Skip to content
Commits on Source (48)
extends:
- '@commitlint/config-conventional'
rules:
body-max-line-length: [2, 'always', 120]
footer-max-line-length: [2, 'always', 120]
header-max-length: [2, 'always', 72]
node_modules/
yarn-error.log
__sapper__/
.env
npm-debug.log
# Cache used by TypeScript's incremental build
*.tsbuildinfo
public/fonts/js/all.min.js
\ No newline at end of file
.DS_Store
/node_modules/
/src/node_modules/@sapper/
yarn-error.log
/__sapper__/
.env
\ No newline at end of file
.env
.svelte-kit
\ No newline at end of file
# -*- coding: utf-8 -*-
# vim: ft=yaml
---
include:
- project: EOLE/infra/ci-tools
ref: stable
file: /templates/Rules.yaml
- project: EOLE/infra/ci-tools
ref: stable
file: /templates/Runners/apps.education-docker.yaml
- project: EOLE/infra/ci-tools
ref: stable
file: /templates/Git.yaml
- project: EOLE/infra/ci-tools
ref: stable
file: /templates/Semantic-release.yaml
- project: EOLE/infra/ci-tools
ref: stable
file: /templates/Docker.yaml
variables:
# `ci-tools` default branch is `stable`
STABLE_BRANCH: master
IMAGE_NAME: laboite-blog_front
RELEASE_TAG_PREFIX: 'release/'
stages:
- initial-checks
- test
- build
- release
# Common setup for all meteor based jobs
.nodejs:
extends: .not-on-stable
image: hub.eole.education/proxyhub/library/node:16-alpine
cache:
key:
files:
# Generate new cache when one of the file changes
- package.json
- yarn.lock
paths:
- build/
- node_modules/
- .svelte-kit/
# Only use the cache created by `yarn:install` and `yarn:build` jobs
policy: pull
###############################################################################
# `initial-checks` stage: `commitlint`, `yarn:build`
###############################################################################
commitlint:
stage: initial-checks
extends: .git:commitlint
# Verify that the dependencies can be installed and cache dependencies
yarn:build:
stage: initial-checks
extends: .nodejs
cache:
policy: pull-push
script:
- apk add git
- yarn install
- yarn run build
###############################################################################
# `test` stage: `yarn:validate`
###############################################################################
yarn:validate:
stage: test
extends: .nodejs
allow_failure: true
script:
- yarn run validate
###############################################################################
# `build` stage: `build-docker`
###############################################################################
# Build on release tag and every branches except for `$STABLE_BRANCH`
# used only to create the release tag.
#
# The ordering is important:
# 1. exclude schedules and drafts
# 2. include `on-release-tag` which must match before `not-on-semantic-release-commit`
# 3. we exclude stable which just produce the release tag
# 4. we exclude `semantic-release` commits like when merging `release` on `dev`
# 5. run on every branches
build-docker:
extends: .docker:image:build
rules:
- !reference [.rules-map, not-on-schedule]
- !reference [.rules-map, not-on-draft]
- !reference [.rules-map, on-release-tag]
- !reference [.rules-map, on-testing-tag]
- !reference [.rules-map, not-on-stable]
- !reference [.rules-map, not-on-testing]
- !reference [.rules-map, not-on-semantic-release-commit]
- !reference [.rules-map, on-branch]
###############################################################################
# `release` stage: `new release`, `testing prerelease`,
# `merge-to-dev`, `tag *`
###############################################################################
new release:
extends:
- .semantic-release:stable
- .on-stable
testing prerelease:
extends:
- .semantic-release:testing
- .on-testing
# Avoid regression and update `version` of package*.json in `$DEV_BRANCH`
merge-to-dev: {extends: '.git:merge-to', variables: {GIT_MERGE_TARGET: $DEV_BRANCH}}
## tag contribution branches with a more stable name than `git-${CI_COMMIT_SHORT_SHA}`
tag contrib branch:
extends:
- .docker:image:tag
- .on-branches
variables:
# `feature/foo-bar_quux` → `feature-foo-bar-quux`
IMAGE_TAG: $CI_COMMIT_REF_SLUG
## dev images
tag dev:
extends:
- .docker:image:tag
- .on-dev
variables:
IMAGE_TAG: dev
## testing images
tag testing prerelease:
extends:
- .docker:image:tag
- .on-testing-tag
tag testing:
extends:
- .docker:image:tag
- .on-testing-tag
variables:
IMAGE_TAG: testing
## stable images
tag release:
extends: .docker:image:tag
tag major:
extends: .docker:image:tag
before_script:
- export RELEASE=${CI_COMMIT_TAG#${RELEASE_TAG_PREFIX}}
- export IMAGE_TAG=${RELEASE%%.*}
tag minor:
extends:
- .docker:image:tag
before_script:
- export RELEASE=${CI_COMMIT_TAG#${RELEASE_TAG_PREFIX}}
- export IMAGE_TAG=${RELEASE%.${RELEASE##*.}}
tag stable:
extends: .docker:image:tag
variables:
IMAGE_TAG: stable
tag latest:
extends: .docker:image:tag
variables:
IMAGE_TAG: latest
// Build the configuration depending of the environnement
// When using prerelease branches, we don't want changelog to be generated
// See https://github.com/semantic-release/changelog/issues/51#issuecomment-682609394
// Gitlab reference name
const branch = process.env.CI_COMMIT_REF_NAME;
const gitAssets = [];
// Configure your branches names
const stableBranch = 'master';
// Assign a branch name to produce a `beta` prerelease tag
const betaBranch = 'testing';
// Assign a branch name to produce a `alpha` prerelease tag
const alphaBranch = undefined;
// Assign a branch name to produce a `dev` prerelease tag
const devBranch = undefined;
// Configure semantic-release plugins
const breakingKeywords = ["BREAKING CHANGE", "BREAKING-CHANGE", "BREAKING CHANGES", "BREAKING-CHANGES"];
const changelogFile = 'docs/CHANGELOG.md';
// Configure `conventionalcommits`
// See:
// - https://github.com/conventional-changelog/conventional-changelog/issues/838
// - https://github.com/conventional-changelog/conventional-changelog/issues/317
// - https://github.com/conventional-changelog/conventional-changelog/pull/421
const commitTypes = [
{type: "build", section: "Build System", hidden: false},
{type: "chore", section: "Maintenance", hidden: true},
{type: "ci", section: "Continuous Integration", hidden: false},
{type: "docs", section: "Documentation", hidden: false},
{type: "feat", section: "Features", hidden: false},
{type: "fix", section: "Bug Fixes", hidden: false},
{type: "perf", section: "Performance Improvements", hidden: false},
{type: "refactor", section: "Code Refactoring", hidden: false},
{type: "revert", section: "Reverts", hidden: false},
{type: "style", section: "Styles", hidden: false},
{type: "test", section: "Tests", hidden: false},
];
const releaseRules = [
{ breaking: true, release: 'major' },
// { type: 'build', release: 'patch'},
// { type: 'chore', release: 'patch'},
// { type: 'ci', release: 'patch'},
{ type: 'docs', release: 'patch' },
{ type: 'feat', release: 'minor' },
{ type: 'fix', release: 'patch' },
{ type: 'perf', release: 'patch' },
{ type: 'refactor', release: 'patch' },
{ type: 'revert', release: 'patch' },
{ type: 'style', release: 'patch' },
{ type: 'test', release: 'patch' },
];
const semanticBranches = [stableBranch];
if (betaBranch) {
semanticBranches.push({
name: betaBranch,
prerelease: true
});
}
if (alphaBranch) {
semanticBranches.push({
name: alphaBranch,
prerelease: true
});
}
if (devBranch) {
semanticBranches.push({
name: devBranch,
prerelease: true
});
}
const config = {
branches: semanticBranches,
/* eslint no-template-curly-in-string: "off" */
tagFormat: 'release/${version}',
plugins: [
[
'@semantic-release/commit-analyzer',
{
preset: 'conventionalcommits',
parserOpts:
{
noteKeywords: breakingKeywords,
},
releaseRules: releaseRules,
presetConfig:
{
types: commitTypes,
},
},
],
[
'@semantic-release/release-notes-generator',
{
preset: 'conventionalcommits',
parserOpts:
{
noteKeywords: breakingKeywords,
},
presetConfig:
{
types: commitTypes,
},
},
],
],
};
if (
!Array.isArray(config.branches) ||
config.branches.some((it) => it === branch || (it.name === branch && !it.prerelease))
) {
// Generate changelog for release branch
config.plugins.push([
'@semantic-release/changelog',
{
changelogFile: changelogFile,
changelogTitle: '# Changelog',
},
]);
gitAssets.push(changelogFile);
}
// We need to update package*.json
// Make sure to modify pkgRoot and gitAssets lines for your needs
config.plugins.push(
[
'@semantic-release/npm',
{
npmPublish: false,
tarballDir: 'dist',
},
]
);
gitAssets.push('package*.json');
// Commit changes and create release on Gitlab
config.plugins.push(
[
'@semantic-release/git',
{
assets: gitAssets,
message: 'chore(release): ${nextRelease.version}\n\n${nextRelease.notes}',
},
],
'@semantic-release/gitlab',
);
module.exports = config;
FROM hub.eole.education/proxyhub/library/node:12-alpine
ENV PORT=4000
ENV NODE_ENV=production
run apk add git gcc
# stage build
FROM hub.eole.education/proxyhub/library/node:16-alpine
# install dependencies
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install
# Copy all local files into the image.
COPY . .
RUN npm install --production
RUN npm rebuild node-sass
RUN npm install --save
RUN npm run build
run apk del git gcc
EXPOSE 4000
CMD ["npm", "start"]
###
# Only copy over the Node pieces we need
###
FROM hub.eole.education/proxyhub/library/node:16-alpine
WORKDIR /app
COPY --from=0 /app .
COPY . .
EXPOSE 3000
CMD ["node", "./build"]
LICENCE PUBLIQUE DE L'UNION EUROPÉENNE v. 1.2
EUPL © Union européenne 2007, 2016
La présente licence publique de l'Union européenne («EUPL») s'applique à toute œuvre (telle que définie ci-dessous) fournie aux conditions prévues par la présente licence. Toute utilisation de l'œuvre autre que ce qu'autorise la présente licence est interdite (dans la mesure où pareille utilisation est couverte par un droit du titulaire des droits d'auteur sur l'œuvre). L'œuvre est fournie aux conditions prévues par la présente licence quand le donneur de licence (tel que défini ci-dessous) a placé la mention suivante immédiatement après la déclaration relative au droit d'auteur sur l'œuvre:
Sous licence EUPL
ou a exprimé de toute autre manière sa volonté de fournir l'œuvre sous licence EUPL.
1.Définitions
Dans la présente licence, on entend par:
— «licence», la présente licence,
— «œuvre originale», l'œuvre ou le logiciel distribué ou communiqué par le donneur de licence en vertu de la présente licence, sous forme de code source ou de code objet, selon le cas,
— «œuvres dérivées», les œuvres ou logiciels qui pourraient être créés par le licencié sur la base de l'œuvre originale ou des modifications qui y auraient été appliquées. La présente licence ne définit pas le degré de modification ou de dépendance requis par rapport à l'œuvre originale pour qu'une œuvre soit qualifiée d'œuvre dérivée; cette question est réglée par la loi applicable en matière de droit d'auteur dans le pays visé à l'article 15,
— «œuvre», l'œuvre originale ou ses œuvres dérivées,
— «code source», la forme de l'œuvre, lisible par l'homme, la plus appropriée pour que des personnes puissent l'examiner et la modifier,
— «code objet», l'œuvre codée, généralement après compilation, destinée à être exécutée en tant que programme par un ordinateur, — «donneur de licence», la personne physique ou morale qui distribue ou communique l'œuvre sous licence,
— «contributeur», toute personne physique ou morale qui modifie l'œuvre sous licence, ou contribue de toute autre manière à en faire une œuvre dérivée,
— «licencié» ou «vous», toute personne physique ou morale qui utilise l'œuvre conformément à la licence,
— «distribution» ou «communication», tout acte de vente, don, prêt, location, distribution, communication, transmission ou mise à disposition, en ligne ou hors ligne, de copies de l'œuvre, et tout acte donnant accès à ses fonctions essentielles à toute autre personne physique ou morale.
2.Portée des droits accordés par la licence
Par la présente, le donneur de licence vous concède, pour la durée de la protection de son droit d'auteur sur l'œuvre originale, une licence mondiale, libre de redevances, non exclusive et pouvant faire l'objet de sous-licences, en vertu de laquelle vous pouvez:
— utiliser l'œuvre en toute circonstance et pour tout usage,
— reproduire l'œuvre,
— modifier l'œuvre et créer des œuvres dérivées sur la base de l'œuvre,
— communiquer l'œuvre au public, ce qui inclut le droit de mettre à disposition du public ou de lui présenter l'œuvre ou des copies de l'œuvre et d'en effectuer des représentations publiques, le cas échéant,
— distribuer l'œuvre ou des copies de celle-ci,
— prêter et louer l'œuvre ou des copies de celles-ci,
— accorder en sous-licence des droits sur l'œuvre ou sur des copies de celle-ci.
Ces droits peuvent être exercés sur tout support et format, connu ou encore à inventer, dans la mesure où le droit applicable le permet. Dans les pays où des droits moraux s'appliquent, le donneur de licence renonce à son droit d'exercer son droit moral dans la mesure permise par la loi afin que la licence sur les droits patrimoniaux susmentionnés produise ses effets. Le donneur de licence vous concède un droit d'usage libre de redevances et non exclusif sur tout brevet qu'il détient, dans la mesure nécessaire à l'exercice des droits qui vous sont concédés sur l'œuvre sous licence.
3.Communication du code source
Le donneur de licence fournit l'œuvre sous forme de code source ou de code objet. Si l'œuvre est fournie sous forme de code objet, le donneur de licence accompagne chacune des copies de l'œuvre qu'il distribue d'une copie lisible par machine du code source de l'œuvre ou indique, dans un avis qui suit la déclaration relative au droit d'auteur jointe à l'œuvre, l'endroit où le code source est aisément et gratuitement accessible aussi longtemps que le donneur de licence continue à distribuer ou communiquer l'œuvre.
4.Limitations du droit d'auteur
Rien dans la présente licence n'a pour but de priver le licencié des avantages résultant de toute exception ou limitation aux droits exclusifs des titulaires de droits sur l'œuvre, de l'épuisement de ces droits ou de toute autre limitation qui s'y applique.
5.Obligations du licencié
La concession des droits susmentionnés est soumise à des restrictions et à des obligations pour le licencié. Ces obligations sont les suivantes:
Droit d'attribution: le licencié laisse intactes toutes les déclarations concernant le droit d'auteur, le brevet ou les marques et toutes les déclarations concernant la licence et l'exclusion de garantie. Le licencié assortit chaque copie de l'œuvre qu'il distribue ou communique d'une copie de ces déclarations et d'une copie de la licence. Le licencié veille à ce que toute œuvre dérivée soit assortie d'un avis bien visible indiquant que l'œuvre a été modifiée et mentionnant la date de la modification.
Clause copyleft: si le licencié distribue ou communique des copies d'œuvres originales ou d'œuvres dérivées, cette distribution ou cette communication est effectuée dans les conditions prévues par la présente licence ou une version ultérieure de cette licence, sauf si l'œuvre originale est expressément distribuée en vertu de la présente version de la licence uniquement, par exemple au moyen de la mention «EUPL v. 1.2 seulement». Le licencié (qui devient donneur de licence) ne peut pas, en ce qui concerne l'œuvre ou les œuvres dérivées, offrir ou imposer des conditions supplémentaires qui restreignent ou modifient les conditions de la licence.
Clause de compatibilité: si le licencié distribue ou communique des œuvres dérivées ou des copies de telles œuvres basées à la fois sur l'œuvre et sur une autre œuvre concédée sous une licence compatible, la distribution ou la communication peut être faite aux conditions de cette licence compatible. Aux fins de la présente clause, une «licence compatible» est l'une des licences énumérées dans l'appendice de la présente licence. Dans le cas où les obligations du licencié au titre de la licence compatible entrent en conflit avec les obligations du licencié au titre de la présente licence, les premières prévalent.
Fourniture du code source: lorsqu'il distribue ou communique des copies de l'œuvre, le licencié fournit une copie lisible par machine du code source ou indique l'endroit où ce code source restera aisément et gratuitement accessible aussi longtemps que le donneur de licence continuera à distribuer ou communiquer l'œuvre.
Protection des droits: la présente licence ne donne pas le droit d'utiliser les noms commerciaux, les marques commerciales, les marques de service ou les noms du donneur de licence, sauf dans la mesure nécessaire, conformément à une utilisation raisonnable et aux pratiques habituelles, pour décrire l'origine de l'œuvre et reproduire la déclaration concernant le droit d'auteur.
6.Chaîne d'auteurs
Le donneur de licence initial garantit que les droits d'auteur sur l'œuvre originale concédés par la présente licence lui appartiennent ou lui ont été donnés sous licence, et qu'il a le pouvoir et la capacité de concéder la licence. Tout contributeur garantit que les droits d'auteur sur les modifications qu'il apporte à l'œuvre lui appartiennent ou lui ont été donnés sous licence, et qu'il a le pouvoir et la capacité de concéder la licence. Chaque fois que vous acceptez la licence, le donneur de licence initial et les contributeurs successifs vous concèdent une licence sur leurs contributions à l'œuvre selon les conditions de la présente licence.
7.Exclusion de garantie
L'œuvre est un travail en cours, amélioré de manière continue par de nombreux contributeurs. Elle constitue un travail inachevé et peut dès lors contenir des défauts ou bogues inhérents à ce type de développement. Pour cette raison, l'œuvre est fournie sous licence telle quelle, sans aucune garantie d'aucune sorte la concernant, y compris, sans que cette liste soit exhaustive, eu égard à sa qualité marchande, son aptitude à un usage particulier, l'absence de défauts ou d'erreurs, l'exactitude ou la non-violation de droits de propriété intellectuelle autres que le droit d'auteur comme prévu à l'article 6 de la présente licence. Cette exclusion de garantie est une partie essentielle de la licence et une condition de la concession de droits sur l'œuvre.
8.Exclusion de responsabilité
Sauf dans les cas de faute intentionnelle ou de dommages directement causés à des personnes physiques, le donneur de licence n'est en aucun cas responsable des dommages, quelle qu'en soit la nature, directs ou indirects, matériels ou moraux, résultant de la licence ou de l'utilisation de l'œuvre, y compris, sans que cette liste soit exhaustive, des dommages causés par les atteintes à la réputation, les interruptions de travail, les défaillances ou le mauvais fonctionnement de matériel informatique, les pertes de données ou tout autre dommage économique, même si le donneur de licence a été informé de la possibilité de tels dommages. Cependant, le donneur de licence est responsable en vertu des dispositions législatives et réglementaires relatives à la responsabilité du fait des produits, dans la mesure où celles-ci sont applicables à l'œuvre.
9.Accords additionnels
Lorsque vous distribuez l'œuvre, vous pouvez choisir de conclure un accord additionnel définissant des obligations ou des services compatibles avec la présente licence. Cependant, si vous acceptez des obligations, vous ne pouvez agir qu'en votre nom et sous votre seule responsabilité, et non au nom du donneur de licence initial ou de tout autre contributeur, et seulement si vous acceptez d'indemniser, de défendre et de mettre hors de cause tous les contributeurs s'ils encourent une responsabilité quelconque ou si des réclamations sont formulées à leur encontre du fait que vous avez accepté des garanties ou des responsabilités additionnelles.
10.Acceptation de la licence
Vous pouvez exprimer votre accord sur le contenu de la présente licence en cliquant sur l'icône «J'accepte» placée au bas d'une fenêtre faisant apparaître le texte de la présente licence, ou par toute autre manifestation de consentement similaire, conformément à la loi applicable. Le fait de cliquer sur cette icône indique votre acceptation claire et irrévocable de la présente licence et de toutes ses conditions. De même, vous acceptez irrévocablement la présente licence et toutes ses conditions dès lors que vous exercez un des droits qui vous sont concédés par l'article 2 de la présente licence, tels que l'utilisation de l'œuvre, la création d'une œuvre dérivée ou la distribution ou la communication de l'œuvre ou de copies de l'œuvre.
11.Information du public
En cas de distribution ou de communication électronique de l'œuvre (par exemple en permettant son téléchargement à distance), le canal de distribution ou le support (par exemple un site web) doit au minimum fournir au public les informations requises par le droit applicable en ce qui concerne le donneur de licence et la licence ainsi que la manière dont le licencié peut accéder à celle-ci, la conclure, la stocker et la reproduire.
12.Fin de la licence
La licence et les droits qu'elle concède prennent automatiquement fin dès que le licencié viole l'une de ses conditions. Un tel événement ne met pas fin aux licences des personnes ayant reçu l'œuvre sous licence de la part du licencié, pour autant que ces personnes respectent pleinement la licence.
13.Divers
Sous réserve de l'article 9, la licence représente l'entièreté de l'accord entre les parties quant à l'œuvre. Le fait qu'une clause quelconque de la licence soit invalide ou inapplicable en vertu du droit applicable n'affecte pas la validité ou l'applicabilité de la licence dans son ensemble. Une telle clause sera interprétée ou modifiée dans la mesure nécessaire pour la rendre valide ou applicable. La Commission européenne peut publier d'autres versions linguistiques ou de nouvelles versions de la présente licence ou des versions actualisées de son appendice, dans la mesure de ce qui est nécessaire et raisonnable, sans réduire la portée des droits accordés par la licence. Les nouvelles versions de la licence seront publiées avec un numéro de version unique. Toutes les versions linguistiques de la présente licence, approuvées par la Commission européenne, ont la même valeur. Les parties peuvent se prévaloir de la version linguistique de leur choix.
14.Juridiction compétente
Sans préjudice d'accords spécifiques entre les parties,
— tout litige résultant de l'interprétation de la présente licence survenant entre des institutions, organes, bureaux ou agences de l'Union européenne en tant que donneurs de licence et un licencié relève de la juridiction de la Cour de justice de l'Union européenne, conformément à l'article 272 du traité sur le fonctionnement de l'Union européenne,
— tout litige survenant entre d'autres parties et résultant de l'interprétation de la présente licence relève de la compétence exclusive de la juridiction compétente du lieu où le donneur de licence réside ou exerce son activité principale.
15.Droit applicable
Sans préjudice d'accords spécifiques entre les parties,
— la présente licence est régie par le droit de l'État membre de l'Union européenne où le donneur de licence réside ou a son siège social ou statutaire,
— la présente licence est régie par le droit belge si le donneur de licence ne réside pas et n'a pas son siège social ou statutaire dans un État membre de l'Union européenne.
Appendice
Aux fins de l'article 5 de l'EUPL, les licences compatibles sont les suivantes:
— GNU General Public License (GPL) v. 2, v. 3
— GNU Affero General Public License (AGPL) v. 3
— Open Software License (OSL) v. 2.1, v. 3.0
— Eclipse Public License (EPL) v. 1.0
— CeCILL v. 2.0, v. 2.1
— Mozilla Public licence (MPL) v. 2
— GNU Lesser General Public licence (LGPL) v. 2.1, v. 3
— Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) pour les œuvres autres que logicielles
— Licence publique de l'Union européenne (EUPL) v. 1.1, v. 1.2
— Licence libre du Québec — Réciprocité (LiLiQ-R) ou Réciprocité forte (LiLiQ-R+)
La Commission européenne pourra actualiser le présent appendice afin d'y inclure des versions ultérieures des licences ci-dessus sans produire de nouvelle version de l'EUPL, dès lors que ces versions prévoient la concession des droits visés à l'article 2 de la présente licence et empêchent l'appropriation exclusive du code source couvert.
Tout autre changement ou ajout au présent appendice requiert la production d'une nouvelle version de l'EUPL.
# sapper-template
# @sveltejs/adapter-node
The default template for setting up a [Sapper](https://github.com/sveltejs/sapper) project. Can use either Rollup or webpack as bundler.
[Adapter](https://kit.svelte.dev/docs/adapters) for SvelteKit apps that generates a standalone Node server.
## Usage
## Getting started
Install with `npm i -D @sveltejs/adapter-node`, then add the adapter to your `svelte.config.js`:
### Using `degit`
To create a new Sapper project based on Rollup locally, run
```bash
npx degit "sveltejs/sapper-template#rollup" my-app
```
For a webpack-based project, instead run
```bash
npx degit "sveltejs/sapper-template#webpack" my-app
```js
// svelte.config.js
import adapter from "@sveltejs/adapter-node";
export default {
kit: {
adapter: adapter(),
},
};
```
[`degit`](https://github.com/Rich-Harris/degit) is a scaffolding tool that lets you create a directory from a branch in a repository.
Replace `my-app` with the path where you wish to create the project.
### Using GitHub templates
## Environment variables
Alternatively, you can create the new project as a GitHub repository using GitHub's template feature.
### `PORT` and `HOST`
Go to either [sapper-template-rollup](https://github.com/sveltejs/sapper-template-rollup) or [sapper-template-webpack](https://github.com/sveltejs/sapper-template-webpack) and click on "Use this template" to create a new project repository initialized by the template.
By default, the server will accept connections on `0.0.0.0` using port 3000. These can be customised with the `PORT` and `HOST` environment variables:
### Running the project
Once you have created the project, install dependencies and run the project in development mode:
```bash
cd my-app
npm install # or yarn
npm run dev
```
This will start the development server on [localhost:3000](http://localhost:3000). Open it and click around.
You now have a fully functional Sapper project! To get started developing, consult [sapper.svelte.dev](https://sapper.svelte.dev).
### Using TypeScript
By default, the template uses plain JavaScript. If you wish to use TypeScript instead, you need some changes to the project:
* Add `typescript` as well as typings as dependences in `package.json`
* Configure the bundler to use [`svelte-preprocess`](https://github.com/sveltejs/svelte-preprocess) and transpile the TypeScript code.
* Add a `tsconfig.json` file
* Update the project code to TypeScript
The template comes with a script that will perform these changes for you by running
```bash
node scripts/setupTypeScript.js
HOST=127.0.0.1 PORT=4000 node build
```
`@sapper` dependencies are resolved through `src/node_modules/@sapper`, which is created during the build. You therefore need to run or build the project once to avoid warnings about missing dependencies.
### `ORIGIN`, `PROTOCOL_HEADER` and `HOST_HEADER`
The script does not support webpack at the moment.
HTTP doesn't give SvelteKit a reliable way to know the URL that is currently being requested. The simplest way to tell SvelteKit where the app is being served is to set the `ORIGIN` environment variable:
## Directory structure
```
ORIGIN=https://my.site node build
```
Sapper expects to find two directories in the root of your project — `src` and `static`.
With this, a request for the `/stuff` pathname will correctly resolve to `https://my.site/stuff`. Alternatively, you can specify headers that tell SvelteKit about the request protocol and host, from which it can construct the origin URL:
```
PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host node build
```
### src
> [`x-forwarded-proto`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Proto) and [`x-forwarded-host`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Host) are de facto standard headers that forward the original protocol and host if you're using a reverse proxy (think load balancers and CDNs). You should only set these variables if your server is behind a trusted reverse proxy; otherwise, it'd be possible for clients to spoof these headers.
The [src](src) directory contains the entry points for your app — `client.js`, `server.js` and (optionally) a `service-worker.js` — along with a `template.html` file and a `routes` directory.
### `ADDRESS_HEADER` and `XFF_DEPTH`
The [RequestEvent](https://kit.svelte.dev/docs/types#additional-types-requestevent) object passed to hooks and endpoints includes an `event.clientAddress` property representing the client's IP address. By default this is the connecting `remoteAddress`. If your server is behind one or more proxies (such as a load balancer), this value will contain the innermost proxy's IP address rather than the client's, so we need to specify an `ADDRESS_HEADER` to read the address from:
#### src/routes
```
ADDRESS_HEADER=True-Client-IP node build
```
This is the heart of your Sapper app. There are two kinds of routes — *pages*, and *server routes*.
> Headers can easily be spoofed. As with `PROTOCOL_HEADER` and `HOST_HEADER`, you should [know what you're doing](https://adam-p.ca/blog/2022/03/x-forwarded-for/) before setting these.
**Pages** are Svelte components written in `.svelte` files. When a user first visits the application, they will be served a server-rendered version of the route in question, plus some JavaScript that 'hydrates' the page and initialises a client-side router. From that point forward, navigating to other pages is handled entirely on the client for a fast, app-like feel. (Sapper will preload and cache the code for these subsequent pages, so that navigation is instantaneous.)
If the `ADDRESS_HEADER` is `X-Forwarded-For`, the header value will contain a comma-separated list of IP addresses. The `XFF_DEPTH` environment variable should specify how many trusted proxies sit in front of your server. E.g. if there are three trusted proxies, proxy 3 will forward the addresses of the original connection and the first two proxies:
**Server routes** are modules written in `.js` files, that export functions corresponding to HTTP methods. Each function receives Express `request` and `response` objects as arguments, plus a `next` function. This is useful for creating a JSON API, for example.
```
<client address>, <proxy 1 address>, <proxy 2 address>
```
There are three simple rules for naming the files that define your routes:
Some guides will tell you to read the left-most address, but this leaves you [vulnerable to spoofing](https://adam-p.ca/blog/2022/03/x-forwarded-for/):
* A file called `src/routes/about.svelte` corresponds to the `/about` route. A file called `src/routes/blog/[slug].svelte` corresponds to the `/blog/:slug` route, in which case `params.slug` is available to the route
* The file `src/routes/index.svelte` (or `src/routes/index.js`) corresponds to the root of your app. `src/routes/about/index.svelte` is treated the same as `src/routes/about.svelte`.
* Files and directories with a leading underscore do *not* create routes. This allows you to colocate helper modules and components with the routes that depend on them — for example you could have a file called `src/routes/_helpers/datetime.js` and it would *not* create a `/_helpers/datetime` route.
```
<spoofed address>, <client address>, <proxy 1 address>, <proxy 2 address>
```
Instead, we read from the _right_, accounting for the number of trusted proxies. In this case, we would use `XFF_DEPTH=3`.
#### src/node_modules/images
> If you need to read the left-most address instead (and don't care about spoofing) — for example, to offer a geolocation service, where it's more important for the IP address to be _real_ than _trusted_, you can do so by inspecting the `x-forwarded-for` header within your app.
Images added to `src/node_modules/images` can be imported into your code using `import 'images/<filename>'`. They will be given a dynamically generated filename containing a hash, allowing for efficient caching and serving the images on a CDN.
## Options
See [`index.svelte`](src/routes/index.svelte) for an example.
The adapter can be configured with various options:
```js
// svelte.config.js
import adapter from "@sveltejs/adapter-node";
export default {
kit: {
adapter: adapter({
// default options are shown
out: "build",
precompress: false,
envPrefix: "",
}),
},
};
```
#### src/node_modules/@sapper
### out
This directory is managed by Sapper and generated when building. It contains all the code you import from `@sapper` modules.
The directory to build the server to. It defaults to `build` — i.e. `node build` would start the server locally after it has been created.
### precompress
### static
Enables precompressing using gzip and brotli for assets and prerendered pages. It defaults to `false`.
The [static](static) directory contains static assets that should be served publicly. Files in this directory will be available directly under the root URL, e.g. an `image.jpg` will be available as `/image.jpg`.
### envPrefix
The default [service-worker.js](src/service-worker.js) will preload and cache these files, by retrieving a list of `files` from the generated manifest:
If you need to change the name of the environment variables used to configure the deployment (for example, to deconflict with environment variables you don't control), you can specify a prefix:
```js
import { files } from '@sapper/service-worker';
envPrefix: "MY_CUSTOM_";
```
If you have static files you do not want to cache, you should exclude them from this list after importing it (and before passing it to `cache.addAll`).
Static files are served using [sirv](https://github.com/lukeed/sirv).
```
MY_CUSTOM_HOST=127.0.0.1 \
MY_CUSTOM_PORT=4000 \
MY_CUSTOM_ORIGIN=https://my.site \
node build
```
## Custom server
## Bundler configuration
The adapter creates two files in your build directory — `index.js` and `handler.js`. Running `index.js` — e.g. `node build`, if you use the default build directory — will start a server on the configured port.
Sapper uses Rollup or webpack to provide code-splitting and dynamic imports, as well as compiling your Svelte components. With webpack, it also provides hot module reloading. As long as you don't do anything daft, you can edit the configuration files to add whatever plugins you'd like.
Alternatively, you can import the `handler.js` file, which exports a handler suitable for use with [Express](https://github.com/expressjs/expressjs.com), [Connect](https://github.com/senchalabs/connect) or [Polka](https://github.com/lukeed/polka) (or even just the built-in [`http.createServer`](https://nodejs.org/dist/latest/docs/api/http.html#httpcreateserveroptions-requestlistener)) and set up your own server:
```js
// my-server.js
import { handler } from "./build/handler.js";
import express from "express";
## Production mode and deployment
const app = express();
To start a production version of your app, run `npm run build && npm start`. This will disable live reloading, and activate the appropriate bundler plugins.
// add a route that lives separately from the SvelteKit app
app.get("/healthcheck", (req, res) => {
res.end("ok");
});
You can deploy your application to any environment that supports Node 10 or above. As an example, to deploy to [Vercel Now](https://vercel.com) when using `sapper export`, run these commands:
// let SvelteKit handle everything else, including serving prerendered pages and static assets
app.use(handler);
```bash
npm install -g vercel
vercel
app.listen(3000, () => {
console.log("listening on port 3000");
});
```
If your app can't be exported to a static site, you can use the [now-sapper](https://github.com/thgh/now-sapper) builder. You can find instructions on how to do so in its [README](https://github.com/thgh/now-sapper#basic-usage).
## Using external components
## Deploying
When using Svelte components installed from npm, such as [@sveltejs/svelte-virtual-list](https://github.com/sveltejs/svelte-virtual-list), Svelte needs the original component source (rather than any precompiled JavaScript that ships with the component). This allows the component to be rendered server-side, and also keeps your client-side app smaller.
Because of that, it's essential that the bundler doesn't treat the package as an *external dependency*. You can either modify the `external` option under `server` in [rollup.config.js](rollup.config.js) or the `externals` option in [webpack.config.js](webpack.config.js), or simply install the package to `devDependencies` rather than `dependencies`, which will cause it to get bundled (and therefore compiled) with your app:
You will need the output directory (`build` by default), the project's `package.json`, and the production dependencies in `node_modules` to run the application. Production dependencies can be generated with `npm ci --prod`, you can also skip this step if your app doesn't have any dependencies. You can then start your app with
```bash
npm install -D @sveltejs/svelte-virtual-list
node build
```
## Changelog
[The Changelog for this package is available on GitHub](https://github.com/sveltejs/kit/blob/master/packages/adapter-node/CHANGELOG.md).
## Bugs and feedback
## License
Sapper is in early development, and may have the odd rough edge here and there. Please be vocal over on the [Sapper issue tracker](https://github.com/sveltejs/sapper/issues).
[MIT](LICENSE)
# Changelog
## [1.2.0](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/compare/release/1.1.1...release/1.2.0) (2022-07-04)
### Features
* **env:** add adapter to generate build ([ba76c35](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/ba76c35e0464820364a812357f72f8adb0288330))
* **env:** change env handling ([377d0cd](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/377d0cdce61e949c0794e5c555fa510bdaa58e5b))
* **structure:** migrate & structure ([81681bf](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/81681bfff7297a79d701878658c2b5a615b01018))
* **ui:** host fontAnsome icons and fonts localy ([7468ebb](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/7468ebb9bc5f7371508a8c3572367b87230d2af9))
### Bug Fixes
* **articles:** fix mardown color syntax plugin ([2a373c2](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/2a373c220676a5955d7e322b467d895492c1fe97))
* **audit:** update libraries, add license ([609ccd3](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/609ccd3ce72d52dabed466b24caeb920bb9d9563))
* **authors:** display structures ([18f3832](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/18f3832461f724cb76d22216a02fd33abd6b35ed))
* **authors:** prevent too many api calls on authors card ([50d39e5](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/50d39e530a2baf357c09329d34878149072f8932))
* **build:** start refactor of Dockerfile ([69e309e](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/69e309e3521718948be4a338324dece4285cbff5))
* **docker:** alignment, declare port only once ([96c267a](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/96c267a1bf375ffa5129a6b04c6c742c934b3b54))
* **Dockerfile:** Replace npm by yarn ([afe9adb](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/afe9adbcdd74877d14785320eec15af42df6767e))
* **docker:** remove useless step during build ([dae820b](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/dae820b6e4cab21e8544fcbb785d1ad3246b3c26))
* **Dokerfile:** Update for svelte kit ([6af884c](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/6af884ca4a3218ae5e957b03ea1f0f8c9e07d32d))
* **env:** add new env variables ([b5bfa2b](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/b5bfa2b11a7e0e1cc866275c530d74be0ea1ffc9))
* **favoris:** fix groups fav display and hide fav button for academies ([664443f](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/664443f667125cae9794f41e0e6366ea5efb1736))
* **package:** update package-lock ([115037d](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/115037da4a08f773689b1cfbe3531f44fc6092fb))
* **styles:** change images routes & improve modified pugin ([aa34902](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/aa3490250cb9915bd0278052c0a4da737300b733))
* **ui:** add font import in layout ([62dce6c](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/62dce6ce089abf666ed8bf31adf4c81274154659))
* **ui:** add missing imports ([8f704a5](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/8f704a5948b86688f637b9b63f4494c042e27a15))
* **ui:** remove console log in FavoritesResearch component ([8438658](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/8438658b14c5e360bd2d0d4005cd7b8990d1086e))
* **ui:** resize eole logo ([2010ab9](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/2010ab97d446857faa05b76b523520fa890bdb11))
### Code Refactoring
* **ui:** change logo in nav bar ([2b80851](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/2b8085121d5f553696368a7573b75fd69122afc4))
* **ui:** change spinner logo ([edf4f48](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/edf4f48c4f6682d84d9bb5da4a284c859f14285f))
### Continuous Integration
* **build:** create the docker image and push it to `${CI_REGISTRY}` ([02d6d94](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/02d6d94c4ce16baba3f24d3cddce7c90cadb337f))
* **commitlint:** enforce commit message format ([54c1539](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/54c1539dd0a5c580baab0a219912577e91b15e29))
* **release:** avoid regression in `dev` branch ([8ebe254](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/8ebe2545958338080e365b41b2896ff3b3a498d5))
* **release:** create release automatically with `semantic-release` ([a32f223](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/a32f22319804c045177863707a710ac0703b0923))
* **release:** tag docker images based on release cycle ([b02d072](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/b02d0729fd10fb813057b076df235ed9de33250e))
* **test:** verify dependencis, build and code tests ([14f7b07](https://gitlab.mim-libre.fr/alphabet/laboite-blog-front/commit/14f7b07fb015211c6a05763cc8881ee6b39790fb))
# How to contribute
This document will eventually outline all aspects of guidance to make your
contributing experience a fruitful and enjoyable one. What it already contains
is information about commit message formatting and how that directly affects
the numerous automated processes that are used for this repo.
[[_TOC_]]
## Overview
Submitting a merge request is more than just code! To achieve a quality
product, the tests and documentation need to be updated as well. An excellent
merge request will include these in the changes, wherever relevant.
## Commit message formatting
Since every type of change requires making Git commits, we will start by
covering the importance of ensuring that all of your commit messages are in the
correct format.
### Automation of multiple processes
This project uses
[semantic-release](https://github.com/semantic-release/semantic-release) for
automating numerous processes such as bumping the version number appropriately,
creating new tags/releases and updating the changelog. The entire process
relies on the structure of commit messages to determine the version bump, which
is then used for the rest of the automation.
Full details are available in the upstream docs regarding
the [Conventionnal Commit Message Conventions](https://www.conventionalcommits.org/en/v1.0.0/).
The key factor is that the first line of the commit message must follow this format:
```
type(scope): subject
```
For example:
```
feat(libfoo): new API `foo.quux` deprecates `foo.bar`
We create the new API `foo.quux` to better do things and mark
`foo.bar` deprecated from version `1.3.4`.
* test/libfoo.t: test the new API `foo.quux`
* lib/foo.pl: new API `foo.quux` and mark `foo.bar` deprecated.
```
Besides the version bump, the changelog and release notes are formatted
accordingly. So based on the example above:
> Features
>
> - **libfoo**: new API `foo.quux` deprecates `foo.bar`
- The `type` translates into a `Features` sub-heading.
- The `(scope)`: will be shown in bold text without the brackets.
- The `subject` follows the `scope` as standard text.
### Linting commit messages in CI
This project uses
[commitlint](https://github.com/conventional-changelog/commitlint) for checking
commit messages during CI testing. This ensures that they are in accordance
with the
[semantic-release](https://github.com/semantic-release/semantic-release)
settings.
For more details about the default settings, refer back to
the [`commitlint` reference rules](https://conventional-changelog.github.io/commitlint/#/reference-rules).
### Relationship between commit type and version bump
This project applies some customisation to the defaults, as outlined in the
table below, based upon the type of the commit:
| Type | Heading | Description | Bump (default) | Bump (custom) |
|----------|--------------------------|---------------------------------------------------------------------------------------------------------|----------------|---------------|
| build | Build System | Changes related to the build system | – | _ |
| chore | – | Changes to the build process or auxiliary tools and libraries such as documentation generation | – | _ |
| ci | Continuous Integration | Changes to the continuous integration configuration | – | _ |
| docs | Documentation | Documentation only changes | – | 0.0.1 |
| feat | Features | A new feature | 0.1.0 | 0.1.0 |
| fix | Bug Fixes | A bug fix | 0.0.1 | 0.0.1 |
| perf | Performance Improvements | A code change that improves performance | 0.0.1 | 0.0.1 |
| refactor | Code Refactoring | A code change that neither fixes a bug nor adds a feature | – | 0.0.1 |
| revert | Reverts | A commit used to revert a previous commit | – | 0.0.1 |
| style | Styles | Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc.) | – | 0.0.1 |
| test | Tests | Adding missing or correcting existing tests | – | 0.0.1 |
#### Scopes
Even if it is possible to
[limit the possible scopes](https://github.com/conventional-changelog/commitlint/blob/master/docs/reference-rules.md#scope-enum)
like [in Angular](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#scope),
this project does not enforce them and let the contributors define meaningful
ones in their commits.
### Use `BREAKING CHANGE` to trigger a `major` version change
Adding `BREAKING CHANGE` to the footer of the extended description of the
commit message will **always** trigger a `major` version change, no matter
which type has been used. This will be appended to the changelog and release
notes as well. To preserve good formatting of these notes, the following format
is prescribed:
```
BREAKING CHANGE: <explanation in paragraph format>.
```
An example of that:
```
feat(api): remove the API deprecated before 1.4.0
To make the project maintainable, we need to cleanup some deprecated
API.
The API deprecated after 1.4.0 are not concerned by this cleanup.
BREAKING CHANGE: the old API `foo.bar` was deprecated since version 1.3.4 and is
removed now.
BREAKING CHANGE: the old API `foo.baz` was deprecated since version 1.2.6 and is
removed now.
```
{
"name": "laboite-blog-front",
"description": "laboite blog service frontend",
"version": "1.1.1",
"version": "1.2.0",
"license": "EUPL-1.2",
"type": "module",
"scripts": {
"start-dev": "npm-run-all --parallel server css-watch dev",
"init-dev": "yarn && cd ../laboite-blog-api && yarn",
"dev": "dotenv_config_path=.env NODE_OPTIONS='-r dotenv/config' sapper dev -p 4000",
"build": "yarn css-build && sapper build --legacy",
"dev": "dotenv_config_path=.env NODE_OPTIONS='-r dotenv/config' svelte-kit dev --port 4000",
"build": "yarn css-build && svelte-kit build",
"server": "cd ../laboite-blog-api && dotenv_config_path=.env NODE_OPTIONS='-r dotenv/config' yarn start",
"export": "sapper export --legacy",
"start": "node __sapper__/build",
"validate": "svelte-check --ignore src/node_modules/@sapper",
"export": "svelte-kit build",
"start": "node build",
"validate": "svelte-check",
"css-build": "node-sass --omit-source-map-url src/utils/theme/index.scss src/utils/theme/index.css",
"css-watch": "yarn css-build --watch"
},
"dependencies": {
"@toast-ui/editor": "^2.5.3",
"@toast-ui/editor-plugin-chart": "^1.0.0",
"@toast-ui/editor": "^3.1.5",
"@toast-ui/editor-plugin-chart": "^3.0.1",
"@toast-ui/editor-plugin-code-syntax-highlight": "^3.0.0",
"@toast-ui/editor-plugin-color-syntax": "^1.0.1",
"@toast-ui/editor-plugin-table-merged-cell": "^1.3.1",
"@toast-ui/editor-plugin-uml": "^1.0.0",
"compression": "^1.7.1",
"@toast-ui/editor-plugin-color-syntax": "^3.0.3",
"@toast-ui/editor-plugin-table-merged-cell": "^3.0.2",
"@toast-ui/editor-plugin-uml": "^3.0.1",
"isomorphic-fetch": "^3.0.0",
"npm-run-all": "^4.1.5",
"polka": "^1.0.0-next.22",
"sirv": "^1.0.18",
"svelte-i18n": "^3.3.13"
"svelte-i18n": "^3.4.0"
},
"devDependencies": {
"@babel/core": "^7.16.0",
"@babel/plugin-syntax-dynamic-import": "^7.0.0",
"@babel/plugin-transform-runtime": "^7.16.0",
"@babel/preset-env": "^7.16.0",
"@babel/runtime": "^7.16.0",
"@rollup/plugin-babel": "^5.3.0",
"@rollup/plugin-commonjs": "^14.0.0",
"@rollup/plugin-json": "^4.1.0",
"@rollup/plugin-node-resolve": "^8.0.0",
"@rollup/plugin-replace": "^2.4.2",
"@rollup/plugin-url": "^5.0.0",
"@tsconfig/svelte": "^1.0.13",
"@types/compression": "^1.7.2",
"@types/node": "^14.17.32",
"@types/polka": "^0.5.3",
"autoprefixer": "^9.8.8",
"@babel/core": "^7.17.10",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-runtime": "^7.17.10",
"@babel/preset-env": "^7.17.10",
"@babel/runtime": "^7.17.9",
"@sveltejs/adapter-node": "^1.0.0-next.73",
"@sveltejs/kit": "^1.0.0-next.324",
"@tsconfig/svelte": "^3.0.0",
"@types/node": "^17.0.31",
"autoprefixer": "^10.4.6",
"bulma": "^0.9.3",
"dotenv": "^8.6.0",
"node-sass": "^6.0.1",
"rollup": "^2.59.0",
"rollup-plugin-postcss": "^4.0.1",
"rollup-plugin-svelte": "^6.0.0",
"rollup-plugin-terser": "^7.0.0",
"sapper": "^0.28.0",
"svelte": "^3.44.1",
"svelte-check": "^1.6.0",
"svelte-preprocess": "^4.9.8"
"dotenv": "^16.0.0",
"html-minifier": "^4.0.0",
"node-sass": "^7.0.1",
"postcss": "^8.4.13",
"sass": "^1.51.0",
"svelte": "^3.48.0",
"svelte-check": "^2.7.0",
"svelte-preprocess": "^4.10.6"
}
}
import path from "path";
import resolve from "@rollup/plugin-node-resolve";
import replace from "@rollup/plugin-replace";
import commonjs from "@rollup/plugin-commonjs";
import url from "@rollup/plugin-url";
import svelte from "rollup-plugin-svelte";
import babel from "@rollup/plugin-babel";
import { terser } from "rollup-plugin-terser";
import sveltePreprocess from "svelte-preprocess";
import config from "sapper/config/rollup.js";
import pkg from "./package.json";
import json from "@rollup/plugin-json";
const mode = process.env.NODE_ENV;
const dev = mode === "development";
const legacy = !!process.env.SAPPER_LEGACY_BUILD;
const preprocess = sveltePreprocess({
transformers: {
scss: {
includePaths: ["node_modules", "src"],
},
postcss: {
plugins: [
require("autoprefixer")({
overrideBrowserslist: "last 2 versions",
}),
],
},
},
});
const onwarn = (warning, onwarn) =>
(warning.code === "MISSING_EXPORT" && /'preload'/.test(warning.message)) ||
(warning.code === "CIRCULAR_DEPENDENCY" &&
/[/\\]@sapper[/\\]/.test(warning.message)) ||
warning.code === "THIS_IS_UNDEFINED" ||
onwarn(warning);
export default {
client: {
input: config.client.input(),
output: config.client.output(),
plugins: [
replace({
"process.browser": true,
"process.env.NODE_ENV": JSON.stringify(mode),
}),
svelte({
dev,
hydratable: true,
preprocess,
emitCss: true,
}),
url({
sourceDir: path.resolve(__dirname, "src/node_modules/images"),
publicPath: "/client/",
}),
resolve({
browser: true,
dedupe: ["svelte"],
}),
commonjs(),
json(),
legacy &&
babel({
extensions: [".js", ".mjs", ".html", ".svelte"],
babelHelpers: "runtime",
exclude: ["node_modules/@babel/**"],
presets: [
[
"@babel/preset-env",
{
targets: "> 0.25%, not dead",
},
],
],
plugins: [
"@babel/plugin-syntax-dynamic-import",
[
"@babel/plugin-transform-runtime",
{
useESModules: true,
},
],
],
}),
!dev &&
terser({
module: true,
}),
],
preserveEntrySignatures: false,
onwarn,
},
server: {
input: { server: config.server.input().server },
output: config.server.output(),
plugins: [
replace({
"process.browser": false,
"process.env.NODE_ENV": JSON.stringify(mode),
}),
svelte({
generate: "ssr",
hydratable: true,
preprocess,
dev,
}),
url({
sourceDir: path.resolve(__dirname, "src/node_modules/images"),
publicPath: "/client/",
emitFiles: false, // already emitted by client build
}),
resolve({
dedupe: ["svelte"],
}),
commonjs(),
json(),
],
external: Object.keys(pkg.dependencies).concat(
require("module").builtinModules
),
preserveEntrySignatures: "strict",
onwarn,
},
serviceworker: {
input: config.serviceworker.input(),
output: config.serviceworker.output(),
plugins: [
resolve(),
replace({
"process.browser": true,
"process.env.NODE_ENV": JSON.stringify(mode),
}),
commonjs(),
!dev && terser(),
],
preserveEntrySignatures: false,
onwarn,
},
};
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<meta name="theme-color" content="#011caa" />
<script defer src="/fonts/js/all.min.js"></script>
%svelte.head%
<link rel="stylesheet" type="text/css" href="/global.css" />
<link rel="manifest" href="manifest.json" crossorigin="use-credentials" />
<link rel="icon" type="image/png" href="/puce_eole.png" />
</head>
<body>
<div id="app">%svelte.body%</div>
</body>
</html>
import * as sapper from '@sapper/app';
sapper.start({
target: document.querySelector('#sapper')
});
\ No newline at end of file
......@@ -8,7 +8,7 @@
export let academy;
</script>
<style lang="scss">
<style>
.box-transparent {
margin-bottom: var(--space-between);
min-height: 450px;
......@@ -28,7 +28,7 @@
<h2 class="subtitle">{$_('pages.academy.authors_subtitle')}</h2>
</div>
<BigLink
link="/academies/{academy.slug}/authors"
link="/academies/{academy._id}/authors"
text={$_('pages.academy.all_authors')} />
</div>
<Divider />
......
......@@ -8,7 +8,7 @@
export let academy;
</script>
<style lang="scss">
<style>
.box-transparent {
margin-bottom: var(--space-between);
min-height: 450px;
......@@ -28,7 +28,7 @@
<h2 class="subtitle">{$_('pages.academy.last_subtitle')}</h2>
</div>
<BigLink
link="/academies/{academy.slug}/articles"
link="/academies/{academy._id}/articles"
text={$_('pages.academy.all_articles')} />
</div>
<Divider />
......
......@@ -3,15 +3,14 @@
import { onMount } from "svelte";
import fetcher from "isomorphic-fetch";
import { _ } from "svelte-i18n";
import { stores } from "@sapper/app";
const { session } = stores();
import { session } from "$app/stores"
export let academy = {};
let total;
let loading = true;
onMount(async () => {
const where = { structure: academy.value };
const where = { structure: academy._id };
const response = await fetcher(
`${$session.env.API_HOST}/articles/count?where=${JSON.stringify(where)}`
......@@ -23,15 +22,15 @@
});
</script>
<a rel="prefetch" href="/academies/{academy.slug}">
<a rel="prefetch" href="/academies/{academy._id}">
<div class="card">
<div class="card-content">
<div class="media">
<div class="media-left">
<Avatar firstName={academy.value} avatar={academy.logo} />
<Avatar firstName={academy.name} avatar={academy.logo} />
</div>
<div class="media-content">
<p class="title is-5">{academy.label}</p>
<p class="title is-5">{academy.name}</p>
<p class="subtitle is-6">
{$_('components.SingleAcademy.articles')}:
{loading ? $_('loading') : total}
......
<script>
import "@toast-ui/editor/dist/toastui-editor-viewer.css";
import { stores } from "@sapper/app";
import '@toast-ui/chart/dist/toastui-chart.css';
import chart from '@toast-ui/editor-plugin-chart';
import Viewer from "@toast-ui/editor/dist/toastui-editor-viewer";
import chart from "./chartPlugin";
// import chart from "./chartPlugin";
import uml from "@toast-ui/editor-plugin-uml";
import codeSyntaxHighlight from "@toast-ui/editor-plugin-code-syntax-highlight";
import colorSyntax from "@toast-ui/editor-plugin-color-syntax";
import tableMergedCell from "@toast-ui/editor-plugin-table-merged-cell";
import { onMount } from "svelte";
const { session } = stores();
import { session } from "$app/stores"
import { modifiedColorSyntax } from "../../utils/functions/modifiedPlugin"
export let content;
onMount(async () => {
onMount(() => {
let umlPlugin = uml;
const chartOptions = {
minWidth: 100,
......@@ -23,7 +24,7 @@
};
const umlOptions = {
rendererURL:
$session.env.UML_SERVER || "https://www.plantuml.com/plantuml/png/",
$session.env.UML_SERVER || "https://www.plantuml.com/plantuml/png/",
};
umlPlugin = [uml, umlOptions];
new Viewer({
......@@ -33,7 +34,7 @@
plugins: [
[chart, chartOptions],
codeSyntaxHighlight,
colorSyntax,
modifiedColorSyntax,
tableMergedCell,
umlPlugin,
],
......
<script>
import { _ } from "svelte-i18n";
import { stores } from "@sapper/app";
import { getStores } from "$app/stores";
import BigLink from "../common/BigLink.svelte";
import SingleTag from "../common/SingleTag.svelte";
const { page } = stores();
const { page } = getStores();
const tags = $page.url.searchParams.get('tags') || ""
export let article;
let queryTags = [];
$: queryTags = $page.query.tags ? $page.query.tags.split(",") : [];
let queryTags = tags ? tags.split(",") : [];
</script>
<div class="column is-half is-full-mobile ">
......@@ -56,7 +56,7 @@
</div>
</div>
<style lang="scss">
<style>
.box {
height: 100%;
display: flex;
......@@ -66,7 +66,6 @@
.tag {
text-decoration: none;
transition: all 0.2s ease-in-out;
// cursor: pointer;
background-color: var(--primary);
color: var(--tertiary);
border-radius: 20px;
......