From 977831157f5a6dc09dba98b9fcb4ee0c08c27dcb Mon Sep 17 00:00:00 2001 From: Jonas Pfalzgraf Date: Mon, 15 Aug 2022 15:46:39 +0200 Subject: [PATCH] basic structure --- .github/workflows/codeql-analysis.yml | 71 ++++ .gitignore | 343 ++++++++++++++++- app.config.json | 23 ++ package-lock.json | 516 ++++++++++++++++++++++++++ package.json | 26 ++ public/favicon.ico | Bin 0 -> 4286 bytes public/icons/icon.png | Bin 0 -> 1764 bytes public/icons/icon128.png | Bin 0 -> 26683 bytes public/icons/icon16.png | Bin 0 -> 1764 bytes public/icons/icon48.png | Bin 0 -> 6506 bytes public/manifest.json | 32 ++ public/popup.html | 26 ++ src/app.ts | 24 ++ src/assets/logo.png | Bin 0 -> 2100 bytes src/background.ts | 13 + src/sass/_content.sass | 6 + src/sass/_mixin.sass | 84 +++++ src/sass/_root.sass | 8 + src/sass/app.sass | 42 +++ tools/deploy.ts | 47 +++ tools/syncConfig.ts | 22 ++ tsconfig.json | 81 ++++ 22 files changed, 1363 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/codeql-analysis.yml create mode 100644 app.config.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 public/icons/icon.png create mode 100644 public/icons/icon128.png create mode 100644 public/icons/icon16.png create mode 100644 public/icons/icon48.png create mode 100644 public/manifest.json create mode 100644 public/popup.html create mode 100644 src/app.ts create mode 100644 src/assets/logo.png create mode 100644 src/background.ts create mode 100644 src/sass/_content.sass create mode 100644 src/sass/_mixin.sass create mode 100644 src/sass/_root.sass create mode 100644 src/sass/app.sass create mode 100644 tools/deploy.ts create mode 100644 tools/syncConfig.ts create mode 100644 tsconfig.json diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000..37bec9c --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,71 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ master ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ master ] + schedule: + - cron: '28 16 * * 0' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] + # Learn more: + # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # â„šī¸ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # âœī¸ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/.gitignore b/.gitignore index dfcfd56..ec6d0f5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,299 @@ +# Created by https://www.toptal.com/developers/gitignore/api/visualstudio,visualstudiocode,webstorm,phpstorm,intellij +# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudio,visualstudiocode,webstorm,phpstorm,intellij + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### PhpStorm ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# AWS User-specific + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# SonarLint plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### PhpStorm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# Support for Project snippet scope +.vscode/*.code-snippets + +# Ignore code-workspaces +*.code-workspace + +### WebStorm ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# AWS User-specific + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# SonarLint plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### WebStorm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij + +### VisualStudio ### ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. ## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore # User-specific files *.rsuser @@ -23,6 +315,7 @@ mono_crash.* [Rr]eleases/ x64/ x86/ +[Ww][Ii][Nn]32/ [Aa][Rr][Mm]/ [Aa][Rr][Mm]64/ bld/ @@ -61,6 +354,9 @@ project.lock.json project.fragment.lock.json artifacts/ +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + # StyleCop StyleCopReport.xml @@ -86,6 +382,7 @@ StyleCopReport.xml *.tmp_proj *_wpftmp.csproj *.log +*.tlog *.vspscc *.vssscc .builds @@ -137,6 +434,11 @@ _TeamCity* .axoCover/* !.axoCover/settings.json +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + # Visual Studio code coverage results *.coverage *.coveragexml @@ -284,6 +586,15 @@ node_modules/ # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) *.vbw +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files + # Visual Studio LightSwitch build output **/*.HTMLClient/GeneratedArtifacts **/*.DesktopClient/GeneratedArtifacts @@ -340,6 +651,9 @@ ASALocalRun/ # Local History for Visual Studio .localhistory/ +# Visual Studio History (VSHistory) files +.vshistory/ + # BeatPulse healthcheck temp database healthchecksdb @@ -348,3 +662,30 @@ MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools + +# Local History for Visual Studio Code + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +### VisualStudio Patch ### +# Additional files built by Visual Studio + +# End of https://www.toptal.com/developers/gitignore/api/visualstudio,visualstudiocode,webstorm,phpstorm,intellij + +dist + +tools/syncConfig.js +tools/deploy.js \ No newline at end of file diff --git a/app.config.json b/app.config.json new file mode 100644 index 0000000..12a5b21 --- /dev/null +++ b/app.config.json @@ -0,0 +1,23 @@ +{ + "AppData": { + "id": "browser_extension_template", + "name": "Browser Extension Template", + "version": "0.0.1", + "description": "A basic template based on SASS and TypeScript to create browser extensions without directly relying on a larger framework.", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com:JosunLP/BrowserExtensionTemplate.git" + }, + "license": "MIT", + "homepage": "https://github.com/JosunLP/BrowserExtensionTemplate", + "bugs": { + "url": "https://github.com/JosunLP/BrowserExtensionTemplate/issues" + }, + "authors": [ + { + "name": "Jonas Pfalzgraf", + "email": "info@josunlp.de" + } + ] + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4c94dd2 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,516 @@ +{ + "name": "browser_extension_template", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "browser_extension_template", + "version": "0.0.1", + "dependencies": { + "bootstrap": "^5.2.0", + "friendly-helper": "^1.7.1" + }, + "devDependencies": { + "@types/bootstrap": "^5.1.6", + "@types/node": "^18.7.4", + "sass": "^1.39.0", + "typescript": "^4.2.4" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@types/aes-js": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/aes-js/-/aes-js-3.1.1.tgz", + "integrity": "sha512-SDSGgXT3LRCH6qMWk8OHT1vLSVNuHNvCpKCx2/TYtQMbMGGgxJC9fspwSkQjqzRagrWnCrxuLL3jMNXLXHHvSw==" + }, + "node_modules/@types/bootstrap": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.1.tgz", + "integrity": "sha512-jPdLpDnBTHeocqelEz+ZVP2eY12hIBXgJLV/n0URiQiiNLdCgHwDqaI0chijjn1qwvDNbjzhKDeYAHxsnIGtIA==", + "dev": true, + "dependencies": { + "@popperjs/core": "^2.9.2" + } + }, + "node_modules/@types/node": { + "version": "18.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.4.tgz", + "integrity": "sha512-RzRcw8c0B8LzryWOR4Wj7YOTFXvdYKwvrb6xQQyuDfnlTxwYXGCV5RZ/TEbq5L5kn+w3rliHAUyRcG1RtbmTFg==", + "dev": true + }, + "node_modules/aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bootstrap": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.0.tgz", + "integrity": "sha512-qlnS9GL6YZE6Wnef46GxGv1UpGGzAwO0aPL1yOjzDIJpeApeMvqV24iL+pjr2kU4dduoBA9fINKWKgMToobx9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.5" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/friendly-helper": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/friendly-helper/-/friendly-helper-1.7.1.tgz", + "integrity": "sha512-6X9baO2FZ/EReoJBNOP55fOO21Bu0Lnkr6cM97OHXPBgn+V0LF3rS1Nmxeb/WcQGomSkAO3kBi73HDcrEpUCiA==", + "dependencies": { + "@types/aes-js": "^3.1.1", + "aes-js": "^3.1.2" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/sass": { + "version": "1.54.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz", + "integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + } + }, + "dependencies": { + "@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" + }, + "@types/aes-js": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/aes-js/-/aes-js-3.1.1.tgz", + "integrity": "sha512-SDSGgXT3LRCH6qMWk8OHT1vLSVNuHNvCpKCx2/TYtQMbMGGgxJC9fspwSkQjqzRagrWnCrxuLL3jMNXLXHHvSw==" + }, + "@types/bootstrap": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.1.tgz", + "integrity": "sha512-jPdLpDnBTHeocqelEz+ZVP2eY12hIBXgJLV/n0URiQiiNLdCgHwDqaI0chijjn1qwvDNbjzhKDeYAHxsnIGtIA==", + "dev": true, + "requires": { + "@popperjs/core": "^2.9.2" + } + }, + "@types/node": { + "version": "18.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.4.tgz", + "integrity": "sha512-RzRcw8c0B8LzryWOR4Wj7YOTFXvdYKwvrb6xQQyuDfnlTxwYXGCV5RZ/TEbq5L5kn+w3rliHAUyRcG1RtbmTFg==", + "dev": true + }, + "aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bootstrap": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.0.tgz", + "integrity": "sha512-qlnS9GL6YZE6Wnef46GxGv1UpGGzAwO0aPL1yOjzDIJpeApeMvqV24iL+pjr2kU4dduoBA9fINKWKgMToobx9A==", + "requires": {} + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "friendly-helper": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/friendly-helper/-/friendly-helper-1.7.1.tgz", + "integrity": "sha512-6X9baO2FZ/EReoJBNOP55fOO21Bu0Lnkr6cM97OHXPBgn+V0LF3rS1Nmxeb/WcQGomSkAO3kBi73HDcrEpUCiA==", + "requires": { + "@types/aes-js": "^3.1.1", + "aes-js": "^3.1.2" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "sass": { + "version": "1.54.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz", + "integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..0ff280e --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "browser_extension_template", + "version": "0.0.1", + "private": true, + "scripts": { + "deploy": "tsc ./tools/deploy.ts --target esnext --module esnext && node ./tools/deploy.js && npm run build-js && npm run build-css", + "build-js": "tsc -p tsconfig.json", + "build-css": "sass ./src/sass/:./dist/css/", + "sync": "tsc ./tools/syncConfig.ts --target esnext --module esnext && node ./tools/syncConfig.js" + }, + "devDependencies": { + "@types/bootstrap": "^5.1.6", + "@types/node": "^18.7.4", + "sass": "^1.39.0", + "typescript": "^4.2.4" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead" + ], + "dependencies": { + "bootstrap": "^5.2.0", + "friendly-helper": "^1.7.1" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..780af6aa434fc27b3b99598813012674e8643a23 GIT binary patch literal 4286 zcmeIuu?>Jg3fs(@+aA|?7$8z4NR%lsL8d!3T)}D=;_*5 kj@*m_3Mim}0tzUgfC36Apnw7jj1@TVeIEPq`|bHTFZ9=gbpQYW literal 0 HcmV?d00001 diff --git a/public/icons/icon.png b/public/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..412525c9d6265d56265ad34a67c2b555afd25300 GIT binary patch literal 1764 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVDkc=49Y(=<4iZ>}Kj}Xy|I;4Kw)9aF-T$-DjR|3v4~Pj*wm=R%;iu*SQ+p9GSzFs2><8wS2u~NskcwMV zg1z&lQ$=izKcDS6{ytsyxZfO$(m7J$zS6EuGuqnNI=VvyLIoW+C?y4Nd>FX#k)k5k zPsSGBq)K1cUQ~t zEEV~$bC;$4f83MLoBbDU40b%ixkFO+sBPMk%+32IYi||zG7?j-Zj53t;5<;9#~c-% zF4|o9nQ8geitRq{{`|6C)vC3EHAp$r+T5f%BX9n$G;RGSbIbD*FRox-Et(+DeopAP zc2L#-Vr_G2+gn#Z&EB36`@o2O&x;eAuFRJF^=sw!OXu6PD;wiaHVU1)JY}Pv=b6iQ z&DdfdFASHrO{}kcvcUMqgPB`=)oLa^krL<34scogR*5EnD6*Bxhv89!ymy{ zcWrAQbgzv!6Oj0l`0c2j#ir90@4xDvkvW@~W@frVl>Pa~r^XLIZg;;ZDg3^cG3(wX zM!7E`bC$lJ&v|icW#^^)>KP9YGt_D_&N4`^D}H`Rm}l?5gE!2kcUqtSw@1@IL+z^} z`-L|KGqzQHEI8fTZGY-Q2`lHuzW((ZGybpR&SFq3UcZg`h@`V>p!nn&o&q9KB0FQd zq}3ADEu`OxyT$~E{P_?qe9gQ1#x@H<;afAhn2xhIPBrRz6ZYL$&-l@|GMS)f+q4t~ z3X*ojGl?gD$lS+gbnKvlPEA?U)EM!Ta*T`r+H4Z#Ye}EQH~p>A?R3*`UfWkk#IHYm zE9>B5O^I(>9ZO60Y?$wQNcn)~t%4i}rt`urO>!~oH_WiP^LPWtoaxqpzNHmu-tS(;vwD7RW<;TIv9`UMam?#TDhd zVBvu;mU^n{Oy$8B%YIC5y?S@H?5B&&hRGkTQt)&MuyPlf!CYyYIu}fvb zhl3`ko}P-=6w%E3WL92OeE4&lzEDhC&K~J41`C9k?_Rn0D*3_Z|FSxl4=e~1pHYAO g=l`@{{)}u4g)^fP4qYnR3aWQJUHx3vIVCg!0DIK0+yDRo literal 0 HcmV?d00001 diff --git a/public/icons/icon128.png b/public/icons/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..fcd0152c78354e09d1d461f75cf1a7b81e48e22b GIT binary patch literal 26683 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 literal 0 HcmV?d00001 diff --git a/public/icons/icon16.png b/public/icons/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..412525c9d6265d56265ad34a67c2b555afd25300 GIT binary patch literal 1764 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVDkc=49Y(=<4iZ>}Kj}Xy|I;4Kw)9aF-T$-DjR|3v4~Pj*wm=R%;iu*SQ+p9GSzFs2><8wS2u~NskcwMV zg1z&lQ$=izKcDS6{ytsyxZfO$(m7J$zS6EuGuqnNI=VvyLIoW+C?y4Nd>FX#k)k5k zPsSGBq)K1cUQ~t zEEV~$bC;$4f83MLoBbDU40b%ixkFO+sBPMk%+32IYi||zG7?j-Zj53t;5<;9#~c-% zF4|o9nQ8geitRq{{`|6C)vC3EHAp$r+T5f%BX9n$G;RGSbIbD*FRox-Et(+DeopAP zc2L#-Vr_G2+gn#Z&EB36`@o2O&x;eAuFRJF^=sw!OXu6PD;wiaHVU1)JY}Pv=b6iQ z&DdfdFASHrO{}kcvcUMqgPB`=)oLa^krL<34scogR*5EnD6*Bxhv89!ymy{ zcWrAQbgzv!6Oj0l`0c2j#ir90@4xDvkvW@~W@frVl>Pa~r^XLIZg;;ZDg3^cG3(wX zM!7E`bC$lJ&v|icW#^^)>KP9YGt_D_&N4`^D}H`Rm}l?5gE!2kcUqtSw@1@IL+z^} z`-L|KGqzQHEI8fTZGY-Q2`lHuzW((ZGybpR&SFq3UcZg`h@`V>p!nn&o&q9KB0FQd zq}3ADEu`OxyT$~E{P_?qe9gQ1#x@H<;afAhn2xhIPBrRz6ZYL$&-l@|GMS)f+q4t~ z3X*ojGl?gD$lS+gbnKvlPEA?U)EM!Ta*T`r+H4Z#Ye}EQH~p>A?R3*`UfWkk#IHYm zE9>B5O^I(>9ZO60Y?$wQNcn)~t%4i}rt`urO>!~oH_WiP^LPWtoaxqpzNHmu-tS(;vwD7RW<;TIv9`UMam?#TDhd zVBvu;mU^n{Oy$8B%YIC5y?S@H?5B&&hRGkTQt)&MuyPlf!CYyYIu}fvb zhl3`ko}P-=6w%E3WL92OeE4&lzEDhC&K~J41`C9k?_Rn0D*3_Z|FSxl4=e~1pHYAO g=l`@{{)}u4g)^fP4qYnR3aWQJUHx3vIVCg!0DIK0+yDRo literal 0 HcmV?d00001 diff --git a/public/icons/icon48.png b/public/icons/icon48.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7db43b0cd601c3c87175305858c43154499471 GIT binary patch literal 6506 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 ZSYZtMmnz$G2EYG)XsPR|RjSyA{}0F#- + + + + + + + {{BET}} + + + + +
+ +

{{BET}}

+
+
+
+
+ +
+ + diff --git a/src/app.ts b/src/app.ts new file mode 100644 index 0000000..e9993b6 --- /dev/null +++ b/src/app.ts @@ -0,0 +1,24 @@ +class App { + + private static contentEntry: string = "content" + + constructor() { + this.drawData() + this.main() + } + + async main(): Promise { + + } + + async drawData(): Promise { + const contentRoot = document.getElementById(App.contentEntry) + const body = new HTMLDivElement() + const title = new HTMLHeadingElement() + title.innerText = "Hello World" + body.appendChild(title) + contentRoot.appendChild(body) + } +} + +new App(); \ No newline at end of file diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5622b9fe69d0cf6086ba630b737925a16ce253ee GIT binary patch literal 2100 zcmd6p`#;kQ1IM=+o3Z4sokccki(E>mlgkLXw4&+tq+^zjYiLv$vdtw-O&51zL~@^w zOJVt*ql=Dvl;aY!BzHS5o6O~Oet&*@etCZQeBQ6m`!D#UoF_UU5hw%*1VTEVIqmj? z)PDn)`O$CrYtBCazTxIz1FGpk&w@a(CCAeQQY3ltF|Fg4yXsqdAU;=+a3BuxAld2Z zZgvK$IQcA&os!G4Wh3Eu`*@Z|V7yz;)pBzM0;iZ$bl-+lT!IhWc6Ev`nZAEd`?Ez0+ zBGz?4L*&sAG$;lYiHua)I6+kqE^8VkLCio&QgrYuxdqTEcnmBOQ{!b(5CP%BxQfEd zd?McuD2(piRuRI5!Tcm3i-BdNIe3Tfr%DUYQEu?(fmk5ZSgZ>eG9vs4Q^iUfvV1rG zRdClbQvs?y4;D)ulIjh&4uFoM_=uT#V3&bqsxuY9-#}jXB(ca=6eaIw4qgkkRk1o| z&pA!o9S4>LH`J3wXFdc2V#e8a19d*TPRNFZco;xKRLPA;sD!G`>EJvl_?-;JONJ~< zK{0o5vO{kxb}3tQB!3X}J!=x*3*Jq8Q#ABgp%sdj-qJ1@g|9g*OAx}C7*RiWy&cG_ zo2kDPy?*lv^Yw&WjPHrP{--w%QcZ>N8{$!(;S!<^v4Q5&6D$n_pomOhn-?(=PS~Vl zOw8g&e0pxXB-nnlQrb9*w*-lea>;MElPijK zod|7t!&=Wb^Piz*fvq4!m`#E|+=X-#}n@wK}*;J#d zQDvy)C+5 zW^^mKrW3n>I^6QaLd-o-DH(o_rH;*YAE?#H0zzAXl5%*ARzn{xlC!U9+++!-uuwJa z$~pUGzqx)wqj>raV8)0IGwEu?P^ICI?bS}+wSJV`!Zc$ThMS5!1tL~8U<(91c(2CP zv*u9PEefr2eU&?E@^_5NwsLftPekWZ?>eJKS%3)%X<850hdjdGAKSVVMG5l{%eHccz;ulRi7Kj#Xa|=$ zeO2A^hL}SM+&O~Ql4`o$09Grt*Fh?pSOm9ldDYJ@9enZ3>XzlLQu6hp%Q^gYZ7k{H zGfc3S_4i_ocUs9{MwH6&)w-jytysWSqf*8vp1t=IRx2eW(07qkTCLPQpLd`sT7Jsr zJnOHeeHqee7@-YtwL16@OZ7sz-pL%n1xA^qV&YV{kkszCc|Bv);E$ZN3_A|2Zcj#6 zK^s1As9mMaDK5&XA>V0cKQicdw?xseTV#m^s`(&sL_wai9q9(S{WhcM?0Q$<%XEQW zo0l1B;_!#`RlQzewo~~XrS>a`#&YH6qp~W=7i>nxx4n-f?5jxcjpjD1>^oc|9XxcP z?SUnpdB>TzlgJL8f9J^CMpe8})sBeP%&j3^DxP>!tL<3|U*laFaG;wU|1I~=ct#mh z=B|_fdpBag&U(9bPC7s!4~|dT@4a=rTI%I+A0}~S%RLu37v3?e%-utEP59H(rp-I@ z`Dlmum!G1Nd5D7P(V*g!Ek7UBrS`p#%>sNcNA&pEQaWv5>)i@cj!ITq`F3|YmyAM< zX6w2u@nxxitdz)nG?@U+_1Q6bm`$i06E_NU)R{JRZ*j+o&?XZ z7RNrFR1#QLEJ`5@ksY7N(>tAA18ZZ|No`H5pRROlTT(i2Hr3YB!YVWCw>=^>Yw?hz zRy_wr94ACKD6!GKxj{$r+r5WRXSxSS?oCS`W!H{)XV$9hkr3 zl(O?1FW%nV7n<0o`+UgN5lBc`UTL|VSz1rgY(5-SO5)c`Sm*sz)PK6 ze%GA`(CBUMv9B;jC*Igm6tmIHsp%}38uPv4nUGl8|EbuCR`$4?hUU%v`wKvhcEr;) IHk7!301B1ulK=n! literal 0 HcmV?d00001 diff --git a/src/background.ts b/src/background.ts new file mode 100644 index 0000000..f3af3fa --- /dev/null +++ b/src/background.ts @@ -0,0 +1,13 @@ + +class Background { + + constructor() { + this.main(); + } + + async main(): Promise { + + } +} + +new Background(); \ No newline at end of file diff --git a/src/sass/_content.sass b/src/sass/_content.sass new file mode 100644 index 0000000..78b7aea --- /dev/null +++ b/src/sass/_content.sass @@ -0,0 +1,6 @@ +@import mixin + +#textbox + text-align: left + padding: 2rem + @include noselect \ No newline at end of file diff --git a/src/sass/_mixin.sass b/src/sass/_mixin.sass new file mode 100644 index 0000000..0e4c93a --- /dev/null +++ b/src/sass/_mixin.sass @@ -0,0 +1,84 @@ +@import "root" + +@mixin respond-to($media) + @if $media == handhelds + @media only screen and (max-device-width: 40rem) + @content + + @else if $media == medium-screens + @media only screen and (min-device-width: 40rem) + @content + + @else if $media == wide-screens + @media only screen and (min-width: 1000px) + @content + +@mixin partialButton + button + width: 100% !important + height: 100% !important + text-align: center !important + margin: 0 !important + + @include respond-to(handhelds) + font-size: 3rem + + @include respond-to(medium-screens) + font-size: 1.5rem + +@mixin hoverMe + &:hover + button + color: grey !important + +@mixin shadow + box-shadow: 0px 0px 30px silver + +@mixin noselect + -webkit-touch-callout: none + -webkit-user-select: none + -khtml-user-select: none + -moz-user-select: none + -ms-user-select: none + user-select: none + pointer-events: none + +@mixin formBasic + display: block + padding: 2rem + background: $background-color-content + border-radius: 0.7rem + min-height: 20rem + margin: auto + margin-top: 2rem + margin-bottom: 2rem + @include shadow + + @include respond-to(handhelds) + font-size: 2.5em + margin-left: -0.8em + margin-right: -0.8em + border-radius: 0 + + @include respond-to(medium-screens) + max-width: 40rem + + @include respond-to(wide-screens) + max-width: 40rem + + input + @include respond-to(handhelds) + font-size: 3rem + border-radius: 0.5rem + + .check + position: static + @include respond-to(handhelds) + width: 2rem !important + height: 2rem !important + + button + @include respond-to(handhelds) + font-size: 3rem + padding: 1rem + border-radius: 1rem diff --git a/src/sass/_root.sass b/src/sass/_root.sass new file mode 100644 index 0000000..72f9b89 --- /dev/null +++ b/src/sass/_root.sass @@ -0,0 +1,8 @@ +$main-font: 'Ubuntu', 'Staatliches' +$main-font-color: white +$main-font-color-hover: lightgrey +$main-uschrift-font: 'Ubuntu', Arial +$seccond-color: lightgrey +$background-color: rgb(77, 153, 252) +$background-color-content: rgb(149, 195, 255) +$logo-image: url('../icons/icon128.png') diff --git a/src/sass/app.sass b/src/sass/app.sass new file mode 100644 index 0000000..4ecebeb --- /dev/null +++ b/src/sass/app.sass @@ -0,0 +1,42 @@ +@import 'root' +@import 'mixin' +@import 'content' +@import '../../node_modules/bootstrap/scss/bootstrap' + +body + height: 30rem + width: 30rem + background-color: $background-color + text-align: center + margin: auto + padding: auto + color: $main-font-color + + @include partialButton + +h1, h2 + @include noselect + +form + @include formBasic + +.logo + width: 5rem + height: auto + padding-top: 2rem + @include noselect + +svg + @include noselect + +table + color: $main-font-color !important + + th + @include noselect + +a + color: $main-font-color + + &:hover + color: $background-color-content \ No newline at end of file diff --git a/tools/deploy.ts b/tools/deploy.ts new file mode 100644 index 0000000..3f9cecb --- /dev/null +++ b/tools/deploy.ts @@ -0,0 +1,47 @@ +var fs = require('fs'); +var path = require('path'); +var DEPLOY_ENTRY = "./public"; +var DEPLOY_TARGET = "./dist"; + +function deleteFolderRecursive(path: string) { + if (fs.existsSync(path)) { + fs.readdirSync(path).forEach(function(file: string) { + var curPath = path + "/" + file; + if (fs.lstatSync(curPath).isDirectory()) { + deleteFolderRecursive(curPath); + } else { + fs.unlinkSync(curPath); + } + }); + fs.rmdirSync(path); + } +} + +function mkdirSync(path: string) { + try { + fs.mkdirSync(path); + } catch(e: any) { + if ( e.code != 'EEXIST' ) throw e; + } +} + +function copyFiles(source: string, target: string) { + var files = fs.readdirSync(source); + files.forEach(function(file: any) { + var sourceFile = path.join(source, file); + var targetFile = path.join(target, file); + var stat = fs.lstatSync(sourceFile); + if (stat.isDirectory()) { + mkdirSync(targetFile); + copyFiles(sourceFile, targetFile); + } else { + fs.writeFileSync(targetFile, fs.readFileSync(sourceFile)); + } + }); +} + +deleteFolderRecursive(DEPLOY_TARGET); +mkdirSync(DEPLOY_TARGET); +copyFiles(DEPLOY_ENTRY, DEPLOY_TARGET); + +console.log("Deployed to " + DEPLOY_TARGET); \ No newline at end of file diff --git a/tools/syncConfig.ts b/tools/syncConfig.ts new file mode 100644 index 0000000..13f1ec4 --- /dev/null +++ b/tools/syncConfig.ts @@ -0,0 +1,22 @@ +import fs from 'fs'; + +const appConfig = JSON.parse(fs.readFileSync('./app.config.json', 'utf8')); +const pkg = JSON.parse(fs.readFileSync('./package.json', 'utf8')); +const manifest = JSON.parse(fs.readFileSync('./public/manifest.json', 'utf8')); + +pkg.version = appConfig.AppData.version; +pkg.name = appConfig.AppData.id; +pkg.authors = appConfig.AppData.authors; +pkg.description = appConfig.AppData.description; +pkg.homepage = appConfig.AppData.homepage; +pkg.license = appConfig.AppData.license; +pkg.repository = appConfig.AppData.repository; +pkg.bugs = appConfig.AppData.bugs; + +manifest.version = appConfig.AppData.version; +manifest.name = appConfig.AppData.name; +manifest.description = appConfig.AppData.description; +manifest.homepage_url = appConfig.AppData.homepage; + +fs.writeFileSync('./package.json', JSON.stringify(pkg, null, 2)); +fs.writeFileSync('./public/manifest.json', JSON.stringify(manifest, null, 2)); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..10fa07b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,81 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ + // "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./public/js/app.js", /* Concatenate and emit output to single file. */ + "outDir": "./dist/js/", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + }, + "include": [ + "./src/**/*.ts", + "./src/*.ts" + ], + "exclude": [ + "./tools/*.ts", + "./dist/*.ts", + "./dist/*.js" + ] +}