@ -0,0 +1,42 @@
|
||||
# See http://help.github.com/ignore-files/ for more about ignoring files.
|
||||
|
||||
# Compiled output
|
||||
/dist
|
||||
/tmp
|
||||
/out-tsc
|
||||
/bazel-out
|
||||
|
||||
# Node
|
||||
/node_modules
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
|
||||
# IDEs and editors
|
||||
.idea/
|
||||
.project
|
||||
.classpath
|
||||
.c9/
|
||||
*.launch
|
||||
.settings/
|
||||
*.sublime-workspace
|
||||
|
||||
# Visual Studio Code
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
.history/*
|
||||
|
||||
# Miscellaneous
|
||||
/.angular/cache
|
||||
.sass-cache/
|
||||
/connect.lock
|
||||
/coverage
|
||||
/libpeerconnection.log
|
||||
testem.log
|
||||
/typings
|
||||
|
||||
# System files
|
||||
.DS_Store
|
||||
Thumbs.db
|
@ -0,0 +1,7 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"tauri-apps.tauri-vscode",
|
||||
"rust-lang.rust-analyzer",
|
||||
"angular.ng-template"
|
||||
]
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
# Tauri + Yew
|
||||
|
||||
This template should help get you started developing with Tauri and Angular.
|
||||
|
||||
## Recommended IDE Setup
|
||||
|
||||
[VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) + [Angular Language Service](https://marketplace.visualstudio.com/items?itemName=Angular.ng-template).
|
@ -0,0 +1,69 @@
|
||||
{
|
||||
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
|
||||
"version": 1,
|
||||
"newProjectRoot": "projects",
|
||||
"projects": {
|
||||
"Nothing": {
|
||||
"root": "",
|
||||
"projectType": "application",
|
||||
"sourceRoot": "src",
|
||||
"prefix": "app",
|
||||
"architect": {
|
||||
"build": {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
"options": {
|
||||
"outputPath": "dist/Nothing",
|
||||
"index": "src/index.html",
|
||||
"main": "src/main.ts",
|
||||
"polyfills": ["zone.js"],
|
||||
"tsConfig": "tsconfig.app.json",
|
||||
"assets": ["src/favicon.ico", "src/assets"],
|
||||
"styles": ["src/styles.css"],
|
||||
"scripts": []
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"budgets": [
|
||||
{
|
||||
"type": "initial",
|
||||
"maximumWarning": "500kb",
|
||||
"maximumError": "1mb"
|
||||
},
|
||||
{
|
||||
"type": "anyComponentStyle",
|
||||
"maximumWarning": "2kb",
|
||||
"maximumError": "4kb"
|
||||
}
|
||||
],
|
||||
"outputHashing": "all"
|
||||
},
|
||||
"development": {
|
||||
"buildOptimizer": false,
|
||||
"optimization": false,
|
||||
"vendorChunk": true,
|
||||
"extractLicenses": false,
|
||||
"sourceMap": true,
|
||||
"namedChunks": true
|
||||
}
|
||||
},
|
||||
"defaultConfiguration": "production"
|
||||
},
|
||||
"serve": {
|
||||
"builder": "@angular-devkit/build-angular:dev-server",
|
||||
"configurations": {
|
||||
"production": {
|
||||
"browserTarget": "Nothing:build:production"
|
||||
},
|
||||
"development": {
|
||||
"browserTarget": "Nothing:build:development"
|
||||
}
|
||||
},
|
||||
"defaultConfiguration": "development"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"cli": {
|
||||
"analytics": false
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
{
|
||||
"name": "tauri-app",
|
||||
"version": "0.0.0",
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
"start": "ng serve",
|
||||
"build": "ng build",
|
||||
"watch": "ng build --watch --configuration development"
|
||||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@angular/animations": "^15.2.0",
|
||||
"@angular/common": "^15.2.0",
|
||||
"@angular/compiler": "^15.2.0",
|
||||
"@angular/core": "^15.2.0",
|
||||
"@angular/forms": "^15.2.0",
|
||||
"@angular/platform-browser": "^15.2.0",
|
||||
"@angular/platform-browser-dynamic": "^15.2.0",
|
||||
"@tauri-apps/api": "^1.2.0",
|
||||
"rxjs": "~7.8.0",
|
||||
"tslib": "^2.3.0",
|
||||
"zone.js": "~0.12.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "^15.2.0",
|
||||
"@angular/cli": "~15.2.0",
|
||||
"@angular/compiler-cli": "^15.2.0",
|
||||
"@tauri-apps/cli": "^1.4.0",
|
||||
"@types/jasmine": "~4.3.0",
|
||||
"jasmine-core": "~4.5.0",
|
||||
"karma": "~6.4.0",
|
||||
"karma-chrome-launcher": "~3.1.0",
|
||||
"karma-coverage": "~2.2.0",
|
||||
"karma-jasmine": "~5.1.0",
|
||||
"karma-jasmine-html-reporter": "~2.0.0",
|
||||
"typescript": "~4.9.4"
|
||||
}
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
# Generated by Cargo
|
||||
# will have compiled files and executables
|
||||
/target/
|
||||
|
@ -0,0 +1,31 @@
|
||||
[package]
|
||||
name = "Nothing"
|
||||
version = "0.0.0"
|
||||
description = "A Tauri App"
|
||||
authors = ["you"]
|
||||
license = ""
|
||||
repository = ""
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "1.2", features = [] }
|
||||
|
||||
[dependencies]
|
||||
tauri = { version = "1.2", features = ["shell-open"] }
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
Underlayer = { git = "https://git.isark.me/isark/Underlay.git" }
|
||||
# Underlayer = { path = "/home/isark/DEV/Underlayer"}
|
||||
log = "0.4.19"
|
||||
simple_logger = "4.2.0"
|
||||
|
||||
x11rb = "0.12.0"
|
||||
raw-window-handle = "0.5.2"
|
||||
|
||||
|
||||
[features]
|
||||
# this feature is used for production builds or when `devPath` points to the filesystem
|
||||
# DO NOT REMOVE!!
|
||||
custom-protocol = ["tauri/custom-protocol"]
|
@ -0,0 +1,3 @@
|
||||
fn main() {
|
||||
tauri_build::build()
|
||||
}
|
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 974 B |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 903 B |
After Width: | Height: | Size: 8.4 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 85 KiB |
After Width: | Height: | Size: 14 KiB |
@ -0,0 +1,155 @@
|
||||
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
|
||||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||
|
||||
use std::{sync::Mutex, time::Duration};
|
||||
|
||||
use log::Level;
|
||||
use overlay::{Overlay, Manager};
|
||||
use tauri::{LogicalSize, Manager, PhysicalPosition, PhysicalSize, Window};
|
||||
use underlayer::Bounds;
|
||||
use x11rb::protocol::xproto::ConnectionExt;
|
||||
|
||||
// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
|
||||
#[tauri::command]
|
||||
fn greet(name: &str) -> String {
|
||||
format!("Hello, {}! You've been greeted from Rust!", name)
|
||||
}
|
||||
|
||||
mod overlay;
|
||||
|
||||
fn show(window: &Window) {
|
||||
window.set_always_on_top(true);
|
||||
window.show();
|
||||
window.set_resizable(true);
|
||||
|
||||
if let Ok(mut state) = window.state::<RuntimeWrapper>().lock() {
|
||||
if state.bounds.height == 0 || state.bounds.width == 0 {
|
||||
return;
|
||||
}
|
||||
|
||||
window
|
||||
.set_position(PhysicalPosition {
|
||||
x: state.bounds.x,
|
||||
y: state.bounds.y,
|
||||
})
|
||||
.expect("msg");
|
||||
window
|
||||
.set_size(PhysicalSize {
|
||||
width: state.bounds.width,
|
||||
height: state.bounds.height,
|
||||
})
|
||||
.expect("msg");
|
||||
}
|
||||
std::thread::spawn(|| {
|
||||
std::thread::sleep(Duration::from_millis(50));
|
||||
underlayer::focus_target();
|
||||
});
|
||||
}
|
||||
|
||||
fn hide(window: &Window) {
|
||||
window.hide();
|
||||
window.set_resizable(false);
|
||||
}
|
||||
|
||||
type RuntimeWrapper = Mutex<Overlay>;
|
||||
|
||||
fn main() {
|
||||
simple_logger::init_with_level(Level::Info).expect("Could not initialize simple_logger");
|
||||
|
||||
tauri::Builder::default()
|
||||
.manage(Mutex::new(Overlay {
|
||||
should_take_focus: false,
|
||||
bounds: Bounds {
|
||||
x: 0,
|
||||
y: 0,
|
||||
width: 0,
|
||||
height: 0,
|
||||
},
|
||||
}))
|
||||
.setup(|app| {
|
||||
let window = app.get_window("Overlay").unwrap();
|
||||
window.set_min_size::<LogicalSize<i32>>(None);
|
||||
let window2 = window.clone();
|
||||
window.on_window_event(move |e| match e {
|
||||
tauri::WindowEvent::Focused(focus) => {
|
||||
if *focus {
|
||||
if let Ok(runtime) = window2.state::<RuntimeWrapper>().lock() {
|
||||
if !runtime.should_take_focus {
|
||||
window2.set_ignore_cursor_events(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
});
|
||||
|
||||
Manager::init(
|
||||
app.get_window("Overlay")
|
||||
.expect("Could not get main overlay window"),
|
||||
"Untitled 1 - Mousepad",
|
||||
);
|
||||
|
||||
std::thread::spawn(move || {
|
||||
log::info!("Running event thread");
|
||||
let mut target_is_focused = false;
|
||||
|
||||
let underlay: std::sync::mpsc::Receiver<underlayer::UnderlayEvent> =
|
||||
underlayer::register("Untitled 1 - Mousepad");
|
||||
while let Ok(event) = underlay.recv() {
|
||||
log::info!("Got event: {event:?}");
|
||||
match event {
|
||||
underlayer::UnderlayEvent::Attach {
|
||||
bounds,
|
||||
has_access,
|
||||
is_fullscreen,
|
||||
} => {
|
||||
if let Ok(mut state) = window.state::<RuntimeWrapper>().lock() {
|
||||
state.bounds = bounds;
|
||||
}
|
||||
}
|
||||
underlayer::UnderlayEvent::Detach => {
|
||||
hide(&window);
|
||||
}
|
||||
underlayer::UnderlayEvent::MoveResize(bounds) => {
|
||||
if let Ok(mut state) = window.state::<RuntimeWrapper>().lock() {
|
||||
state.bounds = bounds;
|
||||
|
||||
if bounds.height == 0 || bounds.width == 0 {
|
||||
return;
|
||||
}
|
||||
|
||||
window
|
||||
.set_position(PhysicalPosition {
|
||||
x: bounds.x,
|
||||
y: bounds.y,
|
||||
})
|
||||
.expect("msg");
|
||||
window
|
||||
.set_size(PhysicalSize {
|
||||
width: bounds.width + 10,
|
||||
height: bounds.height,
|
||||
})
|
||||
.expect("msg");
|
||||
}
|
||||
}
|
||||
underlayer::UnderlayEvent::Focus => {
|
||||
target_is_focused = true;
|
||||
show(&window);
|
||||
}
|
||||
underlayer::UnderlayEvent::Blur => {
|
||||
target_is_focused = false;
|
||||
if !window.is_focused().unwrap() {
|
||||
hide(&window);
|
||||
}
|
||||
}
|
||||
underlayer::UnderlayEvent::X11FullscreenEvent { is_fullscreen } => {}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Ok(())
|
||||
})
|
||||
.invoke_handler(tauri::generate_handler![greet])
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
}
|
@ -0,0 +1,65 @@
|
||||
use std::{sync::{Arc, Mutex}, marker::PhantomData};
|
||||
|
||||
use tauri::{Manager as TManager, Window};
|
||||
use underlayer::{Bounds, UnderlayEvent};
|
||||
|
||||
pub struct Overlay {
|
||||
should_take_focus: bool,
|
||||
bounds: Bounds,
|
||||
}
|
||||
|
||||
pub struct Manager<State> {
|
||||
window: Window,
|
||||
should_take_focus: bool,
|
||||
bounds: Bounds,
|
||||
state: PhantomData<State>
|
||||
}
|
||||
|
||||
pub type ManagerData = Arc<Mutex<Manager>>;
|
||||
|
||||
impl<S> Manager<S> {
|
||||
pub fn init(window: Window, target_label: &str) {
|
||||
std::thread::spawn(move || {
|
||||
let manager = Arc::new(Mutex::new(Manager {
|
||||
window,
|
||||
should_take_focus: false,
|
||||
bounds: Default::default(),
|
||||
state: PhantomData,
|
||||
}));
|
||||
|
||||
let app = window.app_handle();
|
||||
let underlay_rx = underlayer::register(target_label);
|
||||
app.manage(manager.clone());
|
||||
|
||||
while let Ok(event) = underlay_rx.recv() {
|
||||
app.state::<ManagerData>().lock().and_then(|mut manager| {
|
||||
manager.on_event(event);
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
fn on_event(&mut self, event: UnderlayEvent) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
struct Visible;
|
||||
struct Interactable;
|
||||
struct Hidden;
|
||||
|
||||
/*
|
||||
|
||||
should_take_focus
|
||||
|
||||
|
||||
Overlay visible
|
||||
|
||||
Overlay interactable
|
||||
|
||||
Overlay hidden
|
||||
|
||||
*/
|
@ -0,0 +1,52 @@
|
||||
{
|
||||
"build": {
|
||||
"beforeDevCommand": "yarn start --port 1420",
|
||||
"beforeBuildCommand": "yarn build",
|
||||
"devPath": "http://localhost:1420",
|
||||
"distDir": "../dist/Nothing",
|
||||
"withGlobalTauri": false
|
||||
},
|
||||
"package": {
|
||||
"productName": "Nothing",
|
||||
"version": "0.0.0"
|
||||
},
|
||||
"tauri": {
|
||||
"allowlist": {
|
||||
"all": false,
|
||||
"shell": {
|
||||
"all": false,
|
||||
"open": true
|
||||
}
|
||||
},
|
||||
"bundle": {
|
||||
"active": true,
|
||||
"icon": [
|
||||
"icons/32x32.png",
|
||||
"icons/128x128.png",
|
||||
"icons/128x128@2x.png",
|
||||
"icons/icon.icns",
|
||||
"icons/icon.ico"
|
||||
],
|
||||
"identifier": "me.isark.poe.Nothing",
|
||||
"targets": "all"
|
||||
},
|
||||
"security": {
|
||||
"csp": null
|
||||
},
|
||||
"updater": {
|
||||
"active": false
|
||||
},
|
||||
"windows": [
|
||||
{
|
||||
"title": "Nothing",
|
||||
"label": "Overlay",
|
||||
"transparent": true,
|
||||
"visible": false,
|
||||
"decorations": false,
|
||||
"alwaysOnTop": true,
|
||||
"resizable": false,
|
||||
"focus": false
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
.logo.angular:hover {
|
||||
filter: drop-shadow(0 0 2em #e32727);
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
<div class="container">
|
||||
<h1>Welcome to Tauri + Angular!</h1>
|
||||
<div class="row">
|
||||
<a href="https://tauri.app" target="_blank">
|
||||
<img src="/assets/tauri.svg" class="logo tauri" alt="Tauri logo" />
|
||||
</a>
|
||||
<a href="https://angular.io" target="_blank">
|
||||
<img src="/assets/angular.svg" class="logo angular" alt="Angular logo" />
|
||||
</a>
|
||||
</div>
|
||||
<p>Click on the logos to learn more about the frameworks</p>
|
||||
<div class="row">
|
||||
<form (submit)="greet($event, greetInput.value)">
|
||||
<input #greetInput id="greet-input" placeholder="Enter a name..." />
|
||||
<button type="submit">Greet</button>
|
||||
</form>
|
||||
</div>
|
||||
<p>{{ greetingMessage }}</p>
|
||||
</div>
|
@ -0,0 +1,20 @@
|
||||
import { Component } from "@angular/core";
|
||||
import { invoke } from "@tauri-apps/api/tauri";
|
||||
|
||||
@Component({
|
||||
selector: "app-root",
|
||||
templateUrl: "./app.component.html",
|
||||
styleUrls: ["./app.component.css"],
|
||||
})
|
||||
export class AppComponent {
|
||||
greetingMessage = "";
|
||||
|
||||
greet(event: SubmitEvent, name: string): void {
|
||||
event.preventDefault();
|
||||
|
||||
// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
|
||||
invoke<string>("greet", { name }).then((text) => {
|
||||
this.greetingMessage = text;
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
import { NgModule } from "@angular/core";
|
||||
import { BrowserModule } from "@angular/platform-browser";
|
||||
|
||||
import { AppComponent } from "./app.component";
|
||||
|
||||
@NgModule({
|
||||
declarations: [AppComponent],
|
||||
imports: [BrowserModule],
|
||||
providers: [],
|
||||
bootstrap: [AppComponent],
|
||||
})
|
||||
export class AppModule {}
|
After Width: | Height: | Size: 882 B |
After Width: | Height: | Size: 2.5 KiB |
@ -0,0 +1,12 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>TauriApp</title>
|
||||
<base href="/" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<app-root></app-root>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,7 @@
|
||||
import { platformBrowserDynamic } from "@angular/platform-browser-dynamic";
|
||||
|
||||
import { AppModule } from "./app/app.module";
|
||||
|
||||
platformBrowserDynamic()
|
||||
.bootstrapModule(AppModule)
|
||||
.catch((err) => console.error(err));
|
@ -0,0 +1,109 @@
|
||||
:root {
|
||||
font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
font-weight: 400;
|
||||
|
||||
color: #0f0f0f;
|
||||
background-color: #f6f6f6;
|
||||
|
||||
font-synthesis: none;
|
||||
text-rendering: optimizeLegibility;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
}
|
||||
|
||||
.container {
|
||||
margin: 0;
|
||||
padding-top: 10vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.logo {
|
||||
height: 6em;
|
||||
padding: 1.5em;
|
||||
will-change: filter;
|
||||
transition: 0.75s;
|
||||
}
|
||||
|
||||
.logo.tauri:hover {
|
||||
filter: drop-shadow(0 0 2em #24c8db);
|
||||
}
|
||||
|
||||
.row {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
a {
|
||||
font-weight: 500;
|
||||
color: #646cff;
|
||||
text-decoration: inherit;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #535bf2;
|
||||
}
|
||||
|
||||
h1 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
input,
|
||||
button {
|
||||
border-radius: 8px;
|
||||
border: 1px solid transparent;
|
||||
padding: 0.6em 1.2em;
|
||||
font-size: 1em;
|
||||
font-weight: 500;
|
||||
font-family: inherit;
|
||||
color: #0f0f0f;
|
||||
background-color: #ffffff;
|
||||
transition: border-color 0.25s;
|
||||
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
button {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
border-color: #396cd8;
|
||||
}
|
||||
button:active {
|
||||
border-color: #396cd8;
|
||||
background-color: #e8e8e8;
|
||||
}
|
||||
|
||||
input,
|
||||
button {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
#greet-input {
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
color: #f6f6f6;
|
||||
background-color: #2f2f2f;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #24c8db;
|
||||
}
|
||||
|
||||
input,
|
||||
button {
|
||||
color: #ffffff;
|
||||
background-color: #0f0f0f98;
|
||||
}
|
||||
button:active {
|
||||
background-color: #0f0f0f69;
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
/* To learn more about this file see: https://angular.io/config/tsconfig. */
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "./out-tsc/app",
|
||||
"types": []
|
||||
},
|
||||
"files": ["src/main.ts"],
|
||||
"include": ["src/**/*.d.ts"]
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
/* To learn more about this file see: https://angular.io/config/tsconfig. */
|
||||
{
|
||||
"compileOnSave": false,
|
||||
"compilerOptions": {
|
||||
"baseUrl": "./",
|
||||
"outDir": "./dist/out-tsc",
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"strict": true,
|
||||
"noImplicitOverride": true,
|
||||
"noPropertyAccessFromIndexSignature": true,
|
||||
"noImplicitReturns": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"sourceMap": true,
|
||||
"declaration": false,
|
||||
"downlevelIteration": true,
|
||||
"experimentalDecorators": true,
|
||||
"moduleResolution": "node",
|
||||
"importHelpers": true,
|
||||
"target": "ES2022",
|
||||
"module": "ES2022",
|
||||
"useDefineForClassFields": false,
|
||||
"lib": ["ES2022", "dom"]
|
||||
},
|
||||
"angularCompilerOptions": {
|
||||
"enableI18nLegacyMessageIdFormat": false,
|
||||
"strictInjectionParameters": true,
|
||||
"strictInputAccessModifiers": true,
|
||||
"strictTemplates": true
|
||||
}
|
||||
}
|