WIP: Article checker with svelte
This commit is contained in:
		
							
								
								
									
										30
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +1,33 @@ | |||||||
| .dev/ | .dev/ | ||||||
|  | .vscode/ | ||||||
| *.pyc | *.pyc | ||||||
| *.log | *.log | ||||||
| __pycache__/ | __pycache__/ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## svelte: | ||||||
|  | # Logs | ||||||
|  | logs | ||||||
|  | *.log | ||||||
|  | npm-debug.log* | ||||||
|  | yarn-debug.log* | ||||||
|  | yarn-error.log* | ||||||
|  | pnpm-debug.log* | ||||||
|  | lerna-debug.log* | ||||||
|  |  | ||||||
|  | node_modules | ||||||
|  | dist | ||||||
|  | dist-ssr | ||||||
|  | *.local | ||||||
|  |  | ||||||
|  | # Editor directories and files | ||||||
|  | .vscode/* | ||||||
|  | !.vscode/extensions.json | ||||||
|  | .idea | ||||||
|  | .DS_Store | ||||||
|  | *.suo | ||||||
|  | *.ntvs* | ||||||
|  | *.njsproj | ||||||
|  | *.sln | ||||||
|  | *.sw? | ||||||
|   | |||||||
| @@ -60,16 +60,22 @@ services: | |||||||
|     volumes: |     volumes: | ||||||
|       - ${CONTAINER_DATA}:/app/containerdata # always set |       - ${CONTAINER_DATA}:/app/containerdata # always set | ||||||
|       - ${CODE:-/dev/null}:/code # not set in prod, defaults to /dev/null |       - ${CODE:-/dev/null}:/code # not set in prod, defaults to /dev/null | ||||||
|       - ${XSOCK-/dev/null}:${XSOCK-/tmp/sock} # x11 socket, needed for gui |  | ||||||
|       # - ${XAUTHORITY-/dev/null}:/home/auto_news/.Xauthority # xauth needed for authenticating to x11 |  | ||||||
|     environment: |     environment: | ||||||
|       - DISPLAY=$DISPLAY # needed to let x11 apps know where to connect to |  | ||||||
|  |  | ||||||
|       - DEBUG=${DEBUG} |       - DEBUG=${DEBUG} | ||||||
|       - CHECK=${CHECK} |  | ||||||
|       - UPLOAD=${UPLOAD} |  | ||||||
|       - HEADLESS=${HEADLESS} |       - HEADLESS=${HEADLESS} | ||||||
|       - REDUCEDFETCH=${REDUCEDFETCH} |       - REDUCEDFETCH=${REDUCEDFETCH} | ||||||
|     entrypoint: ${ENTRYPOINT:-python3 runner.py} # by default launch workers as defined in the Dockerfile |     entrypoint: ${ENTRYPOINT:-python3 runner.py} # by default launch workers as defined in the Dockerfile | ||||||
|     stdin_open: ${INTERACTIVE:-false} # docker run -i |     stdin_open: ${INTERACTIVE:-false} # docker run -i | ||||||
|     tty: ${INTERACTIVE:-false}        # docker run -t |     tty: ${INTERACTIVE:-false}        # docker run -t | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   news_check: | ||||||
|  |     build: news_check | ||||||
|  |     image: news_check:latest | ||||||
|  |  | ||||||
|  |     volumes: | ||||||
|  |       - ${CONTAINER_DATA}:/app/containerdata # always set | ||||||
|  |       - ${CODE:-/dev/null}:/code # not set in prod, defaults to /dev/null | ||||||
|  |  | ||||||
|  |     ports: | ||||||
|  |       - 8080:80 # 80 inside container | ||||||
							
								
								
									
										12
									
								
								misc/sample_config/nas_sync.config
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								misc/sample_config/nas_sync.config
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | settings { | ||||||
|  |    logfile    = "/tmp/lsyncd.log", | ||||||
|  |    statusFile = "/tmp/lsyncd.status", | ||||||
|  |    nodaemon   = true, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sync { | ||||||
|  |    default.rsync, | ||||||
|  |    source = "/sync/local_files", | ||||||
|  |    target = "/sync/remote_files", | ||||||
|  |    init = false, | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								news_check/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								news_check/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | FROM node:18.8 as build-deps | ||||||
|  |  | ||||||
|  | WORKDIR /app | ||||||
|  | COPY client/package.json ./ | ||||||
|  | COPY client/package-lock.json ./ | ||||||
|  | COPY client/rollup.config.js ./ | ||||||
|  | COPY client/src ./src/ | ||||||
|  | RUN npm run build | ||||||
|  |  | ||||||
|  |  | ||||||
|  | FROM python:latest | ||||||
|  | ENV TZ Europe/Zurich | ||||||
|  |  | ||||||
|  | RUN apt-get update && apt-get install -y postgresql | ||||||
|  |  | ||||||
|  | RUN mkdir -p /app/news_check | ||||||
|  |  | ||||||
|  | COPY requirements.txt /app/requirements.txt | ||||||
|  | RUN python3 -m pip install -r /app/requirements.txt | ||||||
|  | COPY --from=build-deps /app/public /app/news_check/public | ||||||
|  |  | ||||||
|  | COPY app /app/news_check | ||||||
|  | WORKDIR /app/news_check | ||||||
|  |  | ||||||
|  | CMD gunicorn app:app -w 1 --threads 2 -b 0.0.0.0:80 | ||||||
							
								
								
									
										4
									
								
								news_check/client/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								news_check/client/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | /node_modules/ | ||||||
|  | /public/build/ | ||||||
|  |  | ||||||
|  | .DS_Store | ||||||
							
								
								
									
										107
									
								
								news_check/client/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								news_check/client/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | |||||||
|  | # This repo is no longer maintained. Consider using `npm init vite` and selecting the `svelte` option or — if you want a full-fledged app framework and don't mind using pre-1.0 software — use [SvelteKit](https://kit.svelte.dev), the official application framework for Svelte. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # svelte app | ||||||
|  |  | ||||||
|  | This is a project template for [Svelte](https://svelte.dev) apps. It lives at https://github.com/sveltejs/template. | ||||||
|  |  | ||||||
|  | To create a new project based on this template using [degit](https://github.com/Rich-Harris/degit): | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | npx degit sveltejs/template svelte-app | ||||||
|  | cd svelte-app | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | *Note that you will need to have [Node.js](https://nodejs.org) installed.* | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## Get started | ||||||
|  |  | ||||||
|  | Install the dependencies... | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | cd svelte-app | ||||||
|  | npm install | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ...then start [Rollup](https://rollupjs.org): | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | npm run dev | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Navigate to [localhost:8080](http://localhost:8080). You should see your app running. Edit a component file in `src`, save it, and reload the page to see your changes. | ||||||
|  |  | ||||||
|  | By default, the server will only respond to requests from localhost. To allow connections from other computers, edit the `sirv` commands in package.json to include the option `--host 0.0.0.0`. | ||||||
|  |  | ||||||
|  | If you're using [Visual Studio Code](https://code.visualstudio.com/) we recommend installing the official extension [Svelte for VS Code](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). If you are using other editors you may need to install a plugin in order to get syntax highlighting and intellisense. | ||||||
|  |  | ||||||
|  | ## Building and running in production mode | ||||||
|  |  | ||||||
|  | To create an optimised version of the app: | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | npm run build | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | You can run the newly built app with `npm run start`. This uses [sirv](https://github.com/lukeed/sirv), which is included in your package.json's `dependencies` so that the app will work when you deploy to platforms like [Heroku](https://heroku.com). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## Single-page app mode | ||||||
|  |  | ||||||
|  | By default, sirv will only respond to requests that match files in `public`. This is to maximise compatibility with static fileservers, allowing you to deploy your app anywhere. | ||||||
|  |  | ||||||
|  | If you're building a single-page app (SPA) with multiple routes, sirv needs to be able to respond to requests for *any* path. You can make it so by editing the `"start"` command in package.json: | ||||||
|  |  | ||||||
|  | ```js | ||||||
|  | "start": "sirv public --single" | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## Using TypeScript | ||||||
|  |  | ||||||
|  | This template comes with a script to set up a TypeScript development environment, you can run it immediately after cloning the template with: | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | node scripts/setupTypeScript.js | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Or remove the script via: | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | rm scripts/setupTypeScript.js | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | If you want to use `baseUrl` or `path` aliases within your `tsconfig`, you need to set up `@rollup/plugin-alias` to tell Rollup to resolve the aliases. For more info, see [this StackOverflow question](https://stackoverflow.com/questions/63427935/setup-tsconfig-path-in-svelte). | ||||||
|  |  | ||||||
|  | ## Deploying to the web | ||||||
|  |  | ||||||
|  | ### With [Vercel](https://vercel.com) | ||||||
|  |  | ||||||
|  | Install `vercel` if you haven't already: | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | npm install -g vercel | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Then, from within your project folder: | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | cd public | ||||||
|  | vercel deploy --name my-project | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### With [surge](https://surge.sh/) | ||||||
|  |  | ||||||
|  | Install `surge` if you haven't already: | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | npm install -g surge | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Then, from within your project folder: | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | npm run build | ||||||
|  | surge public my-project.surge.sh | ||||||
|  | ``` | ||||||
							
								
								
									
										1955
									
								
								news_check/client/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										1955
									
								
								news_check/client/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										23
									
								
								news_check/client/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								news_check/client/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | { | ||||||
|  |   "name": "svelte-app", | ||||||
|  |   "version": "1.0.0", | ||||||
|  |   "private": true, | ||||||
|  |   "scripts": { | ||||||
|  |     "build": "rollup -c", | ||||||
|  |     "dev": "rollup -c -w", | ||||||
|  |     "start": "sirv public --no-clear" | ||||||
|  |   }, | ||||||
|  |   "devDependencies": { | ||||||
|  |     "@rollup/plugin-commonjs": "^17.0.0", | ||||||
|  |     "@rollup/plugin-node-resolve": "^11.0.0", | ||||||
|  |     "rollup": "^2.3.4", | ||||||
|  |     "rollup-plugin-css-only": "^3.1.0", | ||||||
|  |     "rollup-plugin-livereload": "^2.0.0", | ||||||
|  |     "rollup-plugin-svelte": "^7.0.0", | ||||||
|  |     "rollup-plugin-terser": "^7.0.0", | ||||||
|  |     "svelte": "^3.0.0" | ||||||
|  |   }, | ||||||
|  |   "dependencies": { | ||||||
|  |     "sirv-cli": "^2.0.0" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								news_check/client/public/favicon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								news_check/client/public/favicon.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										63
									
								
								news_check/client/public/global.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								news_check/client/public/global.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | |||||||
|  | html, body { | ||||||
|  | 	position: relative; | ||||||
|  | 	width: 100%; | ||||||
|  | 	height: 100%; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | body { | ||||||
|  | 	color: #333; | ||||||
|  | 	margin: 0; | ||||||
|  | 	padding: 8px; | ||||||
|  | 	box-sizing: border-box; | ||||||
|  | 	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | a { | ||||||
|  | 	color: rgb(0,100,200); | ||||||
|  | 	text-decoration: none; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | a:hover { | ||||||
|  | 	text-decoration: underline; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | a:visited { | ||||||
|  | 	color: rgb(0,80,160); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | label { | ||||||
|  | 	display: block; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | input, button, select, textarea { | ||||||
|  | 	font-family: inherit; | ||||||
|  | 	font-size: inherit; | ||||||
|  | 	-webkit-padding: 0.4em 0; | ||||||
|  | 	padding: 0.4em; | ||||||
|  | 	margin: 0 0 0.5em 0; | ||||||
|  | 	box-sizing: border-box; | ||||||
|  | 	border: 1px solid #ccc; | ||||||
|  | 	border-radius: 2px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | input:disabled { | ||||||
|  | 	color: #ccc; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | button { | ||||||
|  | 	color: #333; | ||||||
|  | 	background-color: #f4f4f4; | ||||||
|  | 	outline: none; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | button:disabled { | ||||||
|  | 	color: #999; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | button:not(:disabled):active { | ||||||
|  | 	background-color: #ddd; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | button:focus { | ||||||
|  | 	border-color: #666; | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								news_check/client/public/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								news_check/client/public/index.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html lang="en"> | ||||||
|  | <head> | ||||||
|  | 	<meta charset='utf-8'> | ||||||
|  | 	<meta name='viewport' content='width=device-width,initial-scale=1'> | ||||||
|  |  | ||||||
|  | 	<title>Svelte app</title> | ||||||
|  |  | ||||||
|  | 	<link rel='icon' type='image/png' href='/favicon.png'> | ||||||
|  | 	<link rel='stylesheet' href='/global.css'> | ||||||
|  | 	<link rel='stylesheet' href='/build/bundle.css'> | ||||||
|  |  | ||||||
|  | 	<script defer src='/build/bundle.js'></script> | ||||||
|  |  | ||||||
|  | 	<link href="https://cdn.jsdelivr.net/npm/daisyui@2.24.0/dist/full.css" rel="stylesheet" type="text/css" /> | ||||||
|  | 	<script src="https://cdn.tailwindcss.com"></script> | ||||||
|  |  | ||||||
|  | 	<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.0.943/pdf.min.js"></script> | ||||||
|  | 	<html data-theme="light"></html> | ||||||
|  |  | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | <body> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										
											BIN
										
									
								
								news_check/client/public/test.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								news_check/client/public/test.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										76
									
								
								news_check/client/rollup.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								news_check/client/rollup.config.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | |||||||
|  | import svelte from 'rollup-plugin-svelte'; | ||||||
|  | import commonjs from '@rollup/plugin-commonjs'; | ||||||
|  | import resolve from '@rollup/plugin-node-resolve'; | ||||||
|  | import livereload from 'rollup-plugin-livereload'; | ||||||
|  | import { terser } from 'rollup-plugin-terser'; | ||||||
|  | import css from 'rollup-plugin-css-only'; | ||||||
|  |  | ||||||
|  | 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', 'start', '--', '--dev'], { | ||||||
|  | 				stdio: ['ignore', 'inherit', 'inherit'], | ||||||
|  | 				shell: true | ||||||
|  | 			}); | ||||||
|  |  | ||||||
|  | 			process.on('SIGTERM', toExit); | ||||||
|  | 			process.on('exit', toExit); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export default { | ||||||
|  | 	input: 'src/main.js', | ||||||
|  | 	output: { | ||||||
|  | 		sourcemap: true, | ||||||
|  | 		format: 'iife', | ||||||
|  | 		name: 'app', | ||||||
|  | 		file: 'public/build/bundle.js' | ||||||
|  | 	}, | ||||||
|  | 	plugins: [ | ||||||
|  | 		svelte({ | ||||||
|  | 			compilerOptions: { | ||||||
|  | 				// enable run-time checks when not in production | ||||||
|  | 				dev: !production | ||||||
|  | 			} | ||||||
|  | 		}), | ||||||
|  | 		// we'll extract any component CSS out into | ||||||
|  | 		// a separate file - better for performance | ||||||
|  | 		css({ output: 'bundle.css' }), | ||||||
|  |  | ||||||
|  | 		// If you have external dependencies installed from | ||||||
|  | 		// npm, you'll most likely need these plugins. In | ||||||
|  | 		// some cases you'll need additional configuration - | ||||||
|  | 		// consult the documentation for details: | ||||||
|  | 		// https://github.com/rollup/plugins/tree/master/packages/commonjs | ||||||
|  | 		resolve({ | ||||||
|  | 			browser: true, | ||||||
|  | 			dedupe: ['svelte'] | ||||||
|  | 		}), | ||||||
|  | 		commonjs(), | ||||||
|  |  | ||||||
|  | 		// In dev mode, call `npm run start` once | ||||||
|  | 		// the bundle has been generated | ||||||
|  | 		!production && serve(), | ||||||
|  |  | ||||||
|  | 		// Watch the `public` directory and refresh the | ||||||
|  | 		// browser on changes when not in production | ||||||
|  | 		!production && livereload('public'), | ||||||
|  |  | ||||||
|  | 		// If we're building for production (npm run build | ||||||
|  | 		// instead of npm run dev), minify | ||||||
|  | 		production && terser() | ||||||
|  | 	], | ||||||
|  | 	watch: { | ||||||
|  | 		clearScreen: false | ||||||
|  | 	} | ||||||
|  | }; | ||||||
							
								
								
									
										121
									
								
								news_check/client/scripts/setupTypeScript.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								news_check/client/scripts/setupTypeScript.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | |||||||
|  | // @ts-check | ||||||
|  |  | ||||||
|  | /** This script modifies the project to support TS code in .svelte files like: | ||||||
|  |  | ||||||
|  |   <script lang="ts"> | ||||||
|  |   	export let name: string; | ||||||
|  |   </script> | ||||||
|  |   | ||||||
|  |   As well as validating the code for CI. | ||||||
|  |   */ | ||||||
|  |  | ||||||
|  | /**  To work on this script: | ||||||
|  |   rm -rf test-template template && git clone sveltejs/template test-template && node scripts/setupTypeScript.js test-template | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | const fs = require("fs") | ||||||
|  | const path = require("path") | ||||||
|  | const { argv } = require("process") | ||||||
|  |  | ||||||
|  | const projectRoot = argv[2] || path.join(__dirname, "..") | ||||||
|  |  | ||||||
|  | // Add deps to pkg.json | ||||||
|  | const packageJSON = JSON.parse(fs.readFileSync(path.join(projectRoot, "package.json"), "utf8")) | ||||||
|  | packageJSON.devDependencies = Object.assign(packageJSON.devDependencies, { | ||||||
|  |   "svelte-check": "^2.0.0", | ||||||
|  |   "svelte-preprocess": "^4.0.0", | ||||||
|  |   "@rollup/plugin-typescript": "^8.0.0", | ||||||
|  |   "typescript": "^4.0.0", | ||||||
|  |   "tslib": "^2.0.0", | ||||||
|  |   "@tsconfig/svelte": "^2.0.0" | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | // Add script for checking | ||||||
|  | packageJSON.scripts = Object.assign(packageJSON.scripts, { | ||||||
|  |   "check": "svelte-check --tsconfig ./tsconfig.json" | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | // Write the package JSON | ||||||
|  | fs.writeFileSync(path.join(projectRoot, "package.json"), JSON.stringify(packageJSON, null, "  ")) | ||||||
|  |  | ||||||
|  | // mv src/main.js to main.ts - note, we need to edit rollup.config.js for this too | ||||||
|  | const beforeMainJSPath = path.join(projectRoot, "src", "main.js") | ||||||
|  | const afterMainTSPath = path.join(projectRoot, "src", "main.ts") | ||||||
|  | fs.renameSync(beforeMainJSPath, afterMainTSPath) | ||||||
|  |  | ||||||
|  | // Switch the app.svelte file to use TS | ||||||
|  | const appSveltePath = path.join(projectRoot, "src", "App.svelte") | ||||||
|  | let appFile = fs.readFileSync(appSveltePath, "utf8") | ||||||
|  | appFile = appFile.replace("<script>", '<script lang="ts">') | ||||||
|  | appFile = appFile.replace("export let name;", 'export let name: string;') | ||||||
|  | fs.writeFileSync(appSveltePath, appFile) | ||||||
|  |  | ||||||
|  | // Edit rollup config | ||||||
|  | const rollupConfigPath = path.join(projectRoot, "rollup.config.js") | ||||||
|  | let rollupConfig = fs.readFileSync(rollupConfigPath, "utf8") | ||||||
|  |  | ||||||
|  | // Edit imports | ||||||
|  | rollupConfig = rollupConfig.replace(`'rollup-plugin-terser';`, `'rollup-plugin-terser'; | ||||||
|  | import sveltePreprocess from 'svelte-preprocess'; | ||||||
|  | import typescript from '@rollup/plugin-typescript';`) | ||||||
|  |  | ||||||
|  | // Replace name of entry point | ||||||
|  | rollupConfig = rollupConfig.replace(`'src/main.js'`, `'src/main.ts'`) | ||||||
|  |  | ||||||
|  | // Add preprocessor | ||||||
|  | rollupConfig = rollupConfig.replace( | ||||||
|  |   'compilerOptions:', | ||||||
|  |   'preprocess: sveltePreprocess({ sourceMap: !production }),\n\t\t\tcompilerOptions:' | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | // Add TypeScript | ||||||
|  | rollupConfig = rollupConfig.replace( | ||||||
|  |   'commonjs(),', | ||||||
|  |   'commonjs(),\n\t\ttypescript({\n\t\t\tsourceMap: !production,\n\t\t\tinlineSources: !production\n\t\t}),' | ||||||
|  | ); | ||||||
|  | fs.writeFileSync(rollupConfigPath, rollupConfig) | ||||||
|  |  | ||||||
|  | // Add TSConfig | ||||||
|  | const tsconfig = `{ | ||||||
|  |   "extends": "@tsconfig/svelte/tsconfig.json", | ||||||
|  |  | ||||||
|  |   "include": ["src/**/*"], | ||||||
|  |   "exclude": ["node_modules/*", "__sapper__/*", "public/*"] | ||||||
|  | }` | ||||||
|  | const tsconfigPath =  path.join(projectRoot, "tsconfig.json") | ||||||
|  | fs.writeFileSync(tsconfigPath, tsconfig) | ||||||
|  |  | ||||||
|  | // Add global.d.ts | ||||||
|  | const dtsPath =  path.join(projectRoot, "src", "global.d.ts") | ||||||
|  | fs.writeFileSync(dtsPath, `/// <reference types="svelte" />`) | ||||||
|  |  | ||||||
|  | // Delete this script, but not during testing | ||||||
|  | if (!argv[2]) { | ||||||
|  |   // Remove the script | ||||||
|  |   fs.unlinkSync(path.join(__filename)) | ||||||
|  |  | ||||||
|  |   // Check for Mac's DS_store file, and if it's the only one left remove it | ||||||
|  |   const remainingFiles = fs.readdirSync(path.join(__dirname)) | ||||||
|  |   if (remainingFiles.length === 1 && remainingFiles[0] === '.DS_store') { | ||||||
|  |     fs.unlinkSync(path.join(__dirname, '.DS_store')) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // Check if the scripts folder is empty | ||||||
|  |   if (fs.readdirSync(path.join(__dirname)).length === 0) { | ||||||
|  |     // Remove the scripts folder | ||||||
|  |     fs.rmdirSync(path.join(__dirname)) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Adds the extension recommendation | ||||||
|  | fs.mkdirSync(path.join(projectRoot, ".vscode"), { recursive: true }) | ||||||
|  | fs.writeFileSync(path.join(projectRoot, ".vscode", "extensions.json"), `{ | ||||||
|  |   "recommendations": ["svelte.svelte-vscode"] | ||||||
|  | } | ||||||
|  | `) | ||||||
|  |  | ||||||
|  | console.log("Converted to TypeScript.") | ||||||
|  |  | ||||||
|  | if (fs.existsSync(path.join(projectRoot, "node_modules"))) { | ||||||
|  |   console.log("\nYou will need to re-run your dependency manager to get started.") | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								news_check/client/src/App.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								news_check/client/src/App.svelte
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | <script> | ||||||
|  | 	import PDFView from './PDFView.svelte'; | ||||||
|  | 	import ArticleStatus from './ArticleStatus.svelte'; | ||||||
|  | 	import ArticleOperations from './ArticleOperations.svelte'; | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | <div class="flex w-full h-full gap-5 p-5"> | ||||||
|  | 	<div class="w-3/5"><PDFView/></div> | ||||||
|  | 	<div class="divider divider-horizontal"></div>  | ||||||
|  | 	<div class="w-2/5"> | ||||||
|  | 		<ArticleStatus article_id={42}/> | ||||||
|  | 		<div class="divider divider-vertical"></div>  | ||||||
|  | 		<ArticleOperations/> | ||||||
|  | 	</div> | ||||||
|  | </div> | ||||||
|  |  | ||||||
							
								
								
									
										28
									
								
								news_check/client/src/ArticleOperations.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								news_check/client/src/ArticleOperations.svelte
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | <div class="toast"> | ||||||
|  | 	<div class="alert alert-info"> | ||||||
|  | 	    <div> | ||||||
|  |             <span>New message arrived.</span> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | </div> | ||||||
|  |  | ||||||
|  | <div class="grid grid-cols-3 gap-4"> | ||||||
|  |     <div class="highlight">01</div> | ||||||
|  |     <div class="highlight">01</div> | ||||||
|  |     <div class="highlight">01</div> | ||||||
|  |     <div class="highlight">01</div> | ||||||
|  |     <div class="highlight">01</div> | ||||||
|  |     <div class="highlight">01</div> | ||||||
|  |     <div class="highlight">01</div> | ||||||
|  |     <div class="highlight">01</div> | ||||||
|  |     <div class="highlight">01</div> | ||||||
|  |  | ||||||
|  | </div> | ||||||
|  | <style> | ||||||
|  |     .highlight { | ||||||
|  |         background-color: #f5f5f5; | ||||||
|  |         border-radius: 5px; | ||||||
|  |         padding: 10px; | ||||||
|  |         margin: 10px; | ||||||
|  |     } | ||||||
|  | </style> | ||||||
							
								
								
									
										25
									
								
								news_check/client/src/ArticleStatus.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								news_check/client/src/ArticleStatus.svelte
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | <script> | ||||||
|  |     export let article_id; | ||||||
|  |     const Article = (async () => { | ||||||
|  |     const response = await fetch('/api/article/' + article_id + '/get') | ||||||
|  |     return await response.json() | ||||||
|  | 	})() | ||||||
|  |     console.log(Article) | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <div class="mockup-window border bg-base-300"> | ||||||
|  |     <h1 class="center">Article overview</h1> | ||||||
|  |     <ul tabindex="0" class="menu p-2 shadow bg-base-100 rounded-box w-52"> | ||||||
|  |         {#await Article} | ||||||
|  |             <li>...waiting</li> | ||||||
|  |         {:then data} | ||||||
|  |             <li><a href="#">{data.value}</a></li> | ||||||
|  |             <li><a href="#">Item 2</a></li> | ||||||
|  |         {:catch error} | ||||||
|  |             <li>An error occurred!</li> | ||||||
|  |         {/await} | ||||||
|  |      | ||||||
|  |          | ||||||
|  |     </ul> | ||||||
|  |      | ||||||
|  | </div> | ||||||
							
								
								
									
										69
									
								
								news_check/client/src/PDFView.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								news_check/client/src/PDFView.svelte
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | |||||||
|  | <!--  | ||||||
|  | <script> | ||||||
|  | 	var myState = { | ||||||
|  | 		pdf: null, | ||||||
|  | 		currentPage: 1, | ||||||
|  | 		zoom: 1 | ||||||
|  | 	} | ||||||
|  |    | ||||||
|  | 	pdfjsLib.getDocument('test.pdf').then((pdf) => { | ||||||
|  |    | ||||||
|  | 		myState.pdf = pdf; | ||||||
|  | 		render(); | ||||||
|  |  | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	function render() { | ||||||
|  | 		myState.pdf.getPage(myState.currentPage).then((page) => { | ||||||
|  | 	   | ||||||
|  | 			var canvas = document.getElementById("pdf_renderer"); | ||||||
|  | 			var ctx = canvas.getContext('2d'); | ||||||
|  |    | ||||||
|  | 			var viewport = page.getViewport(myState.zoom); | ||||||
|  |  | ||||||
|  | 			canvas.width = viewport.width; | ||||||
|  | 			canvas.height = viewport.height; | ||||||
|  | 	   | ||||||
|  | 			page.render({ | ||||||
|  | 				canvasContext: ctx, | ||||||
|  | 				viewport: viewport | ||||||
|  | 			}); | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | </script> | ||||||
|  |   --> | ||||||
|  | <!-- <div id="my_pdf_viewer"> | ||||||
|  |     <div class="mockup-window border bg-base-300"> | ||||||
|  |         <div id="canvas_container" class="flex justify-center"> | ||||||
|  |             <canvas id="pdf_renderer"></canvas> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |          | ||||||
|  |  | ||||||
|  |     <div id="navigation_controls"> | ||||||
|  |         <button id="go_previous">Previous</button> | ||||||
|  |         <input id="current_page" value="1" type="number"/> | ||||||
|  |         <button id="go_next">Next</button> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div id="zoom_controls">   | ||||||
|  |         <button id="zoom_in">+</button> | ||||||
|  |         <button id="zoom_out">-</button> | ||||||
|  |     </div> | ||||||
|  | </div> --> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | 	let pdf_file = 'test.pdf'; | ||||||
|  | </script>  | ||||||
|  |  | ||||||
|  | <div class="mockup-window border bg-base-300 h-full w-full"> | ||||||
|  | 	<object class="pdf-view" data="{pdf_file}" title="Article PDF"> </object> | ||||||
|  | </div> | ||||||
|  |  | ||||||
|  | <style> | ||||||
|  | 	.pdf-view { | ||||||
|  | 		width: 100%; | ||||||
|  | 		height: 100%; | ||||||
|  | 	} | ||||||
|  | </style> | ||||||
							
								
								
									
										10
									
								
								news_check/client/src/main.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								news_check/client/src/main.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | import App from './App.svelte'; | ||||||
|  |  | ||||||
|  | const app = new App({ | ||||||
|  | 	target: document.body, | ||||||
|  | 	props: { | ||||||
|  | 		name: 'world' | ||||||
|  | 	} | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | export default app; | ||||||
							
								
								
									
										4
									
								
								news_check/requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								news_check/requirements.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | flask | ||||||
|  | peewee | ||||||
|  | markdown | ||||||
|  | gunicorn | ||||||
							
								
								
									
										10
									
								
								news_check/server/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								news_check/server/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | # Svelte.js + Flask | ||||||
|  |  | ||||||
|  | A super simple example of using Flask to serve a Svelte app and use it as a backend server. | ||||||
|  |  | ||||||
|  | Run the following for development: | ||||||
|  |  | ||||||
|  | - `python server.py` to start the Flask server. | ||||||
|  | - `cd client; npm install; npm run autobuild` to automatically build and reload the Svelte frontend when it's changed. | ||||||
|  |  | ||||||
|  | This example just queries the Flask server for a random number. | ||||||
							
								
								
									
										37
									
								
								news_check/server/main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								news_check/server/main.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | from crypt import methods | ||||||
|  | import json | ||||||
|  | from flask import Flask, send_from_directory, jsonify | ||||||
|  | import random | ||||||
|  |  | ||||||
|  | app = Flask(__name__) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ############################################################################### | ||||||
|  | # SVELTE BACKEND. Always send index.html and the requested js-files. (compiled by npm) | ||||||
|  | @app.route("/") #index.html | ||||||
|  | def base(): | ||||||
|  |     return send_from_directory('../client/public', 'index.html') | ||||||
|  | @app.route("/<path:path>") #js-files | ||||||
|  | def home(path): | ||||||
|  |     return send_from_directory('../client/public', path) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ############################################################################### | ||||||
|  | # API for news_check. | ||||||
|  |  | ||||||
|  | @app.route("/api/article/<int:id>/get") | ||||||
|  | def get_article(id): | ||||||
|  |     res = {"value": id} | ||||||
|  |     return jsonify(res) | ||||||
|  |  | ||||||
|  | @app.route("/api/article/<int:id>/set", methods=['POST']) | ||||||
|  | def set_article(id): | ||||||
|  |     return str(random.randint(0, 100)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     app.run(debug=True) | ||||||
							
								
								
									
										3
									
								
								news_check/server/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								news_check/server/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | { | ||||||
|  |   "lockfileVersion": 1 | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user