This commit is contained in:
		
						commit
						604b83b51a
					
				
							
								
								
									
										9
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
			
		||||
[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue,css,scss,sass,less,styl}]
 | 
			
		||||
charset = utf-8
 | 
			
		||||
indent_size = 2
 | 
			
		||||
indent_style = space
 | 
			
		||||
insert_final_newline = true
 | 
			
		||||
trim_trailing_whitespace = true
 | 
			
		||||
 | 
			
		||||
end_of_line = lf
 | 
			
		||||
max_line_length = 100
 | 
			
		||||
							
								
								
									
										4
									
								
								.env.example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.env.example
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
			
		||||
VITE_LOGTO_ENDPOINT=https://logto.example.com
 | 
			
		||||
VITE_LOGTO_APP_ID=changeme
 | 
			
		||||
VITE_HOSTNAME=http://localhost:5173 # No trailing slash
 | 
			
		||||
VITE_API_BASE_URL=http://localhost:3000
 | 
			
		||||
							
								
								
									
										7
									
								
								.envrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								.envrc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
export DIRENV_WARN_TIMEOUT=20s
 | 
			
		||||
 | 
			
		||||
eval "$(devenv direnvrc)"
 | 
			
		||||
 | 
			
		||||
# The use_devenv function supports passing flags to the devenv command
 | 
			
		||||
# For example: use devenv --impure --option services.postgres.enable:bool true
 | 
			
		||||
use devenv
 | 
			
		||||
							
								
								
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
* text=auto eol=lf
 | 
			
		||||
							
								
								
									
										27
									
								
								.gitea/workflows/tests.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								.gitea/workflows/tests.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
			
		||||
name: 'Tests'
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
  push:
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  tests:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    permissions:
 | 
			
		||||
      content: read
 | 
			
		||||
      pull-requests: write
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: cachix/install-nix-action@v31.4.0
 | 
			
		||||
      - uses: cachix/cachix-action@v14
 | 
			
		||||
        with:
 | 
			
		||||
          name: devenv
 | 
			
		||||
      - name: Install devenv.sh
 | 
			
		||||
        run: nix profile install nixpkgs#devenv
 | 
			
		||||
      - name: Install NPM dependencies
 | 
			
		||||
        run: devenv shell npm install
 | 
			
		||||
      - name: Build the devenv shell and run any pre-commit hooks and project tests
 | 
			
		||||
        run: devenv test
 | 
			
		||||
      - name: Report coverage
 | 
			
		||||
        if: gitea.event_name == 'pull_request'
 | 
			
		||||
        uses: davelosert/vitest-coverage-report-action@v2
 | 
			
		||||
							
								
								
									
										42
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
			
		||||
# Logs
 | 
			
		||||
logs
 | 
			
		||||
*.log
 | 
			
		||||
npm-debug.log*
 | 
			
		||||
yarn-debug.log*
 | 
			
		||||
yarn-error.log*
 | 
			
		||||
pnpm-debug.log*
 | 
			
		||||
lerna-debug.log*
 | 
			
		||||
 | 
			
		||||
node_modules
 | 
			
		||||
.DS_Store
 | 
			
		||||
dist
 | 
			
		||||
dist-ssr
 | 
			
		||||
coverage
 | 
			
		||||
*.local
 | 
			
		||||
 | 
			
		||||
/cypress/videos/
 | 
			
		||||
/cypress/screenshots/
 | 
			
		||||
 | 
			
		||||
# Editor directories and files
 | 
			
		||||
.vscode/*
 | 
			
		||||
!.vscode/extensions.json
 | 
			
		||||
.idea
 | 
			
		||||
*.suo
 | 
			
		||||
*.ntvs*
 | 
			
		||||
*.njsproj
 | 
			
		||||
*.sln
 | 
			
		||||
*.sw?
 | 
			
		||||
 | 
			
		||||
*.tsbuildinfo
 | 
			
		||||
 | 
			
		||||
# Devenv
 | 
			
		||||
.devenv*
 | 
			
		||||
devenv.local.nix
 | 
			
		||||
 | 
			
		||||
# direnv
 | 
			
		||||
.direnv
 | 
			
		||||
 | 
			
		||||
# pre-commit
 | 
			
		||||
.pre-commit-config.yaml
 | 
			
		||||
 | 
			
		||||
.env
 | 
			
		||||
							
								
								
									
										2
									
								
								.markdownlint.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.markdownlint.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
default: true
 | 
			
		||||
MD051: false
 | 
			
		||||
							
								
								
									
										1
									
								
								.markdownlintignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.markdownlintignore
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
LICENSE.md
 | 
			
		||||
							
								
								
									
										2
									
								
								.prettierignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.prettierignore
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
# README.md
 | 
			
		||||
/*.md
 | 
			
		||||
							
								
								
									
										13
									
								
								.prettierrc.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								.prettierrc.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
{
 | 
			
		||||
  "$schema": "https://json.schemastore.org/prettierrc",
 | 
			
		||||
  "printWidth": 120,
 | 
			
		||||
  "tabWidth": 2,
 | 
			
		||||
  "useTabs": false,
 | 
			
		||||
  "semi": true,
 | 
			
		||||
  "singleQuote": true,
 | 
			
		||||
  "trailingComma": "all",
 | 
			
		||||
  "bracketSpacing": true,
 | 
			
		||||
  "jsxBracketSameLine": true,
 | 
			
		||||
  "arrowParens": "always",
 | 
			
		||||
  "proseWrap": "always"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
			
		||||
{
 | 
			
		||||
  "recommendations": [
 | 
			
		||||
    "Vue.volar",
 | 
			
		||||
    "vitest.explorer",
 | 
			
		||||
    "dbaeumer.vscode-eslint",
 | 
			
		||||
    "EditorConfig.EditorConfig",
 | 
			
		||||
    "esbenp.prettier-vscode"
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										126
									
								
								CODE_OF_CONDUCT.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								CODE_OF_CONDUCT.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,126 @@
 | 
			
		||||
# Code of Conduct - daily-aujourdhui-frontend
 | 
			
		||||
 | 
			
		||||
## Our Pledge
 | 
			
		||||
 | 
			
		||||
In the interest of fostering an open and welcoming environment, we as
 | 
			
		||||
contributors and maintainers pledge to make participation in our
 | 
			
		||||
project and our community a harassment-free experience for everyone,
 | 
			
		||||
regardless of age, body size, disability, ethnicity, sex
 | 
			
		||||
characteristics, gender identity and expression, level of experience,
 | 
			
		||||
education, socio-economic status, nationality, personal appearance,
 | 
			
		||||
race, religion, or sexual identity and orientation.
 | 
			
		||||
 | 
			
		||||
## Our Standards
 | 
			
		||||
 | 
			
		||||
Examples of behavior that contributes to a positive environment for
 | 
			
		||||
our community include:
 | 
			
		||||
 | 
			
		||||
* Demonstrating empathy and kindness toward other people
 | 
			
		||||
* Being respectful of differing opinions, viewpoints, and experiences
 | 
			
		||||
* Giving and gracefully accepting constructive feedback
 | 
			
		||||
* Accepting responsibility and apologizing to those affected by our
 | 
			
		||||
  mistakes, and learning from the experience
 | 
			
		||||
* Focusing on what is best not just for us as individuals, but for the
 | 
			
		||||
  overall community
 | 
			
		||||
 | 
			
		||||
Examples of unacceptable behavior include:
 | 
			
		||||
 | 
			
		||||
* The use of sexualized language or imagery, and sexual attention or
 | 
			
		||||
  advances
 | 
			
		||||
* Trolling, insulting or derogatory comments, and personal or
 | 
			
		||||
  political attacks
 | 
			
		||||
* Public or private harassment
 | 
			
		||||
* Publishing others' private information, such as a physical or email
 | 
			
		||||
  address, without their explicit permission
 | 
			
		||||
* Other conduct which could reasonably be considered inappropriate in
 | 
			
		||||
  a professional setting
 | 
			
		||||
 | 
			
		||||
## Our Responsibilities
 | 
			
		||||
 | 
			
		||||
Project maintainers are responsible for clarifying and enforcing our
 | 
			
		||||
standards of acceptable behavior and will take appropriate and fair
 | 
			
		||||
corrective action in response to any behavior that they deem
 | 
			
		||||
inappropriate, threatening, offensive, or harmful.
 | 
			
		||||
 | 
			
		||||
Project maintainers have the right and responsibility to remove, edit,
 | 
			
		||||
or reject comments, commits, code, wiki edits, issues, and other
 | 
			
		||||
contributions that are not aligned to this Code of Conduct, and will
 | 
			
		||||
communicate reasons for moderation decisions when appropriate.
 | 
			
		||||
 | 
			
		||||
## Scope
 | 
			
		||||
 | 
			
		||||
This Code of Conduct applies within all community spaces, and also
 | 
			
		||||
applies when an individual is officially representing the community in
 | 
			
		||||
public spaces. Examples of representing our community include using an
 | 
			
		||||
official e-mail address, posting via an official social media account,
 | 
			
		||||
or acting as an appointed representative at an online or offline
 | 
			
		||||
event.
 | 
			
		||||
 | 
			
		||||
## Enforcement
 | 
			
		||||
 | 
			
		||||
Instances of abusive, harassing, or otherwise unacceptable behavior
 | 
			
		||||
may be reported to [P’undrak](mailto:lucien@phundrak.com). All
 | 
			
		||||
complaints will be reviewed and investigated promptly and fairly.
 | 
			
		||||
 | 
			
		||||
All community leaders are obligated to respect the privacy and
 | 
			
		||||
security of the reporter of any incident.
 | 
			
		||||
 | 
			
		||||
## Enforcement Guidelines
 | 
			
		||||
 | 
			
		||||
Community leaders will follow these Community Impact Guidelines in
 | 
			
		||||
determining the consequences for any action they deem in violation of
 | 
			
		||||
this Code of Conduct:
 | 
			
		||||
 | 
			
		||||
### 1. Correction
 | 
			
		||||
 | 
			
		||||
**Community Impact**: Use of inappropriate language or other behavior
 | 
			
		||||
deemed unprofessional or unwelcome in the community.
 | 
			
		||||
 | 
			
		||||
**Consequence**: A private, written warning from community leaders,
 | 
			
		||||
providing clarity around the nature of the violation and an
 | 
			
		||||
explanation of why the behavior was inappropriate. A public apology
 | 
			
		||||
may be requested.
 | 
			
		||||
 | 
			
		||||
### 2. Warning
 | 
			
		||||
 | 
			
		||||
**Community Impact**: A violation through a single incident or series
 | 
			
		||||
of actions.
 | 
			
		||||
 | 
			
		||||
**Consequence**: A warning with consequences for continued behavior.
 | 
			
		||||
No interaction with the people involved, including unsolicited
 | 
			
		||||
interaction with those enforcing the Code of Conduct, for a specified
 | 
			
		||||
period of time. This includes avoiding interactions in community
 | 
			
		||||
spaces as well as external channels like social media. Violating these
 | 
			
		||||
terms may lead to a temporary or permanent ban.
 | 
			
		||||
 | 
			
		||||
### 3. Temporary Ban
 | 
			
		||||
 | 
			
		||||
**Community Impact**: A serious violation of community standards,
 | 
			
		||||
including sustained inappropriate behavior.
 | 
			
		||||
 | 
			
		||||
**Consequence**: A temporary ban from any sort of interaction or
 | 
			
		||||
public communication with the community for a specified period of
 | 
			
		||||
time. No public or private interaction with the people involved,
 | 
			
		||||
including unsolicited interaction with those enforcing the Code of
 | 
			
		||||
Conduct, is allowed during this period. Violating these terms may lead
 | 
			
		||||
to a permanent ban.
 | 
			
		||||
 | 
			
		||||
### 4. Permanent Ban
 | 
			
		||||
 | 
			
		||||
**Community Impact**: Demonstrating a pattern of violation of
 | 
			
		||||
community standards, including sustained inappropriate behavior,
 | 
			
		||||
harassment of an individual, or aggression toward or disparagement of
 | 
			
		||||
classes of individuals.
 | 
			
		||||
 | 
			
		||||
**Consequence**: A permanent ban from any sort of public interaction
 | 
			
		||||
within the community.
 | 
			
		||||
 | 
			
		||||
## Attribution
 | 
			
		||||
 | 
			
		||||
This Code of Conduct is adapted from the [Contributor
 | 
			
		||||
Covenant](https://contributor-covenant.org/), version
 | 
			
		||||
[1.4](https://www.contributor-covenant.org/version/1/4/code-of-conduct/code_of_conduct.md)
 | 
			
		||||
and
 | 
			
		||||
[2.0](https://www.contributor-covenant.org/version/2/0/code_of_conduct/code_of_conduct.md),
 | 
			
		||||
and was generated by
 | 
			
		||||
[contributing-gen](https://github.com/bttger/contributing-gen).
 | 
			
		||||
							
								
								
									
										332
									
								
								CONTRIBUTING.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										332
									
								
								CONTRIBUTING.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,332 @@
 | 
			
		||||
<!-- omit in toc -->
 | 
			
		||||
# Contributing to daily-aujourdhui-frontend
 | 
			
		||||
 | 
			
		||||
First off, thanks for taking the time to contribute! ❤️
 | 
			
		||||
 | 
			
		||||
All types of contributions are encouraged and valued. See the [Table
 | 
			
		||||
of Contents](#table-of-contents) for different ways to help and
 | 
			
		||||
details about how this project handles them. Please make sure to read
 | 
			
		||||
the relevant section before making your contribution. It will make it
 | 
			
		||||
a lot easier for us maintainers and smooth out the experience for all
 | 
			
		||||
involved. The community looks forward to your contributions. 🎉
 | 
			
		||||
 | 
			
		||||
> And if you like the project, but just don't have time to contribute,
 | 
			
		||||
> that's fine. There are other easy ways to support the project and
 | 
			
		||||
> show your appreciation, which we would also be very happy about:
 | 
			
		||||
>
 | 
			
		||||
> - Star the project
 | 
			
		||||
> - Tweet about it
 | 
			
		||||
> - Refer this project in your project's readme
 | 
			
		||||
> - Mention the project at local meetups and tell your
 | 
			
		||||
>   friends/colleagues
 | 
			
		||||
 | 
			
		||||
<!-- omit in toc -->
 | 
			
		||||
## Table of Contents
 | 
			
		||||
 | 
			
		||||
- [Code of Conduct](#code-of-conduct)
 | 
			
		||||
- [I Have a Question](#i-have-a-question)
 | 
			
		||||
- [I Want To Contribute](#i-want-to-contribute)
 | 
			
		||||
  - [Reporting Bugs](#reporting-bugs)
 | 
			
		||||
  - [Suggesting Enhancements](#suggesting-enhancements)
 | 
			
		||||
  - [Your First Code Contribution](#your-first-code-contribution)
 | 
			
		||||
  - [Improving The Documentation](#improving-the-documentation)
 | 
			
		||||
- [Styleguides](#styleguides)
 | 
			
		||||
  - [Commit Messages](#commit-messages)
 | 
			
		||||
- [Join The Project Team](#join-the-project-team)
 | 
			
		||||
 | 
			
		||||
## Code of Conduct
 | 
			
		||||
 | 
			
		||||
This project and everyone participating in it is governed by the
 | 
			
		||||
[daily-aujourdhui-frontend Code of Conduct](CODE_OF_CONDUCT.md). By
 | 
			
		||||
participating, you are expected to uphold this code. Please report
 | 
			
		||||
unacceptable behavior to
 | 
			
		||||
[P’undrak](https://phundrak.com/en/find-me.html).
 | 
			
		||||
 | 
			
		||||
## I Have a Question
 | 
			
		||||
 | 
			
		||||
> If you want to ask a question, we assume that you have read the
 | 
			
		||||
> available [Documentation](/phundrak/daily-aujourdhui-frontend/wiki).
 | 
			
		||||
 | 
			
		||||
Before you ask a question, it is best to search for existing
 | 
			
		||||
[Issues](/phundrak/daily-aujourdhui-frontend/issues) that might help
 | 
			
		||||
you. In case you have found a suitable issue and still need
 | 
			
		||||
clarification, you can write your question in this issue. It is also
 | 
			
		||||
advisable to search the internet for answers first.
 | 
			
		||||
 | 
			
		||||
If you then still feel the need to ask a question and need
 | 
			
		||||
clarification, we recommend the following:
 | 
			
		||||
 | 
			
		||||
- Open an [Issue](/phundrak/daily-aujourdhui-frontend/issues/new)
 | 
			
		||||
- Provide as much context as you can about what you're running into
 | 
			
		||||
- Provide project and platform versions (cargo, rustc, etc), depending
 | 
			
		||||
  on what seems relevant
 | 
			
		||||
 | 
			
		||||
We will then take care of the issue as soon as possible.
 | 
			
		||||
 | 
			
		||||
## I Want To Contribute
 | 
			
		||||
 | 
			
		||||
> ### Legal Notice <!-- omit in toc -->
 | 
			
		||||
>
 | 
			
		||||
> When contributing to this project, you must agree that you have
 | 
			
		||||
> authored 100% of the content, that you have the necessary rights to
 | 
			
		||||
> the content and that the content you contribute may be provided
 | 
			
		||||
> under the project license.
 | 
			
		||||
 | 
			
		||||
### Reporting Bugs
 | 
			
		||||
 | 
			
		||||
<!-- omit in toc -->
 | 
			
		||||
#### Before Submitting a Bug Report
 | 
			
		||||
 | 
			
		||||
A good bug report shouldn't leave others needing to chase you up for
 | 
			
		||||
more information. Therefore, we ask you to investigate carefully,
 | 
			
		||||
collect information and describe the issue in detail in your report.
 | 
			
		||||
Please complete the following steps in advance to help us fix any
 | 
			
		||||
potential bug as fast as possible.
 | 
			
		||||
 | 
			
		||||
- Make sure that you are using the latest version.
 | 
			
		||||
- Determine if your bug is really a bug and not an error on your side
 | 
			
		||||
  e.g. using incompatible environment components/versions (Make sure
 | 
			
		||||
  that you have read the
 | 
			
		||||
  [documentation](/phundrak/daily-aujourdhui-frontend/wiki). If you
 | 
			
		||||
  are looking for support, you might want to check [this
 | 
			
		||||
  section](#i-have-a-question)).
 | 
			
		||||
- To see if other users have experienced (and potentially already
 | 
			
		||||
  solved) the same issue you are having, check if there is not already
 | 
			
		||||
  a bug report existing for your bug or error in the [bug
 | 
			
		||||
  tracker](/phundrak/daily-aujourdhui-frontendissues?q=label%3Abug).
 | 
			
		||||
- Also make sure to search the internet (including Stack Overflow) to
 | 
			
		||||
  see if users outside of the PhundrakLabs community have discussed
 | 
			
		||||
  the issue.
 | 
			
		||||
- Collect information about the bug:
 | 
			
		||||
  - Stack trace (Traceback)
 | 
			
		||||
  - OS, Platform and Version (Windows, Linux, macOS, x86, ARM)
 | 
			
		||||
  - Version of the interpreter, compiler, SDK, runtime environment,
 | 
			
		||||
    package manager, depending on what seems relevant
 | 
			
		||||
  - Possibly your input and the output
 | 
			
		||||
  - Can you reliably reproduce the issue? And can you also reproduce
 | 
			
		||||
    it with older versions?
 | 
			
		||||
 | 
			
		||||
<!-- omit in toc -->
 | 
			
		||||
#### How Do I Submit a Good Bug Report?
 | 
			
		||||
 | 
			
		||||
> You must never report security related issues, vulnerabilities or
 | 
			
		||||
> bugs including sensitive information to the issue tracker, or
 | 
			
		||||
> elsewhere in public. Instead sensitive bugs must be sent by email to
 | 
			
		||||
> [P’undrak](mailto:lucien@phundrak.com).
 | 
			
		||||
 | 
			
		||||
You may add a PGP key to allow the messages to be sent encrypted as
 | 
			
		||||
well.
 | 
			
		||||
 | 
			
		||||
We use PhundrakLabs issues to track bugs and errors. If you run into
 | 
			
		||||
an issue with the project:
 | 
			
		||||
 | 
			
		||||
- Open an [Issue](/phundrak/daily-aujourdhui-frontend/issues/new).
 | 
			
		||||
  (Since we can't be sure at this point whether it is a bug or not, we
 | 
			
		||||
  ask you not to talk about a bug yet and not to label the issue.)
 | 
			
		||||
- Explain the behavior you would expect and the actual behavior.
 | 
			
		||||
- Please provide as much context as possible and describe the
 | 
			
		||||
  *reproduction steps* that someone else can follow to recreate the
 | 
			
		||||
  issue on their own. This usually includes your code. For good bug
 | 
			
		||||
  reports you should isolate the problem and create a reduced test
 | 
			
		||||
  case.
 | 
			
		||||
- Provide the information you collected in the previous section.
 | 
			
		||||
 | 
			
		||||
Once it's filed:
 | 
			
		||||
 | 
			
		||||
- The project team will label the issue accordingly.
 | 
			
		||||
- A team member will try to reproduce the issue with your provided
 | 
			
		||||
  steps. If there are no reproduction steps or no obvious way to
 | 
			
		||||
  reproduce the issue, the team will ask you for those steps and mark
 | 
			
		||||
  the issue as `Status/Need More Info`. Bugs with the `Status/Need
 | 
			
		||||
  More Info` tag will not be addressed until they are reproduced.
 | 
			
		||||
- If the team is able to reproduce the issue, it will be marked
 | 
			
		||||
  `Reviewed/Confirmed`, as well as possibly other tags (such as
 | 
			
		||||
  `Priority/Medium`), and the issue will be left to be [implemented by
 | 
			
		||||
  someone](#your-first-code-contribution)
 | 
			
		||||
 | 
			
		||||
### Suggesting Enhancements
 | 
			
		||||
 | 
			
		||||
This section guides you through submitting an enhancement suggestion
 | 
			
		||||
for daily-aujourdhui-frontend, **including completely new features and
 | 
			
		||||
minor improvements to existing functionality**. Following these
 | 
			
		||||
guidelines will help maintainers and the community to understand your
 | 
			
		||||
suggestion and find related suggestions.
 | 
			
		||||
 | 
			
		||||
<!-- omit in toc -->
 | 
			
		||||
#### Before Submitting an Enhancement
 | 
			
		||||
 | 
			
		||||
- Make sure that you are using the latest version.
 | 
			
		||||
- Read the [documentation](/phundrak/daily-aujourdhui-frontend/wiki)
 | 
			
		||||
  carefully and find out if the functionality is already covered,
 | 
			
		||||
  maybe by an individual configuration.
 | 
			
		||||
- Perform a [search](/phundrak/daily-aujourdhui-frontend/issues) to
 | 
			
		||||
  see if the enhancement has already been suggested. If it has, add a
 | 
			
		||||
  comment to the existing issue instead of opening a new one.
 | 
			
		||||
- Find out whether your idea fits with the scope and aims of the
 | 
			
		||||
  project. It's up to you to make a strong case to convince the
 | 
			
		||||
  project's developers of the merits of this feature. Keep in mind
 | 
			
		||||
  that we want features that will be useful to the majority of our
 | 
			
		||||
  users and not just a small subset. If you're just targeting a
 | 
			
		||||
  minority of users, consider writing an add-on/plugin library.
 | 
			
		||||
 | 
			
		||||
<!-- omit in toc -->
 | 
			
		||||
#### How Do I Submit a Good Enhancement Suggestion?
 | 
			
		||||
 | 
			
		||||
Enhancement suggestions are tracked as [Gitea
 | 
			
		||||
issues](/phundrak/daily-aujourdhui-frontend/issues).
 | 
			
		||||
 | 
			
		||||
- Use a **clear and descriptive title** for the issue to identify the
 | 
			
		||||
  suggestion.
 | 
			
		||||
- Provide a **step-by-step description of the suggested enhancement**
 | 
			
		||||
  in as many details as possible.
 | 
			
		||||
- **Describe the current behavior** and **explain which behavior you
 | 
			
		||||
  expected to see instead** and why. At this point you can also tell
 | 
			
		||||
  which alternatives do not work for you.
 | 
			
		||||
- **Explain why this enhancement would be useful** to most
 | 
			
		||||
  daily-aujourdhui-frontend users. You may also want to point out the other
 | 
			
		||||
  projects that solved it better and which could serve as inspiration.
 | 
			
		||||
 | 
			
		||||
### Your First Code Contribution
 | 
			
		||||
 | 
			
		||||
#### Setting Up Your Development Environment
 | 
			
		||||
 | 
			
		||||
Code contributions are most welcome! To contribute to the project, you
 | 
			
		||||
will need to the README and install the
 | 
			
		||||
[prerequisites](/phundrak/daily-aujourdhui-frontend#prerequisites) and [setup your
 | 
			
		||||
development environment](/phundrak/daily-aujourdhui-frontend#installing).
 | 
			
		||||
 | 
			
		||||
You can use the IDE of your choice, popular options for Rust projects
 | 
			
		||||
are [VSCode](https://code.visualstudio.com/) or
 | 
			
		||||
[RustRover](https://www.jetbrains.com/rust/), but plenty of other code
 | 
			
		||||
editors are available such as:
 | 
			
		||||
 | 
			
		||||
- Emacs (we recommend [rustic](https://github.com/rustic-rs/rustic)
 | 
			
		||||
  over [rust-mode](https://github.com/rust-lang/rust-mode)
 | 
			
		||||
- [Vim/NeoVim](https://github.com/rust-lang/rust.vim)
 | 
			
		||||
- [Sublime Text](https://github.com/rust-lang/rust-enhanced)
 | 
			
		||||
- [Helix](https://rust-analyzer.github.io/manual.html#helix)
 | 
			
		||||
- [Visual Studio](https://rust-analyzer.github.io/manual.html#visual-studio-2022)
 | 
			
		||||
- [Eclipse](https://projects.eclipse.org/projects/tools.corrosion)
 | 
			
		||||
- And plenty other text editors!
 | 
			
		||||
 | 
			
		||||
Depending on your choice, you may need to install an LSP server and an
 | 
			
		||||
LSP client on your text editor, such as with Emacs and Vim/NeoVim.
 | 
			
		||||
 | 
			
		||||
#### Where Should You Start?
 | 
			
		||||
 | 
			
		||||
If you want to participate to daily-aujourdhui-frontend, but you’re
 | 
			
		||||
not sure what to do, take a look at the [opened
 | 
			
		||||
issues](/phundrak/daily-aujourdhui-frontend/issues). You way find
 | 
			
		||||
issues with the `help wanted` tag where you could weigh in for the
 | 
			
		||||
resolution of the issue or for decision-making. You may also find
 | 
			
		||||
issues tagged as `good first issue` which should be relatively
 | 
			
		||||
approachable for first time contributors.
 | 
			
		||||
 | 
			
		||||
#### Writing Your First Code Contribution
 | 
			
		||||
 | 
			
		||||
Take your time when reading the code. The existing documentation can
 | 
			
		||||
help you better understand how the project is built and how the code
 | 
			
		||||
behaves. If you still have some questions, don’t hesitate to reach out
 | 
			
		||||
to maintainers.
 | 
			
		||||
 | 
			
		||||
When you start writing your code, only modify what needs to be
 | 
			
		||||
modified. Each contribution should do one thing and one thing only. Do
 | 
			
		||||
not, for instance, refactor some code that is unrelated to the main
 | 
			
		||||
topic of your contribution.
 | 
			
		||||
 | 
			
		||||
Check often the output of clippy by running `just lint`, and check if
 | 
			
		||||
existing tests still pass with `just test`. Ideally, start by writing
 | 
			
		||||
new tests that describe the intended behaviour of your contribution
 | 
			
		||||
with functions that will purposefully fail these tests, then iterate
 | 
			
		||||
over these functions until they finally pass all tests.
 | 
			
		||||
 | 
			
		||||
Check also that your code is properly formatted with
 | 
			
		||||
`just format-check`. You can format it automatically with
 | 
			
		||||
`just format`.
 | 
			
		||||
 | 
			
		||||
Finally, check if the code coverage of daily-aujourdhui-frontend. Ideally, try to
 | 
			
		||||
stay within the initial percentage of code coverage of the project,
 | 
			
		||||
and try to stay above 75% of code coverage. If it drops below 60%,
 | 
			
		||||
your contribution will be rejected automatically until you add more
 | 
			
		||||
test covering more code.
 | 
			
		||||
 | 
			
		||||
For writing tests, don’t hesitate to take a look at existing tests.
 | 
			
		||||
You can also read on how to write tests with SQLx [in their
 | 
			
		||||
documentation](https://docs.rs/sqlx/latest/sqlx/attr.test.html), as
 | 
			
		||||
well as some examples of poem tests in the [documentation of its
 | 
			
		||||
`test` module](https://docs.rs/poem/latest/poem/test/index.html).
 | 
			
		||||
 | 
			
		||||
### Improving the Documentation
 | 
			
		||||
 | 
			
		||||
To improve the documentation of daily-aujourdhui-frontend, you have two choices:
 | 
			
		||||
 | 
			
		||||
- Improve the [wiki](/phundrak/daily-aujourdhui-frontend/wiki) of the
 | 
			
		||||
  project with high-level, functional documentation
 | 
			
		||||
- Improve the code documentation by adding some
 | 
			
		||||
  [rustdoc](https://doc.rust-lang.org/rustdoc/how-to-write-documentation.html)
 | 
			
		||||
  within the code. You can also take the opportunity to add new tests
 | 
			
		||||
  through code examples in the rustdock; who knows, maybe you will
 | 
			
		||||
  discover a bug writing these tests, which will help improve the code
 | 
			
		||||
  itself!
 | 
			
		||||
 | 
			
		||||
## New Pull Requests
 | 
			
		||||
 | 
			
		||||
### Commit Messages
 | 
			
		||||
 | 
			
		||||
When creating a new commit, try to follow as closely as possible the
 | 
			
		||||
[Conventional Commits 1.0.0](https://www.conventionalcommits.org/)
 | 
			
		||||
standard. Each line should not exceed 72 characters in length. Commits
 | 
			
		||||
shall also be written in the present tense. Use the imperative mood as
 | 
			
		||||
much as possible when explaining what this commit does.
 | 
			
		||||
 | 
			
		||||
> Instead of *Fixed #42* or *Fixes #42*, write *Fix #42*
 | 
			
		||||
 | 
			
		||||
**DO NOT** increase the project version yourself. This will be up for
 | 
			
		||||
the maintainers to do so.
 | 
			
		||||
 | 
			
		||||
### Creating the Pull Request
 | 
			
		||||
 | 
			
		||||
Submit your pull requests to the `develop` branch. Pull requests to
 | 
			
		||||
other branches will be refused, unless there is a very specific reason
 | 
			
		||||
to do so explained in the pull request.
 | 
			
		||||
 | 
			
		||||
Note: *PR* means *Pull Request*.
 | 
			
		||||
 | 
			
		||||
**All PRs** must:
 | 
			
		||||
 | 
			
		||||
- Branch from `develop`
 | 
			
		||||
- Target the `develop` branch, unless specific cases. Maintainers are
 | 
			
		||||
  the only contributors that can create a PR targeting `main`
 | 
			
		||||
- Live on their own branch, prefixed by `feature/` or `fix/` (other
 | 
			
		||||
  prefixes can be accepted in specific cases) with the name of the
 | 
			
		||||
  feature or the issue fixed in `kebab-case`
 | 
			
		||||
- Be rebased on `develop` if the PR is no longer up to date
 | 
			
		||||
- Pass the CI pipeline (a failed CI pipeline will prevent any merge)
 | 
			
		||||
 | 
			
		||||
PRs coming from a `main`, `master`, `develop`, `release/`, `hotfix/`,
 | 
			
		||||
or `support/` branch will be rejected. PRs not up to date with
 | 
			
		||||
`develop` will not be merged.
 | 
			
		||||
 | 
			
		||||
**Simple PRs** shall:
 | 
			
		||||
 | 
			
		||||
- Have only one topic
 | 
			
		||||
- Have only one commit
 | 
			
		||||
- Have all their commits squashed into one if it contains several commits
 | 
			
		||||
 | 
			
		||||
If you open a PR whose scope are multiple topics, it will be rejected.
 | 
			
		||||
Open as many PRs as necessary, one for each topic.
 | 
			
		||||
 | 
			
		||||
**Complex PRs** shall:
 | 
			
		||||
 | 
			
		||||
- squash uninteresting commits (fixes to earlier commits, typos,
 | 
			
		||||
  syntax, etc…) together
 | 
			
		||||
- keep the major steps into individual commits
 | 
			
		||||
 | 
			
		||||
<!-- omit in toc -->
 | 
			
		||||
## Attribution
 | 
			
		||||
 | 
			
		||||
This guide is based on
 | 
			
		||||
[**contributing-gen**](https://github.com/bttger/contributing-gen).
 | 
			
		||||
The Pull Request part is heavily based on the corresponding part of
 | 
			
		||||
Spacemacs’
 | 
			
		||||
[CONTRIBUTING.md](https://github.com/syl20bnr/spacemacs/blob/develop/CONTRIBUTING.org#pull-request).
 | 
			
		||||
							
								
								
									
										660
									
								
								LICENSE.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										660
									
								
								LICENSE.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,660 @@
 | 
			
		||||
# GNU AFFERO GENERAL PUBLIC LICENSE
 | 
			
		||||
 | 
			
		||||
Version 3, 19 November 2007
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2007 Free Software Foundation, Inc.
 | 
			
		||||
<https://fsf.org/>
 | 
			
		||||
 | 
			
		||||
Everyone is permitted to copy and distribute verbatim copies of this
 | 
			
		||||
license document, but changing it is not allowed.
 | 
			
		||||
 | 
			
		||||
## Preamble
 | 
			
		||||
 | 
			
		||||
The GNU Affero General Public License is a free, copyleft license for
 | 
			
		||||
software and other kinds of works, specifically designed to ensure
 | 
			
		||||
cooperation with the community in the case of network server software.
 | 
			
		||||
 | 
			
		||||
The licenses for most software and other practical works are designed
 | 
			
		||||
to take away your freedom to share and change the works. By contrast,
 | 
			
		||||
our General Public Licenses are intended to guarantee your freedom to
 | 
			
		||||
share and change all versions of a program--to make sure it remains
 | 
			
		||||
free software for all its users.
 | 
			
		||||
 | 
			
		||||
When we speak of free software, we are referring to freedom, not
 | 
			
		||||
price. Our General Public Licenses are designed to make sure that you
 | 
			
		||||
have the freedom to distribute copies of free software (and charge for
 | 
			
		||||
them if you wish), that you receive source code or can get it if you
 | 
			
		||||
want it, that you can change the software or use pieces of it in new
 | 
			
		||||
free programs, and that you know you can do these things.
 | 
			
		||||
 | 
			
		||||
Developers that use our General Public Licenses protect your rights
 | 
			
		||||
with two steps: (1) assert copyright on the software, and (2) offer
 | 
			
		||||
you this License which gives you legal permission to copy, distribute
 | 
			
		||||
and/or modify the software.
 | 
			
		||||
 | 
			
		||||
A secondary benefit of defending all users' freedom is that
 | 
			
		||||
improvements made in alternate versions of the program, if they
 | 
			
		||||
receive widespread use, become available for other developers to
 | 
			
		||||
incorporate. Many developers of free software are heartened and
 | 
			
		||||
encouraged by the resulting cooperation. However, in the case of
 | 
			
		||||
software used on network servers, this result may fail to come about.
 | 
			
		||||
The GNU General Public License permits making a modified version and
 | 
			
		||||
letting the public access it on a server without ever releasing its
 | 
			
		||||
source code to the public.
 | 
			
		||||
 | 
			
		||||
The GNU Affero General Public License is designed specifically to
 | 
			
		||||
ensure that, in such cases, the modified source code becomes available
 | 
			
		||||
to the community. It requires the operator of a network server to
 | 
			
		||||
provide the source code of the modified version running there to the
 | 
			
		||||
users of that server. Therefore, public use of a modified version, on
 | 
			
		||||
a publicly accessible server, gives the public access to the source
 | 
			
		||||
code of the modified version.
 | 
			
		||||
 | 
			
		||||
An older license, called the Affero General Public License and
 | 
			
		||||
published by Affero, was designed to accomplish similar goals. This is
 | 
			
		||||
a different license, not a version of the Affero GPL, but Affero has
 | 
			
		||||
released a new version of the Affero GPL which permits relicensing
 | 
			
		||||
under this license.
 | 
			
		||||
 | 
			
		||||
The precise terms and conditions for copying, distribution and
 | 
			
		||||
modification follow.
 | 
			
		||||
 | 
			
		||||
## TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
### 0. Definitions.
 | 
			
		||||
 | 
			
		||||
"This License" refers to version 3 of the GNU Affero General Public
 | 
			
		||||
License.
 | 
			
		||||
 | 
			
		||||
"Copyright" also means copyright-like laws that apply to other kinds
 | 
			
		||||
of works, such as semiconductor masks.
 | 
			
		||||
 | 
			
		||||
"The Program" refers to any copyrightable work licensed under this
 | 
			
		||||
License. Each licensee is addressed as "you". "Licensees" and
 | 
			
		||||
"recipients" may be individuals or organizations.
 | 
			
		||||
 | 
			
		||||
To "modify" a work means to copy from or adapt all or part of the work
 | 
			
		||||
in a fashion requiring copyright permission, other than the making of
 | 
			
		||||
an exact copy. The resulting work is called a "modified version" of
 | 
			
		||||
the earlier work or a work "based on" the earlier work.
 | 
			
		||||
 | 
			
		||||
A "covered work" means either the unmodified Program or a work based
 | 
			
		||||
on the Program.
 | 
			
		||||
 | 
			
		||||
To "propagate" a work means to do anything with it that, without
 | 
			
		||||
permission, would make you directly or secondarily liable for
 | 
			
		||||
infringement under applicable copyright law, except executing it on a
 | 
			
		||||
computer or modifying a private copy. Propagation includes copying,
 | 
			
		||||
distribution (with or without modification), making available to the
 | 
			
		||||
public, and in some countries other activities as well.
 | 
			
		||||
 | 
			
		||||
To "convey" a work means any kind of propagation that enables other
 | 
			
		||||
parties to make or receive copies. Mere interaction with a user
 | 
			
		||||
through a computer network, with no transfer of a copy, is not
 | 
			
		||||
conveying.
 | 
			
		||||
 | 
			
		||||
An interactive user interface displays "Appropriate Legal Notices" to
 | 
			
		||||
the extent that it includes a convenient and prominently visible
 | 
			
		||||
feature that (1) displays an appropriate copyright notice, and (2)
 | 
			
		||||
tells the user that there is no warranty for the work (except to the
 | 
			
		||||
extent that warranties are provided), that licensees may convey the
 | 
			
		||||
work under this License, and how to view a copy of this License. If
 | 
			
		||||
the interface presents a list of user commands or options, such as a
 | 
			
		||||
menu, a prominent item in the list meets this criterion.
 | 
			
		||||
 | 
			
		||||
### 1. Source Code.
 | 
			
		||||
 | 
			
		||||
The "source code" for a work means the preferred form of the work for
 | 
			
		||||
making modifications to it. "Object code" means any non-source form of
 | 
			
		||||
a work.
 | 
			
		||||
 | 
			
		||||
A "Standard Interface" means an interface that either is an official
 | 
			
		||||
standard defined by a recognized standards body, or, in the case of
 | 
			
		||||
interfaces specified for a particular programming language, one that
 | 
			
		||||
is widely used among developers working in that language.
 | 
			
		||||
 | 
			
		||||
The "System Libraries" of an executable work include anything, other
 | 
			
		||||
than the work as a whole, that (a) is included in the normal form of
 | 
			
		||||
packaging a Major Component, but which is not part of that Major
 | 
			
		||||
Component, and (b) serves only to enable use of the work with that
 | 
			
		||||
Major Component, or to implement a Standard Interface for which an
 | 
			
		||||
implementation is available to the public in source code form. A
 | 
			
		||||
"Major Component", in this context, means a major essential component
 | 
			
		||||
(kernel, window system, and so on) of the specific operating system
 | 
			
		||||
(if any) on which the executable work runs, or a compiler used to
 | 
			
		||||
produce the work, or an object code interpreter used to run it.
 | 
			
		||||
 | 
			
		||||
The "Corresponding Source" for a work in object code form means all
 | 
			
		||||
the source code needed to generate, install, and (for an executable
 | 
			
		||||
work) run the object code and to modify the work, including scripts to
 | 
			
		||||
control those activities. However, it does not include the work's
 | 
			
		||||
System Libraries, or general-purpose tools or generally available free
 | 
			
		||||
programs which are used unmodified in performing those activities but
 | 
			
		||||
which are not part of the work. For example, Corresponding Source
 | 
			
		||||
includes interface definition files associated with source files for
 | 
			
		||||
the work, and the source code for shared libraries and dynamically
 | 
			
		||||
linked subprograms that the work is specifically designed to require,
 | 
			
		||||
such as by intimate data communication or control flow between those
 | 
			
		||||
subprograms and other parts of the work.
 | 
			
		||||
 | 
			
		||||
The Corresponding Source need not include anything that users can
 | 
			
		||||
regenerate automatically from other parts of the Corresponding Source.
 | 
			
		||||
 | 
			
		||||
The Corresponding Source for a work in source code form is that same
 | 
			
		||||
work.
 | 
			
		||||
 | 
			
		||||
### 2. Basic Permissions.
 | 
			
		||||
 | 
			
		||||
All rights granted under this License are granted for the term of
 | 
			
		||||
copyright on the Program, and are irrevocable provided the stated
 | 
			
		||||
conditions are met. This License explicitly affirms your unlimited
 | 
			
		||||
permission to run the unmodified Program. The output from running a
 | 
			
		||||
covered work is covered by this License only if the output, given its
 | 
			
		||||
content, constitutes a covered work. This License acknowledges your
 | 
			
		||||
rights of fair use or other equivalent, as provided by copyright law.
 | 
			
		||||
 | 
			
		||||
You may make, run and propagate covered works that you do not convey,
 | 
			
		||||
without conditions so long as your license otherwise remains in force.
 | 
			
		||||
You may convey covered works to others for the sole purpose of having
 | 
			
		||||
them make modifications exclusively for you, or provide you with
 | 
			
		||||
facilities for running those works, provided that you comply with the
 | 
			
		||||
terms of this License in conveying all material for which you do not
 | 
			
		||||
control copyright. Those thus making or running the covered works for
 | 
			
		||||
you must do so exclusively on your behalf, under your direction and
 | 
			
		||||
control, on terms that prohibit them from making any copies of your
 | 
			
		||||
copyrighted material outside their relationship with you.
 | 
			
		||||
 | 
			
		||||
Conveying under any other circumstances is permitted solely under the
 | 
			
		||||
conditions stated below. Sublicensing is not allowed; section 10 makes
 | 
			
		||||
it unnecessary.
 | 
			
		||||
 | 
			
		||||
### 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
 | 
			
		||||
 | 
			
		||||
No covered work shall be deemed part of an effective technological
 | 
			
		||||
measure under any applicable law fulfilling obligations under article
 | 
			
		||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
 | 
			
		||||
similar laws prohibiting or restricting circumvention of such
 | 
			
		||||
measures.
 | 
			
		||||
 | 
			
		||||
When you convey a covered work, you waive any legal power to forbid
 | 
			
		||||
circumvention of technological measures to the extent such
 | 
			
		||||
circumvention is effected by exercising rights under this License with
 | 
			
		||||
respect to the covered work, and you disclaim any intention to limit
 | 
			
		||||
operation or modification of the work as a means of enforcing, against
 | 
			
		||||
the work's users, your or third parties' legal rights to forbid
 | 
			
		||||
circumvention of technological measures.
 | 
			
		||||
 | 
			
		||||
### 4. Conveying Verbatim Copies.
 | 
			
		||||
 | 
			
		||||
You may convey verbatim copies of the Program's source code as you
 | 
			
		||||
receive it, in any medium, provided that you conspicuously and
 | 
			
		||||
appropriately publish on each copy an appropriate copyright notice;
 | 
			
		||||
keep intact all notices stating that this License and any
 | 
			
		||||
non-permissive terms added in accord with section 7 apply to the code;
 | 
			
		||||
keep intact all notices of the absence of any warranty; and give all
 | 
			
		||||
recipients a copy of this License along with the Program.
 | 
			
		||||
 | 
			
		||||
You may charge any price or no price for each copy that you convey,
 | 
			
		||||
and you may offer support or warranty protection for a fee.
 | 
			
		||||
 | 
			
		||||
### 5. Conveying Modified Source Versions.
 | 
			
		||||
 | 
			
		||||
You may convey a work based on the Program, or the modifications to
 | 
			
		||||
produce it from the Program, in the form of source code under the
 | 
			
		||||
terms of section 4, provided that you also meet all of these
 | 
			
		||||
conditions:
 | 
			
		||||
 | 
			
		||||
-   a) The work must carry prominent notices stating that you modified
 | 
			
		||||
    it, and giving a relevant date.
 | 
			
		||||
-   b) The work must carry prominent notices stating that it is
 | 
			
		||||
    released under this License and any conditions added under
 | 
			
		||||
    section 7. This requirement modifies the requirement in section 4
 | 
			
		||||
    to "keep intact all notices".
 | 
			
		||||
-   c) You must license the entire work, as a whole, under this
 | 
			
		||||
    License to anyone who comes into possession of a copy. This
 | 
			
		||||
    License will therefore apply, along with any applicable section 7
 | 
			
		||||
    additional terms, to the whole of the work, and all its parts,
 | 
			
		||||
    regardless of how they are packaged. This License gives no
 | 
			
		||||
    permission to license the work in any other way, but it does not
 | 
			
		||||
    invalidate such permission if you have separately received it.
 | 
			
		||||
-   d) If the work has interactive user interfaces, each must display
 | 
			
		||||
    Appropriate Legal Notices; however, if the Program has interactive
 | 
			
		||||
    interfaces that do not display Appropriate Legal Notices, your
 | 
			
		||||
    work need not make them do so.
 | 
			
		||||
 | 
			
		||||
A compilation of a covered work with other separate and independent
 | 
			
		||||
works, which are not by their nature extensions of the covered work,
 | 
			
		||||
and which are not combined with it such as to form a larger program,
 | 
			
		||||
in or on a volume of a storage or distribution medium, is called an
 | 
			
		||||
"aggregate" if the compilation and its resulting copyright are not
 | 
			
		||||
used to limit the access or legal rights of the compilation's users
 | 
			
		||||
beyond what the individual works permit. Inclusion of a covered work
 | 
			
		||||
in an aggregate does not cause this License to apply to the other
 | 
			
		||||
parts of the aggregate.
 | 
			
		||||
 | 
			
		||||
### 6. Conveying Non-Source Forms.
 | 
			
		||||
 | 
			
		||||
You may convey a covered work in object code form under the terms of
 | 
			
		||||
sections 4 and 5, provided that you also convey the machine-readable
 | 
			
		||||
Corresponding Source under the terms of this License, in one of these
 | 
			
		||||
ways:
 | 
			
		||||
 | 
			
		||||
-   a) Convey the object code in, or embodied in, a physical product
 | 
			
		||||
    (including a physical distribution medium), accompanied by the
 | 
			
		||||
    Corresponding Source fixed on a durable physical medium
 | 
			
		||||
    customarily used for software interchange.
 | 
			
		||||
-   b) Convey the object code in, or embodied in, a physical product
 | 
			
		||||
    (including a physical distribution medium), accompanied by a
 | 
			
		||||
    written offer, valid for at least three years and valid for as
 | 
			
		||||
    long as you offer spare parts or customer support for that product
 | 
			
		||||
    model, to give anyone who possesses the object code either (1) a
 | 
			
		||||
    copy of the Corresponding Source for all the software in the
 | 
			
		||||
    product that is covered by this License, on a durable physical
 | 
			
		||||
    medium customarily used for software interchange, for a price no
 | 
			
		||||
    more than your reasonable cost of physically performing this
 | 
			
		||||
    conveying of source, or (2) access to copy the Corresponding
 | 
			
		||||
    Source from a network server at no charge.
 | 
			
		||||
-   c) Convey individual copies of the object code with a copy of the
 | 
			
		||||
    written offer to provide the Corresponding Source. This
 | 
			
		||||
    alternative is allowed only occasionally and noncommercially, and
 | 
			
		||||
    only if you received the object code with such an offer, in accord
 | 
			
		||||
    with subsection 6b.
 | 
			
		||||
-   d) Convey the object code by offering access from a designated
 | 
			
		||||
    place (gratis or for a charge), and offer equivalent access to the
 | 
			
		||||
    Corresponding Source in the same way through the same place at no
 | 
			
		||||
    further charge. You need not require recipients to copy the
 | 
			
		||||
    Corresponding Source along with the object code. If the place to
 | 
			
		||||
    copy the object code is a network server, the Corresponding Source
 | 
			
		||||
    may be on a different server (operated by you or a third party)
 | 
			
		||||
    that supports equivalent copying facilities, provided you maintain
 | 
			
		||||
    clear directions next to the object code saying where to find the
 | 
			
		||||
    Corresponding Source. Regardless of what server hosts the
 | 
			
		||||
    Corresponding Source, you remain obligated to ensure that it is
 | 
			
		||||
    available for as long as needed to satisfy these requirements.
 | 
			
		||||
-   e) Convey the object code using peer-to-peer transmission,
 | 
			
		||||
    provided you inform other peers where the object code and
 | 
			
		||||
    Corresponding Source of the work are being offered to the general
 | 
			
		||||
    public at no charge under subsection 6d.
 | 
			
		||||
 | 
			
		||||
A separable portion of the object code, whose source code is excluded
 | 
			
		||||
from the Corresponding Source as a System Library, need not be
 | 
			
		||||
included in conveying the object code work.
 | 
			
		||||
 | 
			
		||||
A "User Product" is either (1) a "consumer product", which means any
 | 
			
		||||
tangible personal property which is normally used for personal,
 | 
			
		||||
family, or household purposes, or (2) anything designed or sold for
 | 
			
		||||
incorporation into a dwelling. In determining whether a product is a
 | 
			
		||||
consumer product, doubtful cases shall be resolved in favor of
 | 
			
		||||
coverage. For a particular product received by a particular user,
 | 
			
		||||
"normally used" refers to a typical or common use of that class of
 | 
			
		||||
product, regardless of the status of the particular user or of the way
 | 
			
		||||
in which the particular user actually uses, or expects or is expected
 | 
			
		||||
to use, the product. A product is a consumer product regardless of
 | 
			
		||||
whether the product has substantial commercial, industrial or
 | 
			
		||||
non-consumer uses, unless such uses represent the only significant
 | 
			
		||||
mode of use of the product.
 | 
			
		||||
 | 
			
		||||
"Installation Information" for a User Product means any methods,
 | 
			
		||||
procedures, authorization keys, or other information required to
 | 
			
		||||
install and execute modified versions of a covered work in that User
 | 
			
		||||
Product from a modified version of its Corresponding Source. The
 | 
			
		||||
information must suffice to ensure that the continued functioning of
 | 
			
		||||
the modified object code is in no case prevented or interfered with
 | 
			
		||||
solely because modification has been made.
 | 
			
		||||
 | 
			
		||||
If you convey an object code work under this section in, or with, or
 | 
			
		||||
specifically for use in, a User Product, and the conveying occurs as
 | 
			
		||||
part of a transaction in which the right of possession and use of the
 | 
			
		||||
User Product is transferred to the recipient in perpetuity or for a
 | 
			
		||||
fixed term (regardless of how the transaction is characterized), the
 | 
			
		||||
Corresponding Source conveyed under this section must be accompanied
 | 
			
		||||
by the Installation Information. But this requirement does not apply
 | 
			
		||||
if neither you nor any third party retains the ability to install
 | 
			
		||||
modified object code on the User Product (for example, the work has
 | 
			
		||||
been installed in ROM).
 | 
			
		||||
 | 
			
		||||
The requirement to provide Installation Information does not include a
 | 
			
		||||
requirement to continue to provide support service, warranty, or
 | 
			
		||||
updates for a work that has been modified or installed by the
 | 
			
		||||
recipient, or for the User Product in which it has been modified or
 | 
			
		||||
installed. Access to a network may be denied when the modification
 | 
			
		||||
itself materially and adversely affects the operation of the network
 | 
			
		||||
or violates the rules and protocols for communication across the
 | 
			
		||||
network.
 | 
			
		||||
 | 
			
		||||
Corresponding Source conveyed, and Installation Information provided,
 | 
			
		||||
in accord with this section must be in a format that is publicly
 | 
			
		||||
documented (and with an implementation available to the public in
 | 
			
		||||
source code form), and must require no special password or key for
 | 
			
		||||
unpacking, reading or copying.
 | 
			
		||||
 | 
			
		||||
### 7. Additional Terms.
 | 
			
		||||
 | 
			
		||||
"Additional permissions" are terms that supplement the terms of this
 | 
			
		||||
License by making exceptions from one or more of its conditions.
 | 
			
		||||
Additional permissions that are applicable to the entire Program shall
 | 
			
		||||
be treated as though they were included in this License, to the extent
 | 
			
		||||
that they are valid under applicable law. If additional permissions
 | 
			
		||||
apply only to part of the Program, that part may be used separately
 | 
			
		||||
under those permissions, but the entire Program remains governed by
 | 
			
		||||
this License without regard to the additional permissions.
 | 
			
		||||
 | 
			
		||||
When you convey a copy of a covered work, you may at your option
 | 
			
		||||
remove any additional permissions from that copy, or from any part of
 | 
			
		||||
it. (Additional permissions may be written to require their own
 | 
			
		||||
removal in certain cases when you modify the work.) You may place
 | 
			
		||||
additional permissions on material, added by you to a covered work,
 | 
			
		||||
for which you have or can give appropriate copyright permission.
 | 
			
		||||
 | 
			
		||||
Notwithstanding any other provision of this License, for material you
 | 
			
		||||
add to a covered work, you may (if authorized by the copyright holders
 | 
			
		||||
of that material) supplement the terms of this License with terms:
 | 
			
		||||
 | 
			
		||||
-   a) Disclaiming warranty or limiting liability differently from the
 | 
			
		||||
    terms of sections 15 and 16 of this License; or
 | 
			
		||||
-   b) Requiring preservation of specified reasonable legal notices or
 | 
			
		||||
    author attributions in that material or in the Appropriate Legal
 | 
			
		||||
    Notices displayed by works containing it; or
 | 
			
		||||
-   c) Prohibiting misrepresentation of the origin of that material,
 | 
			
		||||
    or requiring that modified versions of such material be marked in
 | 
			
		||||
    reasonable ways as different from the original version; or
 | 
			
		||||
-   d) Limiting the use for publicity purposes of names of licensors
 | 
			
		||||
    or authors of the material; or
 | 
			
		||||
-   e) Declining to grant rights under trademark law for use of some
 | 
			
		||||
    trade names, trademarks, or service marks; or
 | 
			
		||||
-   f) Requiring indemnification of licensors and authors of that
 | 
			
		||||
    material by anyone who conveys the material (or modified versions
 | 
			
		||||
    of it) with contractual assumptions of liability to the recipient,
 | 
			
		||||
    for any liability that these contractual assumptions directly
 | 
			
		||||
    impose on those licensors and authors.
 | 
			
		||||
 | 
			
		||||
All other non-permissive additional terms are considered "further
 | 
			
		||||
restrictions" within the meaning of section 10. If the Program as you
 | 
			
		||||
received it, or any part of it, contains a notice stating that it is
 | 
			
		||||
governed by this License along with a term that is a further
 | 
			
		||||
restriction, you may remove that term. If a license document contains
 | 
			
		||||
a further restriction but permits relicensing or conveying under this
 | 
			
		||||
License, you may add to a covered work material governed by the terms
 | 
			
		||||
of that license document, provided that the further restriction does
 | 
			
		||||
not survive such relicensing or conveying.
 | 
			
		||||
 | 
			
		||||
If you add terms to a covered work in accord with this section, you
 | 
			
		||||
must place, in the relevant source files, a statement of the
 | 
			
		||||
additional terms that apply to those files, or a notice indicating
 | 
			
		||||
where to find the applicable terms.
 | 
			
		||||
 | 
			
		||||
Additional terms, permissive or non-permissive, may be stated in the
 | 
			
		||||
form of a separately written license, or stated as exceptions; the
 | 
			
		||||
above requirements apply either way.
 | 
			
		||||
 | 
			
		||||
### 8. Termination.
 | 
			
		||||
 | 
			
		||||
You may not propagate or modify a covered work except as expressly
 | 
			
		||||
provided under this License. Any attempt otherwise to propagate or
 | 
			
		||||
modify it is void, and will automatically terminate your rights under
 | 
			
		||||
this License (including any patent licenses granted under the third
 | 
			
		||||
paragraph of section 11).
 | 
			
		||||
 | 
			
		||||
However, if you cease all violation of this License, then your license
 | 
			
		||||
from a particular copyright holder is reinstated (a) provisionally,
 | 
			
		||||
unless and until the copyright holder explicitly and finally
 | 
			
		||||
terminates your license, and (b) permanently, if the copyright holder
 | 
			
		||||
fails to notify you of the violation by some reasonable means prior to
 | 
			
		||||
60 days after the cessation.
 | 
			
		||||
 | 
			
		||||
Moreover, your license from a particular copyright holder is
 | 
			
		||||
reinstated permanently if the copyright holder notifies you of the
 | 
			
		||||
violation by some reasonable means, this is the first time you have
 | 
			
		||||
received notice of violation of this License (for any work) from that
 | 
			
		||||
copyright holder, and you cure the violation prior to 30 days after
 | 
			
		||||
your receipt of the notice.
 | 
			
		||||
 | 
			
		||||
Termination of your rights under this section does not terminate the
 | 
			
		||||
licenses of parties who have received copies or rights from you under
 | 
			
		||||
this License. If your rights have been terminated and not permanently
 | 
			
		||||
reinstated, you do not qualify to receive new licenses for the same
 | 
			
		||||
material under section 10.
 | 
			
		||||
 | 
			
		||||
### 9. Acceptance Not Required for Having Copies.
 | 
			
		||||
 | 
			
		||||
You are not required to accept this License in order to receive or run
 | 
			
		||||
a copy of the Program. Ancillary propagation of a covered work
 | 
			
		||||
occurring solely as a consequence of using peer-to-peer transmission
 | 
			
		||||
to receive a copy likewise does not require acceptance. However,
 | 
			
		||||
nothing other than this License grants you permission to propagate or
 | 
			
		||||
modify any covered work. These actions infringe copyright if you do
 | 
			
		||||
not accept this License. Therefore, by modifying or propagating a
 | 
			
		||||
covered work, you indicate your acceptance of this License to do so.
 | 
			
		||||
 | 
			
		||||
### 10. Automatic Licensing of Downstream Recipients.
 | 
			
		||||
 | 
			
		||||
Each time you convey a covered work, the recipient automatically
 | 
			
		||||
receives a license from the original licensors, to run, modify and
 | 
			
		||||
propagate that work, subject to this License. You are not responsible
 | 
			
		||||
for enforcing compliance by third parties with this License.
 | 
			
		||||
 | 
			
		||||
An "entity transaction" is a transaction transferring control of an
 | 
			
		||||
organization, or substantially all assets of one, or subdividing an
 | 
			
		||||
organization, or merging organizations. If propagation of a covered
 | 
			
		||||
work results from an entity transaction, each party to that
 | 
			
		||||
transaction who receives a copy of the work also receives whatever
 | 
			
		||||
licenses to the work the party's predecessor in interest had or could
 | 
			
		||||
give under the previous paragraph, plus a right to possession of the
 | 
			
		||||
Corresponding Source of the work from the predecessor in interest, if
 | 
			
		||||
the predecessor has it or can get it with reasonable efforts.
 | 
			
		||||
 | 
			
		||||
You may not impose any further restrictions on the exercise of the
 | 
			
		||||
rights granted or affirmed under this License. For example, you may
 | 
			
		||||
not impose a license fee, royalty, or other charge for exercise of
 | 
			
		||||
rights granted under this License, and you may not initiate litigation
 | 
			
		||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
 | 
			
		||||
any patent claim is infringed by making, using, selling, offering for
 | 
			
		||||
sale, or importing the Program or any portion of it.
 | 
			
		||||
 | 
			
		||||
### 11. Patents.
 | 
			
		||||
 | 
			
		||||
A "contributor" is a copyright holder who authorizes use under this
 | 
			
		||||
License of the Program or a work on which the Program is based. The
 | 
			
		||||
work thus licensed is called the contributor's "contributor version".
 | 
			
		||||
 | 
			
		||||
A contributor's "essential patent claims" are all patent claims owned
 | 
			
		||||
or controlled by the contributor, whether already acquired or
 | 
			
		||||
hereafter acquired, that would be infringed by some manner, permitted
 | 
			
		||||
by this License, of making, using, or selling its contributor version,
 | 
			
		||||
but do not include claims that would be infringed only as a
 | 
			
		||||
consequence of further modification of the contributor version. For
 | 
			
		||||
purposes of this definition, "control" includes the right to grant
 | 
			
		||||
patent sublicenses in a manner consistent with the requirements of
 | 
			
		||||
this License.
 | 
			
		||||
 | 
			
		||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
 | 
			
		||||
patent license under the contributor's essential patent claims, to
 | 
			
		||||
make, use, sell, offer for sale, import and otherwise run, modify and
 | 
			
		||||
propagate the contents of its contributor version.
 | 
			
		||||
 | 
			
		||||
In the following three paragraphs, a "patent license" is any express
 | 
			
		||||
agreement or commitment, however denominated, not to enforce a patent
 | 
			
		||||
(such as an express permission to practice a patent or covenant not to
 | 
			
		||||
sue for patent infringement). To "grant" such a patent license to a
 | 
			
		||||
party means to make such an agreement or commitment not to enforce a
 | 
			
		||||
patent against the party.
 | 
			
		||||
 | 
			
		||||
If you convey a covered work, knowingly relying on a patent license,
 | 
			
		||||
and the Corresponding Source of the work is not available for anyone
 | 
			
		||||
to copy, free of charge and under the terms of this License, through a
 | 
			
		||||
publicly available network server or other readily accessible means,
 | 
			
		||||
then you must either (1) cause the Corresponding Source to be so
 | 
			
		||||
available, or (2) arrange to deprive yourself of the benefit of the
 | 
			
		||||
patent license for this particular work, or (3) arrange, in a manner
 | 
			
		||||
consistent with the requirements of this License, to extend the patent
 | 
			
		||||
license to downstream recipients. "Knowingly relying" means you have
 | 
			
		||||
actual knowledge that, but for the patent license, your conveying the
 | 
			
		||||
covered work in a country, or your recipient's use of the covered work
 | 
			
		||||
in a country, would infringe one or more identifiable patents in that
 | 
			
		||||
country that you have reason to believe are valid.
 | 
			
		||||
 | 
			
		||||
If, pursuant to or in connection with a single transaction or
 | 
			
		||||
arrangement, you convey, or propagate by procuring conveyance of, a
 | 
			
		||||
covered work, and grant a patent license to some of the parties
 | 
			
		||||
receiving the covered work authorizing them to use, propagate, modify
 | 
			
		||||
or convey a specific copy of the covered work, then the patent license
 | 
			
		||||
you grant is automatically extended to all recipients of the covered
 | 
			
		||||
work and works based on it.
 | 
			
		||||
 | 
			
		||||
A patent license is "discriminatory" if it does not include within the
 | 
			
		||||
scope of its coverage, prohibits the exercise of, or is conditioned on
 | 
			
		||||
the non-exercise of one or more of the rights that are specifically
 | 
			
		||||
granted under this License. You may not convey a covered work if you
 | 
			
		||||
are a party to an arrangement with a third party that is in the
 | 
			
		||||
business of distributing software, under which you make payment to the
 | 
			
		||||
third party based on the extent of your activity of conveying the
 | 
			
		||||
work, and under which the third party grants, to any of the parties
 | 
			
		||||
who would receive the covered work from you, a discriminatory patent
 | 
			
		||||
license (a) in connection with copies of the covered work conveyed by
 | 
			
		||||
you (or copies made from those copies), or (b) primarily for and in
 | 
			
		||||
connection with specific products or compilations that contain the
 | 
			
		||||
covered work, unless you entered into that arrangement, or that patent
 | 
			
		||||
license was granted, prior to 28 March 2007.
 | 
			
		||||
 | 
			
		||||
Nothing in this License shall be construed as excluding or limiting
 | 
			
		||||
any implied license or other defenses to infringement that may
 | 
			
		||||
otherwise be available to you under applicable patent law.
 | 
			
		||||
 | 
			
		||||
### 12. No Surrender of Others' Freedom.
 | 
			
		||||
 | 
			
		||||
If conditions are imposed on you (whether by court order, agreement or
 | 
			
		||||
otherwise) that contradict the conditions of this License, they do not
 | 
			
		||||
excuse you from the conditions of this License. If you cannot convey a
 | 
			
		||||
covered work so as to satisfy simultaneously your obligations under
 | 
			
		||||
this License and any other pertinent obligations, then as a
 | 
			
		||||
consequence you may not convey it at all. For example, if you agree to
 | 
			
		||||
terms that obligate you to collect a royalty for further conveying
 | 
			
		||||
from those to whom you convey the Program, the only way you could
 | 
			
		||||
satisfy both those terms and this License would be to refrain entirely
 | 
			
		||||
from conveying the Program.
 | 
			
		||||
 | 
			
		||||
### 13. Remote Network Interaction; Use with the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
Notwithstanding any other provision of this License, if you modify the
 | 
			
		||||
Program, your modified version must prominently offer all users
 | 
			
		||||
interacting with it remotely through a computer network (if your
 | 
			
		||||
version supports such interaction) an opportunity to receive the
 | 
			
		||||
Corresponding Source of your version by providing access to the
 | 
			
		||||
Corresponding Source from a network server at no charge, through some
 | 
			
		||||
standard or customary means of facilitating copying of software. This
 | 
			
		||||
Corresponding Source shall include the Corresponding Source for any
 | 
			
		||||
work covered by version 3 of the GNU General Public License that is
 | 
			
		||||
incorporated pursuant to the following paragraph.
 | 
			
		||||
 | 
			
		||||
Notwithstanding any other provision of this License, you have
 | 
			
		||||
permission to link or combine any covered work with a work licensed
 | 
			
		||||
under version 3 of the GNU General Public License into a single
 | 
			
		||||
combined work, and to convey the resulting work. The terms of this
 | 
			
		||||
License will continue to apply to the part which is the covered work,
 | 
			
		||||
but the work with which it is combined will remain governed by version
 | 
			
		||||
3 of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
### 14. Revised Versions of this License.
 | 
			
		||||
 | 
			
		||||
The Free Software Foundation may publish revised and/or new versions
 | 
			
		||||
of the GNU Affero General Public License from time to time. Such new
 | 
			
		||||
versions will be similar in spirit to the present version, but may
 | 
			
		||||
differ in detail to address new problems or concerns.
 | 
			
		||||
 | 
			
		||||
Each version is given a distinguishing version number. If the Program
 | 
			
		||||
specifies that a certain numbered version of the GNU Affero General
 | 
			
		||||
Public License "or any later version" applies to it, you have the
 | 
			
		||||
option of following the terms and conditions either of that numbered
 | 
			
		||||
version or of any later version published by the Free Software
 | 
			
		||||
Foundation. If the Program does not specify a version number of the
 | 
			
		||||
GNU Affero General Public License, you may choose any version ever
 | 
			
		||||
published by the Free Software Foundation.
 | 
			
		||||
 | 
			
		||||
If the Program specifies that a proxy can decide which future versions
 | 
			
		||||
of the GNU Affero General Public License can be used, that proxy's
 | 
			
		||||
public statement of acceptance of a version permanently authorizes you
 | 
			
		||||
to choose that version for the Program.
 | 
			
		||||
 | 
			
		||||
Later license versions may give you additional or different
 | 
			
		||||
permissions. However, no additional obligations are imposed on any
 | 
			
		||||
author or copyright holder as a result of your choosing to follow a
 | 
			
		||||
later version.
 | 
			
		||||
 | 
			
		||||
### 15. Disclaimer of Warranty.
 | 
			
		||||
 | 
			
		||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
 | 
			
		||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
 | 
			
		||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
 | 
			
		||||
WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
 | 
			
		||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
 | 
			
		||||
PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
 | 
			
		||||
DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
 | 
			
		||||
CORRECTION.
 | 
			
		||||
 | 
			
		||||
### 16. Limitation of Liability.
 | 
			
		||||
 | 
			
		||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 | 
			
		||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
 | 
			
		||||
CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
 | 
			
		||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT
 | 
			
		||||
NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
 | 
			
		||||
LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
 | 
			
		||||
TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
 | 
			
		||||
PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 | 
			
		||||
 | 
			
		||||
### 17. Interpretation of Sections 15 and 16.
 | 
			
		||||
 | 
			
		||||
If the disclaimer of warranty and limitation of liability provided
 | 
			
		||||
above cannot be given local legal effect according to their terms,
 | 
			
		||||
reviewing courts shall apply local law that most closely approximates
 | 
			
		||||
an absolute waiver of all civil liability in connection with the
 | 
			
		||||
Program, unless a warranty or assumption of liability accompanies a
 | 
			
		||||
copy of the Program in return for a fee.
 | 
			
		||||
 | 
			
		||||
END OF TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
## How to Apply These Terms to Your New Programs
 | 
			
		||||
 | 
			
		||||
If you develop a new program, and you want it to be of the greatest
 | 
			
		||||
possible use to the public, the best way to achieve this is to make it
 | 
			
		||||
free software which everyone can redistribute and change under these
 | 
			
		||||
terms.
 | 
			
		||||
 | 
			
		||||
To do so, attach the following notices to the program. It is safest to
 | 
			
		||||
attach them to the start of each source file to most effectively state
 | 
			
		||||
the exclusion of warranty; and each file should have at least the
 | 
			
		||||
"copyright" line and a pointer to where the full notice is found.
 | 
			
		||||
 | 
			
		||||
        <one line to give the program's name and a brief idea of what it does.>
 | 
			
		||||
        Copyright (C) <year>  <name of author>
 | 
			
		||||
 | 
			
		||||
        This program is free software: you can redistribute it and/or modify
 | 
			
		||||
        it under the terms of the GNU Affero General Public License as
 | 
			
		||||
        published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
        License, or (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
        This program is distributed in the hope that it will be useful,
 | 
			
		||||
        but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
        GNU Affero General Public License for more details.
 | 
			
		||||
 | 
			
		||||
        You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
        along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
Also add information on how to contact you by electronic and paper
 | 
			
		||||
mail.
 | 
			
		||||
 | 
			
		||||
If your software can interact with users remotely through a computer
 | 
			
		||||
network, you should also make sure that it provides a way for users to
 | 
			
		||||
get its source. For example, if your program is a web application, its
 | 
			
		||||
interface could display a "Source" link that leads users to an archive
 | 
			
		||||
of the code. There are many ways you could offer source, and different
 | 
			
		||||
solutions will be better for different programs; see section 13 for
 | 
			
		||||
the specific requirements.
 | 
			
		||||
 | 
			
		||||
You should also get your employer (if you work as a programmer) or
 | 
			
		||||
school, if any, to sign a "copyright disclaimer" for the program, if
 | 
			
		||||
necessary. For more information on this, and how to apply and follow
 | 
			
		||||
the GNU AGPL, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
							
								
								
									
										139
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,139 @@
 | 
			
		||||
# daily-aujourdhui-frontend
 | 
			
		||||
 | 
			
		||||
Daily Aujourd’hui is a platform where users can create daily meeting
 | 
			
		||||
polls, invite participants, and vote on whether a meeting is necessary.
 | 
			
		||||
 | 
			
		||||
This repository contains the frontend code for the project.
 | 
			
		||||
 | 
			
		||||
The backend for this project can be found
 | 
			
		||||
[here](https://labs.phundrak.com/phundrak/daily-aujourdhui-backend).
 | 
			
		||||
 | 
			
		||||
## Project Setup
 | 
			
		||||
 | 
			
		||||
### Prerequisites
 | 
			
		||||
 | 
			
		||||
- Node.js
 | 
			
		||||
- npm
 | 
			
		||||
 | 
			
		||||
### Installation
 | 
			
		||||
 | 
			
		||||
1. Clone the repository:
 | 
			
		||||
 | 
			
		||||
   ```bash
 | 
			
		||||
   git clone https://labs.phundrak.com/phundrak/daily-aujourdhui-frontend.git
 | 
			
		||||
   cd daily-aujourdhui-frontend
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
2. Install dependencies:
 | 
			
		||||
 | 
			
		||||
   Using npm:
 | 
			
		||||
 | 
			
		||||
   ```bash
 | 
			
		||||
   npm i
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
   Using yarn:
 | 
			
		||||
 | 
			
		||||
   ```bash
 | 
			
		||||
   yarn install
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
   Using pnpm:
 | 
			
		||||
 | 
			
		||||
   ```bash
 | 
			
		||||
   pnpm install
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
3. Create a `.env` file
 | 
			
		||||
 | 
			
		||||
   ```bash
 | 
			
		||||
   cp .env.example .env
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
   Modify the environment variables to fit your installation of Daily
 | 
			
		||||
   Aujourd’hui.
 | 
			
		||||
 | 
			
		||||
4. Run the development server
 | 
			
		||||
 | 
			
		||||
   Using npm:
 | 
			
		||||
 | 
			
		||||
   ```bash
 | 
			
		||||
   npm run dev
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
   Using yarn:
 | 
			
		||||
 | 
			
		||||
   ```bash
 | 
			
		||||
   yarn dev
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
   Using pnpm:
 | 
			
		||||
 | 
			
		||||
   ```bash
 | 
			
		||||
   pnpm run dev
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
### Building for Production
 | 
			
		||||
 | 
			
		||||
To build the project for production, run:
 | 
			
		||||
 | 
			
		||||
- Using npm:
 | 
			
		||||
 | 
			
		||||
  ```bash
 | 
			
		||||
  npm run build
 | 
			
		||||
  ```
 | 
			
		||||
 | 
			
		||||
- Using yarn:
 | 
			
		||||
 | 
			
		||||
  ```bash
 | 
			
		||||
  yarn build
 | 
			
		||||
  ```
 | 
			
		||||
 | 
			
		||||
- Using pnpm:
 | 
			
		||||
 | 
			
		||||
  ```bash
 | 
			
		||||
  pnpm run build
 | 
			
		||||
  ```
 | 
			
		||||
 | 
			
		||||
## Project Structure
 | 
			
		||||
 | 
			
		||||
```text
 | 
			
		||||
src/
 | 
			
		||||
├── assets/            # Static assets such as images, fonts, styles, etc.
 | 
			
		||||
├── components/        # Vue components
 | 
			
		||||
│   └─ __tests__/      # Vue components tests
 | 
			
		||||
├── composables/       # Vue composables for reusable logic
 | 
			
		||||
│   └─ __tests__/      # Vue composables tests
 | 
			
		||||
├── router/            # Vue Router configuration
 | 
			
		||||
├── stores/            # Pinia stores for state management
 | 
			
		||||
│   └─ __tests__/      # Vue stores tests
 | 
			
		||||
├── views/             # Vue views/pages
 | 
			
		||||
├── App.vue            # Main Vue component
 | 
			
		||||
└── main.ts            # Main entry point
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Environment Variables
 | 
			
		||||
 | 
			
		||||
You can create your `.env` file based on the example file
 | 
			
		||||
`.env.example`. Here are the variables you need to set to make your
 | 
			
		||||
frontend work correctly:
 | 
			
		||||
 | 
			
		||||
- `VITE_LOGTO_ENDPOINT`: The enpoint used by your Logto application.
 | 
			
		||||
  This value should be given to you by Logto when you create your
 | 
			
		||||
  application in the Logto console.
 | 
			
		||||
- `VITE_LOGTO_APP_ID`: The identifier of your application. Same as
 | 
			
		||||
  above.
 | 
			
		||||
- `VITE_HOSTNAME`: The hostname of your frontend. When running in
 | 
			
		||||
  development, it will usually be `http://localhost:5173`, but it can
 | 
			
		||||
  become something like `https://example.com` when you deploy it in
 | 
			
		||||
  production.
 | 
			
		||||
 | 
			
		||||
  **Warning**: The hostname must NOT end with a trailing slash.
 | 
			
		||||
- `VITE_API_BASE_URL`: The hostname of your backend. In development,
 | 
			
		||||
  it will probably be `http://localhost:3000`, but it can become
 | 
			
		||||
  something like `https://api.example.com` when in production.
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
This project is licensed under the AGPL-3.0 free license. See the
 | 
			
		||||
[LICENSE](LICENSE.md) for more details.
 | 
			
		||||
							
								
								
									
										103
									
								
								devenv.lock
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								devenv.lock
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,103 @@
 | 
			
		||||
{
 | 
			
		||||
  "nodes": {
 | 
			
		||||
    "devenv": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "dir": "src/modules",
 | 
			
		||||
        "lastModified": 1748361913,
 | 
			
		||||
        "owner": "cachix",
 | 
			
		||||
        "repo": "devenv",
 | 
			
		||||
        "rev": "b510085f1ca92779782d1e3de631b2292a30edb2",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "dir": "src/modules",
 | 
			
		||||
        "owner": "cachix",
 | 
			
		||||
        "repo": "devenv",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "flake-compat": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1747046372,
 | 
			
		||||
        "owner": "edolstra",
 | 
			
		||||
        "repo": "flake-compat",
 | 
			
		||||
        "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "edolstra",
 | 
			
		||||
        "repo": "flake-compat",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "git-hooks": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "flake-compat": "flake-compat",
 | 
			
		||||
        "gitignore": "gitignore",
 | 
			
		||||
        "nixpkgs": [
 | 
			
		||||
          "nixpkgs"
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1747372754,
 | 
			
		||||
        "owner": "cachix",
 | 
			
		||||
        "repo": "git-hooks.nix",
 | 
			
		||||
        "rev": "80479b6ec16fefd9c1db3ea13aeb038c60530f46",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "cachix",
 | 
			
		||||
        "repo": "git-hooks.nix",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "gitignore": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "nixpkgs": [
 | 
			
		||||
          "git-hooks",
 | 
			
		||||
          "nixpkgs"
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1709087332,
 | 
			
		||||
        "owner": "hercules-ci",
 | 
			
		||||
        "repo": "gitignore.nix",
 | 
			
		||||
        "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "hercules-ci",
 | 
			
		||||
        "repo": "gitignore.nix",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "nixpkgs": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1746807397,
 | 
			
		||||
        "owner": "cachix",
 | 
			
		||||
        "repo": "devenv-nixpkgs",
 | 
			
		||||
        "rev": "c5208b594838ea8e6cca5997fbf784b7cca1ca90",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "cachix",
 | 
			
		||||
        "ref": "rolling",
 | 
			
		||||
        "repo": "devenv-nixpkgs",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "root": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "devenv": "devenv",
 | 
			
		||||
        "git-hooks": "git-hooks",
 | 
			
		||||
        "nixpkgs": "nixpkgs",
 | 
			
		||||
        "pre-commit-hooks": [
 | 
			
		||||
          "git-hooks"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "root": "root",
 | 
			
		||||
  "version": 7
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								devenv.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								devenv.nix
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
			
		||||
{pkgs, ...}: {
 | 
			
		||||
  packages = with pkgs; [
 | 
			
		||||
    nodejs_20
 | 
			
		||||
    nodePackages."@volar/vue-language-server"
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  enterTest = ''
 | 
			
		||||
    npm run test:ci
 | 
			
		||||
    npm run lint
 | 
			
		||||
  '';
 | 
			
		||||
 | 
			
		||||
  dotenv.enable = true;
 | 
			
		||||
 | 
			
		||||
  languages.typescript.enable = true;
 | 
			
		||||
 | 
			
		||||
  git-hooks.hooks = {
 | 
			
		||||
    alejandra.enable = true;
 | 
			
		||||
    deadnix.enable = true;
 | 
			
		||||
    eslint.enable = true;
 | 
			
		||||
    markdownlint.enable = true;
 | 
			
		||||
    prettier.enable = true;
 | 
			
		||||
    ripsecrets.enable = true;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								devenv.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								devenv.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
			
		||||
# yaml-language-server: $schema=https://devenv.sh/devenv.schema.json
 | 
			
		||||
inputs:
 | 
			
		||||
  nixpkgs:
 | 
			
		||||
    url: github:cachix/devenv-nixpkgs/rolling
 | 
			
		||||
# If you're using non-OSS software, you can set allowUnfree to true.
 | 
			
		||||
# allowUnfree: true
 | 
			
		||||
 | 
			
		||||
# If you're willing to use a package that's vulnerable
 | 
			
		||||
# permittedInsecurePackages:
 | 
			
		||||
#  - "openssl-1.1.1w"
 | 
			
		||||
 | 
			
		||||
# If you have more than one devenv you can merge them
 | 
			
		||||
#imports:
 | 
			
		||||
# - ./backend
 | 
			
		||||
							
								
								
									
										28
									
								
								eslint.config.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								eslint.config.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
import { globalIgnores } from 'eslint/config';
 | 
			
		||||
import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript';
 | 
			
		||||
import pluginVue from 'eslint-plugin-vue';
 | 
			
		||||
import pluginVitest from '@vitest/eslint-plugin';
 | 
			
		||||
import skipFormatting from '@vue/eslint-config-prettier/skip-formatting';
 | 
			
		||||
 | 
			
		||||
// To allow more languages other than `ts` in `.vue` files, uncomment the following lines:
 | 
			
		||||
// import { configureVueProject } from '@vue/eslint-config-typescript'
 | 
			
		||||
// configureVueProject({ scriptLangs: ['ts', 'tsx'] })
 | 
			
		||||
// More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup
 | 
			
		||||
 | 
			
		||||
export default defineConfigWithVueTs(
 | 
			
		||||
  {
 | 
			
		||||
    name: 'app/files-to-lint',
 | 
			
		||||
    files: ['**/*.{ts,mts,tsx,vue}'],
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']),
 | 
			
		||||
 | 
			
		||||
  pluginVue.configs['flat/essential'],
 | 
			
		||||
  vueTsConfigs.recommended,
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    ...pluginVitest.configs.recommended,
 | 
			
		||||
    files: ['src/**/__tests__/*'],
 | 
			
		||||
  },
 | 
			
		||||
  skipFormatting,
 | 
			
		||||
);
 | 
			
		||||
							
								
								
									
										13
									
								
								index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								index.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
<!doctype html>
 | 
			
		||||
<html lang="">
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="UTF-8" />
 | 
			
		||||
    <link rel="icon" href="/favicon.ico" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
			
		||||
    <title>Vite App</title>
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <div id="app"></div>
 | 
			
		||||
    <script type="module" src="/src/main.ts"></script>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										7676
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										7676
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										53
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "daily-aujourdhui-frontend",
 | 
			
		||||
  "version": "0.0.0",
 | 
			
		||||
  "private": true,
 | 
			
		||||
  "type": "module",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "dev": "vite",
 | 
			
		||||
    "build": "run-p type-check \"build-only {@}\" --",
 | 
			
		||||
    "preview": "vite preview",
 | 
			
		||||
    "test": "vitest -c vitest.config.local.ts",
 | 
			
		||||
    "test:ci": "vitest -c vitest.config.ci.ts",
 | 
			
		||||
    "build-only": "vite build",
 | 
			
		||||
    "type-check": "vue-tsc --build",
 | 
			
		||||
    "lint": "eslint . --fix",
 | 
			
		||||
    "lint:ci": "eslint .",
 | 
			
		||||
    "format": "prettier --write src/"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@logto/vue": "^3.0.8",
 | 
			
		||||
    "@primeuix/themes": "^1.1.1",
 | 
			
		||||
    "@tailwindcss/vite": "^4.1.8",
 | 
			
		||||
    "pinia": "^3.0.1",
 | 
			
		||||
    "primevue": "^4.3.4",
 | 
			
		||||
    "tailwindcss": "^4.1.8",
 | 
			
		||||
    "vue": "^3.5.13",
 | 
			
		||||
    "vue-router": "^4.5.0"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@tsconfig/node22": "^22.0.1",
 | 
			
		||||
    "@types/jsdom": "^21.1.7",
 | 
			
		||||
    "@types/node": "^22.14.0",
 | 
			
		||||
    "@vitejs/plugin-vue": "^5.2.3",
 | 
			
		||||
    "@vitest/coverage-v8": "^3.1.4",
 | 
			
		||||
    "@vitest/eslint-plugin": "^1.1.39",
 | 
			
		||||
    "@vue/eslint-config-prettier": "^10.2.0",
 | 
			
		||||
    "@vue/eslint-config-typescript": "^14.5.0",
 | 
			
		||||
    "@vue/test-utils": "^2.4.6",
 | 
			
		||||
    "@vue/tsconfig": "^0.7.0",
 | 
			
		||||
    "eslint": "^9.22.0",
 | 
			
		||||
    "eslint-plugin-vue": "~10.0.0",
 | 
			
		||||
    "jiti": "^2.4.2",
 | 
			
		||||
    "jsdom": "^26.0.0",
 | 
			
		||||
    "less": "^4.3.0",
 | 
			
		||||
    "less-loader": "^12.3.0",
 | 
			
		||||
    "npm-run-all2": "^7.0.2",
 | 
			
		||||
    "prettier": "3.5.3",
 | 
			
		||||
    "typescript": "~5.8.0",
 | 
			
		||||
    "vite": "^6.2.4",
 | 
			
		||||
    "vite-plugin-vue-devtools": "^7.7.2",
 | 
			
		||||
    "vitest": "^3.1.1",
 | 
			
		||||
    "vue-tsc": "^2.2.8"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								public/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 4.2 KiB  | 
							
								
								
									
										10
									
								
								src/App.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/App.vue
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import { RouterView } from 'vue-router';
 | 
			
		||||
import DailyHeader from './components/DailyHeader.vue';
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
  <DailyHeader />
 | 
			
		||||
 | 
			
		||||
  <RouterView />
 | 
			
		||||
</template>
 | 
			
		||||
							
								
								
									
										1
									
								
								src/assets/main.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/assets/main.css
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
@import 'tailwindcss';
 | 
			
		||||
							
								
								
									
										5
									
								
								src/components/DailyHeader.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/components/DailyHeader.vue
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <header>
 | 
			
		||||
    <div>Header</div>
 | 
			
		||||
  </header>
 | 
			
		||||
</template>
 | 
			
		||||
							
								
								
									
										11
									
								
								src/components/__tests__/DailyHeader.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/components/__tests__/DailyHeader.spec.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
import { describe, it, expect } from 'vitest';
 | 
			
		||||
 | 
			
		||||
import { mount } from '@vue/test-utils';
 | 
			
		||||
import DailyHeader from '../DailyHeader.vue';
 | 
			
		||||
 | 
			
		||||
describe('Header', () => {
 | 
			
		||||
  it('Loads properly', () => {
 | 
			
		||||
    const wrapper = mount(DailyHeader);
 | 
			
		||||
    expect(wrapper).toBeDefined();
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										32
									
								
								src/main.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/main.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,32 @@
 | 
			
		||||
import './assets/main.css';
 | 
			
		||||
 | 
			
		||||
import { createApp } from 'vue';
 | 
			
		||||
import { createPinia } from 'pinia';
 | 
			
		||||
import PrimeVue from 'primevue/config';
 | 
			
		||||
import Material from '@primeuix/themes/material';
 | 
			
		||||
import { createLogto, type LogtoConfig } from '@logto/vue';
 | 
			
		||||
 | 
			
		||||
import App from './App.vue';
 | 
			
		||||
import router from './router';
 | 
			
		||||
 | 
			
		||||
console.log('================', import.meta.env);
 | 
			
		||||
 | 
			
		||||
const logtoConfig: LogtoConfig = {
 | 
			
		||||
  endpoint: import.meta.env.VITE_LOGTO_ENDPOINT,
 | 
			
		||||
  appId: import.meta.env.VITE_LOGTO_APP_ID,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
console.log(logtoConfig);
 | 
			
		||||
 | 
			
		||||
const app = createApp(App);
 | 
			
		||||
 | 
			
		||||
app.use(createPinia());
 | 
			
		||||
app.use(router);
 | 
			
		||||
app.use(PrimeVue, {
 | 
			
		||||
  theme: {
 | 
			
		||||
    preset: Material,
 | 
			
		||||
  },
 | 
			
		||||
});
 | 
			
		||||
app.use(createLogto, logtoConfig);
 | 
			
		||||
 | 
			
		||||
app.mount('#app');
 | 
			
		||||
							
								
								
									
										25
									
								
								src/router/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/router/index.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
import { createRouter, createWebHistory } from 'vue-router';
 | 
			
		||||
import HomeView from '../views/HomeView.vue';
 | 
			
		||||
 | 
			
		||||
const router = createRouter({
 | 
			
		||||
  history: createWebHistory(import.meta.env.BASE_URL),
 | 
			
		||||
  routes: [
 | 
			
		||||
    {
 | 
			
		||||
      path: '/',
 | 
			
		||||
      name: 'home',
 | 
			
		||||
      component: HomeView,
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: '/about',
 | 
			
		||||
      name: 'about',
 | 
			
		||||
      component: () => import('../views/AboutView.vue'),
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: '/callback',
 | 
			
		||||
      name: 'callback',
 | 
			
		||||
      component: () => import('../views/CallbackView.vue'),
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default router;
 | 
			
		||||
							
								
								
									
										3
									
								
								src/views/AboutView.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/views/AboutView.vue
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="about">about</div>
 | 
			
		||||
</template>
 | 
			
		||||
							
								
								
									
										12
									
								
								src/views/CallbackView.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/views/CallbackView.vue
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <p v-if="isLoading">Redirecting...</p>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts" setup>
 | 
			
		||||
import { useHandleSignInCallback } from '@logto/vue';
 | 
			
		||||
import router from '@/router';
 | 
			
		||||
 | 
			
		||||
const { isLoading } = useHandleSignInCallback(() => {
 | 
			
		||||
  router.push('/');
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
							
								
								
									
										43
									
								
								src/views/HomeView.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/views/HomeView.vue
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,43 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <main class="text-3x1 font-bold underline">
 | 
			
		||||
    <p>home</p>
 | 
			
		||||
    <button v-on:click="onClickSignOut()" v-if="isAuthenticated">Sign Out</button>
 | 
			
		||||
    <button v-on:click="onClickSignIn()" v-else>Sign In</button>
 | 
			
		||||
    <div v-if="isAuthenticated && user">
 | 
			
		||||
      <table class="table">
 | 
			
		||||
        <thead>
 | 
			
		||||
          <tr>
 | 
			
		||||
            <th>Name</th>
 | 
			
		||||
            <th>Value</th>
 | 
			
		||||
          </tr>
 | 
			
		||||
        </thead>
 | 
			
		||||
        <tbody>
 | 
			
		||||
          <tr v-for="(value, key) in user" :key="key">
 | 
			
		||||
            <td>{{ key }}</td>
 | 
			
		||||
            <td>{{ typeof value === 'string' ? value : JSON.stringify(value) }}</td>
 | 
			
		||||
          </tr>
 | 
			
		||||
        </tbody>
 | 
			
		||||
      </table>
 | 
			
		||||
    </div>
 | 
			
		||||
  </main>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts" setup>
 | 
			
		||||
import { useLogto, type IdTokenClaims } from '@logto/vue';
 | 
			
		||||
import { ref } from 'vue';
 | 
			
		||||
 | 
			
		||||
console.log(import.meta.env);
 | 
			
		||||
 | 
			
		||||
const hostname = import.meta.env.VITE_HOSTNAME;
 | 
			
		||||
const { signIn, signOut, isAuthenticated, getIdTokenClaims } = useLogto();
 | 
			
		||||
const onClickSignIn = () => signIn(`${hostname}/callback`);
 | 
			
		||||
const onClickSignOut = () => signOut(hostname);
 | 
			
		||||
 | 
			
		||||
const user = ref<IdTokenClaims>();
 | 
			
		||||
if (isAuthenticated.value) {
 | 
			
		||||
  (async () => {
 | 
			
		||||
    const claims = await getIdTokenClaims();
 | 
			
		||||
    user.value = claims;
 | 
			
		||||
  })();
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
							
								
								
									
										12
									
								
								tsconfig.app.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								tsconfig.app.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
{
 | 
			
		||||
  "extends": "@vue/tsconfig/tsconfig.dom.json",
 | 
			
		||||
  "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
 | 
			
		||||
  "exclude": ["src/**/__tests__/*"],
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
 | 
			
		||||
 | 
			
		||||
    "paths": {
 | 
			
		||||
      "@/*": ["./src/*"]
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
			
		||||
{
 | 
			
		||||
  "files": [],
 | 
			
		||||
  "references": [
 | 
			
		||||
    {
 | 
			
		||||
      "path": "./tsconfig.node.json"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "path": "./tsconfig.app.json"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "path": "./tsconfig.vitest.json"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								tsconfig.node.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								tsconfig.node.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
{
 | 
			
		||||
  "extends": "@tsconfig/node22/tsconfig.json",
 | 
			
		||||
  "include": [
 | 
			
		||||
    "vite.config.*",
 | 
			
		||||
    "vitest.config.*",
 | 
			
		||||
    "cypress.config.*",
 | 
			
		||||
    "nightwatch.conf.*",
 | 
			
		||||
    "playwright.config.*",
 | 
			
		||||
    "eslint.config.*"
 | 
			
		||||
  ],
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "noEmit": true,
 | 
			
		||||
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
 | 
			
		||||
 | 
			
		||||
    "module": "ESNext",
 | 
			
		||||
    "moduleResolution": "Bundler",
 | 
			
		||||
    "types": ["node"]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								tsconfig.vitest.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								tsconfig.vitest.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
{
 | 
			
		||||
  "extends": "./tsconfig.app.json",
 | 
			
		||||
  "include": ["src/**/__tests__/*", "env.d.ts"],
 | 
			
		||||
  "exclude": [],
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.vitest.tsbuildinfo",
 | 
			
		||||
 | 
			
		||||
    "lib": [],
 | 
			
		||||
    "types": ["node", "jsdom"]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								vite.config.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								vite.config.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
import { fileURLToPath, URL } from 'node:url';
 | 
			
		||||
 | 
			
		||||
import { defineConfig } from 'vite';
 | 
			
		||||
import vue from '@vitejs/plugin-vue';
 | 
			
		||||
import vueDevTools from 'vite-plugin-vue-devtools';
 | 
			
		||||
import tailwindcss from '@tailwindcss/vite';
 | 
			
		||||
 | 
			
		||||
// https://vite.dev/config/
 | 
			
		||||
export default defineConfig({
 | 
			
		||||
  plugins: [vue(), vueDevTools(), tailwindcss()],
 | 
			
		||||
  resolve: {
 | 
			
		||||
    alias: {
 | 
			
		||||
      '@': fileURLToPath(new URL('./src', import.meta.url)),
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										18
									
								
								vitest.config.ci.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								vitest.config.ci.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,18 @@
 | 
			
		||||
import { fileURLToPath } from 'node:url';
 | 
			
		||||
import { mergeConfig, defineConfig, configDefaults } from 'vitest/config';
 | 
			
		||||
import viteConfig from './vite.config';
 | 
			
		||||
 | 
			
		||||
export default mergeConfig(
 | 
			
		||||
  viteConfig,
 | 
			
		||||
  defineConfig({
 | 
			
		||||
    test: {
 | 
			
		||||
      environment: 'jsdom',
 | 
			
		||||
      exclude: [...configDefaults.exclude, 'e2e/**'],
 | 
			
		||||
      root: fileURLToPath(new URL('./', import.meta.url)),
 | 
			
		||||
      watch: false,
 | 
			
		||||
      coverage: {
 | 
			
		||||
        enabled: true,
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
  }),
 | 
			
		||||
);
 | 
			
		||||
							
								
								
									
										17
									
								
								vitest.config.local.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								vitest.config.local.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
			
		||||
import { fileURLToPath } from 'node:url';
 | 
			
		||||
import { mergeConfig, defineConfig, configDefaults } from 'vitest/config';
 | 
			
		||||
import viteConfig from './vite.config';
 | 
			
		||||
 | 
			
		||||
export default mergeConfig(
 | 
			
		||||
  viteConfig,
 | 
			
		||||
  defineConfig({
 | 
			
		||||
    test: {
 | 
			
		||||
      environment: 'jsdom',
 | 
			
		||||
      exclude: [...configDefaults.exclude, 'e2e/**'],
 | 
			
		||||
      root: fileURLToPath(new URL('./', import.meta.url)),
 | 
			
		||||
      coverage: {
 | 
			
		||||
        enabled: true,
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
  }),
 | 
			
		||||
);
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user