mirror of
https://github.com/Eugeny/tabby-web.git
synced 2025-06-17 09:59:53 +00:00
wip
This commit is contained in:
parent
ff29392dad
commit
04ddd11dfc
1
.gitignore
vendored
1
.gitignore
vendored
@ -3,3 +3,4 @@ index.d.ts
|
||||
*.ignore.js
|
||||
*.ignore.js.map
|
||||
dist
|
||||
.mypy_cache
|
||||
|
@ -1 +1 @@
|
||||
<!DOCTYPE html><html><head><base href="dist/"><meta name="viewport" content="initial-scale=1, minimal-ui, shrink-to-fit=no"><link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400" rel="stylesheet"><script src="index.js"></script><title>Terminus</title></head><body><div class="terminal"><iframe src="terminal.html"></iframe></div></body></html>
|
||||
<!DOCTYPE html><html><head><base href="dist/"><meta name="viewport" content="initial-scale=1, minimal-ui, shrink-to-fit=no"><link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400" rel="stylesheet"><script src="index.js" defer></script><title>Terminus</title></head><body><div class="terminal"><iframe src="terminal.html"></iframe></div></body></html>
|
@ -4,7 +4,7 @@ html
|
||||
base(href='dist/')
|
||||
meta(name='viewport', content='initial-scale=1, minimal-ui, shrink-to-fit=no')
|
||||
link(href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400", rel="stylesheet")
|
||||
script(src='index.js')
|
||||
script(src='index.js', defer)
|
||||
title Terminus
|
||||
body
|
||||
.terminal
|
||||
|
22
manage.py
Executable file
22
manage.py
Executable file
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env python
|
||||
"""Django's command-line utility for administrative tasks."""
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
def main():
|
||||
"""Run administrative tasks."""
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'terminus.settings')
|
||||
try:
|
||||
from django.core.management import execute_from_command_line
|
||||
except ImportError as exc:
|
||||
raise ImportError(
|
||||
"Couldn't import Django. Are you sure it's installed and "
|
||||
"available on your PYTHONPATH environment variable? Did you "
|
||||
"forget to activate a virtual environment?"
|
||||
) from exc
|
||||
execute_from_command_line(sys.argv)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -15,6 +15,7 @@
|
||||
"bootstrap": "^4.3.1",
|
||||
"browserify-zlib": "^0.2.0",
|
||||
"buffer": "^6.0.3",
|
||||
"constants-browserify": "^1.0.0",
|
||||
"core-js": "^3.8.3",
|
||||
"crypto-browserify": "^3.12.0",
|
||||
"css-loader": "^2.1.0",
|
||||
@ -31,6 +32,7 @@
|
||||
"source-code-pro": "^2.30.1",
|
||||
"source-sans-pro": "^2.45.0",
|
||||
"stream-browserify": "^3.0.0",
|
||||
"string_decoder": "^1.3.0",
|
||||
"style-loader": "^0.23.1",
|
||||
"typescript": "3.3.3333",
|
||||
"val-loader": "^1.1.1",
|
||||
|
111
poetry.lock
generated
Normal file
111
poetry.lock
generated
Normal file
@ -0,0 +1,111 @@
|
||||
[[package]]
|
||||
name = "asgiref"
|
||||
version = "3.3.4"
|
||||
description = "ASGI specs, helper code, and adapters"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
|
||||
|
||||
[package.extras]
|
||||
tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"]
|
||||
|
||||
[[package]]
|
||||
name = "django"
|
||||
version = "3.2.3"
|
||||
description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
asgiref = ">=3.3.2,<4"
|
||||
pytz = "*"
|
||||
sqlparse = ">=0.2.2"
|
||||
|
||||
[package.extras]
|
||||
argon2 = ["argon2-cffi (>=19.1.0)"]
|
||||
bcrypt = ["bcrypt"]
|
||||
|
||||
[[package]]
|
||||
name = "django-rest-framework"
|
||||
version = "0.1.0"
|
||||
description = "alias."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[package.dependencies]
|
||||
djangorestframework = "*"
|
||||
|
||||
[[package]]
|
||||
name = "djangorestframework"
|
||||
version = "3.12.4"
|
||||
description = "Web APIs for Django, made easy."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
|
||||
[package.dependencies]
|
||||
django = ">=2.2"
|
||||
|
||||
[[package]]
|
||||
name = "pytz"
|
||||
version = "2021.1"
|
||||
description = "World timezone definitions, modern and historical"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[[package]]
|
||||
name = "sqlparse"
|
||||
version = "0.4.1"
|
||||
description = "A non-validating SQL parser."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
|
||||
[[package]]
|
||||
name = "typing-extensions"
|
||||
version = "3.10.0.0"
|
||||
description = "Backported and Experimental Type Hints for Python 3.5+"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[metadata]
|
||||
lock-version = "1.1"
|
||||
python-versions = "^3.7"
|
||||
content-hash = "d745493eff37d4b0b0b9e932d7f14cd1266603161ca3f04ffb50596f03ee9d89"
|
||||
|
||||
[metadata.files]
|
||||
asgiref = [
|
||||
{file = "asgiref-3.3.4-py3-none-any.whl", hash = "sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee"},
|
||||
{file = "asgiref-3.3.4.tar.gz", hash = "sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"},
|
||||
]
|
||||
django = [
|
||||
{file = "Django-3.2.3-py3-none-any.whl", hash = "sha256:7e0a1393d18c16b503663752a8b6790880c5084412618990ce8a81cc908b4962"},
|
||||
{file = "Django-3.2.3.tar.gz", hash = "sha256:13ac78dbfd189532cad8f383a27e58e18b3d33f80009ceb476d7fcbfc5dcebd8"},
|
||||
]
|
||||
django-rest-framework = [
|
||||
{file = "django-rest-framework-0.1.0.tar.gz", hash = "sha256:47a8f496fa69e3b6bd79f68dd7a1527d907d6b77f009e9db7cf9bb21cc565e4a"},
|
||||
]
|
||||
djangorestframework = [
|
||||
{file = "djangorestframework-3.12.4-py3-none-any.whl", hash = "sha256:6d1d59f623a5ad0509fe0d6bfe93cbdfe17b8116ebc8eda86d45f6e16e819aaf"},
|
||||
{file = "djangorestframework-3.12.4.tar.gz", hash = "sha256:f747949a8ddac876e879190df194b925c177cdeb725a099db1460872f7c0a7f2"},
|
||||
]
|
||||
pytz = [
|
||||
{file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"},
|
||||
{file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"},
|
||||
]
|
||||
sqlparse = [
|
||||
{file = "sqlparse-0.4.1-py3-none-any.whl", hash = "sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0"},
|
||||
{file = "sqlparse-0.4.1.tar.gz", hash = "sha256:0f91fd2e829c44362cbcfab3e9ae12e22badaa8a29ad5ff599f9ec109f0454e8"},
|
||||
]
|
||||
typing-extensions = [
|
||||
{file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"},
|
||||
{file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"},
|
||||
{file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"},
|
||||
]
|
16
pyproject.toml
Normal file
16
pyproject.toml
Normal file
@ -0,0 +1,16 @@
|
||||
[tool.poetry]
|
||||
name = "terminus-web"
|
||||
version = "0.1.0"
|
||||
description = ""
|
||||
authors = ["Your Name <you@example.com>"]
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.7"
|
||||
Django = "^3.2.3"
|
||||
django-rest-framework = "^0.1.0"
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core>=1.0.0"]
|
||||
build-backend = "poetry.core.masonry.api"
|
0
terminal-styles.scss
Normal file
0
terminal-styles.scss
Normal file
1
terminal.d.ts
vendored
1
terminal.d.ts
vendored
@ -6,6 +6,7 @@ import '@fortawesome/fontawesome-free/css/fontawesome.css';
|
||||
import 'source-code-pro/source-code-pro.css';
|
||||
import 'source-sans-pro/source-sans-pro.css';
|
||||
import { Duplex } from 'stream-browserify';
|
||||
import './terminal-styles.scss';
|
||||
export declare class Socket extends Duplex {
|
||||
webSocket: WebSocket;
|
||||
constructor();
|
||||
|
@ -1,5 +1,5 @@
|
||||
doctype html
|
||||
html
|
||||
html.terminus
|
||||
head
|
||||
meta(charset='UTF-8')
|
||||
script(src='./terminal.js')
|
||||
|
136
terminal.ts
136
terminal.ts
@ -8,6 +8,7 @@ import * as yaml from 'js-yaml'
|
||||
import { Duplex } from 'stream-browserify'
|
||||
import { Buffer } from 'buffer'
|
||||
|
||||
import './terminal-styles.scss'
|
||||
|
||||
export class Socket extends Duplex {
|
||||
webSocket: WebSocket
|
||||
@ -22,10 +23,10 @@ export class Socket extends Duplex {
|
||||
connect () {
|
||||
this.webSocket = new WebSocket('ws://localhost:9001/')
|
||||
this.webSocket.onopen = event => {
|
||||
this.emit('connect')
|
||||
this['emit']('connect')
|
||||
}
|
||||
this.webSocket.onmessage = async event => {
|
||||
this.emit('data', Buffer.from(await event.data.arrayBuffer()))
|
||||
this['emit']('data', Buffer.from(await event.data.arrayBuffer()))
|
||||
}
|
||||
}
|
||||
|
||||
@ -69,6 +70,8 @@ async function start () {
|
||||
terminal:
|
||||
font: "Source Code Pro"
|
||||
autoOpen: true
|
||||
rightClick: menu
|
||||
copyOnSelect: false
|
||||
appearance:
|
||||
vibrancy: false
|
||||
pluginBlacklist: []
|
||||
@ -94,20 +97,20 @@ async function start () {
|
||||
mkdirSync: path => {
|
||||
console.warn('mock mkdirSync', path)
|
||||
},
|
||||
stat: (path, cb) => {
|
||||
if ([
|
||||
'resources/builtin-plugins',
|
||||
'resources/builtin-plugins/terminus-core/package.json',
|
||||
'resources/builtin-plugins/terminus-ssh/package.json',
|
||||
'resources/builtin-plugins/terminus-settings/package.json',
|
||||
'resources/builtin-plugins/terminus-terminal/package.json',
|
||||
].includes(path)) {
|
||||
cb(null, {})
|
||||
} else {
|
||||
console.warn('mock stat', path)
|
||||
cb('ENOEXIST')
|
||||
}
|
||||
},
|
||||
// stat: (path, cb) => {
|
||||
// if ([
|
||||
// 'resources/builtin-plugins',
|
||||
// 'resources/builtin-plugins/terminus-core/package.json',
|
||||
// 'resources/builtin-plugins/terminus-ssh/package.json',
|
||||
// 'resources/builtin-plugins/terminus-settings/package.json',
|
||||
// 'resources/builtin-plugins/terminus-terminal/package.json',
|
||||
// ].includes(path)) {
|
||||
// cb(null, {})
|
||||
// } else {
|
||||
// console.warn('mock stat', path)
|
||||
// cb('ENOEXIST')
|
||||
// }
|
||||
// },
|
||||
writeFileSync: () => null,
|
||||
readFileSync: (path) => {
|
||||
if (path === 'app-path/config.yaml') {
|
||||
@ -116,31 +119,22 @@ async function start () {
|
||||
return ''
|
||||
},
|
||||
readFile: (path, enc, cb) => {
|
||||
if ([
|
||||
'resources/builtin-plugins/terminus-core/package.json',
|
||||
'resources/builtin-plugins/terminus-ssh/package.json',
|
||||
'resources/builtin-plugins/terminus-terminal/package.json',
|
||||
'resources/builtin-plugins/terminus-settings/package.json',
|
||||
].includes(path)) {
|
||||
cb(null, '{ "keywords": ["terminus-builtin-plugin"], "author": "" }')
|
||||
} else {
|
||||
console.warn('mock readFile', path)
|
||||
cb('UNKNOWN', null)
|
||||
}
|
||||
},
|
||||
readdir: (path, cb) => {
|
||||
if (path === 'resources/builtin-plugins') {
|
||||
cb(null, [
|
||||
'terminus-core',
|
||||
'terminus-ssh',
|
||||
'terminus-settings',
|
||||
'terminus-terminal',
|
||||
])
|
||||
} else {
|
||||
console.warn('mock readdir', path)
|
||||
cb(null, [])
|
||||
}
|
||||
},
|
||||
// readdir: (path, cb) => {
|
||||
// if (path === 'resources/builtin-plugins') {
|
||||
// cb(null, [
|
||||
// 'terminus-core',
|
||||
// 'terminus-ssh',
|
||||
// 'terminus-settings',
|
||||
// 'terminus-terminal',
|
||||
// ])
|
||||
// } else {
|
||||
// console.warn('mock readdir', path)
|
||||
// cb(null, [])
|
||||
// }
|
||||
// },
|
||||
constants: {},
|
||||
},
|
||||
'@electron/remote': {
|
||||
@ -149,6 +143,7 @@ async function start () {
|
||||
getPath: () => 'app-path',
|
||||
getWindow: () => ({
|
||||
reload: () => null,
|
||||
setTrafficLightPosition: () => null,
|
||||
}),
|
||||
},
|
||||
screen: {
|
||||
@ -221,10 +216,6 @@ async function start () {
|
||||
clearLine: stream => stream.write('\r'),
|
||||
},
|
||||
zlib: require('browserify-zlib'),
|
||||
util: {
|
||||
...require('util'),
|
||||
promisify: () => null,
|
||||
},
|
||||
'any-promise': Promise,
|
||||
net: {
|
||||
Socket,
|
||||
@ -256,7 +247,7 @@ async function start () {
|
||||
},
|
||||
'readable-stream': {},
|
||||
os: {
|
||||
platform: () => 'linux',
|
||||
platform: () => 'web',
|
||||
homedir: () => '/home',
|
||||
},
|
||||
'mz/child_process': {
|
||||
@ -287,6 +278,7 @@ async function start () {
|
||||
},
|
||||
},
|
||||
dns: {},
|
||||
util: require('util'),
|
||||
keytar: {
|
||||
getPassword: () => null,
|
||||
},
|
||||
@ -316,17 +308,18 @@ async function start () {
|
||||
Object.assign(window, {
|
||||
require: (path) => {
|
||||
if (mocks[path]) {
|
||||
console.warn('requiring mock', path)
|
||||
return mocks[path]
|
||||
}
|
||||
if (builtins[path]) {
|
||||
return builtins[path]
|
||||
}
|
||||
console.warn('requiring', path)
|
||||
console.error('requiring real module', path)
|
||||
},
|
||||
process: {
|
||||
env: { XWEB: 1, LOGNAME: 'root' },
|
||||
argv: ['terminus'],
|
||||
platform: 'linux',
|
||||
platform: 'darwin',
|
||||
on: () => null,
|
||||
stdout: {},
|
||||
stderr: {},
|
||||
@ -351,29 +344,58 @@ async function start () {
|
||||
window['__dirname'] = '__dirname'
|
||||
window['setImmediate'] = setTimeout
|
||||
mocks.module['prototype'] = { require: window['require'] }
|
||||
window['terminusConfig'] = configContent
|
||||
|
||||
let pluginCode = {
|
||||
core: await import(/* webpackChunkName: "app" */ '../terminus/terminus-core/dist/index.js'),
|
||||
ssh: await import(/* webpackChunkName: "app" */ '../terminus/terminus-ssh/dist/index.js'),
|
||||
settings: await import(/* webpackChunkName: "app" */ '../terminus/terminus-settings/dist/index.js'),
|
||||
terminal: await import(/* webpackChunkName: "app" */ '../terminus/terminus-terminal/dist/index.js'),
|
||||
}
|
||||
require('util').promisify = () => null
|
||||
|
||||
function loadPlugin (name) {
|
||||
let code = `(function (exports, require, module) { \n${pluginCode[name].default}\n })`
|
||||
// let plugins: Record<string, any> = {}
|
||||
// plugins.core = builtins['terminus-core'] = await import(/* webpackChunkName: "app" */ '../terminus/terminus-core/dist/index.js')
|
||||
// plugins.settings = builtins['terminus-settings'] = await import(/* webpackChunkName: "app" */ '../terminus/terminus-settings/dist/index.js')
|
||||
// plugins.terminal = builtins['terminus-terminal'] = await import(/* webpackChunkName: "app" */ '../terminus/terminus-terminal/dist/index.js')
|
||||
// plugins['community-color-schemes'] = builtins['terminus-community-color-schemes'] = await import(/* webpackChunkName: "app" */ '../terminus/terminus-community-color-schemes/dist/index.js')
|
||||
// plugins.ssh = builtins['terminus-ssh'] = await import(/* webpackChunkName: "app" */ '../terminus/terminus-ssh/dist/index.js')
|
||||
// plugins.web = builtins['terminus-web'] = await import(/* webpackChunkName: "app" */ '../terminus/terminus-web/dist/index.js')
|
||||
|
||||
async function loadPlugin (name, file = 'index.js') {
|
||||
let code = await (await fetch(`../app-dist/${name}/dist/${file}`)).text()
|
||||
code = `(function (exports, require, module) { \n${code}\n })`
|
||||
let m = eval(code)
|
||||
let module = { exports: {} }
|
||||
m(module.exports, window['require'], module)
|
||||
return module.exports
|
||||
}
|
||||
|
||||
for (const plugin of ['core', 'settings', 'terminal', 'ssh']) {
|
||||
builtins[`resources/builtin-plugins/terminus-${plugin}`] = builtins[`terminus-${plugin}`] = loadPlugin(plugin)
|
||||
const pluginModules = []
|
||||
for (const plugin of [
|
||||
'terminus-core',
|
||||
'terminus-settings',
|
||||
'terminus-terminal',
|
||||
'terminus-ssh',
|
||||
'terminus-community-color-schemes',
|
||||
'terminus-web',
|
||||
]) {
|
||||
console.log(`Loading ${plugin}`)
|
||||
const mod = await loadPlugin(plugin)
|
||||
builtins[`resources/builtin-plugins/${plugin}`] = builtins[plugin] = mod
|
||||
pluginModules.push(mod)
|
||||
console.log(mod)
|
||||
}
|
||||
|
||||
await import(/* webpackChunkName: "app" */ '../terminus/app/dist/preload.js')
|
||||
// for (const name of ['core', 'settings', 'terminal', 'ssh', 'community-color-schemes', 'web']) {
|
||||
// plugins[name].pluginName = name
|
||||
// builtins[`resources/builtin-plugins/terminus-${name}`] = plugins[name]
|
||||
// }
|
||||
|
||||
// await import(/* webpackChunkName: "app" */ '../terminus/app/dist/preload.js')
|
||||
// document.querySelector('app-root')['style'].display = 'flex'
|
||||
|
||||
// await import(/* webpackChunkName: "app" */ '../terminus/app/dist/bundle-web.js')
|
||||
// window['bootstrapTerminus'](Object.values(plugins), { config })
|
||||
|
||||
await loadPlugin('app', 'preload.js')
|
||||
await loadPlugin('app', 'bundle-web.js')
|
||||
document.querySelector('app-root')['style'].display = 'flex'
|
||||
await import(/* webpackChunkName: "app" */ '../terminus/app/dist/bundle.js')
|
||||
window['bootstrapTerminus'](pluginModules, { config })
|
||||
}
|
||||
|
||||
start()
|
||||
|
0
terminus/__init__.py
Normal file
0
terminus/__init__.py
Normal file
16
terminus/asgi.py
Normal file
16
terminus/asgi.py
Normal file
@ -0,0 +1,16 @@
|
||||
"""
|
||||
ASGI config for terminus project.
|
||||
|
||||
It exposes the ASGI callable as a module-level variable named ``application``.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
from django.core.asgi import get_asgi_application
|
||||
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'terminus.settings')
|
||||
|
||||
application = get_asgi_application()
|
125
terminus/settings.py
Normal file
125
terminus/settings.py
Normal file
@ -0,0 +1,125 @@
|
||||
"""
|
||||
Django settings for terminus project.
|
||||
|
||||
Generated by 'django-admin startproject' using Django 3.2.3.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/3.2/topics/settings/
|
||||
|
||||
For the full list of settings and their values, see
|
||||
https://docs.djangoproject.com/en/3.2/ref/settings/
|
||||
"""
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||
|
||||
|
||||
# Quick-start development settings - unsuitable for production
|
||||
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
|
||||
|
||||
# SECURITY WARNING: keep the secret key used in production secret!
|
||||
SECRET_KEY = 'django-insecure-jw3fshufj(1$iv+&9bie=r%27+^e2sz0!_gq38*5p5!csrm&#s'
|
||||
|
||||
# SECURITY WARNING: don't run with debug turned on in production!
|
||||
DEBUG = True
|
||||
|
||||
ALLOWED_HOSTS = []
|
||||
|
||||
|
||||
# Application definition
|
||||
|
||||
INSTALLED_APPS = [
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
]
|
||||
|
||||
ROOT_URLCONF = 'terminus.urls'
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [],
|
||||
'APP_DIRS': True,
|
||||
'OPTIONS': {
|
||||
'context_processors': [
|
||||
'django.template.context_processors.debug',
|
||||
'django.template.context_processors.request',
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
WSGI_APPLICATION = 'terminus.wsgi.application'
|
||||
|
||||
|
||||
# Database
|
||||
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': BASE_DIR / 'db.sqlite3',
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Password validation
|
||||
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators
|
||||
|
||||
AUTH_PASSWORD_VALIDATORS = [
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
# Internationalization
|
||||
# https://docs.djangoproject.com/en/3.2/topics/i18n/
|
||||
|
||||
LANGUAGE_CODE = 'en-us'
|
||||
|
||||
TIME_ZONE = 'UTC'
|
||||
|
||||
USE_I18N = True
|
||||
|
||||
USE_L10N = True
|
||||
|
||||
USE_TZ = True
|
||||
|
||||
|
||||
# Static files (CSS, JavaScript, Images)
|
||||
# https://docs.djangoproject.com/en/3.2/howto/static-files/
|
||||
|
||||
STATIC_URL = '/static/'
|
||||
|
||||
# Default primary key field type
|
||||
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field
|
||||
|
||||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
21
terminus/urls.py
Normal file
21
terminus/urls.py
Normal file
@ -0,0 +1,21 @@
|
||||
"""terminus URL Configuration
|
||||
|
||||
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||
https://docs.djangoproject.com/en/3.2/topics/http/urls/
|
||||
Examples:
|
||||
Function views
|
||||
1. Add an import: from my_app import views
|
||||
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
||||
Class-based views
|
||||
1. Add an import: from other_app.views import Home
|
||||
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
||||
Including another URLconf
|
||||
1. Import the include() function: from django.urls import include, path
|
||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||
"""
|
||||
from django.contrib import admin
|
||||
from django.urls import path
|
||||
|
||||
urlpatterns = [
|
||||
path('admin/', admin.site.urls),
|
||||
]
|
16
terminus/wsgi.py
Normal file
16
terminus/wsgi.py
Normal file
@ -0,0 +1,16 @@
|
||||
"""
|
||||
WSGI config for terminus project.
|
||||
|
||||
It exposes the WSGI callable as a module-level variable named ``application``.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
from django.core.wsgi import get_wsgi_application
|
||||
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'terminus.settings')
|
||||
|
||||
application = get_wsgi_application()
|
@ -33,10 +33,25 @@ module.exports = {
|
||||
extensions: ['.ts', '.js'],
|
||||
fallback: {
|
||||
stream: require.resolve('stream-browserify'),
|
||||
assert: require.resolve('assert'),
|
||||
util: require.resolve('util'),
|
||||
assert: require.resolve('assert/'),
|
||||
constants: require.resolve('constants-browserify'),
|
||||
util: require.resolve('util/'),
|
||||
zlib: require.resolve('browserify-zlib'),
|
||||
},
|
||||
},
|
||||
externals: {
|
||||
'dns': 'commonjs dns',
|
||||
'tls': 'commonjs tls',
|
||||
'tty': 'commonjs tty',
|
||||
'crypto': 'commonjs crypto',
|
||||
'querystring': 'commonjs querystring',
|
||||
'https': 'commonjs https',
|
||||
'http': 'commonjs http',
|
||||
'url': 'commonjs url',
|
||||
'terminus-core': 'commonjs terminus-core',
|
||||
'terminus-terminal': 'commonjs terminus-terminal',
|
||||
'terminus-settings': 'commonjs terminus-settings',
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
@ -49,7 +64,7 @@ module.exports = {
|
||||
},
|
||||
},
|
||||
{ test: /terminus\/app\/dist/, use: ['script-loader'] },
|
||||
{ test: /dist\/index/, use: ['raw-loader'] },
|
||||
// { test: /dist\/index/, use: ['raw-loader'] },
|
||||
{
|
||||
test: /\.(ttf|eot|otf|woff|woff2)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
|
||||
use: {
|
||||
@ -73,3 +88,31 @@ module.exports = {
|
||||
],
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const externals = [
|
||||
'@electron/remote',
|
||||
'any-promise',
|
||||
'child_process',
|
||||
'electron-promise-ipc',
|
||||
'electron',
|
||||
'fontmanager-redux',
|
||||
'fs',
|
||||
'keytar',
|
||||
'hterm-umdjs',
|
||||
'macos-native-processlist',
|
||||
'native-process-working-directory',
|
||||
'net',
|
||||
'os',
|
||||
'path',
|
||||
'readline',
|
||||
'serialport',
|
||||
'socksv5',
|
||||
'windows-native-registry',
|
||||
'windows-process-tree',
|
||||
'windows-process-tree/build/Release/windows_process_tree.node',
|
||||
]
|
||||
|
||||
for (const k of externals) {
|
||||
module.exports.externals[k] = `commonjs ${k}`
|
||||
}
|
||||
|
38
yarn.lock
38
yarn.lock
@ -344,11 +344,6 @@ arr-union@^3.1.0:
|
||||
resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
|
||||
integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
|
||||
|
||||
array-filter@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83"
|
||||
integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=
|
||||
|
||||
array-find-index@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
|
||||
@ -359,6 +354,17 @@ array-unique@^0.3.2:
|
||||
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
|
||||
integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
|
||||
|
||||
array.prototype.filter@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.0.tgz#24d63e38983cdc6bf023a3c574b2f2a3f384c301"
|
||||
integrity sha512-TfO1gz+tLm+Bswq0FBOXPqAchtCr2Rn48T8dLJoRFl8NoEosjZmzptmuo1X8aZBzZcqsR1W8U761tjACJtngTQ==
|
||||
dependencies:
|
||||
call-bind "^1.0.2"
|
||||
define-properties "^1.1.3"
|
||||
es-abstract "^1.18.0"
|
||||
es-array-method-boxes-properly "^1.0.0"
|
||||
is-string "^1.0.5"
|
||||
|
||||
asap@~2.0.3:
|
||||
version "2.0.6"
|
||||
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
|
||||
@ -415,11 +421,11 @@ atob@^2.1.1:
|
||||
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
|
||||
|
||||
available-typed-arrays@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz#6b098ca9d8039079ee3f77f7b783c4480ba513f5"
|
||||
integrity sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.3.tgz#fb7d02445bfedefad79fad1fe47931163a227198"
|
||||
integrity sha512-CuPhFULixV/d89POo1UG4GqGbR7dmrefY2ZdmsYakeR4gOSJXoF7tfeaiqMHGOMrlTiJoeEs87fpLsBYmE2BMw==
|
||||
dependencies:
|
||||
array-filter "^1.0.0"
|
||||
array.prototype.filter "^1.0.0"
|
||||
|
||||
awesome-typescript-loader@^5.2.1:
|
||||
version "5.2.1"
|
||||
@ -872,6 +878,11 @@ constantinople@^3.0.1:
|
||||
babel-types "^6.26.0"
|
||||
babylon "^6.18.0"
|
||||
|
||||
constants-browserify@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
|
||||
integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
|
||||
|
||||
copy-descriptor@^0.1.0:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
|
||||
@ -1155,7 +1166,7 @@ error-ex@^1.2.0:
|
||||
dependencies:
|
||||
is-arrayish "^0.2.1"
|
||||
|
||||
es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2:
|
||||
es-abstract@^1.18.0, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2:
|
||||
version "1.18.0"
|
||||
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4"
|
||||
integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==
|
||||
@ -1177,6 +1188,11 @@ es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2:
|
||||
string.prototype.trimstart "^1.0.4"
|
||||
unbox-primitive "^1.0.0"
|
||||
|
||||
es-array-method-boxes-properly@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e"
|
||||
integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==
|
||||
|
||||
es-module-lexer@^0.4.0:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.4.1.tgz#dda8c6a14d8f340a24e34331e0fab0cb50438e0e"
|
||||
@ -3570,7 +3586,7 @@ string.prototype.trimstart@^1.0.4:
|
||||
call-bind "^1.0.2"
|
||||
define-properties "^1.1.3"
|
||||
|
||||
string_decoder@^1.1.1:
|
||||
string_decoder@^1.1.1, string_decoder@^1.3.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
|
||||
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
|
||||
|
Loading…
x
Reference in New Issue
Block a user