@lunnos/hyt 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +131 -0
- package/dist/commands/build.d.ts +3 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +74 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/dev.d.ts +3 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +179 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +269 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +164 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/config.d.ts +11 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +39 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/download.d.ts +9 -0
- package/dist/utils/download.d.ts.map +1 -0
- package/dist/utils/download.js +89 -0
- package/dist/utils/download.js.map +1 -0
- package/dist/utils/errors.d.ts +13 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +25 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/gradle.d.ts +7 -0
- package/dist/utils/gradle.d.ts.map +1 -0
- package/dist/utils/gradle.js +50 -0
- package/dist/utils/gradle.js.map +1 -0
- package/dist/utils/hytale.d.ts +5 -0
- package/dist/utils/hytale.d.ts.map +1 -0
- package/dist/utils/hytale.js +84 -0
- package/dist/utils/hytale.js.map +1 -0
- package/dist/utils/java.d.ts +7 -0
- package/dist/utils/java.d.ts.map +1 -0
- package/dist/utils/java.js +53 -0
- package/dist/utils/java.js.map +1 -0
- package/dist/utils/javaDownload.d.ts +9 -0
- package/dist/utils/javaDownload.d.ts.map +1 -0
- package/dist/utils/javaDownload.js +185 -0
- package/dist/utils/javaDownload.js.map +1 -0
- package/dist/utils/paths.d.ts +9 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +19 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/server.d.ts +16 -0
- package/dist/utils/server.d.ts.map +1 -0
- package/dist/utils/server.js +70 -0
- package/dist/utils/server.js.map +1 -0
- package/dist/utils/ui.d.ts +12 -0
- package/dist/utils/ui.d.ts.map +1 -0
- package/dist/utils/ui.js +22 -0
- package/dist/utils/ui.js.map +1 -0
- package/dist/utils/watcher.d.ts +10 -0
- package/dist/utils/watcher.d.ts.map +1 -0
- package/dist/utils/watcher.js +45 -0
- package/dist/utils/watcher.js.map +1 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# HYT - Hytale Development Tool
|
|
2
|
+
|
|
3
|
+
A command-line interface for Hytale plugin development that automates project setup, building, and hot-reload development workflows.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
**Quick Setup**
|
|
8
|
+
- Automatic Java 25 detection and installation
|
|
9
|
+
- Hytale installation discovery
|
|
10
|
+
- Configuration management
|
|
11
|
+
|
|
12
|
+
**Project Initialization**
|
|
13
|
+
- Scaffolds new plugin projects from template
|
|
14
|
+
- Decompiles Hytale server JAR for reference sources (CFR)
|
|
15
|
+
- Configures Gradle build system
|
|
16
|
+
- Git repository initialization
|
|
17
|
+
|
|
18
|
+
**Build System**
|
|
19
|
+
- Gradle wrapper integration
|
|
20
|
+
- One-command builds
|
|
21
|
+
- Automatic JAR output to mods folder
|
|
22
|
+
|
|
23
|
+
**Development Mode**
|
|
24
|
+
- File watching with automatic rebuild on changes
|
|
25
|
+
- Hot-reload server restart
|
|
26
|
+
- Integrated Hytale server management
|
|
27
|
+
- Live feedback with progress indicators
|
|
28
|
+
|
|
29
|
+
## Requirements
|
|
30
|
+
|
|
31
|
+
- Node.js 18 or higher
|
|
32
|
+
- Java 25 (auto-installed if missing)
|
|
33
|
+
- Hytale installation
|
|
34
|
+
|
|
35
|
+
## Installation
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm install -g @lunnos/hyt
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
After installation, the `hyt` command will be available globally.
|
|
42
|
+
|
|
43
|
+
## Usage
|
|
44
|
+
|
|
45
|
+
### Initial Setup
|
|
46
|
+
|
|
47
|
+
Configure Java and Hytale paths:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
hyt setup
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Options:
|
|
54
|
+
- `--java-path <path>` - Specify Java executable manually
|
|
55
|
+
- `--hytale-path <path>` - Specify Hytale installation manually
|
|
56
|
+
|
|
57
|
+
### Create New Plugin
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
hyt init my-plugin
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
This creates a complete project structure with:
|
|
64
|
+
- Plugin source template
|
|
65
|
+
- Hytale server files
|
|
66
|
+
- Decompiled reference sources
|
|
67
|
+
- Gradle build configuration
|
|
68
|
+
|
|
69
|
+
Options:
|
|
70
|
+
- `--skip-cfr` - Skip decompiler download
|
|
71
|
+
- `--skip-git` - Skip git initialization
|
|
72
|
+
|
|
73
|
+
### Build Plugin
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
cd my-plugin/Server/Plugins/my-plugin
|
|
77
|
+
hyt build
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Options:
|
|
81
|
+
- `--copy` - Automatically copy JAR to mods folder
|
|
82
|
+
|
|
83
|
+
### Development Mode
|
|
84
|
+
|
|
85
|
+
Start file watching with hot reload:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
cd my-plugin/Server/Plugins/my-plugin
|
|
89
|
+
hyt dev
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
This will:
|
|
93
|
+
1. Build your plugin
|
|
94
|
+
2. Start the Hytale server
|
|
95
|
+
3. Watch for file changes
|
|
96
|
+
4. Rebuild and restart on save
|
|
97
|
+
|
|
98
|
+
Options:
|
|
99
|
+
- `--no-initial-build` - Skip initial build
|
|
100
|
+
|
|
101
|
+
## Project Structure
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
my-plugin/
|
|
105
|
+
āāā Assets.zip # Hytale game assets
|
|
106
|
+
āāā mods/ # Compiled plugin JARs
|
|
107
|
+
āāā Server/
|
|
108
|
+
āāā HytaleServer.jar
|
|
109
|
+
āāā Plugins/
|
|
110
|
+
āāā my-plugin/ # Your plugin source
|
|
111
|
+
āāā app/
|
|
112
|
+
ā āāā src/
|
|
113
|
+
āāā gradle/
|
|
114
|
+
āāā gradlew
|
|
115
|
+
āāā build.gradle
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Configuration
|
|
119
|
+
|
|
120
|
+
Configuration is stored in `~/.hyt/config.json`:
|
|
121
|
+
|
|
122
|
+
```json
|
|
123
|
+
{
|
|
124
|
+
"javaPath": "/path/to/java",
|
|
125
|
+
"hytaleInstallPath": "/path/to/hytale"
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## License
|
|
130
|
+
|
|
131
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,YAAY,IAAI,OAAO,CA4EtC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import fs from 'fs/promises';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { runGradleBuild, hasGradleWrapper } from '../utils/gradle.js';
|
|
5
|
+
import { getBuildOutputDir } from '../utils/paths.js';
|
|
6
|
+
import { startSpinner, success, error, info } from '../utils/ui.js';
|
|
7
|
+
import { GradleError } from '../utils/errors.js';
|
|
8
|
+
export function buildCommand() {
|
|
9
|
+
return new Command('build')
|
|
10
|
+
.description('Build your Hytale plugin')
|
|
11
|
+
.option('--copy', 'Copy built JAR to mods folder after build')
|
|
12
|
+
.action(async (options) => {
|
|
13
|
+
try {
|
|
14
|
+
const projectDir = process.cwd();
|
|
15
|
+
console.log('\nšØ Building Hytale plugin...\n');
|
|
16
|
+
// Check if we're in a valid plugin directory
|
|
17
|
+
if (!(await hasGradleWrapper(projectDir))) {
|
|
18
|
+
throw new GradleError('No Gradle wrapper found in current directory.\n' +
|
|
19
|
+
'Make sure you are in your plugin directory (e.g., Server/Plugins/your-plugin/)');
|
|
20
|
+
}
|
|
21
|
+
// Run Gradle build
|
|
22
|
+
info('Running Gradle build...\n');
|
|
23
|
+
await runGradleBuild(projectDir);
|
|
24
|
+
// Find the built JAR
|
|
25
|
+
const buildOutputDir = getBuildOutputDir(path.join(projectDir, 'app'));
|
|
26
|
+
let jarFile = null;
|
|
27
|
+
try {
|
|
28
|
+
const files = await fs.readdir(buildOutputDir);
|
|
29
|
+
jarFile = files.find(f => f.endsWith('.jar') && !f.includes('-sources')) || null;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Build output dir might not exist if build failed
|
|
33
|
+
}
|
|
34
|
+
if (!jarFile) {
|
|
35
|
+
throw new GradleError('Build completed but no JAR file found.\n' +
|
|
36
|
+
`Expected location: ${buildOutputDir}`);
|
|
37
|
+
}
|
|
38
|
+
const jarPath = path.join(buildOutputDir, jarFile);
|
|
39
|
+
success(`\n⨠Build successful!`);
|
|
40
|
+
console.log(`\nš¦ Output: ${jarPath}`);
|
|
41
|
+
// Copy to mods folder if requested
|
|
42
|
+
if (options.copy) {
|
|
43
|
+
const copySpinner = startSpinner('Copying JAR to mods folder...');
|
|
44
|
+
// Navigate up to find mods folder
|
|
45
|
+
// Expected structure: project/Server/Plugins/plugin-name/ (we're here)
|
|
46
|
+
// Mods folder: project/mods/
|
|
47
|
+
const modsDir = path.resolve(projectDir, '..', '..', '..', 'mods');
|
|
48
|
+
try {
|
|
49
|
+
await fs.access(modsDir);
|
|
50
|
+
const destPath = path.join(modsDir, jarFile);
|
|
51
|
+
await fs.copyFile(jarPath, destPath);
|
|
52
|
+
copySpinner.succeed(`Copied to ${destPath}`);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
copySpinner.fail('Could not find mods folder. Copy manually.');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.log(`\nš” Tip: Use --copy to automatically copy the JAR to the mods folder`);
|
|
60
|
+
}
|
|
61
|
+
console.log(`\nš To deploy: Copy the JAR to your Server/mods/ folder`);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
if (err instanceof GradleError) {
|
|
65
|
+
error(err.message);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
error(`Build failed: ${err.message}`);
|
|
69
|
+
}
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,UAAU,IAAI,OAAO,CAyKpC"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import fs from 'fs/promises';
|
|
4
|
+
import { loadConfig } from '../utils/config.js';
|
|
5
|
+
import { runGradleBuild, hasGradleWrapper } from '../utils/gradle.js';
|
|
6
|
+
import { getBuildOutputDir } from '../utils/paths.js';
|
|
7
|
+
import { watchFiles, stopWatcher } from '../utils/watcher.js';
|
|
8
|
+
import { launchHytaleServer, stopHytaleServer, restartHytaleServer, isServerRunning } from '../utils/server.js';
|
|
9
|
+
import { startSpinner, success, error, info, warn } from '../utils/ui.js';
|
|
10
|
+
import { ConfigError, GradleError, HytaleError } from '../utils/errors.js';
|
|
11
|
+
let isRebuilding = false;
|
|
12
|
+
let watcher = null;
|
|
13
|
+
export function devCommand() {
|
|
14
|
+
return new Command('dev')
|
|
15
|
+
.description('Start development mode with hot reload')
|
|
16
|
+
.option('--no-initial-build', 'Skip initial build on startup')
|
|
17
|
+
.action(async (options) => {
|
|
18
|
+
try {
|
|
19
|
+
console.log('\nš„ Starting development mode...\n');
|
|
20
|
+
// Verify setup has been run
|
|
21
|
+
const config = await loadConfig();
|
|
22
|
+
if (!config) {
|
|
23
|
+
throw new ConfigError('HYT is not configured. Please run "hyt setup" first.');
|
|
24
|
+
}
|
|
25
|
+
// Check if we're in a valid plugin directory
|
|
26
|
+
const projectDir = process.cwd();
|
|
27
|
+
if (!(await hasGradleWrapper(projectDir))) {
|
|
28
|
+
throw new GradleError('No Gradle wrapper found in current directory.\n' +
|
|
29
|
+
'Make sure you are in your plugin directory (e.g., Server/Plugins/your-plugin/)');
|
|
30
|
+
}
|
|
31
|
+
// Determine project structure
|
|
32
|
+
// Expected: we're in project/Server/Plugins/plugin-name/
|
|
33
|
+
// Project root: ../../../
|
|
34
|
+
// Server dir: ../../
|
|
35
|
+
const projectRoot = path.resolve(projectDir, '..', '..', '..');
|
|
36
|
+
const serverDir = path.resolve(projectDir, '..', '..');
|
|
37
|
+
const modsDir = path.join(projectRoot, 'mods');
|
|
38
|
+
const serverJarPath = path.join(serverDir, 'HytaleServer.jar');
|
|
39
|
+
const assetsPath = path.join(projectRoot, 'Assets.zip');
|
|
40
|
+
// Verify required files exist
|
|
41
|
+
try {
|
|
42
|
+
await fs.access(serverJarPath);
|
|
43
|
+
await fs.access(assetsPath);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
throw new HytaleError('Hytale server files not found.\n' +
|
|
47
|
+
`Expected structure:\n` +
|
|
48
|
+
` - Server/HytaleServer.jar\n` +
|
|
49
|
+
` - Assets.zip\n` +
|
|
50
|
+
`Make sure you ran "hyt init" to create the project structure.`);
|
|
51
|
+
}
|
|
52
|
+
// Initial build
|
|
53
|
+
if (options.initialBuild !== false) {
|
|
54
|
+
info('Running initial build...\n');
|
|
55
|
+
try {
|
|
56
|
+
await runGradleBuild(projectDir);
|
|
57
|
+
success('ā Initial build complete\n');
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
throw new GradleError('Initial build failed. Fix the errors and try again.');
|
|
61
|
+
}
|
|
62
|
+
// Copy JAR to mods folder
|
|
63
|
+
await copyJarToMods(projectDir, modsDir);
|
|
64
|
+
}
|
|
65
|
+
// Start Hytale server
|
|
66
|
+
info('Starting Hytale server...\n');
|
|
67
|
+
const serverOptions = {
|
|
68
|
+
javaPath: config.javaPath,
|
|
69
|
+
serverJarPath,
|
|
70
|
+
assetsPath,
|
|
71
|
+
workingDir: projectRoot,
|
|
72
|
+
};
|
|
73
|
+
try {
|
|
74
|
+
await launchHytaleServer(serverOptions);
|
|
75
|
+
success('ā Hytale server started\n');
|
|
76
|
+
console.log('š Once the server console is ready, run the authentication command:');
|
|
77
|
+
console.log(' /auth login device\n');
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
throw new HytaleError(`Failed to start server: ${err.message}`);
|
|
81
|
+
}
|
|
82
|
+
// Start watching for file changes
|
|
83
|
+
info('š Watching for file changes...\n');
|
|
84
|
+
console.log('Press Ctrl+C to stop development mode\n');
|
|
85
|
+
const srcDir = path.join(projectDir, 'app', 'src');
|
|
86
|
+
watcher = watchFiles(srcDir, {
|
|
87
|
+
onFileChange: async (filePath) => {
|
|
88
|
+
if (isRebuilding) {
|
|
89
|
+
return; // Avoid concurrent rebuilds
|
|
90
|
+
}
|
|
91
|
+
isRebuilding = true;
|
|
92
|
+
const fileName = path.basename(filePath);
|
|
93
|
+
console.log(`\nš File changed: ${fileName}`);
|
|
94
|
+
try {
|
|
95
|
+
// Rebuild
|
|
96
|
+
const buildSpinner = startSpinner('Rebuilding...');
|
|
97
|
+
await runGradleBuild(projectDir);
|
|
98
|
+
buildSpinner.succeed('Build complete');
|
|
99
|
+
// Copy new JAR
|
|
100
|
+
await copyJarToMods(projectDir, modsDir);
|
|
101
|
+
// Restart server
|
|
102
|
+
if (isServerRunning()) {
|
|
103
|
+
const restartSpinner = startSpinner('Restarting server...');
|
|
104
|
+
await restartHytaleServer(serverOptions);
|
|
105
|
+
restartSpinner.succeed('Server restarted');
|
|
106
|
+
console.log('š” Remember to authenticate: /auth login device\n');
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
warn('Server not running, starting it...');
|
|
110
|
+
await launchHytaleServer(serverOptions);
|
|
111
|
+
console.log('š” Remember to authenticate: /auth login device\n');
|
|
112
|
+
}
|
|
113
|
+
success('⨠Hot reload complete!\n');
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
if (err instanceof GradleError) {
|
|
117
|
+
error(`Build failed: ${err.message}`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
error(`Hot reload failed: ${err.message}`);
|
|
121
|
+
}
|
|
122
|
+
info('Fix the errors and save again to rebuild.\n');
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
isRebuilding = false;
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
// Handle graceful shutdown
|
|
130
|
+
const cleanup = async () => {
|
|
131
|
+
console.log('\n\nš Shutting down...');
|
|
132
|
+
if (watcher) {
|
|
133
|
+
await stopWatcher(watcher);
|
|
134
|
+
watcher = null;
|
|
135
|
+
}
|
|
136
|
+
await stopHytaleServer();
|
|
137
|
+
console.log('ā Development mode stopped\n');
|
|
138
|
+
process.exit(0);
|
|
139
|
+
};
|
|
140
|
+
process.on('SIGINT', cleanup);
|
|
141
|
+
process.on('SIGTERM', cleanup);
|
|
142
|
+
// Keep process alive
|
|
143
|
+
await new Promise(() => { });
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
if (err instanceof ConfigError || err instanceof GradleError || err instanceof HytaleError) {
|
|
147
|
+
error(err.message);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
error(`Dev mode failed: ${err.message}`);
|
|
151
|
+
}
|
|
152
|
+
// Cleanup on error
|
|
153
|
+
if (watcher) {
|
|
154
|
+
await stopWatcher(watcher);
|
|
155
|
+
}
|
|
156
|
+
await stopHytaleServer();
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
async function copyJarToMods(projectDir, modsDir) {
|
|
162
|
+
const buildOutputDir = getBuildOutputDir(path.join(projectDir, 'app'));
|
|
163
|
+
try {
|
|
164
|
+
await fs.mkdir(modsDir, { recursive: true });
|
|
165
|
+
const files = await fs.readdir(buildOutputDir);
|
|
166
|
+
const jarFile = files.find(f => f.endsWith('.jar') && !f.includes('-sources'));
|
|
167
|
+
if (!jarFile) {
|
|
168
|
+
throw new Error('JAR file not found in build output');
|
|
169
|
+
}
|
|
170
|
+
const srcPath = path.join(buildOutputDir, jarFile);
|
|
171
|
+
const destPath = path.join(modsDir, jarFile);
|
|
172
|
+
await fs.copyFile(srcPath, destPath);
|
|
173
|
+
info(`ā Copied ${jarFile} to mods/`);
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
throw new GradleError(`Failed to copy JAR: ${err.message}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,WAAW,IAAI,OAAO,CAyNrC"}
|