Initial Commit.
This commit is contained in:
commit
3e123e58f2
24 changed files with 1827 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
.vscode
|
3
README.md
Normal file
3
README.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
#Etheryo > Blog
|
||||
|
||||
The blog part of the etheryo website.
|
5
backend/.gitignore
vendored
Normal file
5
backend/.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
.cache
|
||||
build
|
||||
.vscode
|
||||
compile_commands.json
|
||||
res/.env
|
83
backend/CMakeLists.txt
Normal file
83
backend/CMakeLists.txt
Normal file
|
@ -0,0 +1,83 @@
|
|||
# Project Setup
|
||||
cmake_minimum_required(VERSION 3.21)
|
||||
project(
|
||||
projet
|
||||
VERSION 0.0.1
|
||||
DESCRIPTION "api for etheryo blog"
|
||||
HOMEPAGE_URL "https://www.etheryo.fr/"
|
||||
LANGUAGES CXX C
|
||||
)
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
set(TARGET app)
|
||||
|
||||
# CPM Setup
|
||||
set(CPM_DOWNLOAD_VERSION 0.38.7)
|
||||
set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||
|
||||
if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION}))
|
||||
message(STATUS "Downloading CPM.cmake")
|
||||
file(DOWNLOAD https://github.com/TheLartians/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake ${CPM_DOWNLOAD_LOCATION})
|
||||
endif()
|
||||
|
||||
include(${CPM_DOWNLOAD_LOCATION})
|
||||
|
||||
# Source files
|
||||
set(SOURCES "${PROJECT_SOURCE_DIR}/src")
|
||||
add_executable(${TARGET}
|
||||
${SOURCES}/dotenv.cpp
|
||||
${SOURCES}/json.cpp
|
||||
${SOURCES}/main.cpp
|
||||
)
|
||||
|
||||
# Add Dependencies
|
||||
find_package(Boost 1.64 COMPONENTS system date_time REQUIRED)
|
||||
|
||||
# Crow CPP
|
||||
CPMAddPackage(
|
||||
NAME crowcpp
|
||||
GITHUB_REPOSITORY CrowCpp/Crow
|
||||
GIT_TAG v1.1.0
|
||||
)
|
||||
|
||||
if(crowcpp_ADDED)
|
||||
target_include_directories(${TARGET} PUBLIC "${crowcpp_SOURCE_DIR}/include")
|
||||
endif()
|
||||
|
||||
# Lib Pqxx
|
||||
CPMAddPackage(
|
||||
NAME libpqxx
|
||||
GITHUB_REPOSITORY jtv/libpqxx
|
||||
GIT_TAG 7.9.0
|
||||
)
|
||||
|
||||
if(libpqxx_ADDED)
|
||||
target_include_directories(${TARGET} PUBLIC "${libpqxx_SOURCE_DIR}/include")
|
||||
target_include_directories(${TARGET} PUBLIC "${libpqxx_BINARY_DIR}/include")
|
||||
target_link_libraries(${TARGET} PRIVATE pqxx)
|
||||
endif()
|
||||
|
||||
# Copying the ressource folder to the build
|
||||
add_custom_target(CopyRes ALL
|
||||
COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/res
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/res
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
||||
${CMAKE_SOURCE_DIR}/res
|
||||
${CMAKE_BINARY_DIR}/res
|
||||
COMMENT "Copying and deleting resources to build directory"
|
||||
VERBATIM
|
||||
)
|
||||
add_dependencies(${TARGET} CopyRes)
|
||||
|
||||
# Including the include folder
|
||||
target_include_directories(${TARGET} PUBLIC "${PROJECT_SOURCE_DIR}/include")
|
||||
|
||||
# Compilation depending on the platform
|
||||
if(MSVC)
|
||||
target_compile_options(${TARGET} PUBLIC /W3 /WX /DEBUG )
|
||||
elseif(${CMAKE_CXX_COMPILER} STREQUAL "/usr/bin/x86_64-w64-mingw32-g++")
|
||||
target_compile_options(${TARGET} PUBLIC -Wall -Wextra -Wpedantic -Werror -static-libgcc -static-libstdc++)
|
||||
else()
|
||||
target_compile_options(${TARGET} PUBLIC -Wall -Wextra -Wpedantic -Werror -Wno-unused-but-set-variable)
|
||||
endif()
|
7
backend/README.md
Normal file
7
backend/README.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
first install the following librairies :
|
||||
```
|
||||
dnf install boost-* asio-devel libpq-devel
|
||||
```
|
||||
```
|
||||
pacman -S boost asio libpq
|
||||
```
|
19
backend/include/dotenv.hpp
Normal file
19
backend/include/dotenv.hpp
Normal file
|
@ -0,0 +1,19 @@
|
|||
#ifndef _HEADER_ETHERYOBLOG_DOTENV
|
||||
#define _HEADER_ETHERYOBLOG_DOTENV
|
||||
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
namespace Etheryo {
|
||||
class DotEnv {
|
||||
public:
|
||||
DotEnv();
|
||||
int readFile(const std::string& path);
|
||||
const std::string& operator[](const std::string& rvalue);
|
||||
|
||||
private:
|
||||
std::unordered_map<std::string, std::string> _fileData;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // _HEADER_ETHERYOBLOG_DOTENV
|
29
backend/include/json.hpp
Normal file
29
backend/include/json.hpp
Normal file
|
@ -0,0 +1,29 @@
|
|||
#ifndef _HEADER_ETHERYOBLOG_JSON
|
||||
#define _HEADER_ETHERYOBLOG_JSON
|
||||
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
namespace Etheryo {
|
||||
|
||||
typedef std::unordered_map<std::string, std::string> Data;
|
||||
typedef std::vector<Data> Json;
|
||||
|
||||
class JsonHandler {
|
||||
public:
|
||||
JsonHandler();
|
||||
void clear();
|
||||
void add(const std::vector<std::string>& names);
|
||||
std::string& operator[](const std::string& rvalue);
|
||||
void push();
|
||||
std::string to_str();
|
||||
|
||||
private:
|
||||
Data _dataBuffer;
|
||||
Json _buffer;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // _HEADER_ETHERYOBLOG_JSON
|
115
backend/sql/etheryo.sql
Normal file
115
backend/sql/etheryo.sql
Normal file
|
@ -0,0 +1,115 @@
|
|||
CREATE TABLE "langs" (
|
||||
"id" integer UNIQUE PRIMARY KEY NOT NULL,
|
||||
"lang" text NOT NULL,
|
||||
"icon_alpha" varchar(2) NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE "authors" (
|
||||
"id" integer UNIQUE PRIMARY KEY NOT NULL,
|
||||
"name" text NOT NULL,
|
||||
"username" text UNIQUE NOT NULL,
|
||||
"password" text NOT NULL,
|
||||
"created_at" time DEFAULT (now()),
|
||||
"profile_picture" text,
|
||||
"bio" text
|
||||
);
|
||||
|
||||
CREATE TABLE "author_links" (
|
||||
"author_id" integer NOT NULL,
|
||||
"link_name" text NOT NULL,
|
||||
"link_url" text NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE "post" (
|
||||
"id" integer UNIQUE PRIMARY KEY NOT NULL,
|
||||
"slug" text UNIQUE NOT NULL,
|
||||
"author_id" integer,
|
||||
"lang_id" integer,
|
||||
"title" varchar,
|
||||
"picture" text,
|
||||
"date" time DEFAULT (now()),
|
||||
"body" text,
|
||||
"views" integer DEFAULT 0,
|
||||
"likes" integer DEFAULT 0,
|
||||
"dislikes" integer DEFAULT 0,
|
||||
"shares" integer DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE TABLE "post_likes" (
|
||||
"id" integer UNIQUE PRIMARY KEY NOT NULL,
|
||||
"post_id" integer,
|
||||
"like_status" bool NOT NULL,
|
||||
"ip_address" inet NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE "category" (
|
||||
"id" integer UNIQUE PRIMARY KEY NOT NULL,
|
||||
"slug" text NOT NULL,
|
||||
"icon" text,
|
||||
"type_icon" text
|
||||
);
|
||||
|
||||
CREATE TABLE "category_text" (
|
||||
"category_id" integer NOT NULL,
|
||||
"lang_id" integer NOT NULL,
|
||||
"name" text NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE "post_categories" (
|
||||
"category_id" integer NOT NULL,
|
||||
"post_id" integer NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE "author_categories" (
|
||||
"category_id" integer NOT NULL,
|
||||
"author_id" integer NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE "comment" (
|
||||
"id" integer UNIQUE PRIMARY KEY NOT NULL,
|
||||
"post_id" integer NOT NULL,
|
||||
"comment_id" integer,
|
||||
"date" time DEFAULT (now()),
|
||||
"user" text,
|
||||
"body" text
|
||||
);
|
||||
|
||||
CREATE TABLE "comment_likes" (
|
||||
"id" integer UNIQUE PRIMARY KEY NOT NULL,
|
||||
"comment_id" integer,
|
||||
"like_status" bool NOT NULL,
|
||||
"ip_address" inet NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE "flagged_comment" (
|
||||
"comment_id" integer,
|
||||
"flag_count" integer DEFAULT 1
|
||||
);
|
||||
|
||||
ALTER TABLE "author_links" ADD FOREIGN KEY ("author_id") REFERENCES "authors" ("id");
|
||||
|
||||
ALTER TABLE "post" ADD FOREIGN KEY ("author_id") REFERENCES "authors" ("id");
|
||||
|
||||
ALTER TABLE "post" ADD FOREIGN KEY ("lang_id") REFERENCES "langs" ("id");
|
||||
|
||||
ALTER TABLE "post_likes" ADD FOREIGN KEY ("post_id") REFERENCES "post" ("id");
|
||||
|
||||
ALTER TABLE "category_text" ADD FOREIGN KEY ("lang_id") REFERENCES "langs" ("id");
|
||||
|
||||
ALTER TABLE "category_text" ADD FOREIGN KEY ("category_id") REFERENCES "category" ("id");
|
||||
|
||||
ALTER TABLE "post_categories" ADD FOREIGN KEY ("category_id") REFERENCES "category" ("id");
|
||||
|
||||
ALTER TABLE "post_categories" ADD FOREIGN KEY ("post_id") REFERENCES "post" ("id");
|
||||
|
||||
ALTER TABLE "author_categories" ADD FOREIGN KEY ("category_id") REFERENCES "category" ("id");
|
||||
|
||||
ALTER TABLE "author_categories" ADD FOREIGN KEY ("author_id") REFERENCES "authors" ("id");
|
||||
|
||||
ALTER TABLE "comment" ADD FOREIGN KEY ("post_id") REFERENCES "post" ("id");
|
||||
|
||||
ALTER TABLE "comment" ADD FOREIGN KEY ("comment_id") REFERENCES "comment" ("id");
|
||||
|
||||
ALTER TABLE "comment_likes" ADD FOREIGN KEY ("comment_id") REFERENCES "comment" ("id");
|
||||
|
||||
ALTER TABLE "flagged_comment" ADD FOREIGN KEY ("comment_id") REFERENCES "comment" ("id");
|
48
backend/src/dotenv.cpp
Normal file
48
backend/src/dotenv.cpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
#include "dotenv.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
|
||||
using namespace Etheryo;
|
||||
|
||||
DotEnv::DotEnv()
|
||||
: _fileData({})
|
||||
{
|
||||
}
|
||||
|
||||
int DotEnv::readFile(const std::string& path)
|
||||
{
|
||||
std::ifstream file;
|
||||
std::string line;
|
||||
|
||||
file.open(path);
|
||||
|
||||
if (!file)
|
||||
return 1;
|
||||
while (getline(file, line)) {
|
||||
const size_t pos = line.find("=");
|
||||
|
||||
// Commentary detected, ignoring line
|
||||
if (line.find("#") != std::string::npos)
|
||||
continue;
|
||||
// If could not find '=', skip the line
|
||||
if (pos == std::string::npos)
|
||||
continue;
|
||||
|
||||
// Gathering name
|
||||
const std::string name = line.substr(0, pos);
|
||||
// Gathering value and removing quotes
|
||||
std::string value = line.substr(pos + 1, line.size());
|
||||
auto deleteQuotes = std::remove(value.begin(), value.end(), '"');
|
||||
value.erase(deleteQuotes, value.end());
|
||||
// Adding the name and value to the map
|
||||
_fileData.emplace(name, value);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const std::string& DotEnv::operator[](const std::string& rvalue)
|
||||
{
|
||||
return _fileData[rvalue];
|
||||
}
|
52
backend/src/json.cpp
Normal file
52
backend/src/json.cpp
Normal file
|
@ -0,0 +1,52 @@
|
|||
#include "json.hpp"
|
||||
|
||||
using namespace Etheryo;
|
||||
|
||||
JsonHandler::JsonHandler()
|
||||
: _dataBuffer({})
|
||||
, _buffer({})
|
||||
{
|
||||
}
|
||||
|
||||
void JsonHandler::clear()
|
||||
{
|
||||
_buffer.clear();
|
||||
}
|
||||
|
||||
void JsonHandler::add(const std::vector<std::string>& names)
|
||||
{
|
||||
for (const auto& n : names)
|
||||
_dataBuffer.emplace(n, "");
|
||||
}
|
||||
|
||||
std::string& JsonHandler::operator[](const std::string& rvalue)
|
||||
{
|
||||
return _dataBuffer[rvalue];
|
||||
}
|
||||
|
||||
void JsonHandler::push()
|
||||
{
|
||||
_buffer.emplace_back(_dataBuffer);
|
||||
}
|
||||
|
||||
std::string JsonHandler::to_str()
|
||||
{
|
||||
std::string str = "[";
|
||||
size_t map_size(0), map_index(0), vec_index(0);
|
||||
|
||||
for (const auto& map_data : _buffer) {
|
||||
vec_index++;
|
||||
str.push_back('{');
|
||||
map_size = map_data.size();
|
||||
for (auto it = map_data.begin(); it != map_data.end(); it++) {
|
||||
map_index++;
|
||||
str += ("\"" + it->first + "\": \"" + it->second + (map_index >= map_size ? "\"" : "\","));
|
||||
}
|
||||
map_index = 0;
|
||||
str.push_back('}');
|
||||
if (vec_index < _buffer.size())
|
||||
str.push_back(',');
|
||||
}
|
||||
str.push_back(']');
|
||||
return str;
|
||||
}
|
49
backend/src/main.cpp
Normal file
49
backend/src/main.cpp
Normal file
|
@ -0,0 +1,49 @@
|
|||
#include <string>
|
||||
|
||||
#include "crow.h"
|
||||
#include <pqxx/pqxx>
|
||||
|
||||
#include "dotenv.hpp"
|
||||
#include "json.hpp"
|
||||
|
||||
pqxx::connection* globalConnection(nullptr);
|
||||
crow::response test(void);
|
||||
Etheryo::JsonHandler category;
|
||||
|
||||
int main()
|
||||
{
|
||||
// Init Json Objects
|
||||
category.add({ "id", "slug", "icon", "type_icon" });
|
||||
|
||||
// Init Postgresql + DotEnv
|
||||
Etheryo::DotEnv dotenvParser;
|
||||
dotenvParser.readFile("res/.env");
|
||||
globalConnection = new pqxx::connection(dotenvParser["DATABASE_URL"]);
|
||||
std::cout << "Connected to " << globalConnection->dbname() << '\n';
|
||||
|
||||
// Init Crow App
|
||||
crow::SimpleApp app;
|
||||
CROW_ROUTE(app, "/")
|
||||
(test);
|
||||
|
||||
app.port(8000).multithreaded().run();
|
||||
globalConnection->close();
|
||||
}
|
||||
|
||||
crow::response test(void)
|
||||
{
|
||||
category.clear();
|
||||
pqxx::work worker { *globalConnection };
|
||||
auto result = worker.query<int, std::string, std::string, std::string>("select c.id, c.slug, c.icon, c.type_icon FROM category c ORDER BY c.id;");
|
||||
for (auto [id, slug, icon, type_icon] : result) {
|
||||
category["id"] = std::to_string(id);
|
||||
category["slug"] = slug;
|
||||
category["icon"] = icon;
|
||||
category["type_icon"] = type_icon;
|
||||
category.push();
|
||||
}
|
||||
auto response = crow::response { "application/json", category.to_str() };
|
||||
response.add_header("Access-Control-Allow-Origin", "*");
|
||||
response.add_header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
|
||||
return response;
|
||||
}
|
10
frontend/.gitignore
vendored
Normal file
10
frontend/.gitignore
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
.DS_Store
|
||||
node_modules
|
||||
/build
|
||||
/.svelte-kit
|
||||
/package
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
vite.config.js.timestamp-*
|
||||
vite.config.ts.timestamp-*
|
1
frontend/.npmrc
Normal file
1
frontend/.npmrc
Normal file
|
@ -0,0 +1 @@
|
|||
engine-strict=true
|
4
frontend/.prettierignore
Normal file
4
frontend/.prettierignore
Normal file
|
@ -0,0 +1,4 @@
|
|||
# Ignore files for PNPM, NPM and YARN
|
||||
pnpm-lock.yaml
|
||||
package-lock.json
|
||||
yarn.lock
|
8
frontend/.prettierrc
Normal file
8
frontend/.prettierrc
Normal file
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"useTabs": true,
|
||||
"singleQuote": true,
|
||||
"trailingComma": "none",
|
||||
"printWidth": 100,
|
||||
"plugins": ["prettier-plugin-svelte"],
|
||||
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
|
||||
}
|
22
frontend/README.md
Normal file
22
frontend/README.md
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Etheryo Blog Frontend
|
||||
|
||||
*Powered by the Svelte Framework*
|
||||
|
||||
## Developing
|
||||
|
||||
Just run this command after installing npm.
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## Building/Running Production
|
||||
|
||||
To create production and running it.
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run build
|
||||
node build
|
||||
```
|
1267
frontend/package-lock.json
generated
Normal file
1267
frontend/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
22
frontend/package.json
Normal file
22
frontend/package.json
Normal file
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"name": "blog-etheryo",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite dev",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview",
|
||||
"lint": "prettier --check .",
|
||||
"format": "prettier --write ."
|
||||
},
|
||||
"devDependencies": {
|
||||
"@sveltejs/adapter-auto": "^3.0.0",
|
||||
"@sveltejs/kit": "^2.0.0",
|
||||
"@sveltejs/vite-plugin-svelte": "^3.0.0",
|
||||
"prettier": "^3.1.1",
|
||||
"prettier-plugin-svelte": "^3.1.2",
|
||||
"svelte": "^4.2.7",
|
||||
"vite": "^5.0.3"
|
||||
},
|
||||
"type": "module"
|
||||
}
|
12
frontend/src/app.html
Normal file
12
frontend/src/app.html
Normal file
|
@ -0,0 +1,12 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="icon" href="%sveltekit.assets%/favicon.png" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
%sveltekit.head%
|
||||
</head>
|
||||
<body data-sveltekit-preload-data="hover">
|
||||
<div style="display: contents">%sveltekit.body%</div>
|
||||
</body>
|
||||
</html>
|
16
frontend/src/lib/js/apicall.js
Normal file
16
frontend/src/lib/js/apicall.js
Normal file
|
@ -0,0 +1,16 @@
|
|||
export async function load_post() {
|
||||
try {
|
||||
const response = await fetch('http://127.0.0.1:8000');
|
||||
|
||||
if (!response.ok) {
|
||||
return {status: -1};
|
||||
}
|
||||
|
||||
const data = response.status == 200 ? await response.json() : [];
|
||||
return {
|
||||
data: data, status: response.status
|
||||
}
|
||||
} catch (err) {
|
||||
return {status: -1};
|
||||
}
|
||||
}
|
31
frontend/src/routes/+page.svelte
Normal file
31
frontend/src/routes/+page.svelte
Normal file
|
@ -0,0 +1,31 @@
|
|||
<script>
|
||||
import { onMount } from 'svelte';
|
||||
import { load_post } from '$lib/js/apicall.js'
|
||||
$: isLoaded = false;
|
||||
$: hasLoadFailed = false;
|
||||
let data;
|
||||
|
||||
onMount(async () => {
|
||||
const loaded_post = await load_post();
|
||||
if(loaded_post.status == 200)
|
||||
{
|
||||
data = loaded_post.data;
|
||||
isLoaded = true;
|
||||
}
|
||||
else
|
||||
hasLoadFailed = true;
|
||||
});
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<h1>Etheryo Blog</h1>
|
||||
{#if isLoaded}
|
||||
{#each data as d}
|
||||
<p>id: {d.id}</p>
|
||||
{/each}
|
||||
{:else if hasLoadFailed}
|
||||
<p>Loading failed :c</p>
|
||||
{:else}
|
||||
<p>Loading...</p>
|
||||
{/if}
|
||||
</div>
|
BIN
frontend/static/favicon.png
Normal file
BIN
frontend/static/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
13
frontend/svelte.config.js
Normal file
13
frontend/svelte.config.js
Normal file
|
@ -0,0 +1,13 @@
|
|||
import adapter from '@sveltejs/adapter-auto';
|
||||
|
||||
/** @type {import('@sveltejs/kit').Config} */
|
||||
const config = {
|
||||
kit: {
|
||||
// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
|
||||
// If your environment is not supported or you settled on a specific environment, switch out the adapter.
|
||||
// See https://kit.svelte.dev/docs/adapters for more information about adapters.
|
||||
adapter: adapter()
|
||||
}
|
||||
};
|
||||
|
||||
export default config;
|
10
frontend/vite.config.js
Normal file
10
frontend/vite.config.js
Normal file
|
@ -0,0 +1,10 @@
|
|||
import { sveltekit } from '@sveltejs/kit/vite';
|
||||
import { defineConfig } from 'vite';
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [sveltekit()],
|
||||
server: {
|
||||
host: '0.0.0.0',
|
||||
port: 5125,
|
||||
},
|
||||
});
|
Loading…
Add table
Reference in a new issue