<|start_filename|>public/assets/langs/langs.json<|end_filename|>
[
	{
		"code": "EN",
		"label": "English",
		"words": "assets/langs/en.json"
	},
	{
		"code": "EN-GB",
		"label": "English (United Kingdom)",
		"words": "assets/langs/en.json"
	},
	{
		"code": "EN-US",
		"label": "English (United States)",
		"words": "assets/langs/en.json"
	},
	{
		"code": "FR",
		"label": "Français",
		"words": "assets/langs/fr.json"
	}
]


<|start_filename|>svelte.config.js<|end_filename|>
const sveltePreprocess = require('svelte-preprocess');

function createPreprocessors(sourceMap) {
	return sveltePreprocess({
		sourceMap,
		defaults: {
			script: 'typescript',
			style: 'scss',
		},
	});
}

module.exports = {
	preprocess: createPreprocessors(true),
	createPreprocessors,
};


<|start_filename|>public/preload.js<|end_filename|>
const {
  app,
  contextBridge,
  ipcRenderer,
  shell
} = require("electron");

// Expose protected methods that allow the renderer process to use
// the ipcRenderer without exposing the entire object
contextBridge.exposeInMainWorld(
  "remote", {
    notification: (title, body) => ipcRenderer.send('notifier', { title, body }),
    authorize: (channel, provider) => ipcRenderer.send('oauth', channel, provider),
    setLaunchAtStartUp: (launchAtStartUp) => ipcRenderer.send('launch-startup', launchAtStartUp),
    restartApp: () => {
      app.relaunch();
      app.exit();
    },
    fileImport: () => ipcRenderer.invoke('file-import'),
    fileExport: (data) => ipcRenderer.invoke('file-export', data),
    copyToClipboard: (data) => ipcRenderer.invoke('copy-to-clipboard', data),
    checkForUpdateRequest: () => ipcRenderer.invoke('check-for-update-request'),
    checkForUpdateRestart: () => ipcRenderer.send('check-for-update-restart'),
    openDefaultBrowser: (url) => shell.openExternal(url),
    receive: (channel, func) => {
      ipcRenderer.on(channel, (event, ...args) => func(...args));
    },
    setPreRelease: (preRelease) => {
      ipcRenderer.send('toggle-pre-release', preRelease)
    },
    version: () => ipcRenderer.invoke('get-version'),
    clearApplicationsData: () => ipcRenderer.send('clear-applications-data')
  }
);

<|start_filename|>rollup.config.js<|end_filename|>
import svelte from 'rollup-plugin-svelte';
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import nodePolyfills from 'rollup-plugin-node-polyfills';
import livereload from 'rollup-plugin-livereload';
import { terser } from 'rollup-plugin-terser';
import filesize from 'rollup-plugin-filesize';
import typescript from '@rollup/plugin-typescript';
import css from 'rollup-plugin-css-only';
import svg from 'rollup-plugin-svelte-svg';

const createPreprocessors = require('./svelte.config').createPreprocessors;
const production = !process.env.ROLLUP_WATCH;

function serve() {
	let server;

	function toExit() {
		if (server) server.kill(0);
	}

	return {
		writeBundle() {
			if (server) return;
			server = require('child_process').spawn(
				'npm',
				['run', 'electron'],
				{
					stdio: ['ignore', 'inherit', 'inherit'],
					shell: true,
				},
			);

			process.on('SIGTERM', toExit);
			process.on('exit', toExit);
		},
	};
}

export default {
	input: 'src/index.ts',
	output: {
		sourcemap: !production,
		format: 'iife',
		name: 'Skizzle',
		file: 'public/build/bundle.js',
	},
	plugins: [
		svg(),
		nodePolyfills(),
		svelte({
			compilerOptions: {
				dev: !production,
			},
			preprocess: createPreprocessors(!production),
		}),
		css({
			output: 'bundle.css',
			sourceMap: !production,
		}),
		resolve({
			browser: true,
			dedupe: ['svelte'],
		}),
		commonjs(),
		typescript({
			sourceMap: !production,
			inlineSources: !production,
		}),
		!production && serve(),
		!production && livereload('public'),
		production && terser(),
		filesize(),
	],
	external: ['electron', 'child_process', 'fs', 'path', 'url', 'module', 'os'],
	watch: {
		clearScreen: false,
	},
};


<|start_filename|>jest.config.js<|end_filename|>
const esModules = ["svelte-highlight"].join("|")

module.exports = {
  testEnvironment: 'jsdom',
	setupFiles: ['jest-localstorage-mock'],
  verbose: true,
  testMatch: ["**/__tests__/**/*.+(ts|tsx|js)", "**/?(*.)+(spec).+(ts|tsx|js)"],
  clearMocks: true,
  transform: {
    "^.+\\.(js|mjs)$": "babel-jest",
    "^.+\\.ts$": "ts-jest",
    "^.+\\.svelte$": ["svelte-jester", { "preprocess": true }],
    ".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$": "jest-transform-stub"
  },
  moduleDirectories: ["src","node_modules"],
  moduleFileExtensions: [
    "js",
    "mjs",
    "ts",
    "svelte"
  ],
  coverageDirectory: "coverage",
  coverageReporters: ["json", "lcov", "text", "clover", "html"],
  collectCoverageFrom: [
    "src/**/*.js",
    "src/**/*.svelte",
    "src/**/*.ts",
    "!src/tests/**/*"
  ],
  coverageProvider: "babel",
  coveragePathIgnorePatterns: [
    ".*\\.d\\.ts"
  ],
  transformIgnorePatterns: [`/node_modules/(?!${esModules})`],
	bail: false,
  setupFilesAfterEnv: ['@testing-library/jest-dom/extend-expect', './src/setupTests.ts']
};

<|start_filename|>public/assets/langs/fr.json<|end_filename|>
{
	"About Application": "A propos de l'application",
	"Quit": "Quitter",
	"Edit": "Editer",
	"Undo": "Annuler",
	"Redo": "Refaire",
	"Cut": "Couper",
	"Copy": "Copier",
	"Paste": "Coller",
	"Select All": "Tout selectionnée",
	"Open devtool": "Ouvrir la console de developpement",
	"Reload application": "Recharger l'application",
	"UpdateDevMode": "Mode de développement, passage de l'étape de mise à jour",
	"UpdateError": "Une erreur s'est produite lors de la mise à jour.",
	"UpdateCheck": "Recherche de mise à jour...",
	"UpdateAvailable": "Une mise à jour est disponible",
	"UpdateNotAvailable": "Votre application est à jour",
	"UpdateDownloading": "Téléchargement en cours...",
	"UpdateDownloaded": "Installation de la mise à jour.",
	"UpdateNotified": "Redémarrage dans $0 seconde$1",
	"Offline": "Vous n'êtes pas connecté à Internet. Il est impossible de rafraîchir la liste et certaines fonctionnalités sont désactivées.",
	"Retry": "Réessayer",
	"Refresh": "Rafraîchir",
	"Updating": "Mise à jour...",
	"ViewFullList": "Afficher la liste complète",
	"FilterList": "Filtrer la liste",
	"less": "moins",
	"more": "plus",
	"show": "Voir",
	"PullRequestsError": "Impossible de récupérer vos pull requests.",
	"PullRequestsEmpty": "Il n'y a aucune pull request dans vos projets pour le moment.",
	"ProfileNotFound": "Impossible de charger votre profil.",
	"Menu": "Menu",
	"Projects": "Projets",
	"Settings": "Réglagles",
	"NoProject": "Aucun projet",
	"OneProject": "1 Projet",
	"Search": "Chercher",
	"NoProjectOnOrganization": "Les organisations actuellement selectionnées ne contiennent aucun projet.",
	"Today": "Aujourd'hui",
	"Yesterday": "Hier",
	"Time": "il y a $0 jours",
	"AutoComplete": "Saisie automatique",
	"Draft": "Brouillon",
	"Conflicts": "Conflits",
	"NoRepository": "Aucun repository pour ce projet.",
	"Back": "Retour",
	"ProjectsOrganizations": "Sélectionnez les organisations pour lesquelles vous voulez voir les projets.",
	"OrganizationsEmpty": "Il n'y a aucune organisation valide sur votre compte.",
	"Manually": "Manuellement",
	"EveryMinutes": "Toutes les $0 minutes",
	"LaunchStartup": "Lancer l'application au démarrage",
	"ConfigTheme": "Choisissez votre thème.",
	"Version": "Version",
	"SignOut": "Se déconnecter",
	"Theme": "Theme",
	"Organizations": "Organisations",
	"StartUp": "Démarrage",
	"Refreshment": "Rafraîchissement",
	"HideMenu": "Masquer le menu",
	"Login": "Skizzle vous permet de regrouper les pull requests de vos équipes. <br/>Pour commencer <b>connectez vous</b> avec votre compte.",
	"Globals": "Général",
	"Languages": "Langages",
	"ChooseLanguage": "Choisissez votre langage",
	"DefaultValue": "Choisissez une valeur",
	"Loading": "Chargement...",
	"Yes": "Oui, je le veux",
	"No": "Non, merci",
	"ChangingLanguageTitle": "Voulez-vous changer de langage ?",
	"ChangingLanguageMessage": "Vous allez changer de langage ? (Cela nécéssite un redémarrage de l'application)"
}


<|start_filename|>.prettierrc.js<|end_filename|>
module.exports = {
	arrowParens: 'avoid',
	singleQuote: true,
	printWidth: 90,
	plugins: ['prettier-plugin-svelte'],
	semi: true,
	svelteSortOrder: 'scripts-markup-styles-options',
	svelteStrictMode: false,
	svelteBracketNewLine: true,
	svelteIndentScriptAndStyle: true,
	bracketSpacing: true,
	trailingComma: 'none'
}

<|start_filename|>tsconfig.json<|end_filename|>
{
	"extends": "@tsconfig/svelte/tsconfig.json",
	"compilerOptions": {
		"typeRoots": [
			"node_modules/@types"
		],
		"allowJs": true,
		"skipLibCheck": true,
		"resolveJsonModule": true,
		"esModuleInterop": true,
		"forceConsistentCasingInFileNames": true,
		"moduleResolution": "node",
		"allowSyntheticDefaultImports": true,
		"isolatedModules": true,
		"baseUrl": "src"
	},
	"include": ["src/**/*"],
	"exclude": ["node_modules/*", "__sapper__/*", "public/*", "tools/*"],
}

<|start_filename|>public/assets/langs/en.json<|end_filename|>
{
	"About Application": "About Application",
	"Quit": "Quit",
	"Edit": "Edit",
	"Undo": "Undo",
	"Redo": "Redo",
	"Cut": "Cut",
	"Copy": "Copy",
	"Paste": "Paste",
	"Select All": "Select All",
	"Open devtool": "Open devlopment tool",
	"Reload application": "Reload application",
	"UpdateDevMode": "Development mode, skip the update",
	"UpdateError": "An error occurred during the update.",
	"UpdateCheck": "Check for update...",
	"UpdateAvailable": "An update is available",
	"UpdateNotAvailable": "Your app is up to date",
	"UpdateDownloading": "Downloading...",
	"UpdateDownloaded": "Install the update",
	"UpdateNotified": "Restart in $0 second$1",
	"Offline": "You'r already offline. The list cannot be refreshed and some features are disabled.",
	"Retry": "Retry",
	"Refresh": "Refresh",
	"Updating": "Updating...",
	"ViewFullList": "View full list",
	"FilterList": "Filter list",
	"less": "less",
	"more": "more",
	"show": "Show",
	"PullRequestsError": "Unable to retrieve your pull requests.",
	"PullRequestsEmpty": "There are no pull requests in your projects at the moment.",
	"ProfileNotFound": "Unable to load your profile.",
	"Menu": "Menu",
	"Projects": "Projects",
	"Settings": "Settings",
	"NoProject": "No project",
	"OneProject": "1 Project",
	"Search": "Search",
	"NoProjectOnOrganization": "The currently selected organizations do not contain any projects.",
	"Today": "Today",
	"Yesterday": "Yesterday",
	"Time": "$0 days ago",
	"AutoComplete": "Auto complete",
	"Draft": "Draft",
	"Conflicts": "Conflicts",
	"NoRepository": "No repository for this project.",
	"Back": "Back",
	"ProjectsOrganizations": "Select the organizations for which you want to see projects.",
	"OrganizationsEmpty": "There is no valid organization on your account.",
	"Manually": "Manually",
	"EveryMinutes": "Every $0 minutes",
	"LaunchStartup": "Launch the application on startup",
	"ConfigTheme": "Pick your theme.",
	"Version": "Version",
	"SignOut": "Sign out",
	"Theme": "Theme",
	"Organizations": "Organizations",
	"StartUp": "Start-up",
	"Refreshment": "Refreshment",
	"HideMenu": "Hide menu",
	"Login": "Skizzle allows you to group the pull requests of your teams. <br/>To get started <b>log in</b> with your account.",
	"Globals": "General",
	"Languages": "Languages",
	"ChooseLanguage": "Choose your language",
	"DefaultValue": "Choose a value",
	"Loading": "Loading...",
	"Yes": "Yes, I do",
	"No": "No, thanks",
	"ChangingLanguageTitle": "Do you want to change your language?",
	"ChangingLanguageMessage": "Are you going to change your language? (This requires a reboot of the application)"
}


<|start_filename|>docs/styles.css<|end_filename|>
* {
	margin: 0;
	padding: 0;
	box-sizing: border-box;
}

body {
	font-family: 'Roboto', sans-serif;
	color: #ccc;
	background-color: #333;
}

.skz-header {
	display: flex;
	justify-content: space-between;
	align-items: center;
	width: 100%;
	padding: 1rem;
	background-color: #333;
}

.skz-logo {
	display: block;
	width: auto;
	height: 1.5rem;
}

.skz-nav a {
	color: #fff;
	text-decoration: none;
	font-weight: bold;
}

.skz-nav a:not(:last-child) {
	margin-right: 2rem;
}

.skz-hero {
	position: relative;
	overflow: hidden;
	background: radial-gradient(circle, #333 000%, #000 100%);
}

.skz-title {
	margin-top: 0;
	margin-bottom: 2rem;
	text-align: center;
	font-size: 3rem;
	color: #fff;
	font-family: 'Roboto Slab', serif;
}

.skz-download {
	position: relative;
	z-index: 2;
	display: inline-block;
	padding: 1rem 2rem;
	color: #000;
	font-weight: bold;
	font-size: 1.3rem;
	text-decoration: none;
	border-radius: 8px;
	cursor: pointer;
	opacity: 0.5;
	background-color: #ff8a00;
	transition: opacity linear 0.2s;
}

.skz-download[href] {
	opacity: 1;
}

.skz-download:hover {
	opacity: 0.8;
}

.skz-secondary-download {
	margin-top: 1rem;
	text-decoration: underline;
	font-size: 0.8rem;
	cursor: pointer;
	color: #fff;
}

.skz-secondary-download:hover {
	text-decoration: none;
}

.skz-illustration {
	position: absolute;
	left: 50%;
	bottom: -15rem;
	height: 35rem;
	transform: translateX(-50%);
}

.skz-hero-content {
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	padding: 3rem;
}

.skz-details {
	display: grid;
	grid-template-columns: 1fr 1fr 1fr;
	grid-gap: 3rem;
	width: 100%;
	max-width: 1400px;
	margin: 0 auto;
	padding: 3rem;
}

@media only screen and (max-width: 800px) {
	.skz-details {
		grid-template-columns: none;
	}
}

.skz-detail {
	min-width: 12.5rem;
	padding-left: 1rem;
	border-left: 4px solid #ff8a00;
}

.skz-detail p {
	line-height: 1.3;
}

.skz-detail h2 {
	margin-bottom: 1rem;
	color: #fff;
	font-family: 'Roboto Slab', serif;
}

.skz-detail p {
	margin: 0;
}

.skz-footer {
	position: relative;
	display: flex;
	flex-direction: column;
	height: 30rem;
	text-align: center;
	color: #fff;
	font-size: 0.8rem;
	padding: 3rem;
	overflow: hidden;
	background: radial-gradient(circle, #333 000%, #000 100%);
}

.skz-footer p {
	position: relative;
	z-index: 2;
}

.skz-download-container {
	display: flex;
	flex-direction: column;
	margin: auto;
}

.skz-footer a:not(.skz-download) {
	color: #fff;
}

.skz-content {
	overflow: hidden;
}

.skz-hero-content p {
	max-width: 45rem;
	margin: 0 auto 2rem;
	line-height: 1.3;
}

.skz-hero-content b {
	color: #ff8a00;
}

.doge {
	position: absolute;
	left: 0;
	top: 0;
	width: 100%;
	height: 100%;
	pointer-events: none;
	font-family: 'Comic sans MS', sans-serif;
}

.doge span {
	opacity: 0;
	position: absolute;
	left: 50%;
	top: 50%;
	font-size: 1.2rem;
	transition: opacity linear 0.2s;
}

.doge span:nth-child(1) {
	color: red;
	transform: translateX(-10rem) translateY(-5rem);
	transition-delay: 0.1s;
}
.doge span:nth-child(2) {
	color: green;
	transform: translateX(-2rem) translateY(-7rem);
	transition-delay: 0.5s;
}
.doge span:nth-child(3) {
	color: blue;
	transform: translateX(7rem) translateY(-6rem);
	transition-delay: 1s;
}
.doge span:nth-child(4) {
	color: yellow;
	transform: translateX(-9rem) translateY(5rem);
	transition-delay: 1.5s;
}
.doge span:nth-child(5) {
	color: orange;
	transform: translateX(-1rem) translateY(3rem);
	transition-delay: 2s;
}
.doge span:nth-child(6) {
	color: purple;
	transform: translateX(8rem) translateY(5rem);
	transition-delay: 2.5s;
}

[download]:hover ~ .doge span {
	opacity: 1;
}

.skz-features {
	padding: 4rem;
	background-color: #222;
}

.skz-features ul {
	max-width: 40rem;
	margin: 0 auto;
}

.skz-features li {
	display: flex;
	align-items: flex-start;
}

.skz-features li:not(:last-child) {
	margin-bottom: 3rem;
}

.skz-features img {
	flex: 0 0 auto;
	width: 3rem;
	margin-right: 0.5rem;
}

.skz-features h3 {
	font-size: 1.5rem;
	margin-bottom: 0.5rem;
	color: #fff;
	font-family: 'Roboto Slab', serif;
}

.skz-features p {
	line-height: 1.3;
}

.skz-features b {
	color: #ff8a00;
}
