Compare commits

...

10 Commits

Author SHA1 Message Date
Ashelyn Dawn 892fc92251
Added personal scripts, started refactor 6 months ago
Zonoia 4136ab7107
Merge pull request #18 from mikejonestechno/fix/dockerguide
fix DockerGuide to sync NetscriptDefinitions.d.ts
7 months ago
Mike Jones 915a891dd0 fix DockerGuide to sync NetscriptDefinitions.d.ts 7 months ago
Mike Jones 204fff76fe
Feature: add docker support (#17)
* feat: add docker support and powershell launch script

* feat: Add step to install Docker Desktop

* fix bind mount ns definitions for intelisense on host text editor

* Rename docker markdown file

* Minor updates to DockerGuide for improved clarity

* feat: reference docker support in the readme and beginners guide
7 months ago
Zonoia edc8be056d
Update filesync.json to synchronize deleted files by default 8 months ago
Alt 061c21a7f9
Merge pull request #16 from Pwntheon/feature/strongly_typed_react
Re-export strongly typed React and ReactDOM from the window object
10 months ago
Pwntheon 59d936d19b Add jsx support, readme instructions for using React 10 months ago
Pwntheon d92ca5f82e Reexport strongly typed React and ReactDOM from the window object
This gives access to the global React and ReactDOM objects in a strongly typed context.

The lib file is only included in the build output if it's actually imported and used somewhere, so it shouldn't pollute people's files unless they actually need it.

Unfortunately, i did not find a way to force vscode autoimport to use the local react.ts file instead of the package from node_modules.
10 months ago
Alt e67615b8b8
Merge pull request #15 from Pwntheon/main
Fix source maps to enable ingame debugging
10 months ago
Pwntheon eb10125442 Fix source maps to enable ingame debugging
The inlineSourceMap property was set to true, but due to a missing inlineSources flag, debugging the code ingame led to empty files being shown in the dev tools window.

Adding the inlineSources flag fixes this.

An argument was made that using source maps bloats the save file. This is true. However, if this is a significant issue, the inlineSourceMap flag should also be set to false. Before this fix, the file is already bloated, but ingame debugging is impossible.

To test, make a test script that includes the line `debugger;`. Enable debugging (F12) and run the script. Before this commit, it will show an empty source file. With this commit, it will show the .ts source file as expected.
10 months ago

@ -0,0 +1,8 @@
# Copy files to docker container but ignore the following
.*
*.md
src/
DOCKERFILE
# Following should not be on host but ignore anyway in case they exist for local debug
node_modules/
dist/

@ -3,6 +3,8 @@ This guide is mostly focused on Windows users (Mac instructions are given at som
If you're a Linux/Mac/Other user, there's an expectancy that you know your system and it's peculiarities compared to Windows.
If you need help with your particular system, feel free to ask for help in the Official Bitburner Discord.
Alternatively if you are familiar with docker, see [Docker install guide](DockerGuide.md) (optional) that installs nodejs and the Remote File API in an isolated container.
### 1. Backup your savegame (just in case)
- Augmentations -> Backup save

@ -0,0 +1,81 @@
# Docker Setup Guide
This guide is mostly focused on Windows users (Mac instructions are given at some places).
If you're a Linux/Mac/Other user, there's an expectancy that you know your system and it's peculiarities compared to Windows.
> This guide assumes you have a basic understanding of docker concepts and will be using Docker Desktop for Windows. If you want to use an alternative container management solution e.g. podman, there's an expectancy that you know your system and it's peculiarities compared to Docker Desktop.
**Use of docker is completely optional**. If you are not familiar with docker, or do not intend to run the file sync in a container, the [Beginners Guide](BeginnersGuide.md) manual setup is available.
If you need help with your particular system, feel free to ask for help in the Official Bitburner Discord.
## Running Remote API file sync in Docker
Docker is a virtualization layer that allows you to separate applications from underlying local host infrastructure, making application environments consistent and easier to manage.
You may want to use an isolated docker container for the Remote API instead of installing nodejs with the Remote API dependencies locally on your computer.
> This guide assumes you are familiar with docker fundamentals. You may need to modify these steps if using an alternative container management solution or if you want to include different docker options.
### 1. Backup your saved game (just in case)
- Bitburner > Options sidebar > click Export Game button.
### 2. Install Docker Desktop (if not already installed)
- Go to https://www.docker.com/products/docker-desktop/
- Download the version that's recommended for your OS.
- Install it. Just click next, next, next, next, finish.
### 3. Clone or download this project from GitHub:
- Go to https://github.com/bitburner-official/typescript-template
- Click the green 'Code' button
- If you are familiar with Git, clone the repository using the appropriate remote URL.
- If you're unfamiliar with Git and have no intention to use it, download the ZIP and extract it somewhere on your computer.
### 4. Create `NetscriptDefinitions.d.ts` file for intellisense auto-complete
- The definitions file is used for 'intellisense' or auto-complete in text editors.
- Create a file named `NetscriptDefinitions.d.ts` in your workspace. This is case sensitive. The contents of the file will be overwritten when you connect to bitburner so it doesn't matter what the file is, as long as it exists. The file should be in your project directory (same location as Dockerfile).
- If the file does not exist, the volume bind mount in the docker command will create a directory named `NetscriptDefinitions.d.ts` instead of a file, which is not what we want!
### 5. Run the bitburner-filesync docker container
- Start a command prompt / PowerShell / terminal session in your project workspace and enter:
```docker build -t bitburner-typescript .```
- Enter the following command to run the bitburner-filesync container using the bitburner-typescript image created above:
```docker run --rm -d -v "$($pwd)/src:/app/src" -v "$($pwd)/NetscriptDefinitions.d.ts:/app/NetscriptDefinitions.d.ts" -p 12525:12525 --name bitburner-filesync bitburner-typescript```
> NOTE: In a PowerShell terminal the `$($pwd)` resolves to the current directory but you can modify the command with full file path to the src directory if required.
> NOTE: If you view the container logs they may show "`error TS2307: Cannot find module '@ns' or its corresponding type declarations`". This is fine, the `NetscriptDefinitions.d.ts` will be downloaded from the game once successfully connected to bitburner.
### 6. Start Bitburner and configure the remote API connection
- Bitburner > Options sidebar > Remote API > type in the port `12525` and click connect. The icon should turn green and say it's online.
> NOTE: Your firewall may yell at you; allow the connection.
### 7. Test that the connection works
- In bitburner > terminal > enter `home` and then `ls` to list files on your home server.
- You should see the `src/template.ts` file from your local workspace was automatically compiled to `template.js` and synced to the root of your `home` server in Bitburner.
- In bitburner > terminal > enter `run template.js` and it should print the message `Hello Remote API!`.
- Edit the message in the original `src/template.ts` file in your local workspace (using your preferred text editor) and and save the file.
- The change should automatically sync to bitburner. In bitburner repeat `run template.js` and it should print your new message.
### 8. Thats it!
- You can now make and edit the files in your local `src` workspace, and they will be synced to Bitburner automatically.
> NOTE: do not use the internal bitburner 'nano' editor to change the files. You can use the 'nano' editor to view files but the remote API file sync is one way only, changes made in the bitburner 'nano' editor are not synced back to your local `src` workspace.
- You may want to manually stop the docker filesync container when you are done playing bitburner:
`docker stop bitburner-filesync`
## Launching Bitburner, VS Code and the filesync docker container!
Playing bitburner with an external editor is cool, but each time you want to play bitburner you need to start the docker engine, run the filesync container, open your editor (e.g. VS Code) and your bitburner scripts workspace, and then launch the bitburner game. Phew! If only all that could be automated too...
You may want to create a PowerShell, python or other batch script that will launch everything with one click. This is beyond the scope of this guide given that everyone may have their own favourite text editor, container management solution, and custom installation directories.
### For more information
Read the readme of this https://github.com/bitburner-official/typescript-template and feel free to ask in Bitburner Discord channel `#external-editors:` https://discord.com/channels/415207508303544321/923428435618058311

@ -0,0 +1,20 @@
# Use the official Node.js image as the base image
FROM node:latest
# Create a working directory inside the container
WORKDIR /app
# Copy the package.json and package-lock.json to the container
COPY package*.json ./
# Install application dependencies
RUN npm install
# Copy all files to the container (but ignore paths specified in .dockerignore)
COPY . /app/
# Expose the port the filesync will listen on
EXPOSE 12525
# Run filesync watch when the container starts
CMD npm run watch

@ -4,19 +4,23 @@ The official template for synchronizing Typescript/Javascript from your computer
[Step by step install](BeginnersGuide.md)
[Docker install guide](DockerGuide.md) (optional)
[Learn more about Typescript](https://www.typescriptlang.org/docs/)
## About
This template uses the Typescript compiler and the Remote File API system to synchronize Typescript to your game.
Due to the usage of the RFA system, it works with Web and Electron versions of the game.
Due to the usage of the RFA system, it works with Web and Electron (Steam) versions of the game.
## Prerequisites
[Node.js](https://nodejs.org/en/download/) is needed for compiling typescript and installing dependencies
[Node.js](https://nodejs.org/en/download/) is needed for compiling typescript and installing dependencies.
[See here for step by step installation](BeginnersGuide.md) if you'd like help with installing Node and/or connecting to the game.
Alternatively see [Docker install guide](DockerGuide.md) (optional) that installs nodejs and the Remote File API in an isolated container.
## Quick start
Download the template to your computer and install everything it requires:
@ -38,6 +42,8 @@ in the Remote API section of the game settings, and press the connect button.
[See here for step by step installation](BeginnersGuide.md) if you'd like help with installing Node and/or connecting to the game.
Alternatively see [Docker install guide](DockerGuide.md) (optional) that installs nodejs and the Remote File API in an isolated container.
## Advanced
### Imports
@ -70,3 +76,27 @@ import { someFunction } from "main";
### Debugging
For debugging bitburner on Steam you will need to enable a remote debugging port. This can be done by rightclicking bitburner in your Steam library and selecting properties. There you need to add `--remote-debugging-port=9222` [Thanks @DarkMio]
### Using React
Some `ns` functions, like [`ns.printRaw()`](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.ns.printraw.md) allows you to render React components into the game interface.
The game already exposes the `React` and `ReactDOM` objects globally, but in order to work with strongly typed versions in `.ts` files, you can use the included typings. To do this, use the following import:
`import React, { ReactDOM } from '@react'`
Support for jsx is also included, so if you use the `.tsx` file ending, you can do something like:
```ts
import { NS } from '@ns';
import React from '@react';
interface IMyContentProps {
name: string
}
const MyContent = ({name}: IMyContentProps) => <span>Hello {name}</span>;
export default async function main(ns: NS){
ns.printRaw(<MyContent name="Your name"></MyContent>);
}
```

@ -1,6 +1,10 @@
{
"allowedFiletypes": [".js", ".script", ".txt"],
"allowDeletingFiles": false,
"allowedFiletypes": [
".js",
".script",
".txt"
],
"allowDeletingFiles": true,
"port": 12525,
"scriptsFolder": "dist",
"quiet": false,
@ -8,5 +12,6 @@
"definitionFile": {
"update": true,
"location": "NetscriptDefinitions.d.ts"
}
},
"pushAllOnConnection": false
}

78
package-lock.json generated

@ -8,6 +8,8 @@
"name": "bitburner-typescript-template",
"version": "2.0.0",
"devDependencies": {
"@types/react": "^18.2.18",
"@types/react-dom": "^18.2.7",
"@typescript-eslint/eslint-plugin": "^5.35.1",
"@typescript-eslint/parser": "^5.35.1",
"bitburner-filesync": "^1.1.5",
@ -110,6 +112,38 @@
"integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
"dev": true
},
"node_modules/@types/prop-types": {
"version": "15.7.5",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
"integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
"dev": true
},
"node_modules/@types/react": {
"version": "18.2.18",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.18.tgz",
"integrity": "sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==",
"dev": true,
"dependencies": {
"@types/prop-types": "*",
"@types/scheduler": "*",
"csstype": "^3.0.2"
}
},
"node_modules/@types/react-dom": {
"version": "18.2.7",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz",
"integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==",
"dev": true,
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/scheduler": {
"version": "0.16.3",
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
"integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==",
"dev": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "5.35.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.35.1.tgz",
@ -630,6 +664,12 @@
"node": ">= 8"
}
},
"node_modules/csstype": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
"integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==",
"dev": true
},
"node_modules/date-fns": {
"version": "2.29.3",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz",
@ -2205,6 +2245,38 @@
"integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
"dev": true
},
"@types/prop-types": {
"version": "15.7.5",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
"integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
"dev": true
},
"@types/react": {
"version": "18.2.18",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.18.tgz",
"integrity": "sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==",
"dev": true,
"requires": {
"@types/prop-types": "*",
"@types/scheduler": "*",
"csstype": "^3.0.2"
}
},
"@types/react-dom": {
"version": "18.2.7",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz",
"integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==",
"dev": true,
"requires": {
"@types/react": "*"
}
},
"@types/scheduler": {
"version": "0.16.3",
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
"integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==",
"dev": true
},
"@typescript-eslint/eslint-plugin": {
"version": "5.35.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.35.1.tgz",
@ -2547,6 +2619,12 @@
"which": "^2.0.1"
}
},
"csstype": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
"integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==",
"dev": true
},
"date-fns": {
"version": "2.29.3",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz",

@ -11,6 +11,8 @@
},
"author": "hydroflame, Hoekstraa, based on work by SlyCedix",
"devDependencies": {
"@types/react": "^18.2.18",
"@types/react-dom": "^18.2.7",
"@typescript-eslint/eslint-plugin": "^5.35.1",
"@typescript-eslint/parser": "^5.35.1",
"bitburner-filesync": "^1.1.5",

@ -0,0 +1,5 @@
export async function main(ns) {
while (true) {
await ns.hack(ns.getHostname());
}
}

@ -0,0 +1,10 @@
import ReactNamespace from 'react/index';
import ReactDomNamespace from 'react-dom';
const React = window.React as typeof ReactNamespace;
const ReactDOM = window.ReactDOM as typeof ReactDomNamespace;
export default React;
export {
ReactDOM
}

@ -0,0 +1,18 @@
import { NS } from "@ns";
import { getControllerState } from "/lib/types-and-constants";
export function printStatus(ns : NS) {
const currentHackingLevel = ns.getHackingLevel()
const {knownServers} = getControllerState(ns)
const numServers = knownServers.length
const rootedServers = knownServers.filter(server => server.hasAdminRights).length
const backdooredServers = knownServers.filter(server => server.backdoorInstalled).length
const hackableServers = knownServers.filter(server => server.requiredHackingSkill && server.requiredHackingSkill <= currentHackingLevel).length
ns.print(`INFO: Current topology stats:\n`)
ns.print(` - known: ${numServers}`)
ns.print(` - hackable: ${hackableServers}`)
ns.print(` - rooted: ${rootedServers}`)
ns.print(` - backdoored: ${backdooredServers}`)
}

@ -0,0 +1,32 @@
import { NS, Server } from "@ns"
const datafile = "/data-state.txt"
interface ControllerState {
knownServers: Server[],
assignments: {
[droneHostname: string]: {
targetHostname: string,
attackMode: 'grow' | 'hack' | 'weaken',
}
},
previousAssignments: {
[droneHostname: string]: {
targetHostname: string,
attackMode: 'grow' | 'hack' | 'weaken',
}
}
}
export function getControllerState(ns : NS) : ControllerState {
return JSON.parse(ns.read(datafile) || `{
"knownServers": [],
"assignments": {},
"previousAssignments": {}
}`)
}
export function setControllerState(ns : NS, state : ControllerState) {
ns.write(datafile, JSON.stringify(state), 'w')
}

@ -0,0 +1,42 @@
import { NS } from "@ns";
import { printStatus } from "/lib/status";
const phaseScripts = [
'/tasks/01-discovery.js',
'/tasks/02-breaching.js',
'/tasks/03-targeting.js',
'/tasks/04-propogation.js',
]
const numPhases = phaseScripts.length
let currentPhase = 0
let pid = -1
export async function main(ns : NS) : Promise<void> {
ns.disableLog('ALL')
ns.tail()
ns.resizeTail(600, 200)
while (true) {
// Print status
ns.clearLog()
ns.print("currentPhase: " + phaseScripts[currentPhase])
printStatus(ns)
// If current phase is still running, delay and continue
if (ns.isRunning(pid)) {
await ns.sleep(100)
continue
}
// Advance to next phase
currentPhase = (currentPhase + 1) % numPhases
pid = ns.run(phaseScripts[currentPhase])
// In case of error
if (!pid) {
ns.print("Error starting " + phaseScripts[currentPhase])
break
}
}
}

@ -0,0 +1,34 @@
import { NS } from "@ns";
import { getControllerState, setControllerState } from "/lib/types-and-constants";
/** @param {NS} ns */
export async function main(ns : NS) : Promise<void> {
const datafileState = getControllerState(ns)
ns.print("INFO Starting automated scan . . .\n")
let foundServers : string[] = []
let serversToScan = datafileState.knownServers.map(server => server.hostname)
if(!serversToScan.length) {
serversToScan = ['home']
}
while (serversToScan.length) {
const currentServer = serversToScan.shift() as string
if(foundServers.includes(currentServer)) continue
foundServers = [...foundServers, currentServer]
ns.print(`INFO Scanning from ${currentServer}\n`)
const newVisibleServers = ns.scan(currentServer)
.filter(server => !foundServers.includes(server))
serversToScan = [...serversToScan, ...newVisibleServers]
if(newVisibleServers.length > 0)
ns.print(`SUCCESS - Discovered ${newVisibleServers.length} new servers to add to scan list\n`)
}
datafileState.knownServers = foundServers.map(ns.getServer)
setControllerState(ns, datafileState)
}

@ -0,0 +1,62 @@
import { NS } from "@ns";
import { getControllerState, setControllerState } from "/lib/types-and-constants";
export async function main(ns : NS) : Promise<void> {
const datafileState = getControllerState(ns)
const {knownServers} = datafileState
const portConfigs = [{
openProperty: 'sshPortOpen',
program: 'BruteSSH.exe',
func: ns.brutessh
}, {
openProperty: 'ftpPortOpen',
program: 'FTPCrack.exe',
func: ns.ftpcrack
}, {
openProperty: 'sqlPortOpen',
program: 'SQLInject.exe',
func: ns.sqlinject
}, {
openProperty: 'httpPortOpen',
program: 'HTTPWorm.exe',
func: ns.httpworm
}, {
openProperty: 'smtpPortOpen',
program: 'relaySMTP.exe',
func: ns.relaysmtp
}]
for (const server of knownServers) {
if (server.hostname === 'home' || server.hasAdminRights)
continue
const requiredPorts = server.numOpenPortsRequired ?? 0
const alreadyOpen = server.openPortCount ?? 0
const openablePorts = portConfigs.filter(port =>
!(server as any)[port.openProperty]
&& ns.fileExists(port.program))
const numberCanOpen = openablePorts.length
if (alreadyOpen + numberCanOpen < requiredPorts) {
ns.print(`WARN: Unable to nuke ${server.hostname}, cannot open enough ports (${alreadyOpen} + ${numberCanOpen} < ${requiredPorts})`)
continue
}
for (const port of openablePorts) {
ns.tprint(`INFO: Opening ${port.openProperty.replace('PortOpen', '')} on ${server.hostname}`)
port.func(server.hostname);
(server as any)[port.openProperty] = true
}
ns.tprint(`SUCCESS: Nuking ${server.hostname}`)
ns.nuke(server.hostname)
server.hasAdminRights = true
}
setControllerState(ns, {
...datafileState,
knownServers
})
}

@ -0,0 +1,5 @@
import { NS } from "@ns";
export async function main(ns : NS) : Promise<void> {
}

@ -0,0 +1,26 @@
import { NS } from "@ns";
import { getControllerState } from "/lib/types-and-constants";
export async function main(ns : NS) : Promise<void> {
const {knownServers} = getControllerState(ns)
const playerHackingSkill = ns.getHackingLevel()
for (const server of knownServers) {
if(!server.hasAdminRights || server.hostname === 'home')
continue
if(server.requiredHackingSkill > playerHackingSkill)
continue
ns.scp('auto-hack.js', server.hostname)
const ramCost = ns.getScriptRam('auto-hack.js')
const ramAvail = server.maxRam - server.ramUsed
const numThreads = Math.floor(ramAvail / ramCost)
if (numThreads < 1)
continue
ns.exec('auto-hack.js', server.hostname, numThreads)
}
await ns.sleep(10000)
}

@ -1,5 +0,0 @@
import { NS } from "@ns";
export async function main(ns: NS): Promise<void> {
ns.tprint("Hello Remote API!");
}

@ -1,5 +1,6 @@
{
"include": ["NetscriptDefinitions.d.ts", "src/**/*"],
"exclude": ["src/lib/react.ts"],
"compilerOptions": {
"module": "esnext",
"target": "esnext",
@ -8,14 +9,17 @@
"noImplicitThis": true,
"esModuleInterop": true,
"inlineSourceMap": true,
"inlineSources": true,
"strict": true,
"rootDir": "src/",
"outDir": "dist/",
"baseUrl": "src/",
"allowJs": true,
"jsx": "react",
"paths": {
"/*": ["*"],
"@ns": ["../NetscriptDefinitions.d.ts"]
"@ns": ["../NetscriptDefinitions.d.ts"],
"@react": ["lib/react.ts"]
}
}
}

Loading…
Cancel
Save