Shrubbery Commit
@@ -0,0 +1,13 @@
|
||||
# dependencies
|
||||
/node_modules
|
||||
.env
|
||||
|
||||
/reference
|
||||
|
||||
/_site
|
||||
/build
|
||||
|
||||
/public/media/svg
|
||||
/src/react-app-env.d.ts
|
||||
|
||||
.vscode
|
||||
@@ -0,0 +1 @@
|
||||
Any Colour You Like...
|
||||
@@ -0,0 +1,92 @@
|
||||
{
|
||||
"name": "tachi-client",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "react-scripts start -o",
|
||||
"build": "react-scripts build",
|
||||
"test": "react-scripts test",
|
||||
"eject": "react-scripts eject",
|
||||
"lint": "eslint src --fix",
|
||||
"format": "prettier --write \"src/**/*.{js,css,scss,html}\""
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not op_mini all",
|
||||
"ie 11"
|
||||
],
|
||||
"development": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version",
|
||||
"last 1 safari version",
|
||||
"last 1 edge version",
|
||||
"IE 11"
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@date-io/date-fns": "2.6.1",
|
||||
"@formatjs/intl-pluralrules": "1.3.5",
|
||||
"@fortawesome/fontawesome-free": "5.13.0",
|
||||
"@material-ui/core": "4.9.14",
|
||||
"@material-ui/icons": "4.9.1",
|
||||
"@material-ui/lab": "4.0.0-alpha.53",
|
||||
"@material-ui/pickers": "3.2.10",
|
||||
"@material-ui/styles": "4.9.14",
|
||||
"@tanem/svg-injector": "8.0.50",
|
||||
"@types/jest": "26.0.23",
|
||||
"@types/node": "16.0.0",
|
||||
"@types/react": "17.0.13",
|
||||
"@types/react-dom": "17.0.8",
|
||||
"@types/react-router": "5.1.15",
|
||||
"@types/react-router-dom": "5.1.7",
|
||||
"apexcharts": "3.19.2",
|
||||
"bootstrap": "4.6.0",
|
||||
"clipboard-copy": "3.1.0",
|
||||
"clsx": "1.1.0",
|
||||
"date-fns": "2.8.1",
|
||||
"downshift": "3.4.2",
|
||||
"fg-loadcss": "2.1.0",
|
||||
"lodash": "4.17.15",
|
||||
"material-ui-popup-state": "1.4.1",
|
||||
"perfect-scrollbar": "1.5.0",
|
||||
"react": "16.12.0",
|
||||
"react-bootstrap": "1.0.1",
|
||||
"react-bootstrap-table-next": "4.0.2",
|
||||
"react-bootstrap-table2-paginator": "2.1.2",
|
||||
"react-datepicker": "2.16.0",
|
||||
"react-dom": "16.12.0",
|
||||
"react-draggable": "4.4.2",
|
||||
"react-inlinesvg": "1.2.0",
|
||||
"react-intl": "3.6.2",
|
||||
"react-is": "16.13.1",
|
||||
"react-perfect-scrollbar": "1.5.8",
|
||||
"react-portal": "4.2.0",
|
||||
"react-router": "5.2.0",
|
||||
"react-router-dom": "5.1.2",
|
||||
"react-scripts": "3.2.0",
|
||||
"react-select": "3.1.0",
|
||||
"react-swipeable-views": "0.13.9",
|
||||
"react-swipeable-views-utils": "0.14.0",
|
||||
"react-syntax-highlighter": "12.2.1",
|
||||
"react-window": "1.8.5",
|
||||
"socicon": "3.0.5",
|
||||
"typescript": "4.3.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@typescript-eslint/eslint-plugin": "4.28.1",
|
||||
"@typescript-eslint/parser": "4.28.1",
|
||||
"copyfiles": "2.1.1",
|
||||
"eslint": "7.30.0",
|
||||
"eslint-config-prettier": "8.3.0",
|
||||
"eslint-plugin-import": "2.23.4",
|
||||
"eslint-plugin-prettier": "3.4.0",
|
||||
"prettier": "1.19.1",
|
||||
"sass": "1.32.8",
|
||||
"serve": "11.2.0",
|
||||
"webpack-cli": "3.3.11",
|
||||
"webpack-messages": "2.0.4",
|
||||
"webpack-rtl-plugin": "2.0.0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#splash-screen {
|
||||
position: absolute;
|
||||
z-index: 1000;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
background-color: #131313;
|
||||
}
|
||||
|
||||
#splash-screen img {
|
||||
margin-left: calc(100vw - 100%);
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
#splash-screen.hidden {
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.splash-spinner {
|
||||
animation: rotate 2s cubic-bezier(0.455, 0.03, 0.515, 0.955) infinite;
|
||||
margin-left: calc(100vw - 100%);
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.splash-spinner .path {
|
||||
stroke: #e61c6e;
|
||||
stroke-linecap: round;
|
||||
animation: dash 1.5s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes rotate {
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes dash {
|
||||
0% {
|
||||
stroke-dasharray: 1, 150;
|
||||
stroke-dashoffset: 0;
|
||||
}
|
||||
50% {
|
||||
stroke-dasharray: 90, 150;
|
||||
stroke-dashoffset: -35;
|
||||
}
|
||||
100% {
|
||||
stroke-dasharray: 90, 150;
|
||||
stroke-dashoffset: -124;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>Tachi</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<!--
|
||||
Notice the use of %PUBLIC_URL% in the tags above.
|
||||
It will be replaced with the URL of the `public` folder during the build.
|
||||
Only files inside the `public` folder can be referenced from the HTML.
|
||||
|
||||
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
|
||||
work correctly both with client-side routing and a non-root public URL.
|
||||
Learn how to configure a non-root public URL by running `npm run build`.
|
||||
-->
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/x-icon"
|
||||
href="%PUBLIC_URL%/media/logos/favicon.ico"
|
||||
/>
|
||||
|
||||
<link
|
||||
href="//fonts.googleapis.com/css?family=Poppins:300,400,500,600,700%7CRoboto:300,400,500,600,700"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<link
|
||||
href="https://fonts.googleapis.com/icon?family=Material+Icons"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<link
|
||||
rel="stylesheet"
|
||||
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500"
|
||||
/>
|
||||
<!-- SPLASH SCREEN-->
|
||||
<link
|
||||
rel="stylesheet"
|
||||
id="layout-styles-anchor"
|
||||
href="%PUBLIC_URL%/css/splash-screen.css"
|
||||
/>
|
||||
<script
|
||||
crossorigin="anonymous"
|
||||
src="https://polyfill.io/v3/polyfill.min.js?features=es2017%2Cdefault%2Ces2015%2Ces2016%2CIntl"
|
||||
></script>
|
||||
</head>
|
||||
<body id="kt_body">
|
||||
<noscript>
|
||||
You have JavaScript disabled, probably.<br>
|
||||
I also use a JavaScript blocker!<br>
|
||||
This site uses React to render its contents.<br>
|
||||
We don't use JS to track you or try to do anything malicious. You'll have to enable JS in order for this site to work.
|
||||
</noscript>
|
||||
<div id="root"></div>
|
||||
<div id="splash-screen" class="kt-splash-screen">
|
||||
<img src="%PUBLIC_URL%/media/logos/logo-wordmark.png" width="100px" alt="Kamaitachi" />
|
||||
<svg class="splash-spinner" viewBox="0 0 50 50">
|
||||
<circle
|
||||
class="path"
|
||||
cx="25"
|
||||
cy="25"
|
||||
r="20"
|
||||
fill="none"
|
||||
stroke-width="5"
|
||||
></circle>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="layout-portal"></div>
|
||||
</body>
|
||||
</html>
|
||||
|
After Width: | Height: | Size: 712 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 499 KiB |
|
After Width: | Height: | Size: 255 KiB |
|
After Width: | Height: | Size: 236 KiB |
|
After Width: | Height: | Size: 579 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 200 KiB |
|
After Width: | Height: | Size: 292 KiB |
|
After Width: | Height: | Size: 433 KiB |
|
After Width: | Height: | Size: 396 KiB |
|
After Width: | Height: | Size: 149 KiB |
|
After Width: | Height: | Size: 102 KiB |
|
After Width: | Height: | Size: 489 KiB |
|
After Width: | Height: | Size: 230 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 303 KiB |
|
After Width: | Height: | Size: 149 KiB |
|
After Width: | Height: | Size: 189 KiB |
|
After Width: | Height: | Size: 346 KiB |
|
After Width: | Height: | Size: 172 KiB |
|
After Width: | Height: | Size: 273 KiB |
|
After Width: | Height: | Size: 338 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 241 KiB |
|
After Width: | Height: | Size: 138 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 663 KiB |
|
After Width: | Height: | Size: 380 KiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 257 KiB |
|
After Width: | Height: | Size: 258 KiB |
|
After Width: | Height: | Size: 342 KiB |
|
After Width: | Height: | Size: 258 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 8.8 KiB |
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 25.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 1080 1080" style="enable-background:new 0 0 1080 1080;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#E61C6E;}
|
||||
.st1{fill:#D1D0D1;}
|
||||
</style>
|
||||
<path class="st0" d="M310.57,596.05c1.33,0,93.27,0,93.27,0l76.38-131.46l188.75,0.89l36.42-62.62H424.26L310.57,596.05z"/>
|
||||
<polygon class="st1" points="768.8,482.62 732.82,546.58 549.48,547.88 501.04,547.88 526.13,581.5 468.36,677.65 374.92,677.65
|
||||
489.01,481.3 "/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 699 B |
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"public": "_site",
|
||||
"redirects": [],
|
||||
"rewrites": []
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"root": true,
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es6": true
|
||||
},
|
||||
"plugins": [
|
||||
"@typescript-eslint",
|
||||
"import"
|
||||
],
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"sourceType": "module",
|
||||
"ecmaVersion": 2020
|
||||
},
|
||||
"extends": [
|
||||
"eslint:recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"plugin:prettier/recommended",
|
||||
"plugin:import/typescript",
|
||||
"plugin:import/warnings",
|
||||
"plugin:import/errors"
|
||||
],
|
||||
"rules": {
|
||||
"prettier/prettier": [
|
||||
"error",
|
||||
{
|
||||
"printWidth": 100,
|
||||
"tabWidth": 4,
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"trailingComma": "es5",
|
||||
"bracketSpacing": true,
|
||||
"endOfLine": "auto",
|
||||
"useTabs": true
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/explicit-module-boundary-types": "off",
|
||||
"@typescript-eslint/no-non-null-assertion": "off",
|
||||
"@typescript-eslint/no-unused-vars": [
|
||||
"warn",
|
||||
{
|
||||
"argsIgnorePattern": "logger"
|
||||
}
|
||||
],
|
||||
"import/no-unresolved": "off",
|
||||
"require-await": "warn",
|
||||
"no-await-in-loop": "warn",
|
||||
"no-unused-labels": "error",
|
||||
"prefer-const": "error",
|
||||
"no-console": "error",
|
||||
"eqeqeq": "error",
|
||||
"no-eval": "error",
|
||||
"no-var": "error",
|
||||
"no-new-object": "error",
|
||||
"quote-props": [
|
||||
"error",
|
||||
"as-needed"
|
||||
],
|
||||
"no-array-constructor": "error",
|
||||
"prefer-template": "error",
|
||||
"prefer-promise-reject-errors": "error",
|
||||
"no-useless-escape": "error",
|
||||
"no-loop-func": "error",
|
||||
"prefer-rest-params": "error",
|
||||
"default-param-last": "error",
|
||||
"no-new-func": "error",
|
||||
"arrow-body-style": "error",
|
||||
"no-useless-constructor": "error",
|
||||
"no-duplicate-imports": "error",
|
||||
"dot-notation": "error",
|
||||
"space-before-blocks": "error",
|
||||
"no-prototype-builtins": "off",
|
||||
"prefer-arrow-callback": "error",
|
||||
"curly": "error",
|
||||
"no-template-curly-in-string": "error",
|
||||
"no-implied-eval": "error",
|
||||
"yoda": "error",
|
||||
"no-labels": "error",
|
||||
"no-useless-concat": "error",
|
||||
"radix": "error",
|
||||
"no-octal-escape": "error",
|
||||
"no-param-reassign": "error",
|
||||
"no-proto": "error",
|
||||
"no-return-await": "error",
|
||||
"no-throw-literal": "error",
|
||||
"no-unmodified-loop-condition": "error",
|
||||
"no-unused-expressions": "error",
|
||||
"no-useless-call": "error",
|
||||
"no-useless-return": "error",
|
||||
"require-unicode-regexp": "error"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import React, { Suspense } from "react";
|
||||
import { BrowserRouter } from "react-router-dom";
|
||||
import { Routes } from "./AppRoutes";
|
||||
import { LayoutSplashScreen, MaterialThemeProvider } from "../_metronic/layout";
|
||||
|
||||
export default function App({ basename }: { basename: string }) {
|
||||
return (
|
||||
<Suspense fallback={<LayoutSplashScreen />}>
|
||||
<BrowserRouter basename={basename}>
|
||||
<MaterialThemeProvider>
|
||||
<Routes />
|
||||
</MaterialThemeProvider>
|
||||
</BrowserRouter>
|
||||
</Suspense>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import React from "react";
|
||||
import { Switch, Route } from "react-router-dom";
|
||||
import { Layout } from "../_metronic/layout";
|
||||
import BasePage from "./BasePage";
|
||||
import { ErrorPage } from "./pages/ErrorPage";
|
||||
|
||||
/**
|
||||
* Core Routes for Tachi-Client.
|
||||
* These are things that involve redirecting to non-dashboard apps.
|
||||
*/
|
||||
export function Routes() {
|
||||
return (
|
||||
<Switch>
|
||||
// This should be removed - as it's only for debugging.
|
||||
<Route path="/error">
|
||||
<ErrorPage statusCode={404} />
|
||||
</Route>
|
||||
<Layout>
|
||||
<BasePage />
|
||||
</Layout>
|
||||
</Switch>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
import React, { Suspense } from "react";
|
||||
import { Redirect, Switch, Route } from "react-router-dom";
|
||||
import { LayoutSplashScreen } from "../_metronic/layout";
|
||||
import { DashboardPage } from "./pages/DashboardPage";
|
||||
|
||||
export default function BasePage() {
|
||||
return (
|
||||
<Suspense fallback={<LayoutSplashScreen />}>
|
||||
<Switch>
|
||||
<Redirect exact from="/" to="/dashboard" />
|
||||
|
||||
<Route path="/dashboard" component={DashboardPage} />
|
||||
<Redirect to="error" />
|
||||
</Switch>
|
||||
</Suspense>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import React from "react";
|
||||
|
||||
export function DashboardPage() {
|
||||
return <></>;
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
import React from "react";
|
||||
import { toAbsoluteUrl } from "../../_metronic/_helpers";
|
||||
import { Link } from "react-router-dom";
|
||||
|
||||
export function ErrorPage({ statusCode }: { statusCode: number }) {
|
||||
let message = "An unexpected error has occured. This has been reported!";
|
||||
|
||||
switch (statusCode) {
|
||||
case 400:
|
||||
message = "The server refused this request.";
|
||||
break;
|
||||
case 401:
|
||||
message = "Looks like you're not authorised. Try logging in.";
|
||||
break;
|
||||
case 403:
|
||||
message = "Looks like you're not allowed to be here.";
|
||||
break;
|
||||
case 404:
|
||||
message = "This page does not exist. If you think it should exist, let us know!";
|
||||
break;
|
||||
case 500:
|
||||
message = "Looks like the server has failed. This has been reported!";
|
||||
break;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="d-flex flex-column flex-root">
|
||||
<div
|
||||
className="d-flex flex-row-fluid flex-column bgi-size-cover bgi-position-center bgi-no-repeat p-10 p-sm-30"
|
||||
style={{
|
||||
backgroundImage: `url(${toAbsoluteUrl("/media/error/bg1.jpg")})`,
|
||||
}}
|
||||
>
|
||||
<h1
|
||||
className="font-size-sm-100 font-weight-boldest mt-15"
|
||||
style={{ fontSize: "150px" }}
|
||||
>
|
||||
{statusCode}
|
||||
</h1>
|
||||
<p className="font-size-h3 font-weight-light">{message}</p>
|
||||
<p>
|
||||
<Link to="/">Go Home.</Link>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
@import "./_metronic/_assets/sass/style.react.scss";
|
||||
|
||||
.example-highlight > pre {
|
||||
background: none transparent !important;
|
||||
margin: 0 !important;
|
||||
padding-top: 0.5rem;
|
||||
code {
|
||||
overflow-y: auto;
|
||||
display: block;
|
||||
|
||||
span {
|
||||
background: none transparent !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.json > pre {
|
||||
background: none #fff !important;
|
||||
}
|
||||
|
||||
.example-code > .json {
|
||||
background: none #fff !important;
|
||||
}
|
||||
|
||||
.symbol.symbol-45 > svg {
|
||||
width: 100%;
|
||||
max-width: 45px;
|
||||
height: 45px;
|
||||
}
|
||||
|
||||
.react-bootstrap-table {
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.react-bootstrap-table {
|
||||
th {
|
||||
outline: none;
|
||||
|
||||
&.sortable {
|
||||
.svg-icon-sort {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
|
||||
.svg-icon-sort {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.table.table-head-custom thead tr {
|
||||
.sortable-active {
|
||||
color: #6993ff !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.cursor-default {
|
||||
cursor: default !important;
|
||||
}
|
||||
|
||||
.display-block {
|
||||
display: block;
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* Create React App entry point. This and `public/index.html` files can not be
|
||||
* changed or moved.
|
||||
*/
|
||||
import React from "react";
|
||||
import ReactDOM from "react-dom";
|
||||
import App from "./app/App";
|
||||
import "./index.scss";
|
||||
import "./_metronic/_assets/plugins/keenthemes-icons/font/ki.css";
|
||||
import "socicon/css/socicon.css";
|
||||
import "@fortawesome/fontawesome-free/css/all.min.css";
|
||||
import "./_metronic/_assets/plugins/flaticon/flaticon.css";
|
||||
import "./_metronic/_assets/plugins/flaticon2/flaticon.css";
|
||||
import "react-datepicker/dist/react-datepicker.css";
|
||||
import { MetronicSplashScreenProvider, MetronicSubheaderProvider } from "./_metronic/layout";
|
||||
|
||||
const { PUBLIC_URL } = process.env;
|
||||
|
||||
ReactDOM.render(
|
||||
<MetronicSubheaderProvider>
|
||||
<MetronicSplashScreenProvider>
|
||||
<App basename={PUBLIC_URL} />
|
||||
</MetronicSplashScreenProvider>
|
||||
</MetronicSubheaderProvider>,
|
||||
document.getElementById("root")
|
||||
);
|
||||
@@ -0,0 +1,3 @@
|
||||
export interface JustChildren {
|
||||
children: JSX.Element[];
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "esnext",
|
||||
"outDir": "./dist/",
|
||||
"strictNullChecks": true,
|
||||
"moduleResolution": "node",
|
||||
"allowJs": true,
|
||||
"noEmit": true,
|
||||
"strict": true,
|
||||
"esModuleInterop": true,
|
||||
"jsx": "react",
|
||||
"baseUrl": "src",
|
||||
"lib": [
|
||||
"dom.iterable",
|
||||
"dom",
|
||||
"ESNext"
|
||||
],
|
||||
"module": "esnext",
|
||||
"removeComments": true,
|
||||
"alwaysStrict": true,
|
||||
"allowUnreachableCode": false,
|
||||
"noImplicitAny": true,
|
||||
"noImplicitThis": true,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"noImplicitReturns": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"importHelpers": true,
|
||||
"isolatedModules": true,
|
||||
"skipLibCheck": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"resolveJsonModule": true
|
||||
},
|
||||
"include": [
|
||||
"src"
|
||||
, "reference/GoogleMaterialExamples", "reference/widgets" ],
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
const path = require("path");
|
||||
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
||||
const WebpackMessages = require("webpack-messages");
|
||||
const del = require("del");
|
||||
|
||||
const rootPath = path.resolve(__dirname);
|
||||
const distPath = `${rootPath}/src`;
|
||||
|
||||
module.exports = () => [{
|
||||
mode: "development",
|
||||
stats: "errors-only",
|
||||
performance: {
|
||||
hints: true,
|
||||
},
|
||||
entry: {
|
||||
"sass/style.react": "./src/index.scss",
|
||||
},
|
||||
output: {
|
||||
// main output path in assets folder
|
||||
path: distPath,
|
||||
// output path based on the entries' filename
|
||||
filename: "[name].js",
|
||||
},
|
||||
resolve: { extensions: [".scss"], },
|
||||
plugins: [
|
||||
new WebpackMessages({
|
||||
name: "tachi-client",
|
||||
logger: str => console.log(`>> ${str}`),
|
||||
}),
|
||||
new MiniCssExtractPlugin({
|
||||
filename: "[name].css",
|
||||
}),
|
||||
{
|
||||
apply: compiler => {
|
||||
compiler.hooks.afterEmit.tap("AfterEmitPlugin", compilation => {
|
||||
(async () => {
|
||||
await del.sync(`${distPath}/sass/*.js`, { force: true });
|
||||
})();
|
||||
});
|
||||
},
|
||||
},
|
||||
],
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.scss$/,
|
||||
use: [
|
||||
MiniCssExtractPlugin.loader,
|
||||
"css-loader",
|
||||
{
|
||||
loader: "sass-loader",
|
||||
options: {
|
||||
sourceMap: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
}];
|
||||