Compare commits
No commits in common. "80b4b80508528eeb74243e9c7698207a9d8607c4" and "19862d7cd3ce0276e16169d3db3e37381e531df8" have entirely different histories.
80b4b80508
...
19862d7cd3
94
.gitignore
vendored
@ -1,73 +1,37 @@
|
|||||||
# Logs
|
__pycache__
|
||||||
logs
|
*/__pycache__
|
||||||
*.log
|
|
||||||
|
.DS_Store
|
||||||
|
node_modules
|
||||||
|
|
||||||
|
# pyinstaller build dirs
|
||||||
|
/dist
|
||||||
|
/build
|
||||||
|
|
||||||
|
# local env files
|
||||||
|
/env/
|
||||||
|
/venv/
|
||||||
|
.env.local
|
||||||
|
.env.*.local
|
||||||
|
|
||||||
|
# Log files
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
|
|
||||||
# Runtime data
|
# Editor directories and files
|
||||||
pids
|
# .vscode
|
||||||
*.pid
|
|
||||||
*.seed
|
|
||||||
*.pid.lock
|
|
||||||
|
|
||||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
|
||||||
lib-cov
|
|
||||||
|
|
||||||
# Coverage directory used by tools like istanbul
|
|
||||||
coverage
|
|
||||||
|
|
||||||
# nyc test coverage
|
|
||||||
.nyc_output
|
|
||||||
|
|
||||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
|
||||||
.grunt
|
|
||||||
|
|
||||||
# Bower dependency directory (https://bower.io/)
|
|
||||||
bower_components
|
|
||||||
|
|
||||||
# node-waf configuration
|
|
||||||
.lock-wscript
|
|
||||||
|
|
||||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
|
||||||
build/Release
|
|
||||||
|
|
||||||
# Dependency directories
|
|
||||||
node_modules/
|
|
||||||
jspm_packages/
|
|
||||||
|
|
||||||
# Typescript v1 declaration files
|
|
||||||
typings/
|
|
||||||
|
|
||||||
# Optional npm cache directory
|
|
||||||
.npm
|
|
||||||
|
|
||||||
# Optional eslint cache
|
|
||||||
.eslintcache
|
|
||||||
|
|
||||||
# Optional REPL history
|
|
||||||
.node_repl_history
|
|
||||||
|
|
||||||
# Output of 'npm pack'
|
|
||||||
*.tgz
|
|
||||||
|
|
||||||
# Yarn Integrity file
|
|
||||||
.yarn-integrity
|
|
||||||
|
|
||||||
# dotenv environment variables file
|
|
||||||
.env
|
|
||||||
|
|
||||||
# next.js build output
|
|
||||||
.next
|
|
||||||
|
|
||||||
# IDE
|
|
||||||
.vscode
|
|
||||||
.idea
|
.idea
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
|
|
||||||
|
# Private configs
|
||||||
|
/config.py
|
||||||
|
tailwind.config.full.js
|
||||||
|
|
||||||
# development
|
# development
|
||||||
*.map
|
*.map
|
||||||
dev.sh
|
public/js/bundle.js
|
||||||
|
|
||||||
# distribution
|
|
||||||
dist/*
|
|
||||||
server-dist/*
|
|
||||||
|
42
README.md
@ -1,38 +1,20 @@
|
|||||||
# Deemixer
|
# deemix-webui
|
||||||
|
|
||||||
This is forked from [deemix-webui](https://gitlab.com/RemixDev/deemix-webui) and [deemix-gui](https://gitlab.com/RemixDev/deemix-webui).
|
This is just the WebUI for deemix, it should be used with deemix-gui or something like that.
|
||||||
|
If you are a web developer and want to contribute to this project, please read the [COMPILE-UI](COMPILE-UI.md) file.
|
||||||
|
|
||||||
The submodule reference was removed and consolidated into this single repo. Git history was maintained.
|
# "Hidden" features
|
||||||
|
|
||||||
## Running from source
|
- `CTRL+SHIFT+Backspace` deletes all the search bar content
|
||||||
|
- `CTRL+F` focuses the search bar
|
||||||
|
- `CTRL+B` toggles the download bar
|
||||||
|
- `ALT+Left` goes back to the previous page, if present (like would happen in the browser)
|
||||||
|
- `ALT+Right` goes forward to the next page, if present (like would happen in the browser)
|
||||||
|
- Custom context menu: on certain elements, like download buttons or album covers, when opening the context menu, a custom one with more options will appear instead of the default one
|
||||||
|
|
||||||
You need to use nodejs 16.x, using `yarn` is recommended.
|
# Deps
|
||||||
|
|
||||||
Install the dependencies using `yarn install-all` for production.
|
- `rollup-plugin-vue@4.2.0` is needed because of https://github.com/vuejs/rollup-plugin-vue/issues/238
|
||||||
Install the dependencies using `yarn install-all-dev` for development.
|
|
||||||
Then you should be able to run the app with `yarn start`.
|
|
||||||
If you want to further develop deemix-gui and propose a PR, use `yarn dev`
|
|
||||||
|
|
||||||
Commands for easy setup:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# Production
|
|
||||||
git clone https://gitea.va.reichard.io/evan/Deemixer.git . && yarn install-all
|
|
||||||
# Development
|
|
||||||
git clone https://gitea.va.reichard.io/evan/Deemixer.git . && yarn install-all-dev
|
|
||||||
```
|
|
||||||
|
|
||||||
You can change the default port by setting the environment variable `PORT` to any other number before starting the app.
|
|
||||||
|
|
||||||
## Building the app
|
|
||||||
|
|
||||||
To build the app you need to have git installed and the repo cloned with `git`.
|
|
||||||
Make sure you've installed the dependencies for all packages (the root folder, `server` and `webui`).
|
|
||||||
Then from the root folder run `yarn dist` to make a distributable package for your current OS or `yarn dist-server` to make an executable for only the server.
|
|
||||||
|
|
||||||
## Feature requests
|
|
||||||
|
|
||||||
Before asking for a feature make sure it isn't an already open issue on the repo
|
|
||||||
|
|
||||||
# License
|
# License
|
||||||
|
|
||||||
|
BIN
build/64x64.png
Before Width: | Height: | Size: 2.8 KiB |
BIN
build/icon.icns
BIN
build/icon.ico
Before Width: | Height: | Size: 238 KiB |
1497
build/icon.svg
Before Width: | Height: | Size: 52 KiB |
109
index.js
@ -1,109 +0,0 @@
|
|||||||
const { app, BrowserWindow, ipcMain, shell, dialog, Menu, MenuItem } = require('electron')
|
|
||||||
const contextMenu = require('electron-context-menu')
|
|
||||||
const WindowStateManager = require('electron-window-state-manager')
|
|
||||||
const path = require('path')
|
|
||||||
const os = require('os')
|
|
||||||
const yargs = require('yargs/yargs')
|
|
||||||
const { hideBin } = require('yargs/helpers')
|
|
||||||
const argv = yargs(hideBin(process.argv)).options({
|
|
||||||
port: { type: 'string', default: '6595' },
|
|
||||||
host: { type: 'string', default: '127.0.0.1' },
|
|
||||||
dev: { type: 'boolean', default: false}
|
|
||||||
}).argv
|
|
||||||
const { DeemixServer }= require('./server/dist/app.js')
|
|
||||||
|
|
||||||
const PORT = process.env.DEEMIX_SERVER_PORT || argv.port
|
|
||||||
process.env.DEEMIX_SERVER_PORT = PORT
|
|
||||||
process.env.DEEMIX_HOST = argv.host
|
|
||||||
|
|
||||||
const server = new DeemixServer(argv.host, PORT, '/', false)
|
|
||||||
server.init()
|
|
||||||
|
|
||||||
let win
|
|
||||||
const windowState = new WindowStateManager('mainWindow', {
|
|
||||||
defaultWidth: 800,
|
|
||||||
defaultHeight: 600
|
|
||||||
})
|
|
||||||
|
|
||||||
function createWindow () {
|
|
||||||
win = new BrowserWindow({
|
|
||||||
width: windowState.width,
|
|
||||||
height: windowState.height,
|
|
||||||
x: windowState.x,
|
|
||||||
y: windowState.y,
|
|
||||||
useContentSize: true,
|
|
||||||
autoHideMenuBar: true,
|
|
||||||
icon: path.join(__dirname, os.platform() === 'win32' ? 'build/icon.ico' : 'build/64x64.png'),
|
|
||||||
webPreferences: {
|
|
||||||
preload: path.join(__dirname, 'preload.js')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
win.setMenu(null)
|
|
||||||
|
|
||||||
if (argv.dev){
|
|
||||||
const menu = new Menu()
|
|
||||||
menu.append(new MenuItem({
|
|
||||||
label: 'DevTools',
|
|
||||||
submenu: [
|
|
||||||
{ role: 'reload', accelerator: 'f5', click: () => { win.reload() } },
|
|
||||||
{ role: 'devtools', accelerator: 'f12', click: () => { win.webContents.toggleDevTools() } }
|
|
||||||
]
|
|
||||||
}))
|
|
||||||
Menu.setApplicationMenu(menu)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open links in external browser
|
|
||||||
win.webContents.on('new-window', function(e, url) {
|
|
||||||
e.preventDefault()
|
|
||||||
shell.openExternal(url)
|
|
||||||
})
|
|
||||||
|
|
||||||
win.loadURL(`http://${argv.host}:${PORT}`)
|
|
||||||
|
|
||||||
if (windowState.maximized) {
|
|
||||||
win.maximize();
|
|
||||||
}
|
|
||||||
|
|
||||||
win.on('close', (event)=>{
|
|
||||||
windowState.saveState(win);
|
|
||||||
if (server.deemixApp.getSettings().settings.clearQueueOnExit){
|
|
||||||
server.deemixApp.cancelAllDownloads()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
app.whenReady().then(() => {
|
|
||||||
createWindow()
|
|
||||||
contextMenu({
|
|
||||||
showLookUpSelection: false,
|
|
||||||
showSearchWithGoogle: false,
|
|
||||||
showInspectElement: false
|
|
||||||
})
|
|
||||||
|
|
||||||
// Only one istance per time
|
|
||||||
app.on('activate', () => {
|
|
||||||
if (BrowserWindow.getAllWindows().length === 0) {
|
|
||||||
createWindow()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
app.on('window-all-closed', () => {
|
|
||||||
if (process.platform !== 'darwin') {
|
|
||||||
app.quit()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
ipcMain.on('openDownloadsFolder', (event)=>{
|
|
||||||
const { downloadLocation } = server.deemixApp.getSettings().settings
|
|
||||||
shell.openPath(downloadLocation)
|
|
||||||
})
|
|
||||||
|
|
||||||
ipcMain.on('selectDownloadFolder', async (event, downloadLocation)=>{
|
|
||||||
let path = await dialog.showOpenDialog(win, {
|
|
||||||
defaultPath: downloadLocation,
|
|
||||||
properties: ["openDirectory", "createDirectory"]
|
|
||||||
})
|
|
||||||
if (path.filePaths[0]) win.webContents.send("downloadFolderSelected", path.filePaths[0])
|
|
||||||
})
|
|
139
package.json
@ -1,92 +1,61 @@
|
|||||||
{
|
{
|
||||||
"name": "deemix-gui",
|
"name": "deemix-webui",
|
||||||
"version": "0.0.0",
|
"version": "1.9.3",
|
||||||
"main": "index.js",
|
|
||||||
"repository": "https://gitlab.com/RemixDev/deemix-gui.git",
|
|
||||||
"author": "RemixDev <RemixDev64@gmail.com>",
|
|
||||||
"license": "GPL-3.0-only",
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"install-all": "yarn install && yarn --cwd server install --production && yarn --cwd webui install --production",
|
"clean": "rimraf public/js/bundle.js public/js/bundle.temp.js public/js/bundle.js.map",
|
||||||
"install-all-dev": "yarn install && yarn --cwd server install && yarn --cwd webui install",
|
"clean-temp": "rimraf public/js/bundle.temp.js",
|
||||||
"dev": "yarn --cwd webui dev",
|
"build:js": "rollup -c",
|
||||||
"start": "electron . --dev",
|
"minify": "esbuild public/js/bundle.temp.js --outfile=public/js/bundle.js --minify",
|
||||||
"predist": "yarn build-server && yarn build-webui",
|
"build": "npm-run-all --sequential clean build:js minify clean-temp",
|
||||||
"dist": "yarn set-version && electron-builder && yarn reset-version",
|
"start:gui": "yarn --cwd ../ start",
|
||||||
"dist:dir": "yarn set-version && yarn predist && electron-builder --dir && yarn reset-version",
|
"watch:server": "yarn --cwd ../server watch",
|
||||||
"dist-server": "yarn set-version && yarn predist && ./node_modules/.bin/pkg --out-dir dist ./server/package.json && yarn reset-version",
|
"watch:js": "rollup -c -w",
|
||||||
"start-server": "yarn --cwd server start",
|
"dev": "npm-run-all --parallel watch:server watch:js",
|
||||||
"build-server": "yarn --cwd server build",
|
"lint": "eslint src/**/*.{js,vue,mjs} --fix",
|
||||||
"build-webui": "yarn --cwd webui build",
|
"lint-tests": "eslint src/**/*.js --fix",
|
||||||
"set-version": "node scripts/set-version.js",
|
"test": "jest",
|
||||||
"reset-version": "node scripts/reset-version.js"
|
"test-watch": "jest --watch",
|
||||||
},
|
"testlang": "node ./tests/testlang.js"
|
||||||
"devDependencies": {
|
|
||||||
"electron": "^22.0.0",
|
|
||||||
"electron-builder": "^23.6.0",
|
|
||||||
"pkg": "^5.8.0"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"electron-context-menu": "^3.6.1",
|
"@rollup/plugin-alias": "3.1.5",
|
||||||
"electron-window-state-manager": "^0.3.2",
|
"@rollup/plugin-commonjs": "20.0.0",
|
||||||
"yargs": "^17.6.2"
|
"@rollup/plugin-node-resolve": "13.0.4",
|
||||||
|
"@rollup/plugin-replace": "3.0.0",
|
||||||
|
"@vue/composition-api": "1.0.6",
|
||||||
|
"esbuild": "0.12.19",
|
||||||
|
"flag-icon-css": "3.5.0",
|
||||||
|
"lodash-es": "4.17.21",
|
||||||
|
"npm-run-all": "4.1.5",
|
||||||
|
"postcss": "8.3.6",
|
||||||
|
"rimraf": "3.0.2",
|
||||||
|
"rollup": "2.56.1",
|
||||||
|
"rollup-plugin-analyzer": "4.0.0",
|
||||||
|
"rollup-plugin-postcss": "4.0.0",
|
||||||
|
"rollup-plugin-svg": "2.0.0",
|
||||||
|
"rollup-plugin-vue": "4.2.0",
|
||||||
|
"svg-country-flags": "1.2.10",
|
||||||
|
"tailwindcss": "1.9.6",
|
||||||
|
"toastify-js": "1.11.1",
|
||||||
|
"vue": "2.6.14",
|
||||||
|
"vue-i18n": "8.25.0",
|
||||||
|
"vue-router": "3.5.2",
|
||||||
|
"vuex": "3.6.2"
|
||||||
},
|
},
|
||||||
"build": {
|
"devDependencies": {
|
||||||
"appId": "app.deemix.gui",
|
"@babel/core": "7.15.0",
|
||||||
"productName": "deemix-gui",
|
"@babel/plugin-transform-modules-commonjs": "7.15.0",
|
||||||
"files": [
|
"@nuxtjs/eslint-config": "6.0.1",
|
||||||
"index.js",
|
"@types/jest": "26.0.24",
|
||||||
"preload.js",
|
"@typescript-eslint/eslint-plugin": "4.29.0",
|
||||||
"server/dist/**/*",
|
"@typescript-eslint/parser": "4.29.0",
|
||||||
"webui/public/**/*",
|
"babel-jest": "27.0.6",
|
||||||
"build/**/*",
|
"eslint": "7.32.0",
|
||||||
"package.json"
|
"eslint-config-prettier": "8.3.0",
|
||||||
],
|
"eslint-plugin-prettier": "3.4.0",
|
||||||
"mac": {
|
"jest": "27.0.6",
|
||||||
"target": [
|
"prettier": "2.3.2",
|
||||||
{
|
"typescript": "4.3.5",
|
||||||
"target": "dmg",
|
"vue-template-compiler": "2.6.14"
|
||||||
"arch": "x64"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"target": "dmg",
|
|
||||||
"arch": "arm64"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"artifactName": "deemix-gui_${arch}.${ext}",
|
|
||||||
"category": "public.app-category.music"
|
|
||||||
},
|
|
||||||
"win": {
|
|
||||||
"target": [
|
|
||||||
{
|
|
||||||
"target": "nsis",
|
|
||||||
"arch": "x64"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"target": "portable",
|
|
||||||
"arch": "x64"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"linux": {
|
|
||||||
"target": [
|
|
||||||
"appimage",
|
|
||||||
"deb"
|
|
||||||
],
|
|
||||||
"artifactName": "deemix-gui.${ext}",
|
|
||||||
"category": "AudioVideo,Audio",
|
|
||||||
"icon": "build/icon.icns"
|
|
||||||
},
|
|
||||||
"nsis": {
|
|
||||||
"artifactName": "${productName}_setup.${ext}",
|
|
||||||
"oneClick": false,
|
|
||||||
"license": "LICENSE.txt",
|
|
||||||
"allowToChangeInstallationDirectory": true,
|
|
||||||
"uninstallDisplayName": "${productName}",
|
|
||||||
"deleteAppDataOnUninstall": true
|
|
||||||
},
|
|
||||||
"portable": {
|
|
||||||
"artifactName": "${productName}.${ext}",
|
|
||||||
"requestExecutionLevel": "user"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
25
preload.js
@ -1,25 +0,0 @@
|
|||||||
const {
|
|
||||||
contextBridge,
|
|
||||||
ipcRenderer
|
|
||||||
} = require("electron");
|
|
||||||
|
|
||||||
// Expose protected methods that allow the renderer process to use
|
|
||||||
// the ipcRenderer without exposing the entire object
|
|
||||||
contextBridge.exposeInMainWorld(
|
|
||||||
"api", {
|
|
||||||
send: (channel, data) => {
|
|
||||||
// whitelist channels
|
|
||||||
let validChannels = ["openDownloadsFolder", "selectDownloadFolder"];
|
|
||||||
if (validChannels.includes(channel)) {
|
|
||||||
ipcRenderer.send(channel, data);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
receive: (channel, func) => {
|
|
||||||
let validChannels = ["downloadFolderSelected"];
|
|
||||||
if (validChannels.includes(channel)) {
|
|
||||||
// Deliberately strip event as it includes `sender`
|
|
||||||
ipcRenderer.on(channel, (event, ...args) => func(...args));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
Before Width: | Height: | Size: 238 KiB After Width: | Height: | Size: 238 KiB |
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
@ -1,16 +0,0 @@
|
|||||||
const { execSync } = require('child_process')
|
|
||||||
function generateVersion(){
|
|
||||||
const now = new Date();
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth()+1;
|
|
||||||
const day = now.getDate();
|
|
||||||
|
|
||||||
const commitsNumber = String(execSync('git rev-list --count HEAD')).trim()
|
|
||||||
const commitHash = String(execSync('git rev-parse --short=10 HEAD')).trim()
|
|
||||||
|
|
||||||
return `${year}.${month}.${day}-r${commitsNumber}.${commitHash}`
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(generateVersion())
|
|
||||||
|
|
||||||
module.exports = generateVersion
|
|
@ -1,6 +0,0 @@
|
|||||||
const { execSync } = require('child_process')
|
|
||||||
const fs = require('fs')
|
|
||||||
|
|
||||||
let package = JSON.parse(fs.readFileSync('package.json'))
|
|
||||||
package.version = "0.0.0"
|
|
||||||
fs.writeFileSync('package.json', JSON.stringify(package, null, 2)+"\n")
|
|
@ -1,6 +0,0 @@
|
|||||||
const fs = require('fs')
|
|
||||||
const generateVersion = require('./gen-version.js')
|
|
||||||
|
|
||||||
let package = JSON.parse(fs.readFileSync('package.json'))
|
|
||||||
package.version = generateVersion()
|
|
||||||
fs.writeFileSync('package.json', JSON.stringify(package, null, 2)+"\n")
|
|
@ -1 +0,0 @@
|
|||||||
dist/
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
extends:
|
|
||||||
- "@nuxtjs"
|
|
||||||
- plugin:prettier/recommended
|
|
||||||
plugins:
|
|
||||||
- "@typescript-eslint"
|
|
||||||
parserOptions:
|
|
||||||
parser: "@typescript-eslint/parser"
|
|
||||||
rules:
|
|
||||||
"@typescript-eslint/no-unused-vars":
|
|
||||||
- error
|
|
||||||
- args: all
|
|
||||||
argsIgnorePattern: ^_
|
|
||||||
no-unused-vars: off
|
|
||||||
no-console: off
|
|
||||||
camelcase: off
|
|
68
server/.gitignore
vendored
@ -1,68 +0,0 @@
|
|||||||
# Logs
|
|
||||||
logs
|
|
||||||
*.log
|
|
||||||
npm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
|
|
||||||
# Runtime data
|
|
||||||
pids
|
|
||||||
*.pid
|
|
||||||
*.seed
|
|
||||||
*.pid.lock
|
|
||||||
|
|
||||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
|
||||||
lib-cov
|
|
||||||
|
|
||||||
# Coverage directory used by tools like istanbul
|
|
||||||
coverage
|
|
||||||
|
|
||||||
# nyc test coverage
|
|
||||||
.nyc_output
|
|
||||||
|
|
||||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
|
||||||
.grunt
|
|
||||||
|
|
||||||
# Bower dependency directory (https://bower.io/)
|
|
||||||
bower_components
|
|
||||||
|
|
||||||
# node-waf configuration
|
|
||||||
.lock-wscript
|
|
||||||
|
|
||||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
|
||||||
build/Release
|
|
||||||
|
|
||||||
# Dependency directories
|
|
||||||
node_modules/
|
|
||||||
jspm_packages/
|
|
||||||
|
|
||||||
# Typescript v1 declaration files
|
|
||||||
typings/
|
|
||||||
|
|
||||||
# Optional npm cache directory
|
|
||||||
.npm
|
|
||||||
|
|
||||||
# Optional eslint cache
|
|
||||||
.eslintcache
|
|
||||||
|
|
||||||
# Optional REPL history
|
|
||||||
.node_repl_history
|
|
||||||
|
|
||||||
# Output of 'npm pack'
|
|
||||||
*.tgz
|
|
||||||
|
|
||||||
# Yarn Integrity file
|
|
||||||
.yarn-integrity
|
|
||||||
|
|
||||||
# dotenv environment variables file
|
|
||||||
.env
|
|
||||||
|
|
||||||
# next.js build output
|
|
||||||
.next
|
|
||||||
|
|
||||||
# IDE
|
|
||||||
.vscode
|
|
||||||
.idea
|
|
||||||
|
|
||||||
# development
|
|
||||||
dist/*
|
|