Compare commits
369 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d9c0bff780 | |||
| beceace2c2 | |||
| 5373636704 | |||
| e8d04eccf6 | |||
| d978c82263 | |||
| 883a458ed3 | |||
| 9009d9df99 | |||
| 81c0fa1243 | |||
| 01221616ae | |||
| be75a0f5e9 | |||
| 1b40839490 | |||
| 80f5780602 | |||
| dcf1817cd6 | |||
| ae251803ad | |||
| f6d9627ceb | |||
| 0cbc6b7b56 | |||
| f0af2d14e4 | |||
| b797039144 | |||
| 86e29e5065 | |||
| fddef22e8e | |||
| ad7551b7af | |||
| f09eb18bcc | |||
| 5c65e35f24 | |||
| 8cbe859971 | |||
| 67f38db847 | |||
| 28a72a3592 | |||
| dae334694d | |||
| e57fe3a046 | |||
| 54670c7845 | |||
| 3dbcef1500 | |||
| 24bbad05cb | |||
| cacbda3164 | |||
| da9b1a3a64 | |||
| 394b911eca | |||
| 220778e84f | |||
| c6e343da5d | |||
| 268e5b7478 | |||
| b9ccd16a02 | |||
| 302ad0e8a6 | |||
| e052f435db | |||
| caa1330f39 | |||
| 870d19f566 | |||
| a28f787833 | |||
| 335a51b589 | |||
| 72f9471486 | |||
| f0cd101af5 | |||
| 52876bd77e | |||
| aabe1926bd | |||
| e785227064 | |||
| 0cb88eec3b | |||
| 8cd2914f73 | |||
| f70e2ee8eb | |||
| c60a21ef32 | |||
| 77a57ee609 | |||
| fc15f0e083 | |||
| 6115beece3 | |||
| 54434fbe78 | |||
| 83755bdd25 | |||
| 08f901c5f0 | |||
| 06910fbd4d | |||
| 154e7dd185 | |||
| 8bde3226bf | |||
| e5565145b5 | |||
| 37a667daff | |||
| eda98bacfc | |||
| ee1ee52e13 | |||
| d03bf41ad1 | |||
| ba2fe24629 | |||
| 547116090a | |||
| 974826f42d | |||
| 4914b029f9 | |||
| ff864fbaab | |||
| f583ba4938 | |||
| d552f541ac | |||
| d46d02e37a | |||
| 4e0c6e85da | |||
| 1147808366 | |||
| a7c27a60e0 | |||
| 974976bd90 | |||
| 9bbe665984 | |||
| d0ea8551b6 | |||
| 089ee9bc07 | |||
| 786c4f8207 | |||
| 13879aefdd | |||
| d03a8fd7a4 | |||
| c00aae5566 | |||
| e923f4d650 | |||
| 654c07a364 | |||
| 820eeb0aac | |||
| 2a338baa26 | |||
| ec7351272f | |||
| 13dec43ef3 | |||
| 43673e3349 | |||
| 1e77253a63 | |||
| 798af326a2 | |||
| d349a7591e | |||
| 8370145f6c | |||
| 304945acea | |||
| 1dd05fee50 | |||
| 374eda4103 | |||
| 52a8cca3e8 | |||
| 22ef4d75b6 | |||
| 534e6a0ad3 | |||
| 80ed4fc5fa | |||
| 445eb02386 | |||
| 53ae0b89b0 | |||
| c7376b4d8f | |||
| e3e59b7e24 | |||
| 07f59ac581 | |||
| 7176c3d4f4 | |||
| 13366284c6 | |||
| 0f0b447137 | |||
| f7cc28c896 | |||
| fd790003d1 | |||
| fdad329148 | |||
| 73bf5f3fbe | |||
| 103d64a659 | |||
| 92c4d35992 | |||
| 3b1d95b71b | |||
| 4fd9bf2bb6 | |||
| ce96b6f55d | |||
| 54bbc1dd00 | |||
| ffa31bcacc | |||
| 559f5bd257 | |||
| 977e49e1ce | |||
| 30cb707436 | |||
| ae439633b9 | |||
| 7f33f6ddfd | |||
| 8404415a93 | |||
| 5ddddf8b5d | |||
| 927db19cc6 | |||
| eccff16c5f | |||
| 7be9c62c7c | |||
| 76ce14e8b1 | |||
| fd0074c0b0 | |||
| ad01cdb5ac | |||
| 1b4ca67cf0 | |||
| 53936e19d4 | |||
| b58d00c5a6 | |||
| 41db0c45cd | |||
| 5361b551eb | |||
| eb87647466 | |||
| d9b900f28d | |||
| 198bd6c723 | |||
| 1831e6309f | |||
| 007f5149d2 | |||
| 1a094e3511 | |||
| db1ddc1292 | |||
| 535e3bb36a | |||
| 785237e55e | |||
| e6bf47a859 | |||
| 93ae1711f1 | |||
| af97812beb | |||
| 78cf22ade9 | |||
| b4a461d93a | |||
| 5f33c02064 | |||
| 46c1a392b8 | |||
| c6880c5df6 | |||
| 646da94ef9 | |||
| 36ede93dce | |||
| 9ed35589f7 | |||
| e946dd18e0 | |||
| 51cad598c1 | |||
| 0595f23c18 | |||
| b88816706b | |||
| 80edaae023 | |||
| 883c46b064 | |||
| 4248cc31f2 | |||
| 5f81c6d61a | |||
| 00d82cc817 | |||
| a9edfde162 | |||
| 468d7f445d | |||
| 4cc74deece | |||
| f9831490af | |||
| a055a616eb | |||
| 8009a2cbc4 | |||
| 693cc149cf | |||
| d126fe0bce | |||
| 4cc49cce9e | |||
| f7cb4cd805 | |||
| a2bd9883d1 | |||
| 10a079c304 | |||
| 65f12f1082 | |||
| c15f855c72 | |||
| 3d38483022 | |||
| 57dc1e7175 | |||
| ead68c929f | |||
| d54b346259 | |||
| a05de8269c | |||
| 130b70c6af | |||
| 7247a54c08 | |||
| 28de7ebff8 | |||
| e2c9d4dc2d | |||
| 4866382180 | |||
| 1b1507db1a | |||
| 0ea7d687a7 | |||
| 502e1539ca | |||
| f3910fea1b | |||
| ee9b48fb79 | |||
| 142686ef92 | |||
| 2aa187984e | |||
| c20d4d71c3 | |||
| 4f4d1e1b39 | |||
| f38b590f70 | |||
| c2caf42fd3 | |||
| 8c279c8c10 | |||
| 3480c78360 | |||
| 79ce708f60 | |||
| a4526eb4b5 | |||
| 866a133917 | |||
| adce978244 | |||
| dd3c26b29a | |||
| 25ad42ba9b | |||
| 3285b7e472 | |||
| c7da55480a | |||
| 35e81b5782 | |||
| 769a9526e7 | |||
| 5470153f4f | |||
| 9d6ad87275 | |||
| ac6261d9ac | |||
| 48effe077e | |||
| c656bf8612 | |||
| 9daf7c7156 | |||
| 4bd3bfae9d | |||
| 727964949c | |||
| 21e1fc1aca | |||
| eeba2ef2d4 | |||
| b3e738ce03 | |||
| 46848c7b19 | |||
| 5f3d48597f | |||
| 0efc3e5999 | |||
| 0c0ce89317 | |||
| 4a47061f76 | |||
| 9b3ff9b362 | |||
| 8315fede7d | |||
| d6d0568f67 | |||
| ff0119db9b | |||
| 37d776c315 | |||
| f53d4abd8b | |||
| f827bd4aeb | |||
| f28c4e96c5 | |||
| cf81b11c0b | |||
| 17dc752902 | |||
| bc9faf9456 | |||
| e5b615267c | |||
| 70e9086646 | |||
| 0cc30bc67e | |||
| 73792e7ce6 | |||
| 32f873d9c2 | |||
| 6566bc5f8f | |||
| cc93114eab | |||
| 6d5d949f5c | |||
| f1be4a4db0 | |||
| 8b9f576b30 | |||
| 0735f959ef | |||
| f91d65b7a4 | |||
| c8d4920cd3 | |||
| 27625bc31a | |||
| 67e22e4339 | |||
| b4ed5cffd6 | |||
| 6209ff12bb | |||
| 392a0e85be | |||
| a7abf37781 | |||
| c09f87daa7 | |||
| 43072d2777 | |||
| ed52f28743 | |||
| fe953b6b36 | |||
| d931f3ec6d | |||
| 2fbf404bf3 | |||
| 49064e4e25 | |||
| 2c4004d91f | |||
| 37706b87c4 | |||
| c8a98a745d | |||
| abae472545 | |||
| 749593f1af | |||
| a824a5dcf2 | |||
| 8b2fe90eb7 | |||
| e6370fab66 | |||
| 92ea4b64f9 | |||
| 9f6d071f25 | |||
| 274536eafa | |||
| 5b0ad39526 | |||
| 01d54f504b | |||
| e413fb7ecd | |||
| dc665ec581 | |||
| f7fa0452cd | |||
| 47253cc54b | |||
| 71b56db909 | |||
| ad41edc972 | |||
| 9076561644 | |||
| ff5601aad2 | |||
| 21629b7bed | |||
| 052e38a292 | |||
| 38c44396b0 | |||
| f80e19e18a | |||
| ebdda050f8 | |||
| 110fb1c180 | |||
| fd361f9482 | |||
| 1b8e05ad1f | |||
| 28184d2a52 | |||
| 9a14a81956 | |||
| 3312bbe8e4 | |||
| a9602f5576 | |||
| 0f5dd0fd31 | |||
| e45b016cca | |||
| e1fe07cf26 | |||
| 18e851a205 | |||
| c992ec22ca | |||
| c57f75d1ea | |||
| 5abfafe2fa | |||
| bd87aded67 | |||
| c0332fe035 | |||
| 3941cc4e9b | |||
| 6ebaec5c3b | |||
| 4b8aebdc1b | |||
| 10afb34921 | |||
| 068a3b9c5e | |||
| 94ac704582 | |||
| fd677396ee | |||
| 06d81fb419 | |||
| 3264e86426 | |||
| 5767f2d2c3 | |||
| a267c4028a | |||
| 4916a6b380 | |||
| 55550ade86 | |||
| 8a30906bd4 | |||
| e049ec7782 | |||
| fab2a2aed7 | |||
| 3abc8b730f | |||
| 80bf60e75d | |||
| d0095d3e31 | |||
| 04a9e85bd2 | |||
| 5bab933364 | |||
| ad768296c3 | |||
| cc830827bb | |||
| 0c24507bb2 | |||
| be1ecf1af6 | |||
| 1f449258ab | |||
| 3e7579852b | |||
| b58af80552 | |||
| e17ccd1519 | |||
| 780d053871 | |||
| a25ce58ebf | |||
| fa1a16ad30 | |||
| 0c9073aa6f | |||
| e8a39cbe19 | |||
| c3d3ff39f0 | |||
| 240f3b0380 | |||
| 1238b379ce | |||
| c580472282 | |||
| 07d9aab45f | |||
| 6bb9808d0c | |||
| 283c38c9a5 | |||
| c0084a5d61 | |||
| f0ccb32b51 | |||
| f6e2fb3e89 | |||
| 6114e2693d | |||
| 9dde9b0763 | |||
| 4fed2f32ae | |||
| 2885cd621c | |||
| 3c91ff2860 | |||
| 68ca90e52e | |||
| dd592dc684 | |||
| 75d6a271bf | |||
| 090b24079a | |||
| f5f5d4fdc9 | |||
| b166df13b0 | |||
| 1078607805 | |||
| 94877a056a |
@@ -0,0 +1,9 @@
|
||||
node_modules
|
||||
.git
|
||||
.github
|
||||
.vscode
|
||||
dist
|
||||
build
|
||||
.env
|
||||
.DS_Store
|
||||
*.log
|
||||
@@ -0,0 +1,52 @@
|
||||
# EditorConfig helps maintain consistent coding styles between editors
|
||||
root = true
|
||||
|
||||
# Default settings for all files (e.g. most common, best-practice standard across all filetypes)
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
# Svelte files
|
||||
[*.svelte]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
# JavaScript and TypeScript
|
||||
[*.{js,ts,tsx,cjs,mjs}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
# JSON files (package.json, config files, etc.) - per JSON (RFC 8259) specification
|
||||
[*.json,.prettierrc]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
# YAML files (e.g., GitHub Actions, Lint configs) - per YAML 1.2 (2009) specification
|
||||
[*.{yaml,yml}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
# Markdown files
|
||||
[*.md]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
# Dockerfile
|
||||
[Dockerfile*]
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
insert_final_newline = false
|
||||
|
||||
# Ignore binary files
|
||||
[*.{png,jpg,jpeg,gif,ico,svg,woff,woff2,eot,ttf,otf}]
|
||||
charset = unset
|
||||
trim_trailing_whitespace = false
|
||||
insert_final_newline = false
|
||||
@@ -0,0 +1,26 @@
|
||||
TZ=Etc/UTC
|
||||
KENER_SECRET_KEY=please_change_me_to_something_secure
|
||||
|
||||
# For SQLite database...
|
||||
DATABASE_URL=sqlite://./database/kener.sqlite.db
|
||||
|
||||
# For PostgreSQL database...
|
||||
# DATABASE_URL=postgresql://db_user:db_password@localhost:5432/kener_db
|
||||
# POSTGRES_PASSWORD=some_super_random_secure_password
|
||||
|
||||
# For MySQL database...
|
||||
# DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/kener_db
|
||||
# MYSQL_PASSWORD=some_super_random_secure_password
|
||||
|
||||
KENER_BASE_PATH=""
|
||||
ORIGIN=http://localhost:3000
|
||||
|
||||
RESEND_API_KEY=""
|
||||
RESEND_SENDER_EMAIL=Accounts <accounts@resend.dev>
|
||||
|
||||
# Likely no need to change...
|
||||
# NODE_ENV=production # already defined in container
|
||||
# PORT=3000 # default port Kener service is exposed upon
|
||||
|
||||
# Add the below variable if you would like to ‘white-label’ the product (aka. remove some of the attributions scattered throughout the app)
|
||||
# WHITE_LABEL=true
|
||||
@@ -0,0 +1,48 @@
|
||||
# Contributing to Kener
|
||||
|
||||
Thank you for considering contributing to our project! Here are some guidelines to help you get started.
|
||||
|
||||
---
|
||||
|
||||
## How to Contribute
|
||||
|
||||
1. Fork the repository and clone it locally.
|
||||
2. Create a new branch for your feature or bug fix:
|
||||
```bash
|
||||
git checkout -b feature/your-feature-name
|
||||
```
|
||||
3. Make your changes and commit them:
|
||||
```bash
|
||||
git commit -m 'Describe your changes'
|
||||
```
|
||||
4. Push your changes to your fork:
|
||||
```bash
|
||||
git push origin feature/your-feature-name
|
||||
```
|
||||
5. Create a pull request to the `main` branch.
|
||||
|
||||
|
||||
## Development
|
||||
|
||||
1. Install dependencies:
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
2. Create a `.env` file in the root of the project and add the following:
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
2. Start the development server:
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
3. Open [http://localhost:3000](http://localhost:3000) in your browser.
|
||||
|
||||
## Documentation
|
||||
|
||||
The documentation is available in the `docs` folder. You can view it by going to [http://localhost:3000/docs/home](http://localhost:3000/docs/home) in your browser.
|
||||
|
||||
## Where to Start
|
||||
|
||||
1. Check out the [roadmap items](https://kener.ing/docs/roadmap/)
|
||||
2. Add language support by following the [i18n guide](https://kener.ing/docs/i18n/)
|
||||
@@ -0,0 +1,2 @@
|
||||
github: rajnandan1
|
||||
buy_me_a_coffee: rajnandan1
|
||||
@@ -17,22 +17,17 @@ Steps to reproduce the behavior:
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Version**
|
||||
Which version of kener you are using.
|
||||
|
||||
**Environment**
|
||||
Which environment you are using or where is it deployed. `docker`, `kubernetes`, `bare-metal`, `development`, `pm2` etc
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
- OS: [e.g. iOS]
|
||||
- Browser [e.g. chrome, safari]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Smartphone (please complete the following information):**
|
||||
- Device: [e.g. iPhone6]
|
||||
- OS: [e.g. iOS8.1]
|
||||
- Browser [e.g. stock browser, safari]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
name: Generate README
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- 'README.template.md'
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- 'README.template.md'
|
||||
workflow_dispatch: # Allows for manual execution
|
||||
workflow_run: # Triggers this workflow to run when it recognizes 'publish-images' workflow has ran and successfully completed
|
||||
workflows: ["Publish Docker Image to Registries"]
|
||||
types:
|
||||
- completed
|
||||
|
||||
permissions:
|
||||
contents: write # Explicitly allow pushing changes
|
||||
|
||||
jobs:
|
||||
generate-readme:
|
||||
name: Generate README from template
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
fetch-depth: 0 # Fetch full history, including tags
|
||||
persist-credentials: false # We'll manually authenticate
|
||||
|
||||
- name: Configure Git
|
||||
run: |
|
||||
git config --global user.name "github-actions"
|
||||
git config --global user.email "github-actions@github.com"
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4.2.0
|
||||
with:
|
||||
node-version: "20"
|
||||
|
||||
- name: Install Dependencies
|
||||
run: npm install mustache dotenv
|
||||
|
||||
- name: Extract Major and Major-Minor Versions
|
||||
run: |
|
||||
VERSION="${{ vars.BUILD_VERSION }}"
|
||||
|
||||
# Check if VERSION is empty and set a fallback value
|
||||
if [ -z "$VERSION" ]; then
|
||||
# Fetch the latest release using Git
|
||||
VERSION=$(git tag -l --sort=-v:refname | grep -E '^v?[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1 || echo "3.1.0")
|
||||
fi
|
||||
|
||||
MAJOR=$(echo "$VERSION" | cut -d. -f1)
|
||||
MAJOR_MINOR=$(echo "$VERSION" | cut -d. -f1,2)
|
||||
|
||||
echo "Full version: $VERSION"
|
||||
echo "Major version: $MAJOR"
|
||||
echo "Major-Minor version: $MAJOR_MINOR"
|
||||
|
||||
# Export all as environment variables
|
||||
echo "LATEST_VERSION=$VERSION" >> $GITHUB_ENV
|
||||
echo "LATEST_MAJOR_VERSION=$MAJOR" >> $GITHUB_ENV
|
||||
echo "LATEST_MAJOR_MINOR_VERSION=$MAJOR_MINOR" >> $GITHUB_ENV
|
||||
|
||||
- name: Generate README.md
|
||||
env:
|
||||
BUILD_FULL_VERSION: ${{ env.LATEST_VERSION }} # e.g., 1.2.3
|
||||
BUILD_MAJOR_VERSION: ${{ env.LATEST_MAJOR_VERSION}} # e.g., 1
|
||||
BUILD_MAJOR_MINOR_VERSION: ${{ env.LATEST_MAJOR_MINOR_VERSION }} # e.g., 1.2
|
||||
run: node scripts/generate-readme.js
|
||||
|
||||
- name: Commit and Push Changes
|
||||
env:
|
||||
GH_PAT: ${{ secrets.GH_PAT }}
|
||||
run: |
|
||||
git add README.md
|
||||
git commit -m "Auto-generate README.md with release versions" || echo "No changes to commit"
|
||||
git push https://x-access-token:${{ secrets.GH_PAT }}@github.com/${{ github.repository }}.git HEAD:main
|
||||
@@ -0,0 +1,21 @@
|
||||
name: Prevent Direct README Changes
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- "README.md"
|
||||
|
||||
jobs:
|
||||
check-readme:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4.2.2
|
||||
|
||||
- name: Detect direct README changes
|
||||
run: |
|
||||
if git diff --name-only origin/main | grep -q "README.md"; then
|
||||
echo "❌ Direct modifications to README.md are not allowed!"
|
||||
echo "Please update README.template.md instead."
|
||||
exit 1
|
||||
fi
|
||||
@@ -0,0 +1,157 @@
|
||||
name: Publish Docker Image to Registries
|
||||
|
||||
on:
|
||||
release:
|
||||
types:
|
||||
- published # Runs only when a GitHub Release is published
|
||||
workflow_dispatch: # Allows for manual execution
|
||||
|
||||
env:
|
||||
ALPINE_VERSION: "23-alpine"
|
||||
DEBIAN_VERSION: "23-slim"
|
||||
# Registry URLs
|
||||
DOCKERHUB_REGISTRY: docker.io
|
||||
GITHUB_REGISTRY: ghcr.io
|
||||
# Docker Hub image name (using Docker Hub username)
|
||||
DOCKERHUB_IMAGE_NAME: ${{ secrets.DOCKER_USERNAME }}/${{ github.event.repository.name }}
|
||||
# GitHub image name (formatted as `account/repo`)
|
||||
GITHUB_IMAGE_NAME: ${{ github.repository }}
|
||||
|
||||
jobs:
|
||||
check-lockfile:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20' # Adjust as needed
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Check for lock-file changes
|
||||
run: |
|
||||
git diff --exit-code package-lock.json || (
|
||||
echo "🫥 package-lock.json is outdated or missing. Please run 'npm install' and commit the updated lockfile."
|
||||
exit 1
|
||||
)
|
||||
|
||||
build-and-push-to-registries:
|
||||
needs: check-lockfile # Runs only after `check-lockfile` completes successfully
|
||||
name: Push Docker images to Docker Hub and GitHub Container Registry
|
||||
strategy:
|
||||
matrix:
|
||||
variant: [alpine, debian]
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: write
|
||||
contents: write
|
||||
packages: write
|
||||
# This is used to complete the identity challenge with sigstore/fulcio when running outside of PRs.
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- name: Check out the repo
|
||||
uses: actions/checkout@v4.2.2
|
||||
|
||||
# Install the cosign tool (except on PR)
|
||||
# https://github.com/sigstore/cosign-installer
|
||||
- name: Install cosign
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: sigstore/cosign-installer@v3.8.0
|
||||
with:
|
||||
cosign-release: 'v2.2.4'
|
||||
|
||||
# Set up BuildKit Docker container builder to be able to build multi-platform images and export cache
|
||||
# https://github.com/docker/setup-buildx-action
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3.8.0
|
||||
|
||||
# Log in to Docker Hub (except on PR)
|
||||
- name: Log in to Docker Hub
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@v3.3.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
# Log in to GitHub Container Registry (except on PR)
|
||||
- name: Log in to GitHub Container Registry
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@v3.3.0
|
||||
with:
|
||||
registry: ${{ env.GITHUB_REGISTRY }}
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# Combined metadata extraction for both registries
|
||||
- name: Extract Docker metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5.6.1
|
||||
with:
|
||||
images: |
|
||||
${{ env.DOCKERHUB_IMAGE_NAME }}
|
||||
${{ env.GITHUB_REGISTRY }}/${{ env.GITHUB_IMAGE_NAME }}
|
||||
tags: |
|
||||
# Tag non-main branches (...for Alpine variant, add suffix)
|
||||
type=ref,event=branch,suffix=-${{ matrix.variant }},enable=${{ matrix.variant == 'alpine' && github.ref != 'refs/heads/main' }}
|
||||
type=ref,event=branch,enable=${{ matrix.variant == 'debian' && github.ref != 'refs/heads/main' }}
|
||||
# Tag matrix.variant (Alpine) releases as version (1.0.0), major.minor (1.0), major (1), and matrix.variant (alpine)
|
||||
type=semver,pattern={{version}},suffix=-${{ matrix.variant }},enable=${{ matrix.variant == 'alpine' }}
|
||||
type=semver,pattern={{major}}.{{minor}},suffix=-${{ matrix.variant }},enable=${{ matrix.variant == 'alpine' }}
|
||||
type=semver,pattern={{major}},suffix=-${{ matrix.variant }},enable=${{ matrix.variant == 'alpine' }}
|
||||
type=raw,value=${{ matrix.variant }},enable=${{ matrix.variant == 'alpine' && github.ref == 'refs/heads/main' }}
|
||||
# Tag default (Debian) releases as version (1.0.0), major.minor (1.0), major (1), and latest
|
||||
type=semver,pattern={{version}},enable=${{ matrix.variant == 'debian' }}
|
||||
type=semver,pattern={{major}}.{{minor}},enable=${{ matrix.variant == 'debian' }}
|
||||
type=semver,pattern={{major}},enable=${{ matrix.variant == 'debian' }}
|
||||
type=raw,value=latest,enable=${{ matrix.variant == 'debian' && github.ref == 'refs/heads/main' }}
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3.3.0
|
||||
|
||||
# Build and push Docker image with Buildx to both registries (don't push on PR)
|
||||
- name: Build and push Docker image
|
||||
id: build-and-push
|
||||
uses: docker/build-push-action@v6.13.0
|
||||
with:
|
||||
context: .
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
build-args: |
|
||||
VARIANT=${{ matrix.variant }}
|
||||
ALPINE_VERSION=${{ env.ALPINE_VERSION }}
|
||||
DEBIAN_VERSION=${{ env.DEBIAN_VERSION }}
|
||||
platforms: linux/amd64,linux/arm64
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
# Sign the resulting Docker image digests
|
||||
- name: Sign the published Docker images
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
env:
|
||||
TAGS: ${{ steps.meta.outputs.tags }}
|
||||
DIGEST: ${{ steps.build-and-push.outputs.digest }}
|
||||
run: |
|
||||
echo "${TAGS}" | xargs -I {} cosign sign --yes {}@${DIGEST}
|
||||
|
||||
# For use in other workflows (e.g. 'generate-readme', etc.)
|
||||
- name: Save Build Version to Repository Variable
|
||||
if: matrix.variant == 'debian' && github.run_attempt == 1
|
||||
run: |
|
||||
VERSION="${{ steps.meta.outputs.version }}"
|
||||
|
||||
# Check if VERSION is empty and set a fallback value
|
||||
if [ -z "$VERSION" ]; then
|
||||
# Fetch the latest release using Git
|
||||
VERSION=$(git tag -l --sort=-v:refname | grep -E '^v?[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1 || echo "3.1.0")
|
||||
fi
|
||||
|
||||
echo "Setting BUILD_VERSION to $VERSION"
|
||||
gh variable set BUILD_VERSION --body "$VERSION"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GH_PAT }} # Needs to be PAT w/ Read access to metadata and secrets & Read and Write access to actions, actions variables, and code
|
||||
@@ -1,74 +0,0 @@
|
||||
name: Publish Docker image to Dockerhub and GHCR
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
# add additional branches that should build to images here
|
||||
# they will be tagged based on the branch name IE kener:test
|
||||
#- 'test'
|
||||
tags:
|
||||
- '*.*.*'
|
||||
# don't trigger if just updating docs
|
||||
paths-ignore:
|
||||
- 'docs.md'
|
||||
- 'README.md'
|
||||
|
||||
jobs:
|
||||
push_to_registry:
|
||||
name: Push Docker image to Docker Hub
|
||||
runs-on: ubuntu-latest
|
||||
# only run if we've specified image tag to push to
|
||||
if: ${{ vars.DOCKERHUB_IMAGE_NAME != '' || vars.GHCR_IMAGE_NAME != '' }}
|
||||
# https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token
|
||||
permissions:
|
||||
packages: write
|
||||
contents: read
|
||||
steps:
|
||||
- name: Check out the repo
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Log in to Docker Hub
|
||||
if: ${{ github.event_name != 'pull_request' && vars.DOCKERHUB_IMAGE_NAME != '' }}
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
if: ${{ github.event_name != 'pull_request' && vars.GHCR_IMAGE_NAME != '' }}
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v3
|
||||
with:
|
||||
images: |
|
||||
${{ vars.DOCKERHUB_IMAGE_NAME }}
|
||||
${{ vars.GHCR_IMAGE_NAME }}
|
||||
# generate Docker tags based on the following events/attributes
|
||||
tags: |
|
||||
type=raw,value=latest,enable=${{ endsWith(github.ref, 'main') }}
|
||||
type=ref,event=branch,enable=${{ !endsWith(github.ref, 'main') }}
|
||||
type=semver,pattern={{version}}
|
||||
flavor: |
|
||||
latest=false
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@v4
|
||||
with:
|
||||
context: .
|
||||
push: ${{ github.event_name != 'pull_request' && !env.ACT}}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
platforms: linux/amd64
|
||||
@@ -1,9 +1,10 @@
|
||||
.DS_Store
|
||||
node_modules
|
||||
static/kener
|
||||
build/client/kener
|
||||
build
|
||||
config/monitors.yaml
|
||||
config/site.yaml
|
||||
config/server.yaml
|
||||
/.svelte-kit
|
||||
/src/lib/.kener
|
||||
/package
|
||||
@@ -13,3 +14,17 @@ config/site.yaml
|
||||
vite.config.js.timestamp-*
|
||||
vite.config.ts.timestamp-*
|
||||
nodemon.json
|
||||
.okgit/
|
||||
config/static/*
|
||||
!config/static/.kener
|
||||
db/*
|
||||
!db/.kener
|
||||
database/*
|
||||
!database/.kener
|
||||
uploads/*
|
||||
!uploads/upload.dir
|
||||
|
||||
static/uploads/*
|
||||
!static/uploads/upload.dir
|
||||
temp.txt
|
||||
temp.js
|
||||
@@ -0,0 +1,22 @@
|
||||
.DS_Store
|
||||
node_modules
|
||||
static/kener
|
||||
build
|
||||
config/monitors.yaml
|
||||
config/site.yaml
|
||||
/.svelte-kit
|
||||
/package
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
|
||||
# Ignore files for PNPM, NPM and YARN
|
||||
pnpm-lock.yaml
|
||||
package-lock.json
|
||||
yarn.lock
|
||||
.okgit/
|
||||
config/static/*
|
||||
!config/static/.kener
|
||||
**/*.yaml
|
||||
**/*.yml
|
||||
.github/
|
||||
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"useTabs": false,
|
||||
"semi": true,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "none",
|
||||
"printWidth": 100,
|
||||
"plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"],
|
||||
"overrides": [
|
||||
{
|
||||
"files": "*.svelte",
|
||||
"options": {
|
||||
"parser": "svelte",
|
||||
"useTabs": false,
|
||||
"semi": true,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "none",
|
||||
"printWidth": 120
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": ["*.js", "*.ts", "*.tsx", "*.cjs", "*.mjs"],
|
||||
"options": {
|
||||
"useTabs": false,
|
||||
"semi": true,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "all",
|
||||
"printWidth": 120
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": ["*.json", ".prettierrc"],
|
||||
"options": {
|
||||
"useTabs": false,
|
||||
"semi": false,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "none",
|
||||
"printWidth": 120
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": ["*.yaml", "*.yml"],
|
||||
"options": {
|
||||
"useTabs": false,
|
||||
"semi": false,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "none",
|
||||
"printWidth": 80
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": "*.md",
|
||||
"options": {
|
||||
"useTabs": false,
|
||||
"semi": false,
|
||||
"tabWidth": 4,
|
||||
"trailingComma": "none",
|
||||
"printWidth": 100
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": "Dockerfile",
|
||||
"options": {
|
||||
"useTabs": true,
|
||||
"tabWidth": 4,
|
||||
"semi": false,
|
||||
"trailingComma": "none",
|
||||
"printWidth": 120
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,75 +1,147 @@
|
||||
FROM lsiobase/alpine:3.18 as base
|
||||
# syntax=docker/dockerfile:1
|
||||
|
||||
ENV TZ=Etc/GMT
|
||||
# Global build arguments
|
||||
ARG ALPINE_VERSION=23.7.0-alpine3.21
|
||||
ARG DEBIAN_VERSION=23.7.0-bookworm-slim
|
||||
ARG VARIANT=debian
|
||||
|
||||
RUN \
|
||||
echo "**** install build packages ****" && \
|
||||
apk add --no-cache \
|
||||
nodejs \
|
||||
npm && \
|
||||
echo "**** cleanup ****" && \
|
||||
rm -rf \
|
||||
/root/.cache \
|
||||
/tmp/*
|
||||
#==========================================================#
|
||||
# STAGE 1: BUILD STAGE #
|
||||
#==========================================================#
|
||||
|
||||
# set OS timezone specified by docker ENV
|
||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||
FROM node:${DEBIAN_VERSION} AS builder-debian
|
||||
RUN apt-get update && apt-get install -y \
|
||||
build-essential=12.9 \
|
||||
python3=3.11.2-1+b1 \
|
||||
sqlite3=3.40.1-2+deb12u1 \
|
||||
libsqlite3-dev=3.40.1-2+deb12u1 \
|
||||
make=4.3-4.1 \
|
||||
node-gyp=9.3.0-2 \
|
||||
g++=4:12.2.0-3 \
|
||||
tzdata=2024b-0+deb12u1 \
|
||||
iputils-ping=3:20221126-1+deb12u1 && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ARG data_dir=/config
|
||||
VOLUME $data_dir
|
||||
ENV CONFIG_DIR=$data_dir
|
||||
FROM node:${ALPINE_VERSION} AS builder-alpine
|
||||
RUN apk add --no-cache --update \
|
||||
build-base=0.5-r3 \
|
||||
python3=3.12.9-r0 \
|
||||
py3-pip=24.3.1-r0 \
|
||||
make=4.4.1-r2 \
|
||||
g++=14.2.0-r4 \
|
||||
sqlite=3.48.0-r0 \
|
||||
sqlite-dev=3.48.0-r0 \
|
||||
tzdata \
|
||||
iputils=20240905-r0
|
||||
|
||||
COPY docker/root/ /
|
||||
FROM builder-${VARIANT} AS builder
|
||||
|
||||
# Dir ENVs need to be set before building or else build throws errors
|
||||
ENV PUBLIC_KENER_FOLDER=/config/static \
|
||||
MONITOR_YAML_PATH=/config/monitors.yaml \
|
||||
SITE_YAML_PATH=/config/site.yaml
|
||||
|
||||
# build requires devDependencies which are not used by production deploy
|
||||
# so build in a stage so we can copy results to clean "deploy" stage later
|
||||
FROM base as build
|
||||
# Set environment variables
|
||||
ENV NPM_CONFIG_LOGLEVEL=error \
|
||||
VITE_BUILD_ENV=production
|
||||
|
||||
# Set the working directory
|
||||
WORKDIR /app
|
||||
|
||||
COPY --chown=abc:abc . /app
|
||||
# Copy package files for dependency installation
|
||||
COPY package*.json ./
|
||||
|
||||
# build requires PUBLIC_KENER_FOLDER dir exists so create temporarily
|
||||
# -- it is non-existent in final stage to allow proper startup and chown'ing/example population
|
||||
RUN mkdir -p "${CONFIG_DIR}"/static \
|
||||
&& npm install \
|
||||
&& chown -R root:root node_modules \
|
||||
&& npm run kener:build
|
||||
# Install all dependencies, including `devDependencies` (cache enabled for faster builds)
|
||||
# TODO: Possibly add `--no-audit` flag to `npm ci` to prevent `npm` from running a security audit on installed packages. (By default, `npm install` performs an audit to check for vulnerabilities in dependencies, which can slow down installation. Adding this flag would skip the audit, thus making `npm install` significantly faster for the CI/CD pipeline.)
|
||||
RUN --mount=type=cache,target=/root/.npm \
|
||||
npm ci --no-fund && \
|
||||
npm cache clean --force
|
||||
|
||||
FROM base as app
|
||||
# Copy application source code
|
||||
COPY . .
|
||||
|
||||
# copy package, required libs (npm,nodejs) results of build, prod entrypoint, and examples to be used to populate config dir
|
||||
# to clean, new stage
|
||||
COPY --chown=abc:abc package*.json ./
|
||||
COPY --from=base /usr/local/bin /usr/local/bin
|
||||
COPY --from=base /usr/local/lib /usr/local/lib
|
||||
COPY --chown=abc:abc scripts /app/scripts
|
||||
COPY --chown=abc:abc static /app/static
|
||||
COPY --chown=abc:abc config /app/config
|
||||
COPY --chown=abc:abc src/lib/helpers.js /app/src/lib/helpers.js
|
||||
COPY --from=build --chown=abc:abc /app/build /app/build
|
||||
COPY --from=build --chown=abc:abc /app/prod.js /app/prod.js
|
||||
# TODO: Reevaluate permissions (possibly reduce?)...
|
||||
# Remove docs directory and ensure required directories exist
|
||||
RUN rm -rf src/routes/\(docs\) && \
|
||||
rm -rf static/documentation && \
|
||||
mkdir -p uploads database && \
|
||||
# TODO: Consider changing below to `chmod -R u-rwX,g=rX,o= uploads database`
|
||||
chmod -R 750 uploads database
|
||||
|
||||
# Copy the config/static folder from the build stage to the app stage
|
||||
COPY --from=build --chown=abc:abc $CONFIG_DIR/static $CONFIG_DIR/static
|
||||
# Build the application and remove `devDependencies`
|
||||
RUN npm run build && \
|
||||
npm prune --omit=dev
|
||||
|
||||
ENV NODE_ENV=production
|
||||
#==========================================================#
|
||||
# STAGE 2: PRODUCTION/FINAL STAGE #
|
||||
#==========================================================#
|
||||
|
||||
# install prod depdendencies and clean cache
|
||||
RUN npm install --omit=dev \
|
||||
&& npm cache clean --force \
|
||||
&& chown -R abc:abc node_modules
|
||||
FROM node:${DEBIAN_VERSION} AS final-debian
|
||||
# TODO: Consider adding `--no-install-recommends`, but will need testing (may further help reduce final build size)
|
||||
RUN apt-get update && apt-get install -y \
|
||||
iputils-ping=3:20221126-1+deb12u1 \
|
||||
sqlite3=3.40.1-2+deb12u1 \
|
||||
tzdata=2024b-0+deb12u1 \
|
||||
# TODO: Is it ok to change to `curl` here so that we don't have to maintain `wget` version mismatch between Debian architectures? (`curl` is only used for the container healthcheck and because there is an Alpine variant (best!) we probably don't care if the Debian image ends up building bigger due to `curl`.)
|
||||
curl=7.88.1-10+deb12u8 && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ARG webPort=3000
|
||||
ENV PORT=$webPort
|
||||
FROM node:${ALPINE_VERSION} AS final-alpine
|
||||
RUN apk add --no-cache --update \
|
||||
iputils=20240905-r0 \
|
||||
sqlite=3.48.0-r0 \
|
||||
tzdata
|
||||
|
||||
FROM final-${VARIANT} AS final
|
||||
|
||||
ARG PORT=3000 \
|
||||
USERNAME=node
|
||||
|
||||
# Set environment variables
|
||||
ENV HEALTHCHECK_PORT=$PORT \
|
||||
HEALTHCHECK_PATH= \
|
||||
NODE_ENV=production \
|
||||
NPM_CONFIG_LOGLEVEL=error \
|
||||
PORT=$PORT \
|
||||
TZ=Etc/UTC
|
||||
|
||||
# Set the working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Copy package files build artifacts, and necessary files from builder stage
|
||||
COPY --chown=node:node --from=builder /app/src/lib/ ./src/lib/
|
||||
COPY --chown=node:node --from=builder /app/build ./build
|
||||
COPY --chown=node:node --from=builder /app/uploads ./uploads
|
||||
COPY --chown=node:node --from=builder /app/database ./database
|
||||
# TODO: Consider changing from copying `node_modules` to instead letting `npm ci --omit=dev` handle production dependencies. Right now, copying `node_modules` is leading to a smaller image, whereas letting `npm ci` handle the install in final image is slightly faster, but leads to larger image size. IMO, having a slightly longer build time (e.g. ~10 sec.) is better in the end to have a smaller image.
|
||||
COPY --chown=node:node --from=builder /app/node_modules ./node_modules
|
||||
COPY --chown=node:node --from=builder /app/migrations ./migrations
|
||||
COPY --chown=node:node --from=builder /app/seeds ./seeds
|
||||
COPY --chown=node:node --from=builder /app/static ./static
|
||||
COPY --chown=node:node --from=builder /app/entrypoint.sh ./entrypoint.sh
|
||||
COPY --chown=node:node --from=builder /app/knexfile.js ./knexfile.js
|
||||
COPY --chown=node:node --from=builder /app/main.js ./main.js
|
||||
COPY --chown=node:node --from=builder /app/openapi.json ./openapi.json
|
||||
COPY --chown=node:node --from=builder /app/openapi.yaml ./openapi.yaml
|
||||
|
||||
# Ensure necessary directories are writable
|
||||
VOLUME ["/uploads", "/database"]
|
||||
|
||||
# Set container timezone and make entrypoint script executable
|
||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
|
||||
chmod +x ./entrypoint.sh
|
||||
# TODO: To improve security, consider dropping unnecessary capabilities instead of granting image all network capabilities of host. (Maybe `setcap cap_net_raw+p /usr/bin/ping`, etc.) Could also drop all and then grant only the capabilities that are explicitly needed. Some examples are commented out below...
|
||||
# setcap cap_net_bind_service=+ep /usr/local/bin/node
|
||||
# setcap cap_net_bind_service=+ep /usr/bin/ping
|
||||
# setcap cap_net_bind_service=+ep /usr/bin/ping6
|
||||
# setcap cap_net_bind_service=+ep /usr/bin/tracepath
|
||||
# setcap cap_net_bind_service=+ep /usr/bin/clockdiff
|
||||
|
||||
# Expose the application port
|
||||
EXPOSE $PORT
|
||||
|
||||
# leave entrypoint blank!
|
||||
# uses LSIO s6-init entrypoint with scripts
|
||||
# that populate CONFIG_DIR with static dir, monitor/site.yaml when dir is empty
|
||||
# and chown's all files so they are owned by proper user based on PUID/GUID env
|
||||
# Add a healthcheck to the container; `wget` vs. `curl` depending on base image. Using this approach because `wget` does not actually maintain versioning across architectures, so we cannot pin a `wget` version (in above `final-debian` base, `apt-get install`) between differing architectures (e.g. arm64, amd64)
|
||||
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
|
||||
CMD sh -c 'if [ -f "/etc/alpine-release" ]; then wget --quiet --spider http://localhost:$HEALTHCHECK_PORT$HEALTHCHECK_PATH || exit 1; else curl --silent --head --fail http://localhost:$HEALTHCHECK_PORT$HEALTHCHECK_PATH || exit 1; fi'
|
||||
|
||||
# TODO: Revisit letting user define $PUID & $PGID overrides (e.g. `addgroup -g $PGID newgroup && adduser -D -G newgroup -u $PUID node`) as well as potentially ensure no root user exists. (Make sure no processes are running as root, first!)
|
||||
# Use a non-root user (recommended for security)
|
||||
USER $USERNAME
|
||||
|
||||
ENTRYPOINT ["/app/entrypoint.sh"]
|
||||
CMD ["node", "main"]
|
||||
@@ -1,90 +1,217 @@
|
||||
# Kener - Stunning Status Pages
|
||||
|
||||
<p align="center">
|
||||
<img src="https://kener.ing/ss.png" width="100%" height="auto" alt="kener example illustration">
|
||||
<img src="https://kener.ing/newbg.png?v=1" width="100%" height="auto" class="rounded-lg shadow-lg" alt="kener example illustration">
|
||||
</p>
|
||||
|
||||
|
||||
<p align="center">
|
||||
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/rajnandan1/kener?label=Star%20Repo&style=social">
|
||||
<a href="https://github.com/ivbeg/awesome-status-pages"><img src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg" alt="Awesome status page" /></a>
|
||||
<a href="https://hub.docker.com/r/rajnandan1/kener"><img src="https://img.shields.io/docker/pulls/rajnandan1/kener" alt="Docker Kener" /></a>
|
||||
<a href="https://awesome-selfhosted.net/tags/status--uptime-pages.html#kener"><img src="https://awesome.re/mentioned-badge.svg" alt="Awesome self hosted" /></a>
|
||||
</p>
|
||||
|
||||
#### 👉 Visit a live server [here](https://kener.ing)
|
||||
<p align="center">
|
||||
<a href="https://hub.docker.com/r/rajnandan1/kener"><img src="https://img.shields.io/docker/pulls/rajnandan1/kener" alt="Docker Kener" /></a>
|
||||
<a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=latest"><img alt="Docker Image Size" src="https://img.shields.io/docker/image-size/rajnandan1/kener/latest?logo=docker&logoColor=white&label=debian" /></a>
|
||||
<a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=alpine"><img alt="Docker Image Size" src="https://img.shields.io/docker/image-size/rajnandan1/kener/alpine?logo=docker&logoColor=white&label=alpine" /></a>
|
||||
</p>
|
||||
|
||||
#### 👉 Read the documentation [here](https://kener.ing/docs)
|
||||
<p align="center">
|
||||
<a href="https://github.com/rajnandan1/kener/actions/workflows/publish-images.yml"><img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/rajnandan1/kener/publish-images.yml" /></a>
|
||||
<a href="https://github.com/rajnandan1/kener/commit/HEAD"><img src="https://img.shields.io/github/last-commit/rajnandan1/kener/main" alt="" /></a>
|
||||
<a href="https://github.com/rajnandan1/kener/issues"><img alt="GitHub issues" src="https://img.shields.io/github/issues/rajnandan1/kener.svg" /></a>
|
||||
</p>
|
||||
|
||||
# Kener - Status Page System
|
||||
Kener: Open-source Node.js status page tool, designed to make service monitoring and incident handling a breeze. It offers a sleek and user-friendly interface that simplifies tracking service outages and improves how we communicate during incidents. And the best part? Kener integrates seamlessly with GitHub, making incident management a team effort—making it easier for us to track and fix issues together in a collaborative and friendly environment.
|
||||
<p align="center">
|
||||
<a href="https://www.producthunt.com/posts/kener-2" target="_blank">
|
||||
<img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=kener-2&theme=light" alt="Kener on Product Hunt">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
It uses files to store the data. Other adapters are coming soon
|
||||
|
||||
<p align="center">
|
||||
<picture>
|
||||
<source srcset="https://fonts.gstatic.com/s/e/notoemoji/latest/1f514/512.webp" type="image/webp">
|
||||
<img src="https://fonts.gstatic.com/s/e/notoemoji/latest/1f514/512.gif" alt="🔔" width="32" height="32">
|
||||
</picture>
|
||||
<picture>
|
||||
<source srcset="https://fonts.gstatic.com/s/e/notoemoji/latest/1f680/512.webp" type="image/webp">
|
||||
<img src="https://fonts.gstatic.com/s/e/notoemoji/latest/1f680/512.gif" alt="🚀" width="32" height="32">
|
||||
</picture>
|
||||
<picture>
|
||||
<source srcset="https://fonts.gstatic.com/s/e/notoemoji/latest/1f6a7/512.webp" type="image/webp">
|
||||
<img src="https://fonts.gstatic.com/s/e/notoemoji/latest/1f6a7/512.gif" alt="🚧" width="32" height="32">
|
||||
</picture>
|
||||
</p>
|
||||
|
||||
| [🌍 Live Server](https://kener.ing) | [🎉 Quick Start](https://kener.ing/docs/quick-start) | [🗄 Documentation](https://kener.ing/docs/home) |
|
||||
| ----------------------------------- | ---------------------------------------------------- | ----------------------------------------------- |
|
||||
|
||||
## What is Kener?
|
||||
|
||||
**Kener** is a sleek and lightweight status page system built with **SvelteKit** and **NodeJS**. It’s not here to replace heavyweights like Datadog or Atlassian but rather to offer a simple, modern, and hassle-free way to set up a great-looking status page with minimal effort.
|
||||
|
||||
Designed with **ease of use** and **customization in mind**, Kener provides all the essential features you’d expect from a status page—without unnecessary complexity.
|
||||
|
||||
### Why Kener?
|
||||
|
||||
✅ Minimal overhead – Set up quickly with a clean, modern UI<br>
|
||||
✅ Customizable – Easily tailor it to match your brand<br>
|
||||
✅ Open-source & free – Because great tools should be accessible to everyone
|
||||
|
||||
### What's in a Name?
|
||||
|
||||
“Kener” is inspired by the Assamese word _“Kene”_, meaning _“how’s it going?”_. The _‘.ing’_ was added because, well… that domain was available. 😄
|
||||
|
||||
## Installation
|
||||
|
||||
### Manual
|
||||
|
||||
```shell
|
||||
# Clone the repository
|
||||
git clone https://github.com/rajnandan1/kener.git
|
||||
cd kener
|
||||
npm install
|
||||
cp .env.example .env
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### Docker
|
||||
|
||||
Official Docker images for **Kener** are available on [Docker Hub](https://hub.docker.com/r/rajnandan1/kener). Multiple versions are maintained to support different use cases.
|
||||
|
||||
<a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=3.1.1"><img src="https://img.shields.io/badge/Latest_Stable_Release-3.1.1-blue" alt="Kener latest stable version: 3.1.1" /></a>
|
||||
|
||||
#### Available Tags
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th>Image Tag</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" colspan="2" style="color:#A81D33;text-align:left;">Debian 12 <small>(Bookwork Slim)</small> w/ Node.js v23.7.0 <strong><em>(default)</em></strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=latest" target="_blank"><code>latest</code></td>
|
||||
<td>Latest stable release (aka 3.1.1)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=3.1.1" target="_blank"><code>3.1.1</code></a></td>
|
||||
<td>Specific release version</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=3.1" target="_blank"><code>3.1</code></a></td>
|
||||
<td>Major-minor version tag pointing to the latest patch (3.1.1) release within that minor version (3.1.x)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=3" target="_blank"><code>3</code></a></td>
|
||||
<td>Major version tag pointing to the latest stable (3.1.1) release within that major version (3.x.x)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" colspan="2" style="color:#0D597F;text-align:left;">Alpine Linux 3.21 w/ Node.js v23.7.0 <strong><em>(smallest image size)</em></strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=alpine" target="_blank"><code>alpine</code></td>
|
||||
<td>Latest stable release (aka 3.1.1)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=3.1.1-alpine" target="_blank"><code>3.1.1-alpine</code></a></td>
|
||||
<td>Specific release version</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=3.1-alpine" target="_blank"><code>3.1-alpine</code></a></td>
|
||||
<td>Major-minor version tag pointing to the latest patch (3.1.1) release within that minor version (3.1.x)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=3-alpine" target="_blank"><code>3-alpine</code></a></td>
|
||||
<td>Major version tag pointing to the latest stable (3.1.1) release within that major version (3.x.x)</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
#### Usage
|
||||
|
||||
Pull the latest stable version:
|
||||
|
||||
```sh
|
||||
docker pull rajnandan1/kener:latest
|
||||
```
|
||||
|
||||
Or use the smaller, Alpine-based variant:
|
||||
|
||||
```sh
|
||||
docker pull rajnandan1/kener:alpine
|
||||
```
|
||||
|
||||
For a production setup, refer to the sample [docker-compose.yml](https://github.com/rajnandan1/kener/blob/main/docker-compose.yml).
|
||||
This keeps things clean, structured, and easy to read while preserving all the details.
|
||||
|
||||
### One Click
|
||||
|
||||
[](https://railway.com/template/spSvic?referralCode=1Pn7vs)
|
||||
|
||||
## Features
|
||||
|
||||
**Monitoring and Tracking:**
|
||||
- Real-time monitoring
|
||||
- Polls HTTP endpoint or Push data to monitor using Rest APIs
|
||||
- Handles Timezones for visitors
|
||||
- Categorize Monitors into different Sections
|
||||
- Cron-based scheduling for monitors. Minimum per minute
|
||||
- Flexible monitor configuration using YAML. Define your own parsing for monitor being UP/DOWN/DEGRADED
|
||||
- Construct complex API Polls - Chain, Secrets etc
|
||||
- Supports a Default Status for Monitors. Example defaultStatus=DOWN if you dont hit API per minute with Status UP
|
||||
Here are some of the features that you get out of the box. Please read the documentation to know how to use them.
|
||||
|
||||
**Customization and Branding:**
|
||||
- Customizable status page using yaml or code
|
||||
- Badge generation for status and uptime of Monitors
|
||||
- Support for custom domains
|
||||
- Embed Monitor as an iframe or widget
|
||||
- Light + Dark Theme
|
||||
### 📊 Monitoring and Tracking
|
||||
|
||||
**Incident Management:**
|
||||
- Create Incidents using Github Issues - Rich Text
|
||||
- Or use APIs to create Incidents
|
||||
- Advanced **application performance monitoring** tools
|
||||
- **Real-time network monitoring** capabilities
|
||||
- Supports **polling HTTP endpoints** or **pushing data** via REST APIs
|
||||
- **Timezone auto-adjustment** for visitors
|
||||
- Organize monitors into **custom sections**
|
||||
- **Cron-based scheduling** (minimum: **every minute**)
|
||||
- **Create complex API polls** (chaining, secrets, etc.)
|
||||
- Set a **default status** for monitors
|
||||
- Supports **base path hosting in Kubernetes (k8s)**
|
||||
- **Pre-built Docker images** for easy deployment
|
||||
|
||||
**User Experience and Design:**
|
||||
- 100% Accessibility Score
|
||||
- Easy installation and setup
|
||||
- User-friendly interface
|
||||
- Responsive design for various devices
|
||||
- Auto SEO and Social Media ready
|
||||
### 🎨 Customization and Branding
|
||||
|
||||
- Fully **customizable status page**
|
||||
- **Badge generation** for status and uptime tracking
|
||||
- Support for **custom domains**
|
||||
- Embed monitors as **iframes or widgets**
|
||||
- **Light & Dark Mode**
|
||||
- **Internationalization (i18n) support**
|
||||
- **Sleek, beautifully crafted UI**
|
||||
|
||||
### 🚨 Incident Management
|
||||
|
||||
## Technologies used
|
||||
- [SvelteKit](https://kit.svelte.dev/)
|
||||
- [shadcn-svelte](https://www.shadcn-svelte.com/)
|
||||
- **Incident tracking & communication** tools
|
||||
- **Comprehensive APIs** for incident management
|
||||
|
||||
## Inspired from
|
||||
- [Upptime](https://upptime.js.org/)
|
||||
### 🧑💻 User Experience and Design
|
||||
|
||||
## Roadmap
|
||||
- **Accessible & user-friendly interface**
|
||||
- **Quick & easy installation**
|
||||
- **Responsive design** for all devices
|
||||
- **Auto SEO & Social Media ready**
|
||||
- **Server-Side Rendering (SSR) for better performance**
|
||||
|
||||
- [x] Add api to create incident
|
||||
- [x] Add docker file
|
||||
- [ ] Add notification
|
||||
- [ ] Add Mysql adapter
|
||||
<div align="left">
|
||||
<img alt="Visitor Stats" src="https://widgetbite.com/stats/rajnandan"/>
|
||||
</div>
|
||||
|
||||
## Screenshots
|
||||
## Technologies Used
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
- [SvelteKit](https://kit.svelte.dev/)
|
||||
- [shadcn-svelte](https://www.shadcn-svelte.com/)
|
||||
|
||||
## Support Me
|
||||
|
||||
## Support
|
||||
If you’re enjoying Kener and want to support its development, consider sponsoring me on GitHub or treating me to a coffee. Your support helps keep the project growing! 🚀
|
||||
|
||||
<a href="https://stackexchange.com/users/3713933"><img src="https://stackexchange.com/users/flair/3713933.png" width="108" height="28" alt="profile for Raj Nandan Sharma on Stack Exchange, a network of free, community-driven Q&A sites" title="profile for Raj Nandan Sharma on Stack Exchange, a network of free, community-driven Q&A sites"></a>
|
||||
[Sponsor Me Using Github](https://github.com/sponsors/rajnandan1)
|
||||
|
||||
<a href="https://www.buymeacoffee.com/rajnandan1"><img src="https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=&slug=rajnandan1&button_colour=5F7FFF&font_colour=ffffff&font_family=Poppins&outline_colour=000000&coffee_colour=FFDD00" /></a>
|
||||
☕ [Buy Me a Coffee](https://www.buymeacoffee.com/rajnandan1)
|
||||
|
||||
<a href="https://www.paypal.com/paypalme/rajnandan1"><img style="height:90px;margin-left:-15px" src="static/paypal.png" /></a>
|
||||

|
||||
|
||||
## Contributing
|
||||
|
||||
If you want to contribute to Kener, please read the [Contribution Guide](https://github.com/rajnandan1/kener/blob/main/.github/CONTRIBUTING.md).
|
||||
|
||||
## Star History
|
||||
|
||||
[](https://star-history.com/#rajnandan1/kener&Date)
|
||||
|
||||
@@ -0,0 +1,217 @@
|
||||
# Kener - Stunning Status Pages
|
||||
|
||||
<p align="center">
|
||||
<img src="https://kener.ing/newbg.png?v=1" width="100%" height="auto" class="rounded-lg shadow-lg" alt="kener example illustration">
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/rajnandan1/kener?label=Star%20Repo&style=social">
|
||||
<a href="https://github.com/ivbeg/awesome-status-pages"><img src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg" alt="Awesome status page" /></a>
|
||||
<a href="https://awesome-selfhosted.net/tags/status--uptime-pages.html#kener"><img src="https://awesome.re/mentioned-badge.svg" alt="Awesome self hosted" /></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://hub.docker.com/r/rajnandan1/kener"><img src="https://img.shields.io/docker/pulls/rajnandan1/kener" alt="Docker Kener" /></a>
|
||||
<a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=latest"><img alt="Docker Image Size" src="https://img.shields.io/docker/image-size/rajnandan1/kener/latest?logo=docker&logoColor=white&label=debian" /></a>
|
||||
<a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=alpine"><img alt="Docker Image Size" src="https://img.shields.io/docker/image-size/rajnandan1/kener/alpine?logo=docker&logoColor=white&label=alpine" /></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/rajnandan1/kener/actions/workflows/publish-images.yml"><img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/rajnandan1/kener/publish-images.yml" /></a>
|
||||
<a href="https://github.com/rajnandan1/kener/commit/HEAD"><img src="https://img.shields.io/github/last-commit/rajnandan1/kener/main" alt="" /></a>
|
||||
<a href="https://github.com/rajnandan1/kener/issues"><img alt="GitHub issues" src="https://img.shields.io/github/issues/rajnandan1/kener.svg" /></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://www.producthunt.com/posts/kener-2" target="_blank">
|
||||
<img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=kener-2&theme=light" alt="Kener on Product Hunt">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<picture>
|
||||
<source srcset="https://fonts.gstatic.com/s/e/notoemoji/latest/1f514/512.webp" type="image/webp">
|
||||
<img src="https://fonts.gstatic.com/s/e/notoemoji/latest/1f514/512.gif" alt="🔔" width="32" height="32">
|
||||
</picture>
|
||||
<picture>
|
||||
<source srcset="https://fonts.gstatic.com/s/e/notoemoji/latest/1f680/512.webp" type="image/webp">
|
||||
<img src="https://fonts.gstatic.com/s/e/notoemoji/latest/1f680/512.gif" alt="🚀" width="32" height="32">
|
||||
</picture>
|
||||
<picture>
|
||||
<source srcset="https://fonts.gstatic.com/s/e/notoemoji/latest/1f6a7/512.webp" type="image/webp">
|
||||
<img src="https://fonts.gstatic.com/s/e/notoemoji/latest/1f6a7/512.gif" alt="🚧" width="32" height="32">
|
||||
</picture>
|
||||
</p>
|
||||
|
||||
| [🌍 Live Server](https://kener.ing) | [🎉 Quick Start](https://kener.ing/docs/quick-start) | [🗄 Documentation](https://kener.ing/docs/home) |
|
||||
| ----------------------------------- | ---------------------------------------------------- | ----------------------------------------------- |
|
||||
|
||||
## What is Kener?
|
||||
|
||||
**Kener** is a sleek and lightweight status page system built with **SvelteKit** and **NodeJS**. It’s not here to replace heavyweights like Datadog or Atlassian but rather to offer a simple, modern, and hassle-free way to set up a great-looking status page with minimal effort.
|
||||
|
||||
Designed with **ease of use** and **customization in mind**, Kener provides all the essential features you’d expect from a status page—without unnecessary complexity.
|
||||
|
||||
### Why Kener?
|
||||
|
||||
✅ Minimal overhead – Set up quickly with a clean, modern UI<br>
|
||||
✅ Customizable – Easily tailor it to match your brand<br>
|
||||
✅ Open-source & free – Because great tools should be accessible to everyone
|
||||
|
||||
### What's in a Name?
|
||||
|
||||
“Kener” is inspired by the Assamese word _“Kene”_, meaning _“how’s it going?”_. The _‘.ing’_ was added because, well… that domain was available. 😄
|
||||
|
||||
## Installation
|
||||
|
||||
### Manual
|
||||
|
||||
```shell
|
||||
# Clone the repository
|
||||
git clone https://github.com/rajnandan1/kener.git
|
||||
cd kener
|
||||
npm install
|
||||
cp .env.example .env
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### Docker
|
||||
|
||||
Official Docker images for **Kener** are available on [Docker Hub](https://hub.docker.com/r/rajnandan1/kener). Multiple versions are maintained to support different use cases.
|
||||
|
||||
<a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name={{kener_full_version}}"><img src="https://img.shields.io/badge/Latest_Stable_Release-{{kener_full_version}}-blue" alt="Kener latest stable version: {{kener_full_version}}" /></a>
|
||||
|
||||
#### Available Tags
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th>Image Tag</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" colspan="2" style="color:#A81D33;text-align:left;">Debian 12 <small>(Bookwork Slim)</small> w/ Node.js v23.7.0 <strong><em>(default)</em></strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=latest" target="_blank"><code>latest</code></td>
|
||||
<td>Latest stable release (aka {{kener_full_version}})</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name={{kener_full_version}}" target="_blank"><code>{{kener_full_version}}</code></a></td>
|
||||
<td>Specific release version</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name={{kener_major_minor_version}}" target="_blank"><code>{{kener_major_minor_version}}</code></a></td>
|
||||
<td>Major-minor version tag pointing to the latest patch ({{kener_full_version}}) release within that minor version ({{kener_major_minor_version}}.x)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name={{kener_major_version}}" target="_blank"><code>{{kener_major_version}}</code></a></td>
|
||||
<td>Major version tag pointing to the latest stable ({{kener_full_version}}) release within that major version ({{kener_major_version}}.x.x)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" colspan="2" style="color:#0D597F;text-align:left;">Alpine Linux 3.21 w/ Node.js v23.7.0 <strong><em>(smallest image size)</em></strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=alpine" target="_blank"><code>alpine</code></td>
|
||||
<td>Latest stable release (aka {{kener_full_version}})</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name={{kener_full_version}}-alpine" target="_blank"><code>{{kener_full_version}}-alpine</code></a></td>
|
||||
<td>Specific release version</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name={{kener_major_minor_version}}-alpine" target="_blank"><code>{{kener_major_minor_version}}-alpine</code></a></td>
|
||||
<td>Major-minor version tag pointing to the latest patch ({{kener_full_version}}) release within that minor version ({{kener_major_minor_version}}.x)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name={{kener_major_version}}-alpine" target="_blank"><code>{{kener_major_version}}-alpine</code></a></td>
|
||||
<td>Major version tag pointing to the latest stable ({{kener_full_version}}) release within that major version ({{kener_major_version}}.x.x)</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
#### Usage
|
||||
|
||||
Pull the latest stable version:
|
||||
|
||||
```sh
|
||||
docker pull rajnandan1/kener:latest
|
||||
```
|
||||
|
||||
Or use the smaller, Alpine-based variant:
|
||||
|
||||
```sh
|
||||
docker pull rajnandan1/kener:alpine
|
||||
```
|
||||
|
||||
For a production setup, refer to the sample [docker-compose.yml](https://github.com/rajnandan1/kener/blob/main/docker-compose.yml).
|
||||
This keeps things clean, structured, and easy to read while preserving all the details.
|
||||
|
||||
### One Click
|
||||
|
||||
[](https://railway.com/template/spSvic?referralCode=1Pn7vs)
|
||||
|
||||
## Features
|
||||
|
||||
Here are some of the features that you get out of the box. Please read the documentation to know how to use them.
|
||||
|
||||
### 📊 Monitoring and Tracking
|
||||
|
||||
- Advanced **application performance monitoring** tools
|
||||
- **Real-time network monitoring** capabilities
|
||||
- Supports **polling HTTP endpoints** or **pushing data** via REST APIs
|
||||
- **Timezone auto-adjustment** for visitors
|
||||
- Organize monitors into **custom sections**
|
||||
- **Cron-based scheduling** (minimum: **every minute**)
|
||||
- **Create complex API polls** (chaining, secrets, etc.)
|
||||
- Set a **default status** for monitors
|
||||
- Supports **base path hosting in Kubernetes (k8s)**
|
||||
- **Pre-built Docker images** for easy deployment
|
||||
|
||||
### 🎨 Customization and Branding
|
||||
|
||||
- Fully **customizable status page**
|
||||
- **Badge generation** for status and uptime tracking
|
||||
- Support for **custom domains**
|
||||
- Embed monitors as **iframes or widgets**
|
||||
- **Light & Dark Mode**
|
||||
- **Internationalization (i18n) support**
|
||||
- **Sleek, beautifully crafted UI**
|
||||
|
||||
### 🚨 Incident Management
|
||||
|
||||
- **Incident tracking & communication** tools
|
||||
- **Comprehensive APIs** for incident management
|
||||
|
||||
### 🧑💻 User Experience and Design
|
||||
|
||||
- **Accessible & user-friendly interface**
|
||||
- **Quick & easy installation**
|
||||
- **Responsive design** for all devices
|
||||
- **Auto SEO & Social Media ready**
|
||||
- **Server-Side Rendering (SSR) for better performance**
|
||||
|
||||
<div align="left">
|
||||
<img alt="Visitor Stats" src="https://widgetbite.com/stats/rajnandan"/>
|
||||
</div>
|
||||
|
||||
## Technologies Used
|
||||
|
||||
- [SvelteKit](https://kit.svelte.dev/)
|
||||
- [shadcn-svelte](https://www.shadcn-svelte.com/)
|
||||
|
||||
## Support Me
|
||||
|
||||
If you’re enjoying Kener and want to support its development, consider sponsoring me on GitHub or treating me to a coffee. Your support helps keep the project growing! 🚀
|
||||
|
||||
[Sponsor Me Using Github](https://github.com/sponsors/rajnandan1)
|
||||
|
||||
☕ [Buy Me a Coffee](https://www.buymeacoffee.com/rajnandan1)
|
||||
|
||||

|
||||
|
||||
## Contributing
|
||||
|
||||
If you want to contribute to Kener, please read the [Contribution Guide](https://github.com/rajnandan1/kener/blob/main/.github/CONTRIBUTING.md).
|
||||
|
||||
## Star History
|
||||
|
||||
[](https://star-history.com/#rajnandan1/kener&Date)
|
||||
@@ -1 +0,0 @@
|
||||
.toggle.svelte-1rrlwjr.svelte-1rrlwjr{display:none;transition:all .15s ease-in-out}.toggle.open.svelte-1rrlwjr.svelte-1rrlwjr{transform:rotate(180deg)}.incident-div.svelte-1rrlwjr:hover .toggle.svelte-1rrlwjr{display:block}
|
||||
@@ -1 +0,0 @@
|
||||
.daygrid90.svelte-1nwu38p.svelte-1nwu38p{-ms-overflow-style:none;scrollbar-width:none}.daygrid90.svelte-1nwu38p.svelte-1nwu38p::-webkit-scrollbar{display:none}.oneline.svelte-1nwu38p.svelte-1nwu38p{transition:transform .1s ease-in;cursor:pointer}.oneline.svelte-1nwu38p.svelte-1nwu38p:hover{transform:scaleY(1.2)}.oneline.svelte-1nwu38p:hover+.show-hover.svelte-1nwu38p{display:block!important}.show-hover.svelte-1nwu38p.svelte-1nwu38p{display:none;top:40px;padding:0;text-align:left}.today-sq+.hiddenx.svelte-1nwu38p .message.svelte-1nwu38p{position:absolute;white-space:nowrap}.today-sq.svelte-1nwu38p+.hiddenx.svelte-1nwu38p{visibility:hidden;z-index:30}.today-sq.svelte-1nwu38p:hover+.hiddenx.svelte-1nwu38p{visibility:visible}.today-sq.svelte-1nwu38p.svelte-1nwu38p:hover{box-shadow:#32326926 0 2px 5px,#0000000d 0 1px 1px;opacity:.75;transition:all .1s ease-in;cursor:pointer}.today-sq.svelte-1nwu38p.svelte-1nwu38p{position:relative;z-index:0}
|
||||
@@ -1 +0,0 @@
|
||||
import{s as u,I as r,J as i,y as m,A as d,B as p,C as g}from"./scheduler.8852886c.js";import{S as $,i as h,b as C,d as v,m as b,a as _,t as f,e as I}from"./index.fb8f3617.js";import{I as N,g as w,d as S}from"./Icon.7b7db889.js";function j(l){let e;const s=l[2].default,o=m(s,l,l[3],null);return{c(){o&&o.c()},l(n){o&&o.l(n)},m(n,t){o&&o.m(n,t),e=!0},p(n,t){o&&o.p&&(!e||t&8)&&d(o,s,n,n[3],e?g(s,n[3],t,null):p(n[3]),null)},i(n){e||(_(o,n),e=!0)},o(n){f(o,n),e=!1},d(n){o&&o.d(n)}}}function q(l){let e,s;const o=[{name:"chevron-down"},l[1],{iconNode:l[0]}];let n={$$slots:{default:[j]},$$scope:{ctx:l}};for(let t=0;t<o.length;t+=1)n=r(n,o[t]);return e=new N({props:n}),{c(){C(e.$$.fragment)},l(t){v(e.$$.fragment,t)},m(t,a){b(e,t,a),s=!0},p(t,[a]){const c=a&3?w(o,[o[0],a&2&&S(t[1]),a&1&&{iconNode:t[0]}]):{};a&8&&(c.$$scope={dirty:a,ctx:t}),e.$set(c)},i(t){s||(_(e.$$.fragment,t),s=!0)},o(t){f(e.$$.fragment,t),s=!1},d(t){I(e,t)}}}function A(l,e,s){let{$$slots:o={},$$scope:n}=e;const t=[["path",{d:"m6 9 6 6 6-6"}]];return l.$$set=a=>{s(1,e=r(r({},e),i(a))),"$$scope"in a&&s(3,n=a.$$scope)},e=i(e),[t,e,o,n]}class B extends ${constructor(e){super(),h(this,e,A,q,u,{})}}const z=B;export{z as C};
|
||||
@@ -1 +0,0 @@
|
||||
import{R as a}from"./scheduler.8852886c.js";function i(){const n=a();return t=>{const{originalEvent:e}=t.detail,{cancelable:r}=t,c=e.type;n(c,{originalEvent:e,currentTarget:e.currentTarget},{cancelable:r})||t.preventDefault()}}export{i as c};
|
||||
@@ -1 +0,0 @@
|
||||
const o=typeof window<"u"?window:typeof globalThis<"u"?globalThis:global;export{o as g};
|
||||
@@ -1 +0,0 @@
|
||||
import{u as b,s as w,$ as m,N as q,T as x}from"./scheduler.8852886c.js";const a=[];function z(s,u){return{subscribe:A(s,u).subscribe}}function A(s,u=b){let t;const r=new Set;function o(n){if(w(s,n)&&(s=n,t)){const i=!a.length;for(const e of r)e[1](),a.push(e,s);if(i){for(let e=0;e<a.length;e+=2)a[e][0](a[e+1]);a.length=0}}}function f(n){o(n(s))}function l(n,i=b){const e=[n,i];return r.add(e),r.size===1&&(t=u(o,f)||b),n(s),()=>{r.delete(e),r.size===0&&t&&(t(),t=null)}}return{set:o,update:f,subscribe:l}}function E(s,u,t){const r=!Array.isArray(s),o=r?[s]:s;if(!o.every(Boolean))throw new Error("derived() expects stores as input, got a falsy value");const f=u.length<2;return z(t,(l,n)=>{let i=!1;const e=[];let d=0,p=b;const y=()=>{if(d)return;p();const c=u(r?e[0]:e,l,n);f?l(c):p=x(c)?c:b},h=o.map((c,g)=>m(c,_=>{e[g]=_,d&=~(1<<g),i&&y()},()=>{d|=1<<g}));return i=!0,y(),function(){q(h),p(),i=!1}})}function N(s){return{subscribe:s.subscribe.bind(s)}}export{N as a,E as d,z as r,A as w};
|
||||
@@ -1,4 +0,0 @@
|
||||
var K=Object.defineProperty;var Q=(t,e,n)=>e in t?K(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var A=(t,e,n)=>(Q(t,typeof e!="symbol"?e+"":e,n),n);import{u as w,a0 as W,d as q,a1 as X,N as E,T as j,O,a2 as Y,a3 as I,a4 as U,h as Z,a5 as tt,a6 as et,a7 as nt,a8 as it,a9 as V,aa as st,ab as rt,ac as at,ad as ot,ae as ft}from"./scheduler.8852886c.js";const G=typeof window<"u";let B=G?()=>window.performance.now():()=>Date.now(),D=G?t=>requestAnimationFrame(t):w;const k=new Set;function H(t){k.forEach(e=>{e.c(t)||(k.delete(e),e.f())}),k.size!==0&&D(H)}function F(t){let e;return k.size===0&&D(H),{promise:new Promise(n=>{k.add(e={c:t,f:n})}),abort(){k.delete(e)}}}const N=new Map;let P=0;function ut(t){let e=5381,n=t.length;for(;n--;)e=(e<<5)-e^t.charCodeAt(n);return e>>>0}function ct(t,e){const n={stylesheet:X(e),rules:{}};return N.set(t,n),n}function R(t,e,n,s,u,a,c,i=0){const l=16.666/s;let r=`{
|
||||
`;for(let $=0;$<=1;$+=l){const m=e+(n-e)*a($);r+=$*100+`%{${c(m,1-m)}}
|
||||
`}const d=r+`100% {${c(n,1-n)}}
|
||||
}`,f=`__svelte_${ut(d)}_${i}`,g=W(t),{stylesheet:h,rules:o}=N.get(g)||ct(g,t);o[f]||(o[f]=!0,h.insertRule(`@keyframes ${f} ${d}`,h.cssRules.length));const _=t.style.animation||"";return t.style.animation=`${_?`${_}, `:""}${f} ${s}ms linear ${u}ms 1 both`,P+=1,f}function z(t,e){const n=(t.style.animation||"").split(", "),s=n.filter(e?a=>a.indexOf(e)<0:a=>a.indexOf("__svelte")===-1),u=n.length-s.length;u&&(t.style.animation=s.join(", "),P-=u,P||lt())}function lt(){D(()=>{P||(N.forEach(t=>{const{ownerNode:e}=t.stylesheet;e&&q(e)}),N.clear())})}let S;function L(){return S||(S=Promise.resolve(),S.then(()=>{S=null})),S}function v(t,e,n){t.dispatchEvent(Y(`${e?"intro":"outro"}${n}`))}const M=new Set;let p;function yt(){p={r:0,c:[],p}}function xt(){p.r||E(p.c),p=p.p}function dt(t,e){t&&t.i&&(M.delete(t),t.i(e))}function vt(t,e,n,s){if(t&&t.o){if(M.has(t))return;M.add(t),p.c.push(()=>{M.delete(t),s&&(n&&t.d(1),s())}),t.o(e)}else s&&s()}const T={duration:0};function wt(t,e,n){const s={direction:"in"};let u=e(t,n,s),a=!1,c,i,l=0;function r(){c&&z(t,c)}function d(){const{delay:g=0,duration:h=300,easing:o=I,tick:_=w,css:$}=u||T;$&&(c=R(t,0,1,h,g,o,$,l++)),_(0,1);const m=B()+g,y=m+h;i&&i.abort(),a=!0,O(()=>v(t,!0,"start")),i=F(x=>{if(a){if(x>=y)return _(1,0),v(t,!0,"end"),r(),a=!1;if(x>=m){const b=o((x-m)/h);_(b,1-b)}}return a})}let f=!1;return{start(){f||(f=!0,z(t),j(u)?(u=u(s),L().then(d)):d())},invalidate(){f=!1},end(){a&&(r(),a=!1)}}}function bt(t,e,n){const s={direction:"out"};let u=e(t,n,s),a=!0,c;const i=p;i.r+=1;let l;function r(){const{delay:d=0,duration:f=300,easing:g=I,tick:h=w,css:o}=u||T;o&&(c=R(t,1,0,f,d,g,o));const _=B()+d,$=_+f;O(()=>v(t,!1,"start")),"inert"in t&&(l=t.inert,t.inert=!0),F(m=>{if(a){if(m>=$)return h(0,1),v(t,!1,"end"),--i.r||E(i.c),!1;if(m>=_){const y=g((m-_)/f);h(1-y,y)}}return a})}return j(u)?L().then(()=>{u=u(s),r()}):r(),{end(d){d&&"inert"in t&&(t.inert=l),d&&u.tick&&u.tick(1,0),a&&(c&&z(t,c),a=!1)}}}function kt(t,e,n,s){let a=e(t,n,{direction:"both"}),c=s?0:1,i=null,l=null,r=null,d;function f(){r&&z(t,r)}function g(o,_){const $=o.b-c;return _*=Math.abs($),{a:c,b:o.b,d:$,duration:_,start:o.start,end:o.start+_,group:o.group}}function h(o){const{delay:_=0,duration:$=300,easing:m=I,tick:y=w,css:x}=a||T,b={start:B()+_,b:o};o||(b.group=p,p.r+=1),"inert"in t&&(o?d!==void 0&&(t.inert=d):(d=t.inert,t.inert=!0)),i||l?l=b:(x&&(f(),r=R(t,c,o,$,_,m,x)),o&&y(0,1),i=g(b,$),O(()=>v(t,o,"start")),F(C=>{if(l&&C>l.start&&(i=g(l,$),l=null,v(t,i.b,"start"),x&&(f(),r=R(t,c,i.b,i.duration,0,m,a.css))),i){if(C>=i.end)y(c=i.b,1-c),v(t,i.b,"end"),l||(i.b?f():--i.group.r||E(i.group.c)),i=null;else if(C>=i.start){const J=C-i.start;c=i.a+i.d*m(J/i.duration),y(c,1-c)}}return!!(i||l)}))}return{run(o){j(a)?L().then(()=>{a=a({direction:o?"in":"out"}),h(o)}):h(o)},end(){f(),i=l=null}}}function Et(t,e,n){const s=t.$$.props[e];s!==void 0&&(t.$$.bound[s]=n,n(t.$$.ctx[s]))}function St(t){t&&t.c()}function Ot(t,e){t&&t.l(e)}function _t(t,e,n){const{fragment:s,after_update:u}=t.$$;s&&s.m(e,n),O(()=>{const a=t.$$.on_mount.map(st).filter(j);t.$$.on_destroy?t.$$.on_destroy.push(...a):E(a),t.$$.on_mount=[]}),u.forEach(O)}function $t(t,e){const n=t.$$;n.fragment!==null&&(nt(n.after_update),E(n.on_destroy),n.fragment&&n.fragment.d(e),n.on_destroy=n.fragment=null,n.ctx=[])}function ht(t,e){t.$$.dirty[0]===-1&&(rt.push(t),at(),t.$$.dirty.fill(0)),t.$$.dirty[e/31|0]|=1<<e%31}function jt(t,e,n,s,u,a,c=null,i=[-1]){const l=it;V(t);const r=t.$$={fragment:null,ctx:[],props:a,update:w,not_equal:u,bound:U(),on_mount:[],on_destroy:[],on_disconnect:[],before_update:[],after_update:[],context:new Map(e.context||(l?l.$$.context:[])),callbacks:U(),dirty:i,skip_bound:!1,root:e.target||l.$$.root};c&&c(r.root);let d=!1;if(r.ctx=n?n(t,e.props||{},(f,g,...h)=>{const o=h.length?h[0]:g;return r.ctx&&u(r.ctx[f],r.ctx[f]=o)&&(!r.skip_bound&&r.bound[f]&&r.bound[f](o),d&&ht(t,f)),g}):[],r.update(),d=!0,E(r.before_update),r.fragment=s?s(r.ctx):!1,e.target){if(e.hydrate){ot();const f=Z(e.target);r.fragment&&r.fragment.l(f),f.forEach(q)}else r.fragment&&r.fragment.c();e.intro&&dt(t.$$.fragment),_t(t,e.target,e.anchor),ft(),tt()}V(l)}class Ct{constructor(){A(this,"$$");A(this,"$$set")}$destroy(){$t(this,1),this.$destroy=w}$on(e,n){if(!j(n))return w;const s=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return s.push(n),()=>{const u=s.indexOf(n);u!==-1&&s.splice(u,1)}}$set(e){this.$$set&&!et(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}const gt="4";typeof window<"u"&&(window.__svelte||(window.__svelte={v:new Set})).v.add(gt);export{Ct as S,dt as a,St as b,xt as c,Ot as d,$t as e,bt as f,yt as g,wt as h,jt as i,kt as j,Et as k,_t as m,vt as t};
|
||||
@@ -1 +0,0 @@
|
||||
var s;const e=((s=globalThis.__sveltekit_2uw5wz)==null?void 0:s.base)??"";var a;const t=((a=globalThis.__sveltekit_2uw5wz)==null?void 0:a.assets)??e;export{t as a,e as b};
|
||||
@@ -1 +0,0 @@
|
||||
import{w as u}from"./index.97524e95.js";import{a as b}from"./paths.0183ef73.js";const v="1711082439422",A="sveltekit:snapshot",R="sveltekit:scroll",y="sveltekit:index",f={tap:1,hover:2,viewport:3,eager:4,off:-1},_=location.origin;function I(e){let t=e.baseURI;if(!t){const n=e.getElementsByTagName("base");t=n.length?n[0].href:e.URL}return t}function S(){return{x:pageXOffset,y:pageYOffset}}function c(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const d={...f,"":f.hover};function g(e){let t=e.assignedSlot??e.parentNode;return(t==null?void 0:t.nodeType)===11&&(t=t.host),t}function T(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=g(e)}}function x(e,t){let n;try{n=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI)}catch{}const s=e instanceof SVGAElement?e.target.baseVal:e.target,r=!n||!!s||k(n,t)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),l=(n==null?void 0:n.origin)===_&&e.hasAttribute("download");return{url:n,external:r,target:s,download:l}}function O(e){let t=null,n=null,s=null,r=null,l=null,o=null,a=e;for(;a&&a!==document.documentElement;)s===null&&(s=c(a,"preload-code")),r===null&&(r=c(a,"preload-data")),t===null&&(t=c(a,"keepfocus")),n===null&&(n=c(a,"noscroll")),l===null&&(l=c(a,"reload")),o===null&&(o=c(a,"replacestate")),a=g(a);function i(h){switch(h){case"":case"true":return!0;case"off":case"false":return!1;default:return null}}return{preload_code:d[s??"off"],preload_data:d[r??"off"],keep_focus:i(t),noscroll:i(n),reload:i(l),replace_state:i(o)}}function p(e){const t=u(e);let n=!0;function s(){n=!0,t.update(o=>o)}function r(o){n=!1,t.set(o)}function l(o){let a;return t.subscribe(i=>{(a===void 0||n&&i!==a)&&o(a=i)})}return{notify:s,set:r,subscribe:l}}function m(){const{set:e,subscribe:t}=u(!1);let n;async function s(){clearTimeout(n);try{const r=await fetch(`${b}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const o=(await r.json()).version!==v;return o&&(e(!0),clearTimeout(n)),o}catch{return!1}}return{subscribe:t,check:s}}function k(e,t){return e.origin!==_||!e.pathname.startsWith(t)}function U(e){e.client}const L={url:p({}),page:p({}),navigating:u(null),updated:m()};export{y as I,f as P,R as S,A as a,x as b,O as c,L as d,U as e,T as f,I as g,k as i,_ as o,S as s};
|
||||
@@ -1 +0,0 @@
|
||||
import{d as e}from"./singletons.a5bf3c68.js";const r=()=>{const s=e;return{page:{subscribe:s.page.subscribe},navigating:{subscribe:s.navigating.subscribe},updated:s.updated}},b={subscribe(s){return r().page.subscribe(s)}};export{b as p};
|
||||
@@ -1 +0,0 @@
|
||||
import{s as x,f as u,l as h,a as S,g as d,h as v,m as g,d as m,c as q,i as _,r as E,n as $,u as b,E as y}from"../chunks/scheduler.8852886c.js";import{S as C,i as H}from"../chunks/index.fb8f3617.js";import{p as P}from"../chunks/stores.ba51b889.js";function j(i){var f;let a,s=i[0].status+"",r,o,n,p=((f=i[0].error)==null?void 0:f.message)+"",c;return{c(){a=u("h1"),r=h(s),o=S(),n=u("p"),c=h(p)},l(e){a=d(e,"H1",{});var t=v(a);r=g(t,s),t.forEach(m),o=q(e),n=d(e,"P",{});var l=v(n);c=g(l,p),l.forEach(m)},m(e,t){_(e,a,t),E(a,r),_(e,o,t),_(e,n,t),E(n,c)},p(e,[t]){var l;t&1&&s!==(s=e[0].status+"")&&$(r,s),t&1&&p!==(p=((l=e[0].error)==null?void 0:l.message)+"")&&$(c,p)},i:b,o:b,d(e){e&&(m(a),m(o),m(n))}}}function k(i,a,s){let r;return y(i,P,o=>s(0,r=o)),[r]}class B extends C{constructor(a){super(),H(this,a,k,j,x,{})}}export{B as component};
|
||||
@@ -1,2 +0,0 @@
|
||||
import{s as S,e as b,i as _,d as u,E as y,o as P,p as j,f as k,g as x,h as M,j as d,a as F,F as C,c as I,u as O,x as q}from"../chunks/scheduler.8852886c.js";import{S as B,i as W,t as m,c as L,a as i,g as H,b as p,d as h,m as $,e as g}from"../chunks/index.fb8f3617.js";import{e as v}from"../chunks/ctx.1e61a5a6.js";import{M as A}from"../chunks/monitor.b8d7520d.js";import{C as N,a as z}from"../chunks/Icon.7b7db889.js";import"../chunks/axios.baaa6432.js";import{p as D}from"../chunks/stores.ba51b889.js";function E(l,t,o){const n=l.slice();return n[5]=t[o],n}function G(l){let t,o,n;return o=new N({props:{class:"mx-auto",$$slots:{default:[Q]},$$scope:{ctx:l}}}),{c(){t=k("section"),p(o.$$.fragment),this.h()},l(e){t=x(e,"SECTION",{class:!0,id:!0});var a=M(t);h(o.$$.fragment,a),a.forEach(u),this.h()},h(){d(t,"class","mx-auto bg-transparent mb-4 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center"),d(t,"id","")},m(e,a){_(e,t,a),$(o,t,null),n=!0},p(e,a){const r={};a&256&&(r.$$scope={dirty:a,ctx:e}),o.$set(r)},i(e){n||(i(o.$$.fragment,e),n=!0)},o(e){m(o.$$.fragment,e),n=!1},d(e){e&&u(t),g(o)}}}function J(l){let t,o,n;return o=new N({props:{class:"w-[580px] border-0 shadow-none",$$slots:{default:[U]},$$scope:{ctx:l}}}),{c(){t=k("section"),p(o.$$.fragment),this.h()},l(e){t=x(e,"SECTION",{class:!0});var a=M(t);h(o.$$.fragment,a),a.forEach(u),this.h()},h(){d(t,"class","w-fit p-0")},m(e,a){_(e,t,a),$(o,t,null),l[3](t),n=!0},p(e,a){const r={};a&257&&(r.$$scope={dirty:a,ctx:e}),o.$set(r)},i(e){n||(i(o.$$.fragment,e),n=!0)},o(e){m(o.$$.fragment,e),n=!1},d(e){e&&u(t),g(o),l[3](null)}}}function K(l){let t,o="No Monitor Found.",n,e,a=`Please read the documentation on how to add monitors
|
||||
<a href="https://kener.ing/docs#h1add-monitors" target="_blank" class="underline">here</a>.`;return{c(){t=k("h1"),t.textContent=o,n=F(),e=k("p"),e.innerHTML=a,this.h()},l(r){t=x(r,"H1",{class:!0,"data-svelte-h":!0}),C(t)!=="svelte-1vwlrnd"&&(t.textContent=o),n=I(r),e=x(r,"P",{class:!0,"data-svelte-h":!0}),C(e)!=="svelte-oy4ufi"&&(e.innerHTML=a),this.h()},h(){d(t,"class","scroll-m-20 text-2xl font-extrabold tracking-tight lg:text-2xl text-center"),d(e,"class","mt-3 text-center")},m(r,c){_(r,t,c),_(r,n,c),_(r,e,c)},p:O,d(r){r&&(u(t),u(n),u(e))}}}function Q(l){let t,o;return t=new z({props:{class:"pt-4",$$slots:{default:[K]},$$scope:{ctx:l}}}),{c(){p(t.$$.fragment)},l(n){h(t.$$.fragment,n)},m(n,e){$(t,n,e),o=!0},p(n,e){const a={};e&256&&(a.$$scope={dirty:e,ctx:n}),t.$set(a)},i(n){o||(i(t.$$.fragment,n),o=!0)},o(n){m(t.$$.fragment,n),o=!1},d(n){g(t,n)}}}function T(l){let t,o;return t=new A({props:{monitor:l[5],localTz:l[0].localTz}}),t.$on("heightChange",l[2]),{c(){p(t.$$.fragment)},l(n){h(t.$$.fragment,n)},m(n,e){$(t,n,e),o=!0},p(n,e){const a={};e&1&&(a.monitor=n[5]),e&1&&(a.localTz=n[0].localTz),t.$set(a)},i(n){o||(i(t.$$.fragment,n),o=!0)},o(n){m(t.$$.fragment,n),o=!1},d(n){g(t,n)}}}function R(l){let t,o,n=v(l[0].monitors),e=[];for(let r=0;r<n.length;r+=1)e[r]=T(E(l,n,r));const a=r=>m(e[r],1,1,()=>{e[r]=null});return{c(){for(let r=0;r<e.length;r+=1)e[r].c();t=b()},l(r){for(let c=0;c<e.length;c+=1)e[c].l(r);t=b()},m(r,c){for(let s=0;s<e.length;s+=1)e[s]&&e[s].m(r,c);_(r,t,c),o=!0},p(r,c){if(c&5){n=v(r[0].monitors);let s;for(s=0;s<n.length;s+=1){const f=E(r,n,s);e[s]?(e[s].p(f,c),i(e[s],1)):(e[s]=T(f),e[s].c(),i(e[s],1),e[s].m(t.parentNode,t))}for(H(),s=n.length;s<e.length;s+=1)a(s);L()}},i(r){if(!o){for(let c=0;c<n.length;c+=1)i(e[c]);o=!0}},o(r){e=e.filter(Boolean);for(let c=0;c<e.length;c+=1)m(e[c]);o=!1},d(r){r&&u(t),q(e,r)}}}function U(l){let t,o;return t=new z({props:{class:"p-0 monitors-card ",$$slots:{default:[R]},$$scope:{ctx:l}}}),{c(){p(t.$$.fragment)},l(n){h(t.$$.fragment,n)},m(n,e){$(t,n,e),o=!0},p(n,e){const a={};e&257&&(a.$$scope={dirty:e,ctx:n}),t.$set(a)},i(n){o||(i(t.$$.fragment,n),o=!0)},o(n){m(t.$$.fragment,n),o=!1},d(n){g(t,n)}}}function V(l){let t,o,n,e;const a=[J,G],r=[];function c(s,f){return s[0].monitors.length>0?0:1}return t=c(l),o=r[t]=a[t](l),{c(){o.c(),n=b()},l(s){o.l(s),n=b()},m(s,f){r[t].m(s,f),_(s,n,f),e=!0},p(s,[f]){let w=t;t=c(s),t===w?r[t].p(s,f):(H(),m(r[w],1,1,()=>{r[w]=null}),L(),o=r[t],o?o.p(s,f):(o=r[t]=a[t](s),o.c()),i(o,1),o.m(n.parentNode,n))},i(s){e||(i(o),e=!0)},o(s){m(o),e=!1},d(s){s&&u(n),r[t].d(s)}}}function X(l,t,o){let n;y(l,D,s=>o(4,n=s));let e,{data:a}=t;function r(s){window.parent.postMessage({height:e.offsetHeight,width:e.offsetWidth,slug:n.params.tag},"*")}P(()=>{a.theme==="dark"?(document.documentElement.classList.add("dark"),document.documentElement.classList.add("dark:bg-background")):(document.documentElement.classList.remove("dark"),document.documentElement.classList.remove("dark:bg-background"))});function c(s){j[s?"unshift":"push"](()=>{e=s,o(1,e)})}return l.$$set=s=>{"data"in s&&o(0,a=s.data)},[a,e,r,c]}class se extends B{constructor(t){super(),W(this,t,X,V,S,{data:0})}}export{se as component};
|
||||
@@ -1 +0,0 @@
|
||||
{"version":"1711082439422"}
|
||||
|
Before Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 339 KiB |
|
Before Width: | Height: | Size: 460 KiB |
|
Before Width: | Height: | Size: 162 KiB |
|
Before Width: | Height: | Size: 242 KiB |
|
Before Width: | Height: | Size: 547 KiB |
|
Before Width: | Height: | Size: 368 KiB |
|
Before Width: | Height: | Size: 655 KiB |
|
Before Width: | Height: | Size: 677 KiB |
|
Before Width: | Height: | Size: 508 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
@@ -1 +0,0 @@
|
||||
User-agent: *
|
||||
|
Before Width: | Height: | Size: 420 KiB |
|
Before Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 9.1 KiB |
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="256px" height="308px" viewBox="0 0 256 308" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
|
||||
<g>
|
||||
<path d="M239.681566,40.706757 C211.113272,-0.181889366 154.69089,-12.301439 113.894816,13.6910393 L42.2469062,59.3555354 C22.6760042,71.6680028 9.1958152,91.6538543 5.11196889,114.412133 C1.69420521,133.371174 4.6982178,152.928576 13.6483951,169.987905 C7.51549676,179.291145 3.33259428,189.7413 1.3524912,200.706787 C-2.77083771,223.902098 2.62286977,247.780539 16.3159596,266.951444 C44.8902975,307.843936 101.312954,319.958266 142.10271,293.967161 L213.75062,248.302665 C233.322905,235.991626 246.803553,216.005094 250.885557,193.246067 C254.302867,174.287249 251.30121,154.730228 242.355449,137.668922 C248.486748,128.365895 252.667894,117.916162 254.646134,106.951413 C258.772188,83.7560394 253.378243,59.8765465 239.682665,40.706757" fill="#FF3E00"></path>
|
||||
<path d="M106.888658,270.841265 C83.7871855,276.848065 59.3915045,267.805346 45.7864111,248.192566 C37.5477583,236.66102 34.3023491,222.296573 36.7830958,208.343155 C37.1989333,206.075414 37.7711933,203.839165 38.4957755,201.650433 L39.845476,197.534835 L43.5173097,200.231763 C51.9971301,206.462491 61.4784803,211.199728 71.5527203,214.239302 L74.2164003,215.047419 L73.9710252,217.705878 C73.6455499,221.487851 74.6696022,225.262925 76.8616703,228.361972 C80.9560313,234.269749 88.3011363,236.995968 95.2584831,235.190159 C96.8160691,234.773852 98.3006859,234.121384 99.6606718,233.25546 L171.331634,187.582718 C174.877468,185.349963 177.321139,181.729229 178.065299,177.605596 C178.808171,173.400048 177.830501,169.072361 175.351884,165.594581 C171.255076,159.685578 163.908134,156.9582 156.947927,158.762547 C155.392392,159.178888 153.90975,159.83088 152.551509,160.695872 L125.202489,178.130144 C120.705281,180.989558 115.797437,183.144784 110.64897,184.521162 C87.547692,190.527609 63.1523949,181.484801 49.5475471,161.872188 C41.3085624,150.340895 38.0631179,135.976391 40.5442317,122.023052 C43.0002744,108.333716 51.1099574,96.3125326 62.8835328,88.9089537 L134.548175,43.2323647 C139.047294,40.3682559 143.958644,38.21032 149.111311,36.8336525 C172.21244,30.8273594 196.607527,39.8700206 210.212459,59.4823515 C218.451112,71.013898 221.696522,85.3783452 219.215775,99.3317627 C218.798144,101.59911 218.225915,103.835236 217.503095,106.024485 L216.153395,110.140083 L212.483484,107.447276 C204.004261,101.212984 194.522,96.4735732 184.44615,93.4336926 L181.78247,92.6253012 L182.027845,89.9668419 C182.350522,86.1852063 181.326723,82.4111645 179.1372,79.3110228 C175.042839,73.4032457 167.697734,70.677026 160.740387,72.4828355 C159.182801,72.8991426 157.698185,73.5516104 156.338199,74.4175344 L84.6672364,120.0922 C81.1218886,122.323199 78.6795938,125.943704 77.9387928,130.066574 C77.1913232,134.271925 78.1673502,138.601163 80.6469865,142.078963 C84.7438467,147.987899 92.0907405,150.71526 99.0509435,148.910997 C100.608143,148.493836 102.092543,147.841423 103.452857,146.976298 L130.798305,129.548621 C135.293566,126.685437 140.201191,124.528302 145.350175,123.152382 C168.451453,117.145935 192.846751,126.188743 206.451598,145.801356 C214.690583,157.332649 217.936027,171.697153 215.454914,185.650492 C212.997261,199.340539 204.888162,211.362752 193.115613,218.769811 L121.450695,264.442553 C116.951576,267.306662 112.040226,269.464598 106.887559,270.841265" fill="#FFFFFF"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.4 KiB |
@@ -1,37 +0,0 @@
|
||||
/* global "" */
|
||||
|
||||
const expected = new Set([
|
||||
'SOCKET_PATH',
|
||||
'HOST',
|
||||
'PORT',
|
||||
'ORIGIN',
|
||||
'XFF_DEPTH',
|
||||
'ADDRESS_HEADER',
|
||||
'PROTOCOL_HEADER',
|
||||
'HOST_HEADER',
|
||||
'BODY_SIZE_LIMIT'
|
||||
]);
|
||||
|
||||
if ("") {
|
||||
for (const name in process.env) {
|
||||
if (name.startsWith("")) {
|
||||
const unprefixed = name.slice("".length);
|
||||
if (!expected.has(unprefixed)) {
|
||||
throw new Error(
|
||||
`You should change envPrefix (${""}) to avoid conflicts with existing environment variables — unexpectedly saw ${name}`
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} name
|
||||
* @param {any} fallback
|
||||
*/
|
||||
function env(name, fallback) {
|
||||
const prefixed = "" + name;
|
||||
return prefixed in process.env ? process.env[prefixed] : fallback;
|
||||
}
|
||||
|
||||
export { env };
|
||||
@@ -1,225 +0,0 @@
|
||||
import { handler } from './handler.js';
|
||||
import { env } from './env.js';
|
||||
import http from 'http';
|
||||
import * as qs from 'querystring';
|
||||
|
||||
function parse$1 (str, loose) {
|
||||
if (str instanceof RegExp) return { keys:false, pattern:str };
|
||||
var c, o, tmp, ext, keys=[], pattern='', arr = str.split('/');
|
||||
arr[0] || arr.shift();
|
||||
|
||||
while (tmp = arr.shift()) {
|
||||
c = tmp[0];
|
||||
if (c === '*') {
|
||||
keys.push('wild');
|
||||
pattern += '/(.*)';
|
||||
} else if (c === ':') {
|
||||
o = tmp.indexOf('?', 1);
|
||||
ext = tmp.indexOf('.', 1);
|
||||
keys.push( tmp.substring(1, !!~o ? o : !!~ext ? ext : tmp.length) );
|
||||
pattern += !!~o && !~ext ? '(?:/([^/]+?))?' : '/([^/]+?)';
|
||||
if (!!~ext) pattern += (!!~o ? '?' : '') + '\\' + tmp.substring(ext);
|
||||
} else {
|
||||
pattern += '/' + tmp;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
keys: keys,
|
||||
pattern: new RegExp('^' + pattern + (loose ? '(?=$|\/)' : '\/?$'), 'i')
|
||||
};
|
||||
}
|
||||
|
||||
class Trouter {
|
||||
constructor() {
|
||||
this.routes = [];
|
||||
|
||||
this.all = this.add.bind(this, '');
|
||||
this.get = this.add.bind(this, 'GET');
|
||||
this.head = this.add.bind(this, 'HEAD');
|
||||
this.patch = this.add.bind(this, 'PATCH');
|
||||
this.options = this.add.bind(this, 'OPTIONS');
|
||||
this.connect = this.add.bind(this, 'CONNECT');
|
||||
this.delete = this.add.bind(this, 'DELETE');
|
||||
this.trace = this.add.bind(this, 'TRACE');
|
||||
this.post = this.add.bind(this, 'POST');
|
||||
this.put = this.add.bind(this, 'PUT');
|
||||
}
|
||||
|
||||
use(route, ...fns) {
|
||||
let handlers = [].concat.apply([], fns);
|
||||
let { keys, pattern } = parse$1(route, true);
|
||||
this.routes.push({ keys, pattern, method:'', handlers });
|
||||
return this;
|
||||
}
|
||||
|
||||
add(method, route, ...fns) {
|
||||
let { keys, pattern } = parse$1(route);
|
||||
let handlers = [].concat.apply([], fns);
|
||||
this.routes.push({ keys, pattern, method, handlers });
|
||||
return this;
|
||||
}
|
||||
|
||||
find(method, url) {
|
||||
let isHEAD=(method === 'HEAD');
|
||||
let i=0, j=0, k, tmp, arr=this.routes;
|
||||
let matches=[], params={}, handlers=[];
|
||||
for (; i < arr.length; i++) {
|
||||
tmp = arr[i];
|
||||
if (tmp.method.length === 0 || tmp.method === method || isHEAD && tmp.method === 'GET') {
|
||||
if (tmp.keys === false) {
|
||||
matches = tmp.pattern.exec(url);
|
||||
if (matches === null) continue;
|
||||
if (matches.groups !== void 0) for (k in matches.groups) params[k]=matches.groups[k];
|
||||
tmp.handlers.length > 1 ? (handlers=handlers.concat(tmp.handlers)) : handlers.push(tmp.handlers[0]);
|
||||
} else if (tmp.keys.length > 0) {
|
||||
matches = tmp.pattern.exec(url);
|
||||
if (matches === null) continue;
|
||||
for (j=0; j < tmp.keys.length;) params[tmp.keys[j]]=matches[++j];
|
||||
tmp.handlers.length > 1 ? (handlers=handlers.concat(tmp.handlers)) : handlers.push(tmp.handlers[0]);
|
||||
} else if (tmp.pattern.test(url)) {
|
||||
tmp.handlers.length > 1 ? (handlers=handlers.concat(tmp.handlers)) : handlers.push(tmp.handlers[0]);
|
||||
}
|
||||
} // else not a match
|
||||
}
|
||||
|
||||
return { params, handlers };
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @typedef ParsedURL
|
||||
* @type {import('.').ParsedURL}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef Request
|
||||
* @property {string} url
|
||||
* @property {ParsedURL} _parsedUrl
|
||||
*/
|
||||
|
||||
/**
|
||||
* @param {Request} req
|
||||
* @returns {ParsedURL|void}
|
||||
*/
|
||||
function parse(req) {
|
||||
let raw = req.url;
|
||||
if (raw == null) return;
|
||||
|
||||
let prev = req._parsedUrl;
|
||||
if (prev && prev.raw === raw) return prev;
|
||||
|
||||
let pathname=raw, search='', query;
|
||||
|
||||
if (raw.length > 1) {
|
||||
let idx = raw.indexOf('?', 1);
|
||||
|
||||
if (idx !== -1) {
|
||||
search = raw.substring(idx);
|
||||
pathname = raw.substring(0, idx);
|
||||
if (search.length > 1) {
|
||||
query = qs.parse(search.substring(1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return req._parsedUrl = { pathname, search, query, raw };
|
||||
}
|
||||
|
||||
function onError(err, req, res) {
|
||||
let code = typeof err.status === 'number' && err.status;
|
||||
code = res.statusCode = (code && code >= 100 ? code : 500);
|
||||
if (typeof err === 'string' || Buffer.isBuffer(err)) res.end(err);
|
||||
else res.end(err.message || http.STATUS_CODES[code]);
|
||||
}
|
||||
|
||||
const mount = fn => fn instanceof Polka ? fn.attach : fn;
|
||||
|
||||
class Polka extends Trouter {
|
||||
constructor(opts={}) {
|
||||
super();
|
||||
this.parse = parse;
|
||||
this.server = opts.server;
|
||||
this.handler = this.handler.bind(this);
|
||||
this.onError = opts.onError || onError; // catch-all handler
|
||||
this.onNoMatch = opts.onNoMatch || this.onError.bind(null, { status: 404 });
|
||||
this.attach = (req, res) => setImmediate(this.handler, req, res);
|
||||
}
|
||||
|
||||
use(base, ...fns) {
|
||||
if (base === '/') {
|
||||
super.use(base, fns.map(mount));
|
||||
} else if (typeof base === 'function' || base instanceof Polka) {
|
||||
super.use('/', [base, ...fns].map(mount));
|
||||
} else {
|
||||
super.use(base,
|
||||
(req, _, next) => {
|
||||
if (typeof base === 'string') {
|
||||
let len = base.length;
|
||||
base.startsWith('/') || len++;
|
||||
req.url = req.url.substring(len) || '/';
|
||||
req.path = req.path.substring(len) || '/';
|
||||
} else {
|
||||
req.url = req.url.replace(base, '') || '/';
|
||||
req.path = req.path.replace(base, '') || '/';
|
||||
}
|
||||
if (req.url.charAt(0) !== '/') {
|
||||
req.url = '/' + req.url;
|
||||
}
|
||||
next();
|
||||
},
|
||||
fns.map(mount),
|
||||
(req, _, next) => {
|
||||
req.path = req._parsedUrl.pathname;
|
||||
req.url = req.path + req._parsedUrl.search;
|
||||
next();
|
||||
}
|
||||
);
|
||||
}
|
||||
return this; // chainable
|
||||
}
|
||||
|
||||
listen() {
|
||||
(this.server = this.server || http.createServer()).on('request', this.attach);
|
||||
this.server.listen.apply(this.server, arguments);
|
||||
return this;
|
||||
}
|
||||
|
||||
handler(req, res, next) {
|
||||
let info = this.parse(req), path = info.pathname;
|
||||
let obj = this.find(req.method, req.path=path);
|
||||
|
||||
req.url = path + info.search;
|
||||
req.originalUrl = req.originalUrl || req.url;
|
||||
req.query = info.query || {};
|
||||
req.search = info.search;
|
||||
req.params = obj.params;
|
||||
|
||||
if (path.length > 1 && path.indexOf('%', 1) !== -1) {
|
||||
for (let k in req.params) {
|
||||
try { req.params[k] = decodeURIComponent(req.params[k]); }
|
||||
catch (e) { /* malform uri segment */ }
|
||||
}
|
||||
}
|
||||
|
||||
let i=0, arr=obj.handlers.concat(this.onNoMatch), len=arr.length;
|
||||
let loop = async () => res.finished || (i < len) && arr[i++](req, res, next);
|
||||
(next = next || (err => err ? this.onError(err, req, res, next) : loop().catch(next)))(); // init
|
||||
}
|
||||
}
|
||||
|
||||
function polka (opts) {
|
||||
return new Polka(opts);
|
||||
}
|
||||
|
||||
const path = env('SOCKET_PATH', false);
|
||||
const host = env('HOST', '0.0.0.0');
|
||||
const port = env('PORT', !path && '3000');
|
||||
|
||||
const server = polka().use(handler);
|
||||
|
||||
server.listen({ path, host, port }, () => {
|
||||
console.log(`Listening on ${path ? path : host + ':' + port}`);
|
||||
});
|
||||
|
||||
export { host, path, port, server };
|
||||
@@ -1,43 +0,0 @@
|
||||
import fs from 'fs-extra';
|
||||
import { p as public_env } from './shared-server-58a5f352.js';
|
||||
|
||||
async function load({ params, route, url, cookies, request }) {
|
||||
let site = JSON.parse(fs.readFileSync(public_env.PUBLIC_KENER_FOLDER + "/site.json", "utf8"));
|
||||
const headers = request.headers;
|
||||
const userAgent = headers.get("user-agent");
|
||||
let localTz = "GMT";
|
||||
const localTzCookie = cookies.get("localTz");
|
||||
if (!!localTzCookie) {
|
||||
localTz = localTzCookie;
|
||||
}
|
||||
let showNav = true;
|
||||
if (url.pathname.startsWith("/embed")) {
|
||||
showNav = false;
|
||||
}
|
||||
let isBot = false;
|
||||
if (userAgent?.includes("Chrome-Lighthouse") || userAgent?.includes("bot")) {
|
||||
isBot = true;
|
||||
}
|
||||
return {
|
||||
site,
|
||||
localTz,
|
||||
showNav,
|
||||
isBot
|
||||
};
|
||||
}
|
||||
|
||||
var _layout_server = /*#__PURE__*/Object.freeze({
|
||||
__proto__: null,
|
||||
load: load
|
||||
});
|
||||
|
||||
const index = 0;
|
||||
let component_cache;
|
||||
const component = async () => component_cache ??= (await import('./_layout.svelte-c7eb1f78.js')).default;
|
||||
const server_id = "src/routes/+layout.server.js";
|
||||
const imports = ["_app/immutable/nodes/0.762daf68.js","_app/immutable/chunks/scheduler.8852886c.js","_app/immutable/chunks/index.fb8f3617.js","_app/immutable/chunks/globals.7f7f1b26.js","_app/immutable/chunks/ctx.1e61a5a6.js","_app/immutable/chunks/index.97524e95.js","_app/immutable/chunks/index.cd89ef46.js"];
|
||||
const stylesheets = ["_app/immutable/assets/0.1c2a189f.css"];
|
||||
const fonts = [];
|
||||
|
||||
export { component, fonts, imports, index, _layout_server as server, server_id, stylesheets };
|
||||
//# sourceMappingURL=0-44f6362d.js.map
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"0-44f6362d.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/_layout.server.js","../../../.svelte-kit/adapter-node/nodes/0.js"],"sourcesContent":["import fs from \"fs-extra\";\nimport { p as public_env } from \"../../chunks/shared-server.js\";\nasync function load({ params, route, url, cookies, request }) {\n let site = JSON.parse(fs.readFileSync(public_env.PUBLIC_KENER_FOLDER + \"/site.json\", \"utf8\"));\n const headers = request.headers;\n const userAgent = headers.get(\"user-agent\");\n let localTz = \"GMT\";\n const localTzCookie = cookies.get(\"localTz\");\n if (!!localTzCookie) {\n localTz = localTzCookie;\n }\n let showNav = true;\n if (url.pathname.startsWith(\"/embed\")) {\n showNav = false;\n }\n let isBot = false;\n if (userAgent?.includes(\"Chrome-Lighthouse\") || userAgent?.includes(\"bot\")) {\n isBot = true;\n }\n return {\n site,\n localTz,\n showNav,\n isBot\n };\n}\nexport {\n load\n};\n","import * as server from '../entries/pages/_layout.server.js';\n\nexport const index = 0;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/_layout.svelte.js')).default;\nexport { server };\nexport const server_id = \"src/routes/+layout.server.js\";\nexport const imports = [\"_app/immutable/nodes/0.762daf68.js\",\"_app/immutable/chunks/scheduler.8852886c.js\",\"_app/immutable/chunks/index.fb8f3617.js\",\"_app/immutable/chunks/globals.7f7f1b26.js\",\"_app/immutable/chunks/ctx.1e61a5a6.js\",\"_app/immutable/chunks/index.97524e95.js\",\"_app/immutable/chunks/index.cd89ef46.js\"];\nexport const stylesheets = [\"_app/immutable/assets/0.1c2a189f.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":";;;AAEA,eAAe,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;AAC9D,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB,GAAG,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;AAChG,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;AAClC,EAAE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC9C,EAAE,IAAI,OAAO,GAAG,KAAK,CAAC;AACtB,EAAE,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC/C,EAAE,IAAI,CAAC,CAAC,aAAa,EAAE;AACvB,IAAI,OAAO,GAAG,aAAa,CAAC;AAC5B,GAAG;AACH,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC;AACrB,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AACzC,IAAI,OAAO,GAAG,KAAK,CAAC;AACpB,GAAG;AACH,EAAE,IAAI,KAAK,GAAG,KAAK,CAAC;AACpB,EAAE,IAAI,SAAS,EAAE,QAAQ,CAAC,mBAAmB,CAAC,IAAI,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC9E,IAAI,KAAK,GAAG,IAAI,CAAC;AACjB,GAAG;AACH,EAAE,OAAO;AACT,IAAI,IAAI;AACR,IAAI,OAAO;AACX,IAAI,OAAO;AACX,IAAI,KAAK;AACT,GAAG,CAAC;AACJ;;;;;;;ACvBY,MAAC,KAAK,GAAG,EAAE;AACvB,IAAI,eAAe,CAAC;AACR,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,8BAAoC,CAAC,EAAE,QAAQ;AAE1G,MAAC,SAAS,GAAG,+BAA+B;AAC5C,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,6CAA6C,CAAC,yCAAyC,CAAC,2CAA2C,CAAC,uCAAuC,CAAC,yCAAyC,CAAC,yCAAyC,EAAE;AAClT,MAAC,WAAW,GAAG,CAAC,sCAAsC,EAAE;AACxD,MAAC,KAAK,GAAG;;;;"}
|
||||
@@ -1,9 +0,0 @@
|
||||
const index = 1;
|
||||
let component_cache;
|
||||
const component = async () => component_cache ??= (await import('./error.svelte-e53c3896.js')).default;
|
||||
const imports = ["_app/immutable/nodes/1.369b6ef7.js","_app/immutable/chunks/scheduler.8852886c.js","_app/immutable/chunks/index.fb8f3617.js","_app/immutable/chunks/stores.ba51b889.js","_app/immutable/chunks/singletons.a5bf3c68.js","_app/immutable/chunks/index.97524e95.js","_app/immutable/chunks/paths.0183ef73.js"];
|
||||
const stylesheets = [];
|
||||
const fonts = [];
|
||||
|
||||
export { component, fonts, imports, index, stylesheets };
|
||||
//# sourceMappingURL=1-5200298c.js.map
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"1-5200298c.js","sources":["../../../.svelte-kit/adapter-node/nodes/1.js"],"sourcesContent":["\n\nexport const index = 1;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/fallbacks/error.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/1.369b6ef7.js\",\"_app/immutable/chunks/scheduler.8852886c.js\",\"_app/immutable/chunks/index.fb8f3617.js\",\"_app/immutable/chunks/stores.ba51b889.js\",\"_app/immutable/chunks/singletons.a5bf3c68.js\",\"_app/immutable/chunks/index.97524e95.js\",\"_app/immutable/chunks/paths.0183ef73.js\"];\nexport const stylesheets = [];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG,EAAE;AACvB,IAAI,eAAe,CAAC;AACR,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,4BAAsC,CAAC,EAAE,QAAQ;AAC5G,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,6CAA6C,CAAC,yCAAyC,CAAC,0CAA0C,CAAC,8CAA8C,CAAC,yCAAyC,CAAC,yCAAyC,EAAE;AACxT,MAAC,WAAW,GAAG,GAAG;AAClB,MAAC,KAAK,GAAG;;;;"}
|
||||
@@ -1,51 +0,0 @@
|
||||
import { G as GetOpenIncidents, M as Mapper, F as FilterAndInsertMonitorInIncident } from './github-31d08953.js';
|
||||
import { F as FetchData } from './page-576e2fb0.js';
|
||||
import { p as public_env } from './shared-server-58a5f352.js';
|
||||
import fs from 'fs-extra';
|
||||
import 'axios';
|
||||
import './tool-b4b3e524.js';
|
||||
import 'marked';
|
||||
|
||||
async function load({ parent }) {
|
||||
let monitors = JSON.parse(fs.readFileSync(public_env.PUBLIC_KENER_FOLDER + "/monitors.json", "utf8"));
|
||||
const parentData = await parent();
|
||||
const siteData = parentData.site;
|
||||
const github = siteData.github;
|
||||
const monitorsActive = [];
|
||||
for (let i = 0; i < monitors.length; i++) {
|
||||
if (monitors[i].hidden !== void 0 && monitors[i].hidden === true) {
|
||||
continue;
|
||||
}
|
||||
if (monitors[i].category !== void 0 && monitors[i].category !== "home") {
|
||||
continue;
|
||||
}
|
||||
delete monitors[i].api;
|
||||
delete monitors[i].defaultStatus;
|
||||
let data = await FetchData(monitors[i], parentData.localTz);
|
||||
monitors[i].pageData = data;
|
||||
monitors[i].activeIncidents = [];
|
||||
monitorsActive.push(monitors[i]);
|
||||
}
|
||||
let openIncidents = await GetOpenIncidents(github);
|
||||
let openIncidentsReduced = openIncidents.map(Mapper);
|
||||
return {
|
||||
monitors: monitorsActive,
|
||||
openIncidents: FilterAndInsertMonitorInIncident(openIncidentsReduced, monitorsActive)
|
||||
};
|
||||
}
|
||||
|
||||
var _page_server = /*#__PURE__*/Object.freeze({
|
||||
__proto__: null,
|
||||
load: load
|
||||
});
|
||||
|
||||
const index = 2;
|
||||
let component_cache;
|
||||
const component = async () => component_cache ??= (await import('./_page.svelte-b9177f34.js')).default;
|
||||
const server_id = "src/routes/+page.server.js";
|
||||
const imports = ["_app/immutable/nodes/2.6a901bcb.js","_app/immutable/chunks/scheduler.8852886c.js","_app/immutable/chunks/index.fb8f3617.js","_app/immutable/chunks/ctx.1e61a5a6.js","_app/immutable/chunks/index.97524e95.js","_app/immutable/chunks/monitor.b8d7520d.js","_app/immutable/chunks/axios.baaa6432.js","_app/immutable/chunks/Icon.7b7db889.js","_app/immutable/chunks/index.cd89ef46.js","_app/immutable/chunks/events.b4751e74.js","_app/immutable/chunks/incident.fe542872.js","_app/immutable/chunks/chevron-down.f8b4fb7d.js"];
|
||||
const stylesheets = ["_app/immutable/assets/monitor.13f869bc.css","_app/immutable/assets/incident.d0acbf00.css"];
|
||||
const fonts = [];
|
||||
|
||||
export { component, fonts, imports, index, _page_server as server, server_id, stylesheets };
|
||||
//# sourceMappingURL=2-33c4e9d5.js.map
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"2-33c4e9d5.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/_page.server.js","../../../.svelte-kit/adapter-node/nodes/2.js"],"sourcesContent":["import { e as GetOpenIncidents, M as Mapper, F as FilterAndInsertMonitorInIncident } from \"../../chunks/github.js\";\nimport { F as FetchData } from \"../../chunks/page.js\";\nimport { p as public_env } from \"../../chunks/shared-server.js\";\nimport fs from \"fs-extra\";\nasync function load({ parent }) {\n let monitors = JSON.parse(fs.readFileSync(public_env.PUBLIC_KENER_FOLDER + \"/monitors.json\", \"utf8\"));\n const parentData = await parent();\n const siteData = parentData.site;\n const github = siteData.github;\n const monitorsActive = [];\n for (let i = 0; i < monitors.length; i++) {\n if (monitors[i].hidden !== void 0 && monitors[i].hidden === true) {\n continue;\n }\n if (monitors[i].category !== void 0 && monitors[i].category !== \"home\") {\n continue;\n }\n delete monitors[i].api;\n delete monitors[i].defaultStatus;\n let data = await FetchData(monitors[i], parentData.localTz);\n monitors[i].pageData = data;\n monitors[i].activeIncidents = [];\n monitorsActive.push(monitors[i]);\n }\n let openIncidents = await GetOpenIncidents(github);\n let openIncidentsReduced = openIncidents.map(Mapper);\n return {\n monitors: monitorsActive,\n openIncidents: FilterAndInsertMonitorInIncident(openIncidentsReduced, monitorsActive)\n };\n}\nexport {\n load\n};\n","import * as server from '../entries/pages/_page.server.js';\n\nexport const index = 2;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/_page.svelte.js')).default;\nexport { server };\nexport const server_id = \"src/routes/+page.server.js\";\nexport const imports = [\"_app/immutable/nodes/2.6a901bcb.js\",\"_app/immutable/chunks/scheduler.8852886c.js\",\"_app/immutable/chunks/index.fb8f3617.js\",\"_app/immutable/chunks/ctx.1e61a5a6.js\",\"_app/immutable/chunks/index.97524e95.js\",\"_app/immutable/chunks/monitor.b8d7520d.js\",\"_app/immutable/chunks/axios.baaa6432.js\",\"_app/immutable/chunks/Icon.7b7db889.js\",\"_app/immutable/chunks/index.cd89ef46.js\",\"_app/immutable/chunks/events.b4751e74.js\",\"_app/immutable/chunks/incident.fe542872.js\",\"_app/immutable/chunks/chevron-down.f8b4fb7d.js\"];\nexport const stylesheets = [\"_app/immutable/assets/monitor.13f869bc.css\",\"_app/immutable/assets/incident.d0acbf00.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":";;;;;;;;AAIA,eAAe,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE;AAChC,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB,GAAG,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;AACxG,EAAE,MAAM,UAAU,GAAG,MAAM,MAAM,EAAE,CAAC;AACpC,EAAE,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC;AACnC,EAAE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;AACjC,EAAE,MAAM,cAAc,GAAG,EAAE,CAAC;AAC5B,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE;AACtE,MAAM,SAAS;AACf,KAAK;AACL,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,EAAE;AAC5E,MAAM,SAAS;AACf,KAAK;AACL,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3B,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AACrC,IAAI,IAAI,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;AAChE,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;AAChC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,EAAE,CAAC;AACrC,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,GAAG;AACH,EAAE,IAAI,aAAa,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACrD,EAAE,IAAI,oBAAoB,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACvD,EAAE,OAAO;AACT,IAAI,QAAQ,EAAE,cAAc;AAC5B,IAAI,aAAa,EAAE,gCAAgC,CAAC,oBAAoB,EAAE,cAAc,CAAC;AACzF,GAAG,CAAC;AACJ;;;;;;;AC5BY,MAAC,KAAK,GAAG,EAAE;AACvB,IAAI,eAAe,CAAC;AACR,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,4BAAkC,CAAC,EAAE,QAAQ;AAExG,MAAC,SAAS,GAAG,6BAA6B;AAC1C,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,6CAA6C,CAAC,yCAAyC,CAAC,uCAAuC,CAAC,yCAAyC,CAAC,2CAA2C,CAAC,yCAAyC,CAAC,wCAAwC,CAAC,yCAAyC,CAAC,0CAA0C,CAAC,4CAA4C,CAAC,gDAAgD,EAAE;AAC9gB,MAAC,WAAW,GAAG,CAAC,4CAA4C,CAAC,6CAA6C,EAAE;AAC5G,MAAC,KAAK,GAAG;;;;"}
|
||||
@@ -1,50 +0,0 @@
|
||||
import { G as GetOpenIncidents, M as Mapper, F as FilterAndInsertMonitorInIncident } from './github-31d08953.js';
|
||||
import { F as FetchData } from './page-576e2fb0.js';
|
||||
import { p as public_env } from './shared-server-58a5f352.js';
|
||||
import fs from 'fs-extra';
|
||||
import 'axios';
|
||||
import './tool-b4b3e524.js';
|
||||
import 'marked';
|
||||
|
||||
async function load({ params, route, url, parent }) {
|
||||
let monitors = JSON.parse(fs.readFileSync(public_env.PUBLIC_KENER_FOLDER + "/monitors.json", "utf8"));
|
||||
const parentData = await parent();
|
||||
const siteData = parentData.site;
|
||||
const github = siteData.github;
|
||||
const monitorsActive = [];
|
||||
for (let i = 0; i < monitors.length; i++) {
|
||||
if (monitors[i].hidden !== void 0 && monitors[i].hidden === true) {
|
||||
continue;
|
||||
}
|
||||
if (monitors[i].category === void 0 || monitors[i].category !== params.category) {
|
||||
continue;
|
||||
}
|
||||
delete monitors[i].api;
|
||||
delete monitors[i].defaultStatus;
|
||||
let data = await FetchData(monitors[i], parentData.localTz);
|
||||
monitors[i].pageData = data;
|
||||
monitorsActive.push(monitors[i]);
|
||||
}
|
||||
let openIncidents = await GetOpenIncidents(github);
|
||||
let openIncidentsReduced = openIncidents.map(Mapper);
|
||||
return {
|
||||
monitors: monitorsActive,
|
||||
openIncidents: FilterAndInsertMonitorInIncident(openIncidentsReduced, monitorsActive)
|
||||
};
|
||||
}
|
||||
|
||||
var _page_server = /*#__PURE__*/Object.freeze({
|
||||
__proto__: null,
|
||||
load: load
|
||||
});
|
||||
|
||||
const index = 3;
|
||||
let component_cache;
|
||||
const component = async () => component_cache ??= (await import('./_page.svelte-85f71bac.js')).default;
|
||||
const server_id = "src/routes/category-[category]/+page.server.js";
|
||||
const imports = ["_app/immutable/nodes/3.5419bf7f.js","_app/immutable/chunks/scheduler.8852886c.js","_app/immutable/chunks/index.fb8f3617.js","_app/immutable/chunks/ctx.1e61a5a6.js","_app/immutable/chunks/index.97524e95.js","_app/immutable/chunks/monitor.b8d7520d.js","_app/immutable/chunks/axios.baaa6432.js","_app/immutable/chunks/Icon.7b7db889.js","_app/immutable/chunks/index.cd89ef46.js","_app/immutable/chunks/events.b4751e74.js","_app/immutable/chunks/incident.fe542872.js","_app/immutable/chunks/chevron-down.f8b4fb7d.js","_app/immutable/chunks/stores.ba51b889.js","_app/immutable/chunks/singletons.a5bf3c68.js","_app/immutable/chunks/paths.0183ef73.js"];
|
||||
const stylesheets = ["_app/immutable/assets/monitor.13f869bc.css","_app/immutable/assets/incident.d0acbf00.css"];
|
||||
const fonts = [];
|
||||
|
||||
export { component, fonts, imports, index, _page_server as server, server_id, stylesheets };
|
||||
//# sourceMappingURL=3-817f823c.js.map
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"3-817f823c.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/category-_category_/_page.server.js","../../../.svelte-kit/adapter-node/nodes/3.js"],"sourcesContent":["import { e as GetOpenIncidents, M as Mapper, F as FilterAndInsertMonitorInIncident } from \"../../../chunks/github.js\";\nimport { F as FetchData } from \"../../../chunks/page.js\";\nimport { p as public_env } from \"../../../chunks/shared-server.js\";\nimport fs from \"fs-extra\";\nasync function load({ params, route, url, parent }) {\n let monitors = JSON.parse(fs.readFileSync(public_env.PUBLIC_KENER_FOLDER + \"/monitors.json\", \"utf8\"));\n const parentData = await parent();\n const siteData = parentData.site;\n const github = siteData.github;\n const monitorsActive = [];\n for (let i = 0; i < monitors.length; i++) {\n if (monitors[i].hidden !== void 0 && monitors[i].hidden === true) {\n continue;\n }\n if (monitors[i].category === void 0 || monitors[i].category !== params.category) {\n continue;\n }\n delete monitors[i].api;\n delete monitors[i].defaultStatus;\n let data = await FetchData(monitors[i], parentData.localTz);\n monitors[i].pageData = data;\n monitorsActive.push(monitors[i]);\n }\n let openIncidents = await GetOpenIncidents(github);\n let openIncidentsReduced = openIncidents.map(Mapper);\n return {\n monitors: monitorsActive,\n openIncidents: FilterAndInsertMonitorInIncident(openIncidentsReduced, monitorsActive)\n };\n}\nexport {\n load\n};\n","import * as server from '../entries/pages/category-_category_/_page.server.js';\n\nexport const index = 3;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/category-_category_/_page.svelte.js')).default;\nexport { server };\nexport const server_id = \"src/routes/category-[category]/+page.server.js\";\nexport const imports = [\"_app/immutable/nodes/3.5419bf7f.js\",\"_app/immutable/chunks/scheduler.8852886c.js\",\"_app/immutable/chunks/index.fb8f3617.js\",\"_app/immutable/chunks/ctx.1e61a5a6.js\",\"_app/immutable/chunks/index.97524e95.js\",\"_app/immutable/chunks/monitor.b8d7520d.js\",\"_app/immutable/chunks/axios.baaa6432.js\",\"_app/immutable/chunks/Icon.7b7db889.js\",\"_app/immutable/chunks/index.cd89ef46.js\",\"_app/immutable/chunks/events.b4751e74.js\",\"_app/immutable/chunks/incident.fe542872.js\",\"_app/immutable/chunks/chevron-down.f8b4fb7d.js\",\"_app/immutable/chunks/stores.ba51b889.js\",\"_app/immutable/chunks/singletons.a5bf3c68.js\",\"_app/immutable/chunks/paths.0183ef73.js\"];\nexport const stylesheets = [\"_app/immutable/assets/monitor.13f869bc.css\",\"_app/immutable/assets/incident.d0acbf00.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":";;;;;;;;AAIA,eAAe,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;AACpD,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB,GAAG,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;AACxG,EAAE,MAAM,UAAU,GAAG,MAAM,MAAM,EAAE,CAAC;AACpC,EAAE,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC;AACnC,EAAE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;AACjC,EAAE,MAAM,cAAc,GAAG,EAAE,CAAC;AAC5B,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE;AACtE,MAAM,SAAS;AACf,KAAK;AACL,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE;AACrF,MAAM,SAAS;AACf,KAAK;AACL,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3B,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AACrC,IAAI,IAAI,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;AAChE,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;AAChC,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,GAAG;AACH,EAAE,IAAI,aAAa,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACrD,EAAE,IAAI,oBAAoB,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACvD,EAAE,OAAO;AACT,IAAI,QAAQ,EAAE,cAAc;AAC5B,IAAI,aAAa,EAAE,gCAAgC,CAAC,oBAAoB,EAAE,cAAc,CAAC;AACzF,GAAG,CAAC;AACJ;;;;;;;AC3BY,MAAC,KAAK,GAAG,EAAE;AACvB,IAAI,eAAe,CAAC;AACR,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,4BAAsD,CAAC,EAAE,QAAQ;AAE5H,MAAC,SAAS,GAAG,iDAAiD;AAC9D,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,6CAA6C,CAAC,yCAAyC,CAAC,uCAAuC,CAAC,yCAAyC,CAAC,2CAA2C,CAAC,yCAAyC,CAAC,wCAAwC,CAAC,yCAAyC,CAAC,0CAA0C,CAAC,4CAA4C,CAAC,gDAAgD,CAAC,0CAA0C,CAAC,8CAA8C,CAAC,yCAAyC,EAAE;AAClpB,MAAC,WAAW,GAAG,CAAC,4CAA4C,CAAC,6CAA6C,EAAE;AAC5G,MAAC,KAAK,GAAG;;;;"}
|
||||
@@ -1,24 +0,0 @@
|
||||
import axios from 'axios';
|
||||
|
||||
async function load({ params, route, url, parent }) {
|
||||
const { data } = await axios.get("https://raw.githubusercontent.com/rajnandan1/kener/main/docs.md");
|
||||
return {
|
||||
md: data
|
||||
};
|
||||
}
|
||||
|
||||
var _page_server = /*#__PURE__*/Object.freeze({
|
||||
__proto__: null,
|
||||
load: load
|
||||
});
|
||||
|
||||
const index = 4;
|
||||
let component_cache;
|
||||
const component = async () => component_cache ??= (await import('./_page.svelte-f5dc29c8.js')).default;
|
||||
const server_id = "src/routes/docs/+page.server.js";
|
||||
const imports = ["_app/immutable/nodes/4.67b330c5.js","_app/immutable/chunks/scheduler.8852886c.js","_app/immutable/chunks/index.fb8f3617.js","_app/immutable/chunks/globals.7f7f1b26.js","_app/immutable/chunks/ctx.1e61a5a6.js","_app/immutable/chunks/index.97524e95.js","_app/immutable/chunks/Icon.7b7db889.js","_app/immutable/chunks/events.b4751e74.js","_app/immutable/chunks/chevron-down.f8b4fb7d.js"];
|
||||
const stylesheets = [];
|
||||
const fonts = [];
|
||||
|
||||
export { component, fonts, imports, index, _page_server as server, server_id, stylesheets };
|
||||
//# sourceMappingURL=4-88a8e0b2.js.map
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"4-88a8e0b2.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/docs/_page.server.js","../../../.svelte-kit/adapter-node/nodes/4.js"],"sourcesContent":["import axios from \"axios\";\nasync function load({ params, route, url, parent }) {\n const { data } = await axios.get(\"https://raw.githubusercontent.com/rajnandan1/kener/main/docs.md\");\n return {\n md: data\n };\n}\nexport {\n load\n};\n","import * as server from '../entries/pages/docs/_page.server.js';\n\nexport const index = 4;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/docs/_page.svelte.js')).default;\nexport { server };\nexport const server_id = \"src/routes/docs/+page.server.js\";\nexport const imports = [\"_app/immutable/nodes/4.67b330c5.js\",\"_app/immutable/chunks/scheduler.8852886c.js\",\"_app/immutable/chunks/index.fb8f3617.js\",\"_app/immutable/chunks/globals.7f7f1b26.js\",\"_app/immutable/chunks/ctx.1e61a5a6.js\",\"_app/immutable/chunks/index.97524e95.js\",\"_app/immutable/chunks/Icon.7b7db889.js\",\"_app/immutable/chunks/events.b4751e74.js\",\"_app/immutable/chunks/chevron-down.f8b4fb7d.js\"];\nexport const stylesheets = [];\nexport const fonts = [];\n"],"names":[],"mappings":";;AACA,eAAe,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;AACpD,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;AACtG,EAAE,OAAO;AACT,IAAI,EAAE,EAAE,IAAI;AACZ,GAAG,CAAC;AACJ;;;;;;;ACJY,MAAC,KAAK,GAAG,EAAE;AACvB,IAAI,eAAe,CAAC;AACR,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,4BAAuC,CAAC,EAAE,QAAQ;AAE7G,MAAC,SAAS,GAAG,kCAAkC;AAC/C,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,6CAA6C,CAAC,yCAAyC,CAAC,2CAA2C,CAAC,uCAAuC,CAAC,yCAAyC,CAAC,wCAAwC,CAAC,0CAA0C,CAAC,gDAAgD,EAAE;AAC7Y,MAAC,WAAW,GAAG,GAAG;AAClB,MAAC,KAAK,GAAG;;;;"}
|
||||
@@ -1,43 +0,0 @@
|
||||
import { F as FetchData } from './page-576e2fb0.js';
|
||||
import { p as public_env } from './shared-server-58a5f352.js';
|
||||
import fs from 'fs-extra';
|
||||
|
||||
async function load({ params, route, url, parent }) {
|
||||
let monitors = JSON.parse(fs.readFileSync(public_env.PUBLIC_KENER_FOLDER + "/monitors.json", "utf8"));
|
||||
const parentData = await parent();
|
||||
const monitorsActive = [];
|
||||
const query = url.searchParams;
|
||||
const theme = query.get("theme");
|
||||
for (let i = 0; i < monitors.length; i++) {
|
||||
if (monitors[i].tag !== params.tag) {
|
||||
continue;
|
||||
}
|
||||
delete monitors[i].api;
|
||||
delete monitors[i].defaultStatus;
|
||||
monitors[i].embed = true;
|
||||
let data = await FetchData(monitors[i], parentData.localTz);
|
||||
monitors[i].pageData = data;
|
||||
monitorsActive.push(monitors[i]);
|
||||
}
|
||||
return {
|
||||
monitors: monitorsActive,
|
||||
theme,
|
||||
openIncidents: []
|
||||
};
|
||||
}
|
||||
|
||||
var _page_server = /*#__PURE__*/Object.freeze({
|
||||
__proto__: null,
|
||||
load: load
|
||||
});
|
||||
|
||||
const index = 5;
|
||||
let component_cache;
|
||||
const component = async () => component_cache ??= (await import('./_page.svelte-e60523b0.js')).default;
|
||||
const server_id = "src/routes/embed-[tag]/+page.server.js";
|
||||
const imports = ["_app/immutable/nodes/5.dec378a2.js","_app/immutable/chunks/scheduler.8852886c.js","_app/immutable/chunks/index.fb8f3617.js","_app/immutable/chunks/ctx.1e61a5a6.js","_app/immutable/chunks/index.97524e95.js","_app/immutable/chunks/monitor.b8d7520d.js","_app/immutable/chunks/axios.baaa6432.js","_app/immutable/chunks/Icon.7b7db889.js","_app/immutable/chunks/index.cd89ef46.js","_app/immutable/chunks/events.b4751e74.js","_app/immutable/chunks/stores.ba51b889.js","_app/immutable/chunks/singletons.a5bf3c68.js","_app/immutable/chunks/paths.0183ef73.js"];
|
||||
const stylesheets = ["_app/immutable/assets/monitor.13f869bc.css"];
|
||||
const fonts = [];
|
||||
|
||||
export { component, fonts, imports, index, _page_server as server, server_id, stylesheets };
|
||||
//# sourceMappingURL=5-f1e9d0b4.js.map
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"5-f1e9d0b4.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/embed-_tag_/_page.server.js","../../../.svelte-kit/adapter-node/nodes/5.js"],"sourcesContent":["import { F as FetchData } from \"../../../chunks/page.js\";\nimport { p as public_env } from \"../../../chunks/shared-server.js\";\nimport fs from \"fs-extra\";\nasync function load({ params, route, url, parent }) {\n let monitors = JSON.parse(fs.readFileSync(public_env.PUBLIC_KENER_FOLDER + \"/monitors.json\", \"utf8\"));\n const parentData = await parent();\n const monitorsActive = [];\n const query = url.searchParams;\n const theme = query.get(\"theme\");\n for (let i = 0; i < monitors.length; i++) {\n if (monitors[i].tag !== params.tag) {\n continue;\n }\n delete monitors[i].api;\n delete monitors[i].defaultStatus;\n monitors[i].embed = true;\n let data = await FetchData(monitors[i], parentData.localTz);\n monitors[i].pageData = data;\n monitorsActive.push(monitors[i]);\n }\n return {\n monitors: monitorsActive,\n theme,\n openIncidents: []\n };\n}\nexport {\n load\n};\n","import * as server from '../entries/pages/embed-_tag_/_page.server.js';\n\nexport const index = 5;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/embed-_tag_/_page.svelte.js')).default;\nexport { server };\nexport const server_id = \"src/routes/embed-[tag]/+page.server.js\";\nexport const imports = [\"_app/immutable/nodes/5.dec378a2.js\",\"_app/immutable/chunks/scheduler.8852886c.js\",\"_app/immutable/chunks/index.fb8f3617.js\",\"_app/immutable/chunks/ctx.1e61a5a6.js\",\"_app/immutable/chunks/index.97524e95.js\",\"_app/immutable/chunks/monitor.b8d7520d.js\",\"_app/immutable/chunks/axios.baaa6432.js\",\"_app/immutable/chunks/Icon.7b7db889.js\",\"_app/immutable/chunks/index.cd89ef46.js\",\"_app/immutable/chunks/events.b4751e74.js\",\"_app/immutable/chunks/stores.ba51b889.js\",\"_app/immutable/chunks/singletons.a5bf3c68.js\",\"_app/immutable/chunks/paths.0183ef73.js\"];\nexport const stylesheets = [\"_app/immutable/assets/monitor.13f869bc.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":";;;;AAGA,eAAe,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;AACpD,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB,GAAG,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;AACxG,EAAE,MAAM,UAAU,GAAG,MAAM,MAAM,EAAE,CAAC;AACpC,EAAE,MAAM,cAAc,GAAG,EAAE,CAAC;AAC5B,EAAE,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC;AACjC,EAAE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACnC,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,EAAE;AACxC,MAAM,SAAS;AACf,KAAK;AACL,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3B,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AACrC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;AAC7B,IAAI,IAAI,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;AAChE,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;AAChC,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,GAAG;AACH,EAAE,OAAO;AACT,IAAI,QAAQ,EAAE,cAAc;AAC5B,IAAI,KAAK;AACT,IAAI,aAAa,EAAE,EAAE;AACrB,GAAG,CAAC;AACJ;;;;;;;ACvBY,MAAC,KAAK,GAAG,EAAE;AACvB,IAAI,eAAe,CAAC;AACR,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,4BAA8C,CAAC,EAAE,QAAQ;AAEpH,MAAC,SAAS,GAAG,yCAAyC;AACtD,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,6CAA6C,CAAC,yCAAyC,CAAC,uCAAuC,CAAC,yCAAyC,CAAC,2CAA2C,CAAC,yCAAyC,CAAC,wCAAwC,CAAC,yCAAyC,CAAC,0CAA0C,CAAC,0CAA0C,CAAC,8CAA8C,CAAC,yCAAyC,EAAE;AACpjB,MAAC,WAAW,GAAG,CAAC,4CAA4C,EAAE;AAC9D,MAAC,KAAK,GAAG;;;;"}
|
||||
@@ -1,43 +0,0 @@
|
||||
import { p as public_env } from './shared-server-58a5f352.js';
|
||||
import { a as GetIncidents, M as Mapper } from './github-31d08953.js';
|
||||
import fs from 'fs-extra';
|
||||
import 'axios';
|
||||
import './tool-b4b3e524.js';
|
||||
import 'marked';
|
||||
|
||||
async function load({ params, route, url, parent }) {
|
||||
let monitors = JSON.parse(fs.readFileSync(public_env.PUBLIC_KENER_FOLDER + "/monitors.json", "utf8"));
|
||||
const siteData = await parent();
|
||||
const github = siteData.site.github;
|
||||
const { description, name, tag, image } = monitors.find((monitor) => monitor.folderName === params.id);
|
||||
const allIncidents = await GetIncidents(tag, github, "all");
|
||||
const gitHubActiveIssues = allIncidents.filter((issue) => {
|
||||
return issue.state === "open";
|
||||
});
|
||||
const gitHubPastIssues = allIncidents.filter((issue) => {
|
||||
return issue.state === "closed";
|
||||
});
|
||||
return {
|
||||
issues: params.id,
|
||||
githubConfig: github,
|
||||
monitor: { description, name, image },
|
||||
activeIncidents: await Promise.all(gitHubActiveIssues.map(Mapper, { github })),
|
||||
pastIncidents: await Promise.all(gitHubPastIssues.map(Mapper, { github }))
|
||||
};
|
||||
}
|
||||
|
||||
var _page_server = /*#__PURE__*/Object.freeze({
|
||||
__proto__: null,
|
||||
load: load
|
||||
});
|
||||
|
||||
const index = 6;
|
||||
let component_cache;
|
||||
const component = async () => component_cache ??= (await import('./_page.svelte-5de3ecd2.js')).default;
|
||||
const server_id = "src/routes/incident/[id]/+page.server.js";
|
||||
const imports = ["_app/immutable/nodes/6.b99c92be.js","_app/immutable/chunks/scheduler.8852886c.js","_app/immutable/chunks/index.fb8f3617.js","_app/immutable/chunks/ctx.1e61a5a6.js","_app/immutable/chunks/index.97524e95.js","_app/immutable/chunks/incident.fe542872.js","_app/immutable/chunks/Icon.7b7db889.js","_app/immutable/chunks/index.cd89ef46.js","_app/immutable/chunks/axios.baaa6432.js","_app/immutable/chunks/chevron-down.f8b4fb7d.js"];
|
||||
const stylesheets = ["_app/immutable/assets/incident.d0acbf00.css"];
|
||||
const fonts = [];
|
||||
|
||||
export { component, fonts, imports, index, _page_server as server, server_id, stylesheets };
|
||||
//# sourceMappingURL=6-98296fd1.js.map
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"6-98296fd1.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/incident/_id_/_page.server.js","../../../.svelte-kit/adapter-node/nodes/6.js"],"sourcesContent":["import { p as public_env } from \"../../../../chunks/shared-server.js\";\nimport { f as GetIncidents, M as Mapper } from \"../../../../chunks/github.js\";\nimport fs from \"fs-extra\";\nasync function load({ params, route, url, parent }) {\n let monitors = JSON.parse(fs.readFileSync(public_env.PUBLIC_KENER_FOLDER + \"/monitors.json\", \"utf8\"));\n const siteData = await parent();\n const github = siteData.site.github;\n const { description, name, tag, image } = monitors.find((monitor) => monitor.folderName === params.id);\n const allIncidents = await GetIncidents(tag, github, \"all\");\n const gitHubActiveIssues = allIncidents.filter((issue) => {\n return issue.state === \"open\";\n });\n const gitHubPastIssues = allIncidents.filter((issue) => {\n return issue.state === \"closed\";\n });\n return {\n issues: params.id,\n githubConfig: github,\n monitor: { description, name, image },\n activeIncidents: await Promise.all(gitHubActiveIssues.map(Mapper, { github })),\n pastIncidents: await Promise.all(gitHubPastIssues.map(Mapper, { github }))\n };\n}\nexport {\n load\n};\n","import * as server from '../entries/pages/incident/_id_/_page.server.js';\n\nexport const index = 6;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/incident/_id_/_page.svelte.js')).default;\nexport { server };\nexport const server_id = \"src/routes/incident/[id]/+page.server.js\";\nexport const imports = [\"_app/immutable/nodes/6.b99c92be.js\",\"_app/immutable/chunks/scheduler.8852886c.js\",\"_app/immutable/chunks/index.fb8f3617.js\",\"_app/immutable/chunks/ctx.1e61a5a6.js\",\"_app/immutable/chunks/index.97524e95.js\",\"_app/immutable/chunks/incident.fe542872.js\",\"_app/immutable/chunks/Icon.7b7db889.js\",\"_app/immutable/chunks/index.cd89ef46.js\",\"_app/immutable/chunks/axios.baaa6432.js\",\"_app/immutable/chunks/chevron-down.f8b4fb7d.js\"];\nexport const stylesheets = [\"_app/immutable/assets/incident.d0acbf00.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":";;;;;;;AAGA,eAAe,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;AACpD,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB,GAAG,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;AACxG,EAAE,MAAM,QAAQ,GAAG,MAAM,MAAM,EAAE,CAAC;AAClC,EAAE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AACtC,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,UAAU,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;AACzG,EAAE,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAC9D,EAAE,MAAM,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK;AAC5D,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC;AAClC,GAAG,CAAC,CAAC;AACL,EAAE,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK;AAC1D,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC;AACpC,GAAG,CAAC,CAAC;AACL,EAAE,OAAO;AACT,IAAI,MAAM,EAAE,MAAM,CAAC,EAAE;AACrB,IAAI,YAAY,EAAE,MAAM;AACxB,IAAI,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE;AACzC,IAAI,eAAe,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AAClF,IAAI,aAAa,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9E,GAAG,CAAC;AACJ;;;;;;;ACpBY,MAAC,KAAK,GAAG,EAAE;AACvB,IAAI,eAAe,CAAC;AACR,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,4BAAgD,CAAC,EAAE,QAAQ;AAEtH,MAAC,SAAS,GAAG,2CAA2C;AACxD,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,6CAA6C,CAAC,yCAAyC,CAAC,uCAAuC,CAAC,yCAAyC,CAAC,4CAA4C,CAAC,wCAAwC,CAAC,yCAAyC,CAAC,yCAAyC,CAAC,gDAAgD,EAAE;AACvb,MAAC,WAAW,GAAG,CAAC,6CAA6C,EAAE;AAC/D,MAAC,KAAK,GAAG;;;;"}
|
||||
@@ -1,47 +0,0 @@
|
||||
import { G as GetOpenIncidents, M as Mapper, F as FilterAndInsertMonitorInIncident } from './github-31d08953.js';
|
||||
import { F as FetchData } from './page-576e2fb0.js';
|
||||
import { p as public_env } from './shared-server-58a5f352.js';
|
||||
import fs from 'fs-extra';
|
||||
import 'axios';
|
||||
import './tool-b4b3e524.js';
|
||||
import 'marked';
|
||||
|
||||
async function load({ params, route, url, parent }) {
|
||||
let monitors = JSON.parse(fs.readFileSync(public_env.PUBLIC_KENER_FOLDER + "/monitors.json", "utf8"));
|
||||
const parentData = await parent();
|
||||
const siteData = parentData.site;
|
||||
const github = siteData.github;
|
||||
const monitorsActive = [];
|
||||
for (let i = 0; i < monitors.length; i++) {
|
||||
if (monitors[i].tag !== params.tag) {
|
||||
continue;
|
||||
}
|
||||
delete monitors[i].api;
|
||||
delete monitors[i].defaultStatus;
|
||||
let data = await FetchData(monitors[i], parentData.localTz);
|
||||
monitors[i].pageData = data;
|
||||
monitorsActive.push(monitors[i]);
|
||||
}
|
||||
let openIncidents = await GetOpenIncidents(github);
|
||||
let openIncidentsReduced = openIncidents.map(Mapper);
|
||||
return {
|
||||
monitors: monitorsActive,
|
||||
openIncidents: FilterAndInsertMonitorInIncident(openIncidentsReduced, monitorsActive)
|
||||
};
|
||||
}
|
||||
|
||||
var _page_server = /*#__PURE__*/Object.freeze({
|
||||
__proto__: null,
|
||||
load: load
|
||||
});
|
||||
|
||||
const index = 7;
|
||||
let component_cache;
|
||||
const component = async () => component_cache ??= (await import('./_page.svelte-277c90e9.js')).default;
|
||||
const server_id = "src/routes/monitor-[tag]/+page.server.js";
|
||||
const imports = ["_app/immutable/nodes/7.11a20832.js","_app/immutable/chunks/scheduler.8852886c.js","_app/immutable/chunks/index.fb8f3617.js","_app/immutable/chunks/ctx.1e61a5a6.js","_app/immutable/chunks/index.97524e95.js","_app/immutable/chunks/monitor.b8d7520d.js","_app/immutable/chunks/axios.baaa6432.js","_app/immutable/chunks/Icon.7b7db889.js","_app/immutable/chunks/index.cd89ef46.js","_app/immutable/chunks/events.b4751e74.js","_app/immutable/chunks/incident.fe542872.js","_app/immutable/chunks/chevron-down.f8b4fb7d.js","_app/immutable/chunks/paths.0183ef73.js"];
|
||||
const stylesheets = ["_app/immutable/assets/monitor.13f869bc.css","_app/immutable/assets/incident.d0acbf00.css"];
|
||||
const fonts = [];
|
||||
|
||||
export { component, fonts, imports, index, _page_server as server, server_id, stylesheets };
|
||||
//# sourceMappingURL=7-998fb83e.js.map
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"7-998fb83e.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/monitor-_tag_/_page.server.js","../../../.svelte-kit/adapter-node/nodes/7.js"],"sourcesContent":["import { e as GetOpenIncidents, M as Mapper, F as FilterAndInsertMonitorInIncident } from \"../../../chunks/github.js\";\nimport { F as FetchData } from \"../../../chunks/page.js\";\nimport { p as public_env } from \"../../../chunks/shared-server.js\";\nimport fs from \"fs-extra\";\nasync function load({ params, route, url, parent }) {\n let monitors = JSON.parse(fs.readFileSync(public_env.PUBLIC_KENER_FOLDER + \"/monitors.json\", \"utf8\"));\n const parentData = await parent();\n const siteData = parentData.site;\n const github = siteData.github;\n const monitorsActive = [];\n for (let i = 0; i < monitors.length; i++) {\n if (monitors[i].tag !== params.tag) {\n continue;\n }\n delete monitors[i].api;\n delete monitors[i].defaultStatus;\n let data = await FetchData(monitors[i], parentData.localTz);\n monitors[i].pageData = data;\n monitorsActive.push(monitors[i]);\n }\n let openIncidents = await GetOpenIncidents(github);\n let openIncidentsReduced = openIncidents.map(Mapper);\n return {\n monitors: monitorsActive,\n openIncidents: FilterAndInsertMonitorInIncident(openIncidentsReduced, monitorsActive)\n };\n}\nexport {\n load\n};\n","import * as server from '../entries/pages/monitor-_tag_/_page.server.js';\n\nexport const index = 7;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/monitor-_tag_/_page.svelte.js')).default;\nexport { server };\nexport const server_id = \"src/routes/monitor-[tag]/+page.server.js\";\nexport const imports = [\"_app/immutable/nodes/7.11a20832.js\",\"_app/immutable/chunks/scheduler.8852886c.js\",\"_app/immutable/chunks/index.fb8f3617.js\",\"_app/immutable/chunks/ctx.1e61a5a6.js\",\"_app/immutable/chunks/index.97524e95.js\",\"_app/immutable/chunks/monitor.b8d7520d.js\",\"_app/immutable/chunks/axios.baaa6432.js\",\"_app/immutable/chunks/Icon.7b7db889.js\",\"_app/immutable/chunks/index.cd89ef46.js\",\"_app/immutable/chunks/events.b4751e74.js\",\"_app/immutable/chunks/incident.fe542872.js\",\"_app/immutable/chunks/chevron-down.f8b4fb7d.js\",\"_app/immutable/chunks/paths.0183ef73.js\"];\nexport const stylesheets = [\"_app/immutable/assets/monitor.13f869bc.css\",\"_app/immutable/assets/incident.d0acbf00.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":";;;;;;;;AAIA,eAAe,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;AACpD,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB,GAAG,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;AACxG,EAAE,MAAM,UAAU,GAAG,MAAM,MAAM,EAAE,CAAC;AACpC,EAAE,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC;AACnC,EAAE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;AACjC,EAAE,MAAM,cAAc,GAAG,EAAE,CAAC;AAC5B,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,EAAE;AACxC,MAAM,SAAS;AACf,KAAK;AACL,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3B,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AACrC,IAAI,IAAI,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;AAChE,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;AAChC,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,GAAG;AACH,EAAE,IAAI,aAAa,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACrD,EAAE,IAAI,oBAAoB,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACvD,EAAE,OAAO;AACT,IAAI,QAAQ,EAAE,cAAc;AAC5B,IAAI,aAAa,EAAE,gCAAgC,CAAC,oBAAoB,EAAE,cAAc,CAAC;AACzF,GAAG,CAAC;AACJ;;;;;;;ACxBY,MAAC,KAAK,GAAG,EAAE;AACvB,IAAI,eAAe,CAAC;AACR,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,4BAAgD,CAAC,EAAE,QAAQ;AAEtH,MAAC,SAAS,GAAG,2CAA2C;AACxD,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,6CAA6C,CAAC,yCAAyC,CAAC,uCAAuC,CAAC,yCAAyC,CAAC,2CAA2C,CAAC,yCAAyC,CAAC,wCAAwC,CAAC,yCAAyC,CAAC,0CAA0C,CAAC,4CAA4C,CAAC,gDAAgD,CAAC,yCAAyC,EAAE;AACxjB,MAAC,WAAW,GAAG,CAAC,4CAA4C,CAAC,6CAA6C,EAAE;AAC5G,MAAC,KAAK,GAAG;;;;"}
|
||||
@@ -1,133 +0,0 @@
|
||||
import { c as create_ssr_component, f as compute_rest_props, g as spread, k as escape_attribute_value, h as escape_object, a as each } from './ssr-f056b9d4.js';
|
||||
import { clsx } from 'clsx';
|
||||
import { twMerge } from 'tailwind-merge';
|
||||
|
||||
const void_element_names = /^(?:area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/;
|
||||
function is_void(name) {
|
||||
return void_element_names.test(name) || name.toLowerCase() === "!doctype";
|
||||
}
|
||||
function cubicOut(t) {
|
||||
const f = t - 1;
|
||||
return f * f * f + 1;
|
||||
}
|
||||
function cn(...inputs) {
|
||||
return twMerge(clsx(inputs));
|
||||
}
|
||||
const flyAndScale = (node, params = { y: -8, x: 0, start: 0.95, duration: 150 }) => {
|
||||
const style = getComputedStyle(node);
|
||||
const transform = style.transform === "none" ? "" : style.transform;
|
||||
const scaleConversion = (valueA, scaleA, scaleB) => {
|
||||
const [minA, maxA] = scaleA;
|
||||
const [minB, maxB] = scaleB;
|
||||
const percentage = (valueA - minA) / (maxA - minA);
|
||||
const valueB = percentage * (maxB - minB) + minB;
|
||||
return valueB;
|
||||
};
|
||||
const styleToString = (style2) => {
|
||||
return Object.keys(style2).reduce((str, key) => {
|
||||
if (style2[key] === void 0)
|
||||
return str;
|
||||
return str + `${key}:${style2[key]};`;
|
||||
}, "");
|
||||
};
|
||||
return {
|
||||
duration: params.duration ?? 200,
|
||||
delay: 0,
|
||||
css: (t) => {
|
||||
const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]);
|
||||
const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]);
|
||||
const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]);
|
||||
return styleToString({
|
||||
transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`,
|
||||
opacity: t
|
||||
});
|
||||
},
|
||||
easing: cubicOut
|
||||
};
|
||||
};
|
||||
const Card = create_ssr_component(($$result, $$props, $$bindings, slots) => {
|
||||
let $$restProps = compute_rest_props($$props, ["class"]);
|
||||
let { class: className = void 0 } = $$props;
|
||||
if ($$props.class === void 0 && $$bindings.class && className !== void 0)
|
||||
$$bindings.class(className);
|
||||
return `<div${spread(
|
||||
[
|
||||
{
|
||||
class: escape_attribute_value(cn("rounded-lg border bg-card text-card-foreground shadow-sm", className))
|
||||
},
|
||||
escape_object($$restProps)
|
||||
],
|
||||
{}
|
||||
)}>${slots.default ? slots.default({}) : ``}</div>`;
|
||||
});
|
||||
const Card_content = create_ssr_component(($$result, $$props, $$bindings, slots) => {
|
||||
let $$restProps = compute_rest_props($$props, ["class"]);
|
||||
let { class: className = void 0 } = $$props;
|
||||
if ($$props.class === void 0 && $$bindings.class && className !== void 0)
|
||||
$$bindings.class(className);
|
||||
return `<div${spread(
|
||||
[
|
||||
{
|
||||
class: escape_attribute_value(cn("p-6 pt-0", className))
|
||||
},
|
||||
escape_object($$restProps)
|
||||
],
|
||||
{}
|
||||
)}>${slots.default ? slots.default({}) : ``}</div>`;
|
||||
});
|
||||
const defaultAttributes = {
|
||||
xmlns: "http://www.w3.org/2000/svg",
|
||||
width: 24,
|
||||
height: 24,
|
||||
viewBox: "0 0 24 24",
|
||||
fill: "none",
|
||||
stroke: "currentColor",
|
||||
"stroke-width": 2,
|
||||
"stroke-linecap": "round",
|
||||
"stroke-linejoin": "round"
|
||||
};
|
||||
const Icon = create_ssr_component(($$result, $$props, $$bindings, slots) => {
|
||||
let $$restProps = compute_rest_props($$props, ["name", "color", "size", "strokeWidth", "absoluteStrokeWidth", "iconNode"]);
|
||||
let { name } = $$props;
|
||||
let { color = "currentColor" } = $$props;
|
||||
let { size = 24 } = $$props;
|
||||
let { strokeWidth = 2 } = $$props;
|
||||
let { absoluteStrokeWidth = false } = $$props;
|
||||
let { iconNode } = $$props;
|
||||
if ($$props.name === void 0 && $$bindings.name && name !== void 0)
|
||||
$$bindings.name(name);
|
||||
if ($$props.color === void 0 && $$bindings.color && color !== void 0)
|
||||
$$bindings.color(color);
|
||||
if ($$props.size === void 0 && $$bindings.size && size !== void 0)
|
||||
$$bindings.size(size);
|
||||
if ($$props.strokeWidth === void 0 && $$bindings.strokeWidth && strokeWidth !== void 0)
|
||||
$$bindings.strokeWidth(strokeWidth);
|
||||
if ($$props.absoluteStrokeWidth === void 0 && $$bindings.absoluteStrokeWidth && absoluteStrokeWidth !== void 0)
|
||||
$$bindings.absoluteStrokeWidth(absoluteStrokeWidth);
|
||||
if ($$props.iconNode === void 0 && $$bindings.iconNode && iconNode !== void 0)
|
||||
$$bindings.iconNode(iconNode);
|
||||
return `<svg${spread(
|
||||
[
|
||||
escape_object(defaultAttributes),
|
||||
escape_object($$restProps),
|
||||
{ width: escape_attribute_value(size) },
|
||||
{ height: escape_attribute_value(size) },
|
||||
{ stroke: escape_attribute_value(color) },
|
||||
{
|
||||
"stroke-width": escape_attribute_value(absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth)
|
||||
},
|
||||
{
|
||||
class: escape_attribute_value(`lucide-icon lucide lucide-${name} ${$$props.class ?? ""}`)
|
||||
}
|
||||
],
|
||||
{}
|
||||
)}>${each(iconNode, ([tag, attrs]) => {
|
||||
return `${((tag$1) => {
|
||||
return tag$1 ? `<${tag}${spread([escape_object(attrs)], {})}>${is_void(tag$1) ? "" : ``}${is_void(tag$1) ? "" : `</${tag$1}>`}` : "";
|
||||
})(tag)}`;
|
||||
})}${slots.default ? slots.default({}) : ``}</svg>`;
|
||||
});
|
||||
const Icon$1 = Icon;
|
||||
|
||||
export { Card as C, Icon$1 as I, Card_content as a, cubicOut as b, cn as c, flyAndScale as f, is_void as i };
|
||||
//# sourceMappingURL=Icon-2d61886b.js.map
|
||||
@@ -1,26 +0,0 @@
|
||||
import { c as create_ssr_component, v as validate_component, e as escape, a as each, b as add_attribute } from './ssr-f056b9d4.js';
|
||||
import './index3-940e7b25.js';
|
||||
import './ctx-719e1af3.js';
|
||||
import './index2-ef0fcb8d.js';
|
||||
import 'clsx';
|
||||
import 'tailwind-variants';
|
||||
|
||||
const Nav = create_ssr_component(($$result, $$props, $$bindings, slots) => {
|
||||
let { data } = $$props;
|
||||
if ($$props.data === void 0 && $$bindings.data && data !== void 0)
|
||||
$$bindings.data(data);
|
||||
return `<div class="one"></div> <header class="relative z-50 w-full"><div class="container flex h-14 items-center "><div class="mr-4 flex blurry-bg w-full justify-between"><a${add_attribute("href", data.site.home ? data.site.home : "/", 0)} class="mr-6 flex items-center space-x-2">${data.site.logo ? `<img${add_attribute("src", data.site.logo, 0)} class="h-8"${add_attribute("alt", data.site.title, 0)} srcset="">` : ``} ${data.site.title ? `<span class="hidden font-bold md:inline-block text-[15px] lg:text-base">${escape(data.site.title)}</span>` : ``}</a> ${data.site.nav ? `<nav class="flex flex-wrap items-center space-x-6 text-sm font-medium">${each(data.site.nav, (navItem) => {
|
||||
return `<a${add_attribute("href", navItem.url, 0)}>${escape(navItem.name)} </a>`;
|
||||
})}</nav>` : ``}</div></div></header>`;
|
||||
});
|
||||
const Layout = create_ssr_component(($$result, $$props, $$bindings, slots) => {
|
||||
let { data } = $$props;
|
||||
if ($$props.data === void 0 && $$bindings.data && data !== void 0)
|
||||
$$bindings.data(data);
|
||||
return `${data.showNav ? `${validate_component(Nav, "Nav").$$render($$result, { data }, {}, {})}` : ``} ${$$result.head += `<!-- HEAD_svelte-3shchj_START -->${$$result.title = `<title>${escape(data.site.title)}</title>`, ""}${each(Object.entries(data.site.metaTags), ([key, value]) => {
|
||||
return `<meta${add_attribute("name", key, 0)}${add_attribute("content", value, 0)}>`;
|
||||
})}<!-- HEAD_svelte-3shchj_END -->`, ""} ${slots.default ? slots.default({}) : ``} ${data.showNav && !!data.site.footerHTML ? `<footer class="py-6 z-10 md:px-8 md:py-0"><div class="container relative flex flex-col pl-0 items-center justify-center max-w-[890px] gap-4 md:h-24 md:flex-row"><div class="flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0"><p class="text-center text-sm leading-loose text-muted-foreground md:text-left"><!-- HTML_TAG_START -->${data.site.footerHTML}<!-- HTML_TAG_END --></p></div></div></footer>` : ``}`;
|
||||
});
|
||||
|
||||
export { Layout as default };
|
||||
//# sourceMappingURL=_layout.svelte-c7eb1f78.js.map
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"_layout.svelte-c7eb1f78.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/_layout.svelte.js"],"sourcesContent":["import { c as create_ssr_component, a as add_attribute, e as escape, b as each, v as validate_component } from \"../../chunks/ssr.js\";\nimport \"../../chunks/index3.js\";\nconst app = \"\";\nconst kener = \"\";\nconst Nav = create_ssr_component(($$result, $$props, $$bindings, slots) => {\n let { data } = $$props;\n if ($$props.data === void 0 && $$bindings.data && data !== void 0)\n $$bindings.data(data);\n return `<div class=\"one\"></div> <header class=\"relative z-50 w-full\"><div class=\"container flex h-14 items-center \"><div class=\"mr-4 flex blurry-bg w-full justify-between\"><a${add_attribute(\"href\", data.site.home ? data.site.home : \"/\", 0)} class=\"mr-6 flex items-center space-x-2\">${data.site.logo ? `<img${add_attribute(\"src\", data.site.logo, 0)} class=\"h-8\"${add_attribute(\"alt\", data.site.title, 0)} srcset=\"\">` : ``} ${data.site.title ? `<span class=\"hidden font-bold md:inline-block text-[15px] lg:text-base\">${escape(data.site.title)}</span>` : ``}</a> ${data.site.nav ? `<nav class=\"flex flex-wrap items-center space-x-6 text-sm font-medium\">${each(data.site.nav, (navItem) => {\n return `<a${add_attribute(\"href\", navItem.url, 0)}>${escape(navItem.name)} </a>`;\n })}</nav>` : ``}</div></div></header>`;\n});\nconst Layout = create_ssr_component(($$result, $$props, $$bindings, slots) => {\n let { data } = $$props;\n if ($$props.data === void 0 && $$bindings.data && data !== void 0)\n $$bindings.data(data);\n return `${data.showNav ? `${validate_component(Nav, \"Nav\").$$render($$result, { data }, {}, {})}` : ``} ${$$result.head += `<!-- HEAD_svelte-3shchj_START -->${$$result.title = `<title>${escape(data.site.title)}</title>`, \"\"}${each(Object.entries(data.site.metaTags), ([key, value]) => {\n return `<meta${add_attribute(\"name\", key, 0)}${add_attribute(\"content\", value, 0)}>`;\n })}<!-- HEAD_svelte-3shchj_END -->`, \"\"} ${slots.default ? slots.default({}) : ``} ${data.showNav && !!data.site.footerHTML ? `<footer class=\"py-6 z-10 md:px-8 md:py-0\"><div class=\"container relative flex flex-col pl-0 items-center justify-center max-w-[890px] gap-4 md:h-24 md:flex-row\"><div class=\"flex flex-col items-center gap-4 px-8 md:flex-row md:gap-2 md:px-0\"><p class=\"text-center text-sm leading-loose text-muted-foreground md:text-left\"><!-- HTML_TAG_START -->${data.site.footerHTML}<!-- HTML_TAG_END --></p></div></div></footer>` : ``}`;\n});\nexport {\n Layout as default\n};\n"],"names":[],"mappings":";;;;;;;AAIA,MAAM,GAAG,GAAG,oBAAoB,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,KAAK;AAC3E,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;AACzB,EAAE,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC;AACnE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,EAAE,OAAO,CAAC,sKAAsK,EAAE,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,0CAA0C,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,wEAAwE,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,uEAAuE,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,KAAK;AAC/qB,IAAI,OAAO,CAAC,EAAE,EAAE,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AACrF,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AACE,MAAC,MAAM,GAAG,oBAAoB,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,KAAK;AAC9E,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;AACzB,EAAE,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC;AACnE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,iCAAiC,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;AAC/R,IAAI,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzF,GAAG,CAAC,CAAC,+BAA+B,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,wVAAwV,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,8CAA8C,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACviB,CAAC;;;;"}
|
||||
@@ -1,69 +0,0 @@
|
||||
import { c as create_ssr_component, e as escape, v as validate_component, a as each } from './ssr-f056b9d4.js';
|
||||
import { M as Monitor } from './monitor-4022e836.js';
|
||||
import { C as Card, a as Card_content } from './Icon-2d61886b.js';
|
||||
import 'clsx';
|
||||
import { I as Incident } from './incident-2dcbb3c6.js';
|
||||
import './ctx-719e1af3.js';
|
||||
import { B as Badge } from './index4-9cd90a9b.js';
|
||||
import './index2-ef0fcb8d.js';
|
||||
import './events-3e3c01b3.js';
|
||||
import './index3-940e7b25.js';
|
||||
import 'tailwind-variants';
|
||||
import 'tailwind-merge';
|
||||
import './helpers-0acb6e43.js';
|
||||
import 'moment';
|
||||
import './chevron-down-afdb97a6.js';
|
||||
|
||||
const Page = create_ssr_component(($$result, $$props, $$bindings, slots) => {
|
||||
let { data } = $$props;
|
||||
let hasActiveIncidents = data.openIncidents.length > 0;
|
||||
if ($$props.data === void 0 && $$bindings.data && data !== void 0)
|
||||
$$bindings.data(data);
|
||||
return `${$$result.head += `<!-- HEAD_svelte-11ekmvk_START -->${data.monitors.length > 0 ? `${$$result.title = `<title>${escape(data.monitors[0].name)} Monitor Page</title>`, ""}` : ``}<!-- HEAD_svelte-11ekmvk_END -->`, ""} <div class="mt-32"></div> ${hasActiveIncidents ? `<section class="mx-auto bg-transparent mb-4 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center" id=""><div class="grid w-full grid-cols-2 gap-4"><div class="col-span-2 md:col-span-1 text-center md:text-left">${validate_component(Badge, "Badge").$$render($$result, { variant: "outline" }, {}, {
|
||||
default: () => {
|
||||
return `Ongoing Incidents`;
|
||||
}
|
||||
})}</div></div></section> <section class="mx-auto mb-8 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center" id="">${each(data.openIncidents, (incident, i) => {
|
||||
return `${validate_component(Incident, "Incident").$$render(
|
||||
$$result,
|
||||
{
|
||||
incident,
|
||||
state: "close",
|
||||
variant: "title+body+comments+monitor",
|
||||
monitor: incident.monitor
|
||||
},
|
||||
{},
|
||||
{}
|
||||
)}`;
|
||||
})}</section>` : ``} ${data.monitors.length > 0 ? `<section class="mx-auto bg-transparent mb-4 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center" id=""><div class="grid w-full grid-cols-2 gap-4"><div class="col-span-2 md:col-span-1 text-center md:text-left">${validate_component(Badge, "Badge").$$render($$result, { class: "", variant: "outline" }, {}, {
|
||||
default: () => {
|
||||
return `Availability per Component`;
|
||||
}
|
||||
})}</div> <div class="col-span-2 md:col-span-1 text-center md:text-right">${validate_component(Badge, "Badge").$$render($$result, { variant: "outline" }, {}, {
|
||||
default: () => {
|
||||
return `<span class="w-[8px] h-[8px] inline-flex rounded-full bg-api-up opacity-75 mr-1"></span> <span class="mr-3" data-svelte-h="svelte-fd8nbr">UP</span> <span class="w-[8px] h-[8px] inline-flex rounded-full bg-api-degraded opacity-75 mr-1"></span> <span class="mr-3" data-svelte-h="svelte-ddctvm">DEGRADED</span> <span class="w-[8px] h-[8px] inline-flex rounded-full bg-api-down opacity-75 mr-1"></span> <span class="mr-3" data-svelte-h="svelte-1o75psw">DOWN</span>`;
|
||||
}
|
||||
})}</div></div></section> <section class="mx-auto backdrop-blur-[2px] mb-8 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center">${validate_component(Card, "Card.Root").$$render($$result, { class: "w-full" }, {}, {
|
||||
default: () => {
|
||||
return `${validate_component(Card_content, "Card.Content").$$render($$result, { class: "p-0 monitors-card" }, {}, {
|
||||
default: () => {
|
||||
return `${each(data.monitors, (monitor) => {
|
||||
return `${validate_component(Monitor, "Monitor").$$render($$result, { monitor, localTz: data.localTz }, {}, {})}`;
|
||||
})}`;
|
||||
}
|
||||
})}`;
|
||||
}
|
||||
})}</section>` : `<section class="mx-auto bg-transparent mb-4 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center" id="">${validate_component(Card, "Card.Root").$$render($$result, { class: "mx-auto" }, {}, {
|
||||
default: () => {
|
||||
return `${validate_component(Card_content, "Card.Content").$$render($$result, { class: "pt-4" }, {}, {
|
||||
default: () => {
|
||||
return `<h1 class="scroll-m-20 text-2xl font-extrabold tracking-tight lg:text-2xl text-center" data-svelte-h="svelte-pnpgii">No Monitor Found.</h1> <p class="mt-3 text-center" data-svelte-h="svelte-x3h5nn">Please read the documentation on how to add monitors
|
||||
<a href="https://kener.ing/docs#h1add-monitors" target="_blank" class="underline">here</a>.</p>`;
|
||||
}
|
||||
})}`;
|
||||
}
|
||||
})}</section>`}`;
|
||||
});
|
||||
|
||||
export { Page as default };
|
||||
//# sourceMappingURL=_page.svelte-277c90e9.js.map
|
||||
@@ -1,112 +0,0 @@
|
||||
import { c as create_ssr_component, e as escape, v as validate_component, a as each, f as compute_rest_props, d as subscribe, g as spread, h as escape_object } from './ssr-f056b9d4.js';
|
||||
import 'clsx';
|
||||
import { I as Incident } from './incident-2dcbb3c6.js';
|
||||
import { e as setCtx, f as getAttrs } from './ctx-719e1af3.js';
|
||||
import { c as cn } from './Icon-2d61886b.js';
|
||||
import 'moment';
|
||||
import { B as Badge } from './index4-9cd90a9b.js';
|
||||
import './helpers-0acb6e43.js';
|
||||
import './index3-940e7b25.js';
|
||||
import 'tailwind-variants';
|
||||
import './chevron-down-afdb97a6.js';
|
||||
import './index2-ef0fcb8d.js';
|
||||
import 'tailwind-merge';
|
||||
|
||||
const Separator$1 = create_ssr_component(($$result, $$props, $$bindings, slots) => {
|
||||
let builder;
|
||||
let $$restProps = compute_rest_props($$props, ["orientation", "decorative", "asChild"]);
|
||||
let $root, $$unsubscribe_root;
|
||||
let { orientation = "horizontal" } = $$props;
|
||||
let { decorative = true } = $$props;
|
||||
let { asChild = false } = $$props;
|
||||
const { elements: { root }, updateOption } = setCtx({ orientation, decorative });
|
||||
$$unsubscribe_root = subscribe(root, (value) => $root = value);
|
||||
const attrs = getAttrs("root");
|
||||
if ($$props.orientation === void 0 && $$bindings.orientation && orientation !== void 0)
|
||||
$$bindings.orientation(orientation);
|
||||
if ($$props.decorative === void 0 && $$bindings.decorative && decorative !== void 0)
|
||||
$$bindings.decorative(decorative);
|
||||
if ($$props.asChild === void 0 && $$bindings.asChild && asChild !== void 0)
|
||||
$$bindings.asChild(asChild);
|
||||
{
|
||||
updateOption("orientation", orientation);
|
||||
}
|
||||
{
|
||||
updateOption("decorative", decorative);
|
||||
}
|
||||
builder = $root;
|
||||
$$unsubscribe_root();
|
||||
return `${asChild ? `${slots.default ? slots.default({ builder, attrs }) : ``}` : `<div${spread([escape_object(builder), escape_object($$restProps), escape_object(attrs)], {})}></div>`}`;
|
||||
});
|
||||
const Separator = create_ssr_component(($$result, $$props, $$bindings, slots) => {
|
||||
let $$restProps = compute_rest_props($$props, ["class", "orientation", "decorative"]);
|
||||
let { class: className = void 0 } = $$props;
|
||||
let { orientation = "horizontal" } = $$props;
|
||||
let { decorative = void 0 } = $$props;
|
||||
if ($$props.class === void 0 && $$bindings.class && className !== void 0)
|
||||
$$bindings.class(className);
|
||||
if ($$props.orientation === void 0 && $$bindings.orientation && orientation !== void 0)
|
||||
$$bindings.orientation(orientation);
|
||||
if ($$props.decorative === void 0 && $$bindings.decorative && decorative !== void 0)
|
||||
$$bindings.decorative(decorative);
|
||||
return `${validate_component(Separator$1, "SeparatorPrimitive.Root").$$render(
|
||||
$$result,
|
||||
Object.assign(
|
||||
{},
|
||||
{
|
||||
class: cn(
|
||||
"shrink-0 bg-border",
|
||||
orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
|
||||
className
|
||||
)
|
||||
},
|
||||
{ orientation },
|
||||
{ decorative },
|
||||
$$restProps
|
||||
),
|
||||
{},
|
||||
{}
|
||||
)}`;
|
||||
});
|
||||
const Page = create_ssr_component(($$result, $$props, $$bindings, slots) => {
|
||||
let { data } = $$props;
|
||||
if ($$props.data === void 0 && $$bindings.data && data !== void 0)
|
||||
$$bindings.data(data);
|
||||
return `${$$result.head += `<!-- HEAD_svelte-1j8jcnk_START -->${$$result.title = `<title> ${escape(data.monitor.name)} - Incidents
|
||||
</title>`, ""}<!-- HEAD_svelte-1j8jcnk_END -->`, ""} <section class="mx-auto flex w-full max-w-4xl flex-1 flex-col items-start justify-center"><div class="mx-auto max-w-screen-xl px-4 pt-32 pb-16 lg:flex lg:items-center"><div class="mx-auto max-w-3xl text-center blurry-bg"><h1 class="bg-gradient-to-r from-green-300 via-blue-500 to-purple-600 bg-clip-text text-5xl font-extrabold text-transparent leading-snug">${escape(data.monitor.name)}</h1> <p class="mx-auto mt-4 max-w-xl sm:text-xl"><!-- HTML_TAG_START -->${data.monitor.description}<!-- HTML_TAG_END --></p></div></div></section> <section class="mx-auto flex-1 mt-8 flex-col mb-4 flex w-full"><div class="container"><h1 class="mb-4 text-2xl font-bold leading-none">${validate_component(Badge, "Badge").$$render($$result, { variant: "outline" }, {}, {
|
||||
default: () => {
|
||||
return `Active Incidents`;
|
||||
}
|
||||
})}</h1> ${data.activeIncidents.length > 0 ? `${each(data.activeIncidents, (incident, i) => {
|
||||
return `${validate_component(Incident, "Incident").$$render(
|
||||
$$result,
|
||||
{
|
||||
incident,
|
||||
state: i == 0 ? "open" : "close",
|
||||
variant: "title+body+comments",
|
||||
monitor: data.monitor
|
||||
},
|
||||
{},
|
||||
{}
|
||||
)}`;
|
||||
})}` : `<div class="flex items-center justify-left" data-svelte-h="svelte-otycm6"><p class="text-base font-semibold">No active incidents</p></div>`}</div></section> ${validate_component(Separator, "Separator").$$render($$result, { class: "container mb-4 w-[400px]" }, {}, {})} <section class="mx-auto flex-1 mt-8 flex-col mb-4 flex w-full"><div class="container"><h1 class="mb-4 text-2xl font-bold leading-none">${validate_component(Badge, "Badge").$$render($$result, { variant: "outline" }, {}, {
|
||||
default: () => {
|
||||
return `Recent Incidents - Last ${escape(data.site.github.incidentSince)} Hours`;
|
||||
}
|
||||
})}</h1> ${data.pastIncidents.length > 0 ? `${each(data.pastIncidents, (incident) => {
|
||||
return `${validate_component(Incident, "Incident").$$render(
|
||||
$$result,
|
||||
{
|
||||
incident,
|
||||
state: "close",
|
||||
variant: "title+body+comments",
|
||||
monitor: data.monitor
|
||||
},
|
||||
{},
|
||||
{}
|
||||
)}`;
|
||||
})}` : `<div class="flex items-center justify-left" data-svelte-h="svelte-1wctao9"><p class="text-base font-semibold">No recent incidents</p></div>`}</div></section>`;
|
||||
});
|
||||
|
||||
export { Page as default };
|
||||
//# sourceMappingURL=_page.svelte-5de3ecd2.js.map
|
||||
@@ -1,74 +0,0 @@
|
||||
import { c as create_ssr_component, d as subscribe, e as escape, b as add_attribute, v as validate_component, a as each } from './ssr-f056b9d4.js';
|
||||
import { M as Monitor } from './monitor-4022e836.js';
|
||||
import { C as Card, a as Card_content } from './Icon-2d61886b.js';
|
||||
import 'clsx';
|
||||
import { I as Incident } from './incident-2dcbb3c6.js';
|
||||
import './ctx-719e1af3.js';
|
||||
import { B as Badge } from './index4-9cd90a9b.js';
|
||||
import { p as page } from './stores-0262db6b.js';
|
||||
import './index2-ef0fcb8d.js';
|
||||
import './events-3e3c01b3.js';
|
||||
import './index3-940e7b25.js';
|
||||
import 'tailwind-variants';
|
||||
import 'tailwind-merge';
|
||||
import './helpers-0acb6e43.js';
|
||||
import 'moment';
|
||||
import './chevron-down-afdb97a6.js';
|
||||
|
||||
const Page = create_ssr_component(($$result, $$props, $$bindings, slots) => {
|
||||
let $page, $$unsubscribe_page;
|
||||
$$unsubscribe_page = subscribe(page, (value) => $page = value);
|
||||
let { data } = $$props;
|
||||
let category = data.site.categories.find((c) => c.name === $page.params.category);
|
||||
let hasActiveIncidents = data.openIncidents.length > 0;
|
||||
if ($$props.data === void 0 && $$bindings.data && data !== void 0)
|
||||
$$bindings.data(data);
|
||||
$$unsubscribe_page();
|
||||
return `${$$result.head += `<!-- HEAD_svelte-zgbzo2_START -->${category ? `${$$result.title = `<title>${escape(category.name)} Categorry Page</title>`, ""} ${category.description ? `<meta name="description"${add_attribute("content", category.description, 0)}>` : ``}` : ``}<!-- HEAD_svelte-zgbzo2_END -->`, ""} <div class="mt-32"></div> ${category ? `<section class="mx-auto flex w-full max-w-4xl mb-8 flex-1 flex-col items-start justify-center"><div class="mx-auto max-w-screen-xl px-4 lg:flex lg:items-center"><div class="mx-auto max-w-3xl text-center blurry-bg">${category.name ? `<h1 class="bg-gradient-to-r from-green-300 via-blue-500 to-purple-600 bg-clip-text text-5xl font-extrabold text-transparent leading-snug">${escape(category.name)}</h1>` : ``} ${category.description ? `<p class="mx-auto mt-4 max-w-xl sm:text-xl">${escape(category.description)}</p>` : ``}</div></div></section>` : ``} ${hasActiveIncidents ? `<section class="mx-auto bg-transparent mb-4 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center" id=""><div class="grid w-full grid-cols-2 gap-4"><div class="col-span-2 md:col-span-1 text-center md:text-left">${validate_component(Badge, "Badge").$$render($$result, { variant: "outline" }, {}, {
|
||||
default: () => {
|
||||
return `Ongoing Incidents`;
|
||||
}
|
||||
})}</div></div></section> <section class="mx-auto backdrop-blur-[2px] mb-8 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center" id="">${each(data.openIncidents, (incident, i) => {
|
||||
return `${validate_component(Incident, "Incident").$$render(
|
||||
$$result,
|
||||
{
|
||||
incident,
|
||||
state: "close",
|
||||
variant: "title+body+comments+monitor",
|
||||
monitor: incident.monitor
|
||||
},
|
||||
{},
|
||||
{}
|
||||
)}`;
|
||||
})}</section>` : ``} ${data.monitors.length > 0 ? `<section class="mx-auto bg-transparent mb-4 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center" id=""><div class="grid w-full grid-cols-2 gap-4"><div class="col-span-2 md:col-span-1 text-center md:text-left">${validate_component(Badge, "Badge").$$render($$result, { class: "", variant: "outline" }, {}, {
|
||||
default: () => {
|
||||
return `Availability per Component`;
|
||||
}
|
||||
})}</div> <div class="col-span-2 md:col-span-1 text-center md:text-right">${validate_component(Badge, "Badge").$$render($$result, { variant: "outline" }, {}, {
|
||||
default: () => {
|
||||
return `<span class="w-[8px] h-[8px] inline-flex rounded-full bg-api-up opacity-75 mr-1"></span> <span class="mr-3" data-svelte-h="svelte-fd8nbr">UP</span> <span class="w-[8px] h-[8px] inline-flex rounded-full bg-api-degraded opacity-75 mr-1"></span> <span class="mr-3" data-svelte-h="svelte-ddctvm">DEGRADED</span> <span class="w-[8px] h-[8px] inline-flex rounded-full bg-api-down opacity-75 mr-1"></span> <span class="mr-3" data-svelte-h="svelte-1o75psw">DOWN</span>`;
|
||||
}
|
||||
})}</div></div></section> <section class="mx-auto backdrop-blur-[2px] mb-8 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center">${validate_component(Card, "Card.Root").$$render($$result, { class: "w-full" }, {}, {
|
||||
default: () => {
|
||||
return `${validate_component(Card_content, "Card.Content").$$render($$result, { class: "p-0 monitors-card" }, {}, {
|
||||
default: () => {
|
||||
return `${each(data.monitors, (monitor) => {
|
||||
return `${validate_component(Monitor, "Monitor").$$render($$result, { monitor, localTz: data.localTz }, {}, {})}`;
|
||||
})}`;
|
||||
}
|
||||
})}`;
|
||||
}
|
||||
})}</section>` : `<section class="mx-auto bg-transparent mb-4 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center" id="">${validate_component(Card, "Card.Root").$$render($$result, { class: "mx-auto" }, {}, {
|
||||
default: () => {
|
||||
return `${validate_component(Card_content, "Card.Content").$$render($$result, { class: "pt-4" }, {}, {
|
||||
default: () => {
|
||||
return `<h1 class="scroll-m-20 text-2xl font-extrabold tracking-tight lg:text-2xl text-center" data-svelte-h="svelte-pnpgii">No Monitor Found.</h1> <p class="mt-3 text-center" data-svelte-h="svelte-x3h5nn">Please read the documentation on how to add monitors
|
||||
<a href="https://kener.ing/docs#h1add-monitors" target="_blank" class="underline">here</a>.</p>`;
|
||||
}
|
||||
})}`;
|
||||
}
|
||||
})}</section>`}`;
|
||||
});
|
||||
|
||||
export { Page as default };
|
||||
//# sourceMappingURL=_page.svelte-85f71bac.js.map
|
||||
@@ -1,78 +0,0 @@
|
||||
import { c as create_ssr_component, b as add_attribute, e as escape, v as validate_component, a as each } from './ssr-f056b9d4.js';
|
||||
import { M as Monitor } from './monitor-4022e836.js';
|
||||
import { C as Card, a as Card_content } from './Icon-2d61886b.js';
|
||||
import { I as Incident, C as Card_header, a as Card_title, b as Card_description } from './incident-2dcbb3c6.js';
|
||||
import 'clsx';
|
||||
import { b as buttonVariants } from './index3-940e7b25.js';
|
||||
import { B as Badge } from './index4-9cd90a9b.js';
|
||||
import './ctx-719e1af3.js';
|
||||
import './index2-ef0fcb8d.js';
|
||||
import './events-3e3c01b3.js';
|
||||
import 'tailwind-merge';
|
||||
import './helpers-0acb6e43.js';
|
||||
import 'moment';
|
||||
import './chevron-down-afdb97a6.js';
|
||||
import 'tailwind-variants';
|
||||
|
||||
const Page = create_ssr_component(($$result, $$props, $$bindings, slots) => {
|
||||
let { data } = $$props;
|
||||
let hasActiveIncidents = data.openIncidents.length > 0;
|
||||
if ($$props.data === void 0 && $$bindings.data && data !== void 0)
|
||||
$$bindings.data(data);
|
||||
return `<div class="mt-32"></div> ${data.site.hero ? `<section class="mx-auto mb-8 flex w-full max-w-4xl flex-1 flex-col items-start justify-center"><div class="mx-auto max-w-screen-xl px-4 lg:flex lg:items-center"><div class="blurry-bg mx-auto max-w-3xl text-center">${data.site.hero.image ? `<img${add_attribute("src", data.site.hero.image, 0)} class="m-auto h-16 w-16" alt="" srcset="">` : ``} ${data.site.hero.title ? `<h1 class="bg-gradient-to-r from-green-300 via-blue-500 to-purple-600 bg-clip-text text-5xl font-extrabold leading-snug text-transparent">${escape(data.site.hero.title)}</h1>` : ``} ${data.site.hero.subtitle ? `<p class="mx-auto mt-4 max-w-xl sm:text-xl">${escape(data.site.hero.subtitle)}</p>` : ``}</div></div></section>` : ``} ${hasActiveIncidents ? `<section class="mx-auto mb-4 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center bg-transparent" id=""><div class="grid w-full grid-cols-2 gap-4"><div class="col-span-2 text-center md:col-span-1 md:text-left">${validate_component(Badge, "Badge").$$render($$result, { variant: "outline" }, {}, {
|
||||
default: () => {
|
||||
return `Ongoing Incidents`;
|
||||
}
|
||||
})}</div></div></section> <section class="mx-auto mb-8 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center backdrop-blur-[2px]" id="">${each(data.openIncidents, (incident, i) => {
|
||||
return `${validate_component(Incident, "Incident").$$render(
|
||||
$$result,
|
||||
{
|
||||
incident,
|
||||
state: "close",
|
||||
variant: "title+body+comments+monitor",
|
||||
monitor: incident.monitor
|
||||
},
|
||||
{},
|
||||
{}
|
||||
)}`;
|
||||
})}</section>` : ``} ${data.monitors.length > 0 ? `<section class="mx-auto mb-4 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center bg-transparent" id=""><div class="grid w-full grid-cols-2 gap-4"><div class="col-span-2 text-center md:col-span-1 md:text-left">${validate_component(Badge, "Badge").$$render($$result, { class: "", variant: "outline" }, {}, {
|
||||
default: () => {
|
||||
return `Availability per Component`;
|
||||
}
|
||||
})}</div> <div class="col-span-2 text-center md:col-span-1 md:text-right">${validate_component(Badge, "Badge").$$render($$result, { variant: "outline" }, {}, {
|
||||
default: () => {
|
||||
return `<span class="bg-api-up mr-1 inline-flex h-[8px] w-[8px] rounded-full opacity-75"></span> <span class="mr-3" data-svelte-h="svelte-fd8nbr">UP</span> <span class="bg-api-degraded mr-1 inline-flex h-[8px] w-[8px] rounded-full opacity-75"></span> <span class="mr-3" data-svelte-h="svelte-ddctvm">DEGRADED</span> <span class="bg-api-down mr-1 inline-flex h-[8px] w-[8px] rounded-full opacity-75"></span> <span class="mr-3" data-svelte-h="svelte-1o75psw">DOWN</span>`;
|
||||
}
|
||||
})}</div></div></section> <section class="mx-auto mb-8 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center backdrop-blur-[2px]">${validate_component(Card, "Card.Root").$$render($$result, {}, {}, {
|
||||
default: () => {
|
||||
return `${validate_component(Card_content, "Card.Content").$$render($$result, { class: "monitors-card p-0" }, {}, {
|
||||
default: () => {
|
||||
return `${each(data.monitors, (monitor) => {
|
||||
return `${validate_component(Monitor, "Monitor").$$render($$result, { monitor, localTz: data.localTz }, {}, {})}`;
|
||||
})}`;
|
||||
}
|
||||
})}`;
|
||||
}
|
||||
})}</section>` : ``} ${data.site.categories ? `<section class="mx-auto mb-8 w-full max-w-[890px] flex-1 flex-col items-start backdrop-blur-[2px]"><h2 class="mb-2 mt-2 px-2 text-xl font-semibold" data-svelte-h="svelte-3lfsa8">Other Monitors</h2> ${each(data.site.categories, (category) => {
|
||||
return `${validate_component(Card, "Card.Root").$$render($$result, { class: "mb-2 w-full" }, {}, {
|
||||
default: () => {
|
||||
return `${validate_component(Card_header, "Card.Header").$$render($$result, {}, {}, {
|
||||
default: () => {
|
||||
return `${validate_component(Card_title, "Card.Title").$$render($$result, {}, {}, {
|
||||
default: () => {
|
||||
return `${escape(category.name)}`;
|
||||
}
|
||||
})} ${validate_component(Card_description, "Card.Description").$$render($$result, { class: "relative pr-[100px]" }, {}, {
|
||||
default: () => {
|
||||
return `${category.description ? `${escape(category.description)}` : ``} <a href="${"/category-" + escape(category.name, true)}" class="${escape(buttonVariants({ variant: "secondary" }), true) + " absolute -top-4 right-2"}">View</a> `;
|
||||
}
|
||||
})} `;
|
||||
}
|
||||
})} `;
|
||||
}
|
||||
})}`;
|
||||
})}</section>` : ``}`;
|
||||
});
|
||||
|
||||
export { Page as default };
|
||||
//# sourceMappingURL=_page.svelte-b9177f34.js.map
|
||||
@@ -1,45 +0,0 @@
|
||||
import { c as create_ssr_component, d as subscribe, b as add_attribute, v as validate_component, a as each } from './ssr-f056b9d4.js';
|
||||
import { M as Monitor } from './monitor-4022e836.js';
|
||||
import { C as Card, a as Card_content } from './Icon-2d61886b.js';
|
||||
import 'clsx';
|
||||
import './ctx-719e1af3.js';
|
||||
import './index4-9cd90a9b.js';
|
||||
import { p as page } from './stores-0262db6b.js';
|
||||
import './index2-ef0fcb8d.js';
|
||||
import './events-3e3c01b3.js';
|
||||
import './index3-940e7b25.js';
|
||||
import 'tailwind-variants';
|
||||
import 'tailwind-merge';
|
||||
|
||||
const Page = create_ssr_component(($$result, $$props, $$bindings, slots) => {
|
||||
let $$unsubscribe_page;
|
||||
$$unsubscribe_page = subscribe(page, (value) => value);
|
||||
let element;
|
||||
let { data } = $$props;
|
||||
if ($$props.data === void 0 && $$bindings.data && data !== void 0)
|
||||
$$bindings.data(data);
|
||||
$$unsubscribe_page();
|
||||
return `${data.monitors.length > 0 ? `<section class="w-fit p-0"${add_attribute("this", element, 0)}>${validate_component(Card, "Card.Root").$$render($$result, { class: "w-[580px] border-0 shadow-none" }, {}, {
|
||||
default: () => {
|
||||
return `${validate_component(Card_content, "Card.Content").$$render($$result, { class: "p-0 monitors-card " }, {}, {
|
||||
default: () => {
|
||||
return `${each(data.monitors, (monitor) => {
|
||||
return `${validate_component(Monitor, "Monitor").$$render($$result, { monitor, localTz: data.localTz }, {}, {})}`;
|
||||
})}`;
|
||||
}
|
||||
})}`;
|
||||
}
|
||||
})}</section>` : `<section class="mx-auto bg-transparent mb-4 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center" id="">${validate_component(Card, "Card.Root").$$render($$result, { class: "mx-auto" }, {}, {
|
||||
default: () => {
|
||||
return `${validate_component(Card_content, "Card.Content").$$render($$result, { class: "pt-4" }, {}, {
|
||||
default: () => {
|
||||
return `<h1 class="scroll-m-20 text-2xl font-extrabold tracking-tight lg:text-2xl text-center" data-svelte-h="svelte-1vwlrnd">No Monitor Found.</h1> <p class="mt-3 text-center" data-svelte-h="svelte-oy4ufi">Please read the documentation on how to add monitors
|
||||
<a href="https://kener.ing/docs#h1add-monitors" target="_blank" class="underline">here</a>.</p>`;
|
||||
}
|
||||
})}`;
|
||||
}
|
||||
})}</section>`}`;
|
||||
});
|
||||
|
||||
export { Page as default };
|
||||
//# sourceMappingURL=_page.svelte-e60523b0.js.map
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"_page.svelte-e60523b0.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/embed-_tag_/_page.svelte.js"],"sourcesContent":["import { c as create_ssr_component, d as subscribe, a as add_attribute, v as validate_component, b as each } from \"../../../chunks/ssr.js\";\nimport { M as Monitor } from \"../../../chunks/monitor.js\";\nimport { C as Card, a as Card_content } from \"../../../chunks/Icon.js\";\nimport \"clsx\";\nimport \"dequal\";\nimport \"../../../chunks/ctx.js\";\nimport \"../../../chunks/index4.js\";\nimport { p as page } from \"../../../chunks/stores.js\";\nconst Page = create_ssr_component(($$result, $$props, $$bindings, slots) => {\n let $$unsubscribe_page;\n $$unsubscribe_page = subscribe(page, (value) => value);\n let element;\n let { data } = $$props;\n if ($$props.data === void 0 && $$bindings.data && data !== void 0)\n $$bindings.data(data);\n $$unsubscribe_page();\n return `${data.monitors.length > 0 ? `<section class=\"w-fit p-0\"${add_attribute(\"this\", element, 0)}>${validate_component(Card, \"Card.Root\").$$render($$result, { class: \"w-[580px] border-0 shadow-none\" }, {}, {\n default: () => {\n return `${validate_component(Card_content, \"Card.Content\").$$render($$result, { class: \"p-0 monitors-card \" }, {}, {\n default: () => {\n return `${each(data.monitors, (monitor) => {\n return `${validate_component(Monitor, \"Monitor\").$$render($$result, { monitor, localTz: data.localTz }, {}, {})}`;\n })}`;\n }\n })}`;\n }\n })}</section>` : `<section class=\"mx-auto bg-transparent mb-4 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center\" id=\"\">${validate_component(Card, \"Card.Root\").$$render($$result, { class: \"mx-auto\" }, {}, {\n default: () => {\n return `${validate_component(Card_content, \"Card.Content\").$$render($$result, { class: \"pt-4\" }, {}, {\n default: () => {\n return `<h1 class=\"scroll-m-20 text-2xl font-extrabold tracking-tight lg:text-2xl text-center\" data-svelte-h=\"svelte-1vwlrnd\">No Monitor Found.</h1> <p class=\"mt-3 text-center\" data-svelte-h=\"svelte-oy4ufi\">Please read the documentation on how to add monitors\n <a href=\"https://kener.ing/docs#h1add-monitors\" target=\"_blank\" class=\"underline\">here</a>.</p>`;\n }\n })}`;\n }\n })}</section>`}`;\n});\nexport {\n Page as default\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;AAQK,MAAC,IAAI,GAAG,oBAAoB,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,KAAK;AAC5E,EAAE,IAAI,kBAAkB,CAAC;AACzB,EAAE,kBAAkB,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AACzD,EAAE,IAAI,OAAO,CAAC;AACd,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;AACzB,EAAE,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC;AACnE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,EAAE,kBAAkB,EAAE,CAAC;AACvB,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,0BAA0B,EAAE,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,EAAE,EAAE;AACnN,IAAI,OAAO,EAAE,MAAM;AACnB,MAAM,OAAO,CAAC,EAAE,kBAAkB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,EAAE,EAAE;AACzH,QAAQ,OAAO,EAAE,MAAM;AACvB,UAAU,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,KAAK;AACrD,YAAY,OAAO,CAAC,EAAE,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9H,WAAW,CAAC,CAAC,CAAC,CAAC;AACf,SAAS;AACT,OAAO,CAAC,CAAC,CAAC,CAAC;AACX,KAAK;AACL,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,wHAAwH,EAAE,kBAAkB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE;AACjO,IAAI,OAAO,EAAE,MAAM;AACnB,MAAM,OAAO,CAAC,EAAE,kBAAkB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;AAC3G,QAAQ,OAAO,EAAE,MAAM;AACvB,UAAU,OAAO,CAAC;AAClB,+GAA+G,CAAC,CAAC;AACjH,SAAS;AACT,OAAO,CAAC,CAAC,CAAC,CAAC;AACX,KAAK;AACL,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;;;;"}
|
||||