From 88d26d1e5c86981e72293ff9d9faf94f7beb2537 Mon Sep 17 00:00:00 2001 From: Antonio De Lucreziis Date: Thu, 3 Mar 2022 01:14:39 +0100 Subject: [PATCH] Initial commit --- .gitignore | 1 + README.md | 7 + client/index.html | 74 ++ client/package-lock.json | 1129 +++++++++++++++++++++++++++++ client/package.json | 18 + client/public/diargamma-posti.jpg | Bin 0 -> 17790 bytes client/src/index.js | 1 + client/src/reset.scss | 74 ++ client/src/style.scss | 119 +++ server/auth/auth.go | 128 ++++ server/db/database.go | 50 ++ server/go.mod | 7 + server/go.sum | 4 + server/main.go | 26 + 14 files changed, 1638 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 client/index.html create mode 100644 client/package-lock.json create mode 100644 client/package.json create mode 100644 client/public/diargamma-posti.jpg create mode 100644 client/src/index.js create mode 100644 client/src/reset.scss create mode 100644 client/src/style.scss create mode 100644 server/auth/auth.go create mode 100644 server/db/database.go create mode 100644 server/go.mod create mode 100644 server/go.sum create mode 100644 server/main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..2bea328 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# Posti DM + +Prototipo di applicazione web per prenotare posti in dipartimento. + +- FrontEnd: Vite + VanillaJS + +- BackEnd: Golang + go-chi + sqlite3 (?) diff --git a/client/index.html b/client/index.html new file mode 100644 index 0000000..7eb2ddd --- /dev/null +++ b/client/index.html @@ -0,0 +1,74 @@ + + + + + + + Posti DM + + + + +
+ + + +
+
+
AulaStud
+
+
+ diargamma-posti +
+
+
+
+
Posto 1
+ +
+
+
Posto 2
+ +
+
+
Posto 3
+ +
+
+
Posto 4
+ +
+
+
Posto 5
+ +
+
+
Posto 6
+ +
+
+
Posto 7
+ +
+
+
Posto 8
+ +
+
+
Posto 9
+ +
+
+
Posto 10
+ +
+
+
+
+
+ + diff --git a/client/package-lock.json b/client/package-lock.json new file mode 100644 index 0000000..2fc51f5 --- /dev/null +++ b/client/package-lock.json @@ -0,0 +1,1129 @@ +{ + "name": "client", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "client", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "sass": "^1.49.9", + "vite": "^2.8.6" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/esbuild": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.23.tgz", + "integrity": "sha512-XjnIcZ9KB6lfonCa+jRguXyRYcldmkyZ99ieDksqW/C8bnyEX299yA4QH2XcgijCgaddEZePPTgvx/2imsq7Ig==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-arm64": "0.14.23", + "esbuild-darwin-64": "0.14.23", + "esbuild-darwin-arm64": "0.14.23", + "esbuild-freebsd-64": "0.14.23", + "esbuild-freebsd-arm64": "0.14.23", + "esbuild-linux-32": "0.14.23", + "esbuild-linux-64": "0.14.23", + "esbuild-linux-arm": "0.14.23", + "esbuild-linux-arm64": "0.14.23", + "esbuild-linux-mips64le": "0.14.23", + "esbuild-linux-ppc64le": "0.14.23", + "esbuild-linux-riscv64": "0.14.23", + "esbuild-linux-s390x": "0.14.23", + "esbuild-netbsd-64": "0.14.23", + "esbuild-openbsd-64": "0.14.23", + "esbuild-sunos-64": "0.14.23", + "esbuild-windows-32": "0.14.23", + "esbuild-windows-64": "0.14.23", + "esbuild-windows-arm64": "0.14.23" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.23.tgz", + "integrity": "sha512-k9sXem++mINrZty1v4FVt6nC5BQCFG4K2geCIUUqHNlTdFnuvcqsY7prcKZLFhqVC1rbcJAr9VSUGFL/vD4vsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.23.tgz", + "integrity": "sha512-lB0XRbtOYYL1tLcYw8BoBaYsFYiR48RPrA0KfA/7RFTr4MV7Bwy/J4+7nLsVnv9FGuQummM3uJ93J3ptaTqFug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.23.tgz", + "integrity": "sha512-yat73Z/uJ5tRcfRiI4CCTv0FSnwErm3BJQeZAh+1tIP0TUNh6o+mXg338Zl5EKChD+YGp6PN+Dbhs7qa34RxSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.23.tgz", + "integrity": "sha512-/1xiTjoLuQ+LlbfjJdKkX45qK/M7ARrbLmyf7x3JhyQGMjcxRYVR6Dw81uH3qlMHwT4cfLW4aEVBhP1aNV7VsA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.23.tgz", + "integrity": "sha512-uyPqBU/Zcp6yEAZS4LKj5jEE0q2s4HmlMBIPzbW6cTunZ8cyvjG6YWpIZXb1KK3KTJDe62ltCrk3VzmWHp+iLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.23.tgz", + "integrity": "sha512-37R/WMkQyUfNhbH7aJrr1uCjDVdnPeTHGeDhZPUNhfoHV0lQuZNCKuNnDvlH/u/nwIYZNdVvz1Igv5rY/zfrzQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.23.tgz", + "integrity": "sha512-H0gztDP60qqr8zoFhAO64waoN5yBXkmYCElFklpd6LPoobtNGNnDe99xOQm28+fuD75YJ7GKHzp/MLCLhw2+vQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.23.tgz", + "integrity": "sha512-x64CEUxi8+EzOAIpCUeuni0bZfzPw/65r8tC5cy5zOq9dY7ysOi5EVQHnzaxS+1NmV+/RVRpmrzGw1QgY2Xpmw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.23.tgz", + "integrity": "sha512-c4MLOIByNHR55n3KoYf9hYDfBRghMjOiHLaoYLhkQkIabb452RWi+HsNgB41sUpSlOAqfpqKPFNg7VrxL3UX9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.23.tgz", + "integrity": "sha512-kHKyKRIAedYhKug2EJpyJxOUj3VYuamOVA1pY7EimoFPzaF3NeY7e4cFBAISC/Av0/tiV0xlFCt9q0HJ68IBIw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.23.tgz", + "integrity": "sha512-7ilAiJEPuJJnJp/LiDO0oJm5ygbBPzhchJJh9HsHZzeqO+3PUzItXi+8PuicY08r0AaaOe25LA7sGJ0MzbfBag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.23.tgz", + "integrity": "sha512-fbL3ggK2wY0D8I5raPIMPhpCvODFE+Bhb5QGtNP3r5aUsRR6TQV+ZBXIaw84iyvKC8vlXiA4fWLGhghAd/h/Zg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.23.tgz", + "integrity": "sha512-GHMDCyfy7+FaNSO8RJ8KCFsnax8fLUsOrj9q5Gi2JmZMY0Zhp75keb5abTFCq2/Oy6KVcT0Dcbyo/bFb4rIFJA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.23.tgz", + "integrity": "sha512-ovk2EX+3rrO1M2lowJfgMb/JPN1VwVYrx0QPUyudxkxLYrWeBxDKQvc6ffO+kB4QlDyTfdtAURrVzu3JeNdA2g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.23.tgz", + "integrity": "sha512-uYYNqbVR+i7k8ojP/oIROAHO9lATLN7H2QeXKt2H310Fc8FJj4y3Wce6hx0VgnJ4k1JDrgbbiXM8rbEgQyg8KA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.23.tgz", + "integrity": "sha512-hAzeBeET0+SbScknPzS2LBY6FVDpgE+CsHSpe6CEoR51PApdn2IB0SyJX7vGelXzlyrnorM4CAsRyb9Qev4h9g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.23.tgz", + "integrity": "sha512-Kttmi3JnohdaREbk6o9e25kieJR379TsEWF0l39PQVHXq3FR6sFKtVPgY8wk055o6IB+rllrzLnbqOw/UV60EA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.23.tgz", + "integrity": "sha512-JtIT0t8ymkpl6YlmOl6zoSWL5cnCgyLaBdf/SiU/Eg3C13r0NbHZWNT/RDEMKK91Y6t79kTs3vyRcNZbfu5a8g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.23.tgz", + "integrity": "sha512-cTFaQqT2+ik9e4hePvYtRZQ3pqOvKDVNarzql0VFIzhc0tru/ZgdLoXd6epLiKT+SzoSce6V9YJ+nn6RCn6SHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz", + "integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==", + "dev": true, + "dependencies": { + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "2.69.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.69.0.tgz", + "integrity": "sha512-kjER91tHyek8gAkuz7+558vSnTQ+pITEok1P0aNOS45ZXyngaqPsXJmSel4QPQnJo7EJMjXUU1/GErWkWiKORg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/sass": { + "version": "1.49.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", + "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/vite": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.6.tgz", + "integrity": "sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug==", + "dev": true, + "dependencies": { + "esbuild": "^0.14.14", + "postcss": "^8.4.6", + "resolve": "^1.22.0", + "rollup": "^2.59.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": ">=12.2.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "less": "*", + "sass": "*", + "stylus": "*" + }, + "peerDependenciesMeta": { + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + } + } + } + }, + "dependencies": { + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "esbuild": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.23.tgz", + "integrity": "sha512-XjnIcZ9KB6lfonCa+jRguXyRYcldmkyZ99ieDksqW/C8bnyEX299yA4QH2XcgijCgaddEZePPTgvx/2imsq7Ig==", + "dev": true, + "requires": { + "esbuild-android-arm64": "0.14.23", + "esbuild-darwin-64": "0.14.23", + "esbuild-darwin-arm64": "0.14.23", + "esbuild-freebsd-64": "0.14.23", + "esbuild-freebsd-arm64": "0.14.23", + "esbuild-linux-32": "0.14.23", + "esbuild-linux-64": "0.14.23", + "esbuild-linux-arm": "0.14.23", + "esbuild-linux-arm64": "0.14.23", + "esbuild-linux-mips64le": "0.14.23", + "esbuild-linux-ppc64le": "0.14.23", + "esbuild-linux-riscv64": "0.14.23", + "esbuild-linux-s390x": "0.14.23", + "esbuild-netbsd-64": "0.14.23", + "esbuild-openbsd-64": "0.14.23", + "esbuild-sunos-64": "0.14.23", + "esbuild-windows-32": "0.14.23", + "esbuild-windows-64": "0.14.23", + "esbuild-windows-arm64": "0.14.23" + } + }, + "esbuild-android-arm64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.23.tgz", + "integrity": "sha512-k9sXem++mINrZty1v4FVt6nC5BQCFG4K2geCIUUqHNlTdFnuvcqsY7prcKZLFhqVC1rbcJAr9VSUGFL/vD4vsw==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.23.tgz", + "integrity": "sha512-lB0XRbtOYYL1tLcYw8BoBaYsFYiR48RPrA0KfA/7RFTr4MV7Bwy/J4+7nLsVnv9FGuQummM3uJ93J3ptaTqFug==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.23.tgz", + "integrity": "sha512-yat73Z/uJ5tRcfRiI4CCTv0FSnwErm3BJQeZAh+1tIP0TUNh6o+mXg338Zl5EKChD+YGp6PN+Dbhs7qa34RxSw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.23.tgz", + "integrity": "sha512-/1xiTjoLuQ+LlbfjJdKkX45qK/M7ARrbLmyf7x3JhyQGMjcxRYVR6Dw81uH3qlMHwT4cfLW4aEVBhP1aNV7VsA==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.23.tgz", + "integrity": "sha512-uyPqBU/Zcp6yEAZS4LKj5jEE0q2s4HmlMBIPzbW6cTunZ8cyvjG6YWpIZXb1KK3KTJDe62ltCrk3VzmWHp+iLg==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.23.tgz", + "integrity": "sha512-37R/WMkQyUfNhbH7aJrr1uCjDVdnPeTHGeDhZPUNhfoHV0lQuZNCKuNnDvlH/u/nwIYZNdVvz1Igv5rY/zfrzQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.23.tgz", + "integrity": "sha512-H0gztDP60qqr8zoFhAO64waoN5yBXkmYCElFklpd6LPoobtNGNnDe99xOQm28+fuD75YJ7GKHzp/MLCLhw2+vQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.23.tgz", + "integrity": "sha512-x64CEUxi8+EzOAIpCUeuni0bZfzPw/65r8tC5cy5zOq9dY7ysOi5EVQHnzaxS+1NmV+/RVRpmrzGw1QgY2Xpmw==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.23.tgz", + "integrity": "sha512-c4MLOIByNHR55n3KoYf9hYDfBRghMjOiHLaoYLhkQkIabb452RWi+HsNgB41sUpSlOAqfpqKPFNg7VrxL3UX9g==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.23.tgz", + "integrity": "sha512-kHKyKRIAedYhKug2EJpyJxOUj3VYuamOVA1pY7EimoFPzaF3NeY7e4cFBAISC/Av0/tiV0xlFCt9q0HJ68IBIw==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.23.tgz", + "integrity": "sha512-7ilAiJEPuJJnJp/LiDO0oJm5ygbBPzhchJJh9HsHZzeqO+3PUzItXi+8PuicY08r0AaaOe25LA7sGJ0MzbfBag==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.23.tgz", + "integrity": "sha512-fbL3ggK2wY0D8I5raPIMPhpCvODFE+Bhb5QGtNP3r5aUsRR6TQV+ZBXIaw84iyvKC8vlXiA4fWLGhghAd/h/Zg==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.23.tgz", + "integrity": "sha512-GHMDCyfy7+FaNSO8RJ8KCFsnax8fLUsOrj9q5Gi2JmZMY0Zhp75keb5abTFCq2/Oy6KVcT0Dcbyo/bFb4rIFJA==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.23.tgz", + "integrity": "sha512-ovk2EX+3rrO1M2lowJfgMb/JPN1VwVYrx0QPUyudxkxLYrWeBxDKQvc6ffO+kB4QlDyTfdtAURrVzu3JeNdA2g==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.23.tgz", + "integrity": "sha512-uYYNqbVR+i7k8ojP/oIROAHO9lATLN7H2QeXKt2H310Fc8FJj4y3Wce6hx0VgnJ4k1JDrgbbiXM8rbEgQyg8KA==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.23.tgz", + "integrity": "sha512-hAzeBeET0+SbScknPzS2LBY6FVDpgE+CsHSpe6CEoR51PApdn2IB0SyJX7vGelXzlyrnorM4CAsRyb9Qev4h9g==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.23.tgz", + "integrity": "sha512-Kttmi3JnohdaREbk6o9e25kieJR379TsEWF0l39PQVHXq3FR6sFKtVPgY8wk055o6IB+rllrzLnbqOw/UV60EA==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.23.tgz", + "integrity": "sha512-JtIT0t8ymkpl6YlmOl6zoSWL5cnCgyLaBdf/SiU/Eg3C13r0NbHZWNT/RDEMKK91Y6t79kTs3vyRcNZbfu5a8g==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.23", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.23.tgz", + "integrity": "sha512-cTFaQqT2+ik9e4hePvYtRZQ3pqOvKDVNarzql0VFIzhc0tru/ZgdLoXd6epLiKT+SzoSce6V9YJ+nn6RCn6SHw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "postcss": { + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz", + "integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==", + "dev": true, + "requires": { + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "rollup": { + "version": "2.69.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.69.0.tgz", + "integrity": "sha512-kjER91tHyek8gAkuz7+558vSnTQ+pITEok1P0aNOS45ZXyngaqPsXJmSel4QPQnJo7EJMjXUU1/GErWkWiKORg==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "sass": { + "version": "1.49.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", + "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "vite": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.6.tgz", + "integrity": "sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug==", + "dev": true, + "requires": { + "esbuild": "^0.14.14", + "fsevents": "~2.3.2", + "postcss": "^8.4.6", + "resolve": "^1.22.0", + "rollup": "^2.59.0" + } + } + } +} diff --git a/client/package.json b/client/package.json new file mode 100644 index 0000000..a11476a --- /dev/null +++ b/client/package.json @@ -0,0 +1,18 @@ +{ + "name": "client", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "sass": "^1.49.9", + "vite": "^2.8.6" + } +} diff --git a/client/public/diargamma-posti.jpg b/client/public/diargamma-posti.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7dfabd5089db28dfb862d697d54a04d909f26687 GIT binary patch literal 17790 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 literal 0 HcmV?d00001 diff --git a/client/src/index.js b/client/src/index.js new file mode 100644 index 0000000..72dcf9c --- /dev/null +++ b/client/src/index.js @@ -0,0 +1 @@ +import './style.scss' diff --git a/client/src/reset.scss b/client/src/reset.scss new file mode 100644 index 0000000..60d4fb4 --- /dev/null +++ b/client/src/reset.scss @@ -0,0 +1,74 @@ +/* Box sizing rules */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +/* Remove default margin */ +body, +h1, +h2, +h3, +h4, +p, +figure, +blockquote, +dl, +dd { + margin: 0; +} + +/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */ +ul[role='list'], +ol[role='list'] { + list-style: none; +} + +/* Set core root defaults */ +html:focus-within { + scroll-behavior: smooth; +} + +/* Set core body defaults */ +body { + min-height: 100vh; + text-rendering: optimizeSpeed; + line-height: 1.5; +} + +/* A elements that don't have a class get default styles */ +a:not([class]) { + text-decoration-skip-ink: auto; +} + +/* Make images easier to work with */ +img, +picture { + max-width: 100%; + display: block; +} + +/* Inherit fonts for inputs and buttons */ +input, +button, +textarea, +select { + font: inherit; +} + +/* Remove all animations, transitions and smooth scroll for people that prefer not to see them */ +@media (prefers-reduced-motion: reduce) { + html:focus-within { + scroll-behavior: auto; + } + + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +} diff --git a/client/src/style.scss b/client/src/style.scss new file mode 100644 index 0000000..95c9e4c --- /dev/null +++ b/client/src/style.scss @@ -0,0 +1,119 @@ +@use './reset.scss'; + +body { + background: #f0f0f0; + + display: flex; + flex-direction: column; + align-items: center; +} + +header { + width: 100%; + height: 3rem; + + position: relative; + + background: #fff; + border-bottom: 1px solid #ddd; + + .nav-item { + height: 3rem; + + display: flex; + align-items: center; + justify-content: center; + } + + .left { + position: absolute; + left: 0; + + padding-left: 1rem; + + display: flex; + gap: 1rem; + } + + .center { + position: absolute; + left: 50%; + transform: translate(-50%, 0); + + display: flex; + gap: 1rem; + } + + .right { + position: absolute; + right: 0; + + padding-right: 1rem; + + display: flex; + gap: 1rem; + } +} + +main { + display: flex; + flex-direction: column; + gap: 2rem; + + align-items: center; + + padding: 2rem 1rem 2rem; + + .room-name { + display: flex; + align-items: center; + justify-content: center; + + font-size: 26px; + font-weight: bold; + } + + .room-main { + display: flex; + flex-direction: row; + gap: 1rem; + + @media screen and (max-width: 1000px) { + flex-direction: column; + } + + .room-diagram { + display: flex; + flex-direction: column; + border: 1px solid #ddd; + + background: #fff; + + padding: 1rem; + } + + .room-bookings { + display: flex; + flex-direction: column; + border: 1px solid #ddd; + + background: #fff; + + min-width: 15rem; + + padding: 0.5rem; + + .seat-list { + display: flex; + flex-direction: column; + + gap: 0.5rem; + + .seat { + display: grid; + grid-template-columns: 1fr auto; + } + } + } + } +} diff --git a/server/auth/auth.go b/server/auth/auth.go new file mode 100644 index 0000000..a013522 --- /dev/null +++ b/server/auth/auth.go @@ -0,0 +1,128 @@ +package auth + +import ( + "fmt" + "net/http" + "time" +) + +var SessionCookieName = "session" // TODO: Make configurable + +type AuthMiddlewareConfig struct { + IsLogged bool + WithPermissions []string +} + +type Authenticator interface { + // Login adds a session cookie to the user + Login(w http.ResponseWriter, userID string) + // Logout clears the user session cookies (by setting the session cookie timeout to 0) + Logout(w http.ResponseWriter) + + // Middleware is a configurable middleware to authenticate http routes based on logged status and permissions + Middleware(*AuthMiddlewareConfig) func(http.Handler) http.Handler + // LoggedMiddleware accepts all logged users without checking for specific permissions + LoggedMiddleware() func(http.Handler) http.Handler + + // UserFromSession returns the userID for this cookie session token + UserFromSession(r http.Request) (string, error) +} + +type AuthService struct { + // CheckUserPassword + CheckUserPassword func(userID string, password string) bool + + // GetUserPermissions gets the list of permissions for this user + UserPermissions func(userID string) []string + + // SessionTokenFromUser returns a session token that represents this user + SessionTokenFromUser func(userID string) string + // UserFromSessionToken returns the corresponing user for this session token + UserFromSessionToken func(session string) (string, bool) + + // AuthenticationFailed handles failed authentications + AuthenticationFailed http.Handler +} + +func (auth *AuthService) Login(w http.ResponseWriter, userID string) { + http.SetCookie(w, &http.Cookie{ + Name: SessionCookieName, + Value: auth.SessionTokenFromUser(userID), + Expires: time.Now().Add(10 * time.Minute), // TODO: Make configurable + }) +} + +func (auth *AuthService) Logout(w http.ResponseWriter) { + http.SetCookie(w, &http.Cookie{ + Name: SessionCookieName, + Value: "", + Expires: time.Now(), + }) +} + +func (auth *AuthService) Middleware(config *AuthMiddlewareConfig) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + cookie, err := r.Cookie(SessionCookieName) + if err == http.ErrNoCookie && !config.IsLogged { + next.ServeHTTP(w, r) + return + } + if err != nil { + auth.AuthenticationFailed.ServeHTTP(w, r) + return + } + + userID, exists := auth.UserFromSessionToken(cookie.Value) + if !exists { + auth.Logout(w) + w.WriteHeader(http.StatusBadRequest) + return + } + + if config.IsLogged { + userPerms := map[string]bool{} + for _, perm := range auth.UserPermissions(userID) { + userPerms[perm] = true + } + + // check the user has all the permissions to access the route + hasAll := true + for _, perm := range config.WithPermissions { + if _, present := userPerms[perm]; !present { + hasAll = false + break + } + } + + if !hasAll { + auth.AuthenticationFailed.ServeHTTP(w, r) + return + } + } + + next.ServeHTTP(w, r) + }) + } +} + +func (auth *AuthService) LoggedMiddleware() func(http.Handler) http.Handler { + return auth.Middleware(&AuthMiddlewareConfig{ + IsLogged: true, + WithPermissions: []string{}, + }) +} + +func (auth *AuthService) UserFromSession(r http.Request) (string, error) { + cookie, err := r.Cookie(SessionCookieName) + if err != nil { + return "", err + } + + userID, exists := auth.UserFromSessionToken(cookie.Value) + if !exists { + return "", fmt.Errorf(`no user for this session token`) + } + + return userID, nil +} diff --git a/server/db/database.go b/server/db/database.go new file mode 100644 index 0000000..2cde51e --- /dev/null +++ b/server/db/database.go @@ -0,0 +1,50 @@ +package db + +// Entities + +type Utente struct { + ID string + Username string + Permissions []string +} + +type Stanza struct { + ID string + Posti []string +} + +// Actions + +type AzioneBase struct { + Tipo string +} + +type AzioneStanza struct { + AzioneBase + UserID string + StanzaID string +} + +type AzioneOccupaPosto struct { + AzioneStanza + PostoID string +} + +type AzioneLiberaPosto struct { + AzioneStanza + PostoID string +} + +// Database Interfaces + +type Store interface { + // Entities + + GetUtente(userID string) *Utente + GetStanza(stanzaID string) *Stanza + + // Available Seats + + GetPostiOccupati(stanzaID string) []string + GetPostiLiberi(stanzaID string) []string +} diff --git a/server/go.mod b/server/go.mod new file mode 100644 index 0000000..2c5f4cb --- /dev/null +++ b/server/go.mod @@ -0,0 +1,7 @@ +module git.phc.dm.unipi.it/aziis98/posti-dm/server + +go 1.17 + +require github.com/go-chi/chi/v5 v5.0.7 + +require github.com/mattn/go-sqlite3 v1.14.12 // indirect diff --git a/server/go.sum b/server/go.sum new file mode 100644 index 0000000..f65788f --- /dev/null +++ b/server/go.sum @@ -0,0 +1,4 @@ +github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= +github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= +github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= diff --git a/server/main.go b/server/main.go new file mode 100644 index 0000000..3b4a596 --- /dev/null +++ b/server/main.go @@ -0,0 +1,26 @@ +package main + +import ( + "log" + "net/http" + + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" +) + +var HOST = ":3000" + +func main() { + r := chi.NewRouter() + + r.Use(middleware.RequestID) + r.Use(middleware.RealIP) + r.Use(middleware.Logger) + r.Use(middleware.Recoverer) + + log.Printf(`Starting server on %s...`, HOST) + err := http.ListenAndServe(HOST, r) + if err != nil { + panic(err) + } +}