@via-dev/via 0.1.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/LICENSE +21 -0
- package/README.md +87 -0
- package/dist/cli.js +136 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.js +124 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/learn.js +112 -0
- package/dist/commands/learn.js.map +1 -0
- package/dist/commands/list.js +38 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/remove.js +82 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/ui/index.js +23 -0
- package/dist/commands/ui/index.js.map +1 -0
- package/dist/commands/ui/server.js +47 -0
- package/dist/commands/ui/server.js.map +1 -0
- package/dist/commands/ui/static/script.js +101 -0
- package/dist/commands/ui/static/script.js.map +1 -0
- package/dist/commands/ui/static/styles.js +245 -0
- package/dist/commands/ui/static/styles.js.map +1 -0
- package/dist/commands/ui/templates/layout.js +51 -0
- package/dist/commands/ui/templates/layout.js.map +1 -0
- package/dist/commands/use.js +236 -0
- package/dist/commands/use.js.map +1 -0
- package/dist/schema.js +12 -0
- package/dist/schema.js.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/add/file-scanner.js +99 -0
- package/dist/utils/add/file-scanner.js.map +1 -0
- package/dist/utils/add/get-dependencies.js +75 -0
- package/dist/utils/add/get-dependencies.js.map +1 -0
- package/dist/utils/add/meta.js +22 -0
- package/dist/utils/add/meta.js.map +1 -0
- package/dist/utils/add/module-processor.js +140 -0
- package/dist/utils/add/module-processor.js.map +1 -0
- package/dist/utils/ai/blocks.js +22 -0
- package/dist/utils/ai/blocks.js.map +1 -0
- package/dist/utils/ai/detection-prompt.js +173 -0
- package/dist/utils/ai/detection-prompt.js.map +1 -0
- package/dist/utils/ai/models.js +17 -0
- package/dist/utils/ai/models.js.map +1 -0
- package/dist/utils/ai/sdk.js +36 -0
- package/dist/utils/ai/sdk.js.map +1 -0
- package/dist/utils/branding.js +82 -0
- package/dist/utils/branding.js.map +1 -0
- package/dist/utils/constants.js +56 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/paths.js +14 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/use/text.js +31 -0
- package/dist/utils/use/text.js.map +1 -0
- package/package.json +63 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 viping7
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Via
|
|
2
|
+
|
|
3
|
+
**Via** is a pattern-aware developer toolkit that helps you capture and reuse code patterns in your project. It "learns" from your existing codebase and allows you to instantiate those patterns (modules) with intelligent, context-aware renaming.
|
|
4
|
+
|
|
5
|
+
## Key Features
|
|
6
|
+
|
|
7
|
+
- **Pattern Learning**: Extract specific folders or components from your project and save them as reusable modules.
|
|
8
|
+
- **Smart Renaming**: When creating a new instance of a module, Via automatically renames files, classes, variables, and imports while preserving the original casing (PascalCase, camelCase, kebab-case, etc.) and handling plurality.
|
|
9
|
+
- **AI-Powered (Optional)**: Can lean on AI for complex pattern recognition and documentation.
|
|
10
|
+
- **Web UI**: A built-in documentation server to browse and manage your saved modules.
|
|
11
|
+
|
|
12
|
+
## Supported Technologies
|
|
13
|
+
|
|
14
|
+
Currently, Via is optimized for backend patterns in the following ecosystems:
|
|
15
|
+
|
|
16
|
+
- **Express.js**
|
|
17
|
+
- **Hono.js**
|
|
18
|
+
- **NestJS**
|
|
19
|
+
- **Next.js** (API routes and backend logic)
|
|
20
|
+
|
|
21
|
+
## Installation
|
|
22
|
+
|
|
23
|
+
To install Via globally:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install -g @via-dev/via
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
### 1. Learn a Module
|
|
32
|
+
Point Via to a folder containing a pattern you want to reuse (e.g., a Controller, a Service, or a CDK Stack). If you omit the path, Via enters **AI mode** to automatically detect patterns across your entire project.
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Learn from a specific path
|
|
36
|
+
via learn src/controllers/user
|
|
37
|
+
|
|
38
|
+
# Auto-detect patterns using AI
|
|
39
|
+
via learn
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 2. List Saved Modules
|
|
43
|
+
See everything Via has learned so far.
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
via list
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 3. Instantiate a Module
|
|
50
|
+
Create a new instance of a learned module with a new name. Via will intelligently rename everything for you.
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# General syntax: via <module_name> create <new_name>
|
|
54
|
+
via UserControllerModule create Auth
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 4. Open the Web UI
|
|
58
|
+
Explore your learned modules in a beautiful web interface.
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
via ui
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Command Reference
|
|
65
|
+
|
|
66
|
+
| Command | Description |
|
|
67
|
+
| :--- | :--- |
|
|
68
|
+
| `via learn [path]` | Learn from a path, or auto-detect modules using AI if path is omitted |
|
|
69
|
+
| `via list` | List all saved modules |
|
|
70
|
+
| `via <module> create <name>` | Instantiate a learned module with a new name |
|
|
71
|
+
| `via remove <name>` | Delete a saved module |
|
|
72
|
+
| `via ui` | Start the Via UI documentation server |
|
|
73
|
+
| `via config` | Configure AI provider and model |
|
|
74
|
+
|
|
75
|
+
## Smart Renaming in Action
|
|
76
|
+
|
|
77
|
+
Via isn't just a search-and-replace tool. It understands your code's context:
|
|
78
|
+
|
|
79
|
+
- **PascalCase**: `UserComponent` becomes `AccountPage`
|
|
80
|
+
- **camelCase**: `userService` becomes `authService`
|
|
81
|
+
- **kebab-case**: `user-module.ts` becomes `auth-module.ts`
|
|
82
|
+
- **UPPERCASE**: `USER_ID` becomes `AUTH_ID`
|
|
83
|
+
- **Plurality**: `users` becomes `accounts`
|
|
84
|
+
|
|
85
|
+
## License
|
|
86
|
+
|
|
87
|
+
MIT © viping7
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const use_1 = require("./commands/use");
|
|
42
|
+
const learn_1 = require("./commands/learn");
|
|
43
|
+
const remove_1 = require("./commands/remove");
|
|
44
|
+
const list_1 = require("./commands/list");
|
|
45
|
+
const config_1 = require("./commands/config");
|
|
46
|
+
const branding_1 = require("./utils/branding");
|
|
47
|
+
const fs_1 = require("fs");
|
|
48
|
+
const paths_1 = require("./utils/paths");
|
|
49
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
50
|
+
const program = new commander_1.Command();
|
|
51
|
+
program
|
|
52
|
+
.name("via")
|
|
53
|
+
.description("Via — pattern-aware developer tooling")
|
|
54
|
+
.version("0.1.0");
|
|
55
|
+
// Show branding when NO arguments are provided
|
|
56
|
+
if (process.argv.length <= 2) {
|
|
57
|
+
(0, branding_1.showLogo)();
|
|
58
|
+
(0, branding_1.showAbout)();
|
|
59
|
+
program.help();
|
|
60
|
+
}
|
|
61
|
+
program.addHelpText('after', `
|
|
62
|
+
Module Usage:
|
|
63
|
+
via <module_name> create <new_name> Instantiate a learned module
|
|
64
|
+
`);
|
|
65
|
+
program.hook("preAction", (thisCommand) => {
|
|
66
|
+
// Always show logo for subcommands (handled manually for empty call)
|
|
67
|
+
if (thisCommand.args.length > 0) {
|
|
68
|
+
(0, branding_1.showLogo)();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
program
|
|
72
|
+
.command("learn [path]")
|
|
73
|
+
.description("Learn modules from a specific path or the whole project")
|
|
74
|
+
.action((path) => {
|
|
75
|
+
(0, learn_1.learn)(path || "");
|
|
76
|
+
});
|
|
77
|
+
program
|
|
78
|
+
.command("list")
|
|
79
|
+
.description("List all saved modules")
|
|
80
|
+
.action(() => {
|
|
81
|
+
(0, list_1.listModules)();
|
|
82
|
+
});
|
|
83
|
+
program
|
|
84
|
+
.command("config")
|
|
85
|
+
.description("Configure AI provider and model")
|
|
86
|
+
.action(() => {
|
|
87
|
+
(0, config_1.configure)();
|
|
88
|
+
});
|
|
89
|
+
program
|
|
90
|
+
.command("remove <name>")
|
|
91
|
+
.description("Delete a saved module")
|
|
92
|
+
.action((name) => {
|
|
93
|
+
(0, remove_1.removeModule)(name);
|
|
94
|
+
});
|
|
95
|
+
program
|
|
96
|
+
.command("ui")
|
|
97
|
+
.description("Start the Via UI documentation server")
|
|
98
|
+
.option("-p, --port <number>", "Port to run the server on", "3000")
|
|
99
|
+
.action(async (options) => {
|
|
100
|
+
const { ui: uiCommand } = await Promise.resolve().then(() => __importStar(require("./commands/ui")));
|
|
101
|
+
uiCommand(parseInt(options.port));
|
|
102
|
+
});
|
|
103
|
+
// Dynamic commands from saved modules
|
|
104
|
+
const mappingPath = (0, paths_1.getViaDataPath)('mapping.json');
|
|
105
|
+
if ((0, fs_1.existsSync)(mappingPath)) {
|
|
106
|
+
try {
|
|
107
|
+
const mapping = JSON.parse((0, fs_1.readFileSync)(mappingPath, 'utf-8'));
|
|
108
|
+
Object.keys(mapping).forEach(moduleName => {
|
|
109
|
+
const moduleCmd = program.command(moduleName, { hidden: true }).description(`Manage ${moduleName} module`);
|
|
110
|
+
moduleCmd
|
|
111
|
+
.command("create <name>")
|
|
112
|
+
.description(`Instantiate ${moduleName} with a new name`)
|
|
113
|
+
.action((name) => {
|
|
114
|
+
(0, use_1.use)(moduleName, name);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
console.error(`Warning: Failed to parse mapping.json at ${mappingPath}. Some commands may be missing.`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
program.on('command:*', (operands) => {
|
|
123
|
+
const unknownCmd = operands[0];
|
|
124
|
+
const isLikelyModule = operands[1] === 'create';
|
|
125
|
+
if (isLikelyModule) {
|
|
126
|
+
console.error(`\n${chalk_1.default.red.bold('✖ Error:')} Module "${chalk_1.default.white.bold(unknownCmd)}" has not been learned yet.`);
|
|
127
|
+
console.log(` Use ${chalk_1.default.cyan('via learn [path]')} to teach Via about this pattern first.\n`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.error(`\n${chalk_1.default.red.bold('✖ Error:')} Unknown command "${chalk_1.default.white.bold(unknownCmd)}".`);
|
|
131
|
+
console.log(` Type ${chalk_1.default.cyan('via --help')} for available commands.\n`);
|
|
132
|
+
}
|
|
133
|
+
process.exit(1);
|
|
134
|
+
});
|
|
135
|
+
program.parse();
|
|
136
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.configure = exports.setConfig = exports.getConfig = void 0;
|
|
40
|
+
const promises_1 = require("fs/promises");
|
|
41
|
+
const fs_1 = require("fs");
|
|
42
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
43
|
+
const paths_1 = require("../utils/paths");
|
|
44
|
+
const models_1 = require("../utils/ai/models");
|
|
45
|
+
const defaultConfig = {
|
|
46
|
+
provider: 'openai',
|
|
47
|
+
model: 'gpt-4o-mini',
|
|
48
|
+
};
|
|
49
|
+
const getConfig = async () => {
|
|
50
|
+
const configPath = (0, paths_1.getViaDataPath)('config.json');
|
|
51
|
+
if (!(0, fs_1.existsSync)(configPath)) {
|
|
52
|
+
return defaultConfig;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const content = await (0, promises_1.readFile)(configPath, 'utf-8');
|
|
56
|
+
return JSON.parse(content);
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
return defaultConfig;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
exports.getConfig = getConfig;
|
|
63
|
+
const setConfig = async (config) => {
|
|
64
|
+
const configDir = (0, paths_1.getViaDataDir)();
|
|
65
|
+
if (!(0, fs_1.existsSync)(configDir)) {
|
|
66
|
+
await (0, promises_1.mkdir)(configDir, { recursive: true });
|
|
67
|
+
}
|
|
68
|
+
const configPath = (0, paths_1.getViaDataPath)('config.json');
|
|
69
|
+
await (0, promises_1.writeFile)(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
70
|
+
};
|
|
71
|
+
exports.setConfig = setConfig;
|
|
72
|
+
const configure = async () => {
|
|
73
|
+
const { select, input } = await Promise.resolve().then(() => __importStar(require('@inquirer/prompts')));
|
|
74
|
+
const currentConfig = await (0, exports.getConfig)();
|
|
75
|
+
console.log(`\n${chalk_1.default.cyan.bold('--- VIA AI Configuration ---')}\n`);
|
|
76
|
+
const provider = await select({
|
|
77
|
+
message: 'Select your preferred AI Provider:',
|
|
78
|
+
choices: [
|
|
79
|
+
{ name: 'OpenAI', value: 'openai' },
|
|
80
|
+
{ name: 'Google (Gemini)', value: 'google' },
|
|
81
|
+
{ name: 'Anthropic (Claude)', value: 'anthropic' },
|
|
82
|
+
{ name: 'Ollama (Local)', value: 'ollama' },
|
|
83
|
+
],
|
|
84
|
+
default: currentConfig.provider,
|
|
85
|
+
});
|
|
86
|
+
let model;
|
|
87
|
+
let baseUrl;
|
|
88
|
+
if (provider === 'ollama') {
|
|
89
|
+
model = await input({
|
|
90
|
+
message: 'Enter your local Ollama model name (e.g., llama3, mistral):',
|
|
91
|
+
default: currentConfig.provider === 'ollama' ? currentConfig.model : 'llama3',
|
|
92
|
+
});
|
|
93
|
+
baseUrl = await input({
|
|
94
|
+
message: 'Enter your local Ollama base URL (e.g., http://localhost:11434):',
|
|
95
|
+
default: currentConfig.provider === 'ollama' ? currentConfig.baseUrl : 'http://localhost:11434',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const modelChoices = (0, models_1.getAvailableModels)(provider);
|
|
100
|
+
model = await select({
|
|
101
|
+
message: `Select ${provider} model:`,
|
|
102
|
+
choices: modelChoices.map(m => ({ name: m, value: m })),
|
|
103
|
+
default: modelChoices.includes(currentConfig.model) ? currentConfig.model : modelChoices?.[0],
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
let apiKey = '';
|
|
107
|
+
if (provider !== 'ollama') {
|
|
108
|
+
apiKey = await input({
|
|
109
|
+
message: `Enter API Key for ${provider} (leave empty to use Environment Variable):`,
|
|
110
|
+
default: '',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
const newConfig = { provider, model };
|
|
114
|
+
if (apiKey) {
|
|
115
|
+
newConfig.apiKey = apiKey;
|
|
116
|
+
}
|
|
117
|
+
if (baseUrl) {
|
|
118
|
+
newConfig.baseUrl = baseUrl;
|
|
119
|
+
}
|
|
120
|
+
await (0, exports.setConfig)(newConfig);
|
|
121
|
+
console.log(`\n${chalk_1.default.green.bold('✓')} Configuration updated: ${chalk_1.default.cyan(provider)} - ${chalk_1.default.white(model)}\n`);
|
|
122
|
+
};
|
|
123
|
+
exports.configure = configure;
|
|
124
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.learn = void 0;
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const promises_1 = require("fs/promises");
|
|
42
|
+
const fs_1 = require("fs");
|
|
43
|
+
const file_scanner_1 = require("../utils/add/file-scanner");
|
|
44
|
+
const module_processor_1 = require("../utils/add/module-processor");
|
|
45
|
+
const lodash_1 = require("lodash");
|
|
46
|
+
const paths_1 = require("../utils/paths");
|
|
47
|
+
const meta_1 = require("../utils/add/meta");
|
|
48
|
+
const blocks_1 = require("../utils/ai/blocks");
|
|
49
|
+
const branding_1 = require("../utils/branding");
|
|
50
|
+
const config_1 = require("./config");
|
|
51
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
52
|
+
const learn = async (targetPath) => {
|
|
53
|
+
let loader;
|
|
54
|
+
try {
|
|
55
|
+
const modulesDir = (0, paths_1.getViaDataPath)('modules');
|
|
56
|
+
if (!(0, fs_1.existsSync)(modulesDir)) {
|
|
57
|
+
await (0, promises_1.mkdir)(modulesDir, { recursive: true });
|
|
58
|
+
}
|
|
59
|
+
let mapping = {};
|
|
60
|
+
const mappingPath = (0, paths_1.getViaDataPath)('mapping.json');
|
|
61
|
+
if ((0, fs_1.existsSync)(mappingPath)) {
|
|
62
|
+
const mappingFile = await (0, promises_1.readFile)(mappingPath, 'utf-8');
|
|
63
|
+
mapping = JSON.parse(mappingFile);
|
|
64
|
+
}
|
|
65
|
+
const folderStructure = await (0, file_scanner_1.getAllFileAndFolders)();
|
|
66
|
+
const flattenedFiles = (0, lodash_1.chain)(folderStructure).flattenDeep().orderBy([item => !item.isDirectory, "name"], ["asc", "asc"]).value();
|
|
67
|
+
let modulesToProcess = [];
|
|
68
|
+
if (targetPath) {
|
|
69
|
+
// Manual mode: scan the provided path
|
|
70
|
+
const absoluteTargetPath = path.resolve(process.cwd(), targetPath);
|
|
71
|
+
if (!(0, fs_1.existsSync)(absoluteTargetPath)) {
|
|
72
|
+
console.error(`Error: Path ${targetPath} does not exist.`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
modulesToProcess = await (0, file_scanner_1.readFiles)(absoluteTargetPath);
|
|
76
|
+
if (modulesToProcess.length === 0) {
|
|
77
|
+
console.log("No modules found in the specified path.");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Automatic mode: detect blocks
|
|
83
|
+
const configPath = (0, paths_1.getViaDataPath)('config.json');
|
|
84
|
+
if (!(0, fs_1.existsSync)(configPath)) {
|
|
85
|
+
console.log(chalk_1.default.yellow("\nAI configuration not found. Let's set it up first...\n"));
|
|
86
|
+
await (0, config_1.configure)();
|
|
87
|
+
// Re-verify after configuration attempt
|
|
88
|
+
if (!(0, fs_1.existsSync)(configPath)) {
|
|
89
|
+
console.log(chalk_1.default.red("\nAI configuration is required for auto-detection. Operation cancelled.\n"));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const foldersWithFiles = (0, meta_1.getFileNamesAndFolders)(flattenedFiles);
|
|
94
|
+
loader = (0, branding_1.showStatusLoader)();
|
|
95
|
+
const blocks = await (0, blocks_1.detectBlocks)(foldersWithFiles);
|
|
96
|
+
loader.stop();
|
|
97
|
+
if (blocks.modules.length === 0) {
|
|
98
|
+
console.log("No modules detected.");
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
modulesToProcess = blocks.modules.filter(module => module.confidence === "high" || module.confidence === "medium");
|
|
102
|
+
}
|
|
103
|
+
// Process modules (selection, renaming, extraction, saving)
|
|
104
|
+
await (0, module_processor_1.processModules)(modulesToProcess, flattenedFiles, mapping, modulesDir, mappingPath);
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
loader?.stop();
|
|
108
|
+
console.error("Error during learning:", e);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
exports.learn = learn;
|
|
112
|
+
//# sourceMappingURL=learn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learn.js","sourceRoot":"","sources":["../../src/commands/learn.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.listModules = void 0;
|
|
7
|
+
const promises_1 = require("fs/promises");
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const paths_1 = require("../utils/paths");
|
|
11
|
+
const listModules = async () => {
|
|
12
|
+
try {
|
|
13
|
+
const mappingPath = (0, paths_1.getViaDataPath)('mapping.json');
|
|
14
|
+
if (!(0, fs_1.existsSync)(mappingPath)) {
|
|
15
|
+
console.log(chalk_1.default.yellow("\nNo modules found. Use 'via project' or 'via learn <path>' to add some!\n"));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const mappingFile = await (0, promises_1.readFile)(mappingPath, 'utf-8');
|
|
19
|
+
const mapping = JSON.parse(mappingFile);
|
|
20
|
+
const moduleNames = Object.keys(mapping);
|
|
21
|
+
if (moduleNames.length === 0) {
|
|
22
|
+
console.log(chalk_1.default.yellow("\nNo modules found. Use 'via project' or 'via learn <path>' to add some!\n"));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
console.log(chalk_1.default.cyan.bold("\nAvailable VIA Modules:"));
|
|
26
|
+
console.log(chalk_1.default.cyan("=".repeat(25)));
|
|
27
|
+
moduleNames.sort().forEach((name, index) => {
|
|
28
|
+
console.log(`${chalk_1.default.gray(index + 1 + ".")} ${chalk_1.default.white(name)}`);
|
|
29
|
+
});
|
|
30
|
+
console.log(chalk_1.default.cyan("=".repeat(25)));
|
|
31
|
+
console.log(chalk_1.default.gray(`Total: ${moduleNames.length} modules\n`));
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
console.error(chalk_1.default.red("Error listing modules:"), e);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
exports.listModules = listModules;
|
|
38
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":";;;;;;AAAA,0CAAuC;AACvC,2BAAgC;AAChC,kDAA0B;AAC1B,0CAAgD;AAEzC,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;IAClC,IAAI,CAAC;QACD,MAAM,WAAW,GAAG,IAAA,sBAAc,EAAC,cAAc,CAAC,CAAC;QAEnD,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,4EAA4E,CAAC,CAAC,CAAC;YACxG,OAAO;QACX,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAA,mBAAQ,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,4EAA4E,CAAC,CAAC,CAAC;YACxG,OAAO;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAExC,WAAW,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACvC,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,WAAW,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC;IAEtE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;AACL,CAAC,CAAC;AA/BW,QAAA,WAAW,eA+BtB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.removeModule = void 0;
|
|
40
|
+
const promises_1 = require("fs/promises");
|
|
41
|
+
const fs_1 = require("fs");
|
|
42
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
43
|
+
const paths_1 = require("../utils/paths");
|
|
44
|
+
const removeModule = async (name) => {
|
|
45
|
+
try {
|
|
46
|
+
const mappingPath = (0, paths_1.getViaDataPath)('mapping.json');
|
|
47
|
+
if (!(0, fs_1.existsSync)(mappingPath)) {
|
|
48
|
+
console.log(chalk_1.default.yellow("\nNo modules found.\n"));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const mappingFile = await (0, promises_1.readFile)(mappingPath, 'utf-8');
|
|
52
|
+
const mapping = JSON.parse(mappingFile);
|
|
53
|
+
const id = mapping[name];
|
|
54
|
+
if (!id) {
|
|
55
|
+
console.log(chalk_1.default.red(`\nModule "${name}" not found.\n`));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const { confirm } = await Promise.resolve().then(() => __importStar(require('@inquirer/prompts')));
|
|
59
|
+
const shouldDelete = await confirm({
|
|
60
|
+
message: `Are you sure you want to delete the module "${name}"?`,
|
|
61
|
+
default: false,
|
|
62
|
+
});
|
|
63
|
+
if (!shouldDelete) {
|
|
64
|
+
console.log(chalk_1.default.gray("\nDeletion cancelled.\n"));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// Delete the .via file
|
|
68
|
+
const viaPath = (0, paths_1.getViaDataPath)(`modules/${id}.via`);
|
|
69
|
+
if ((0, fs_1.existsSync)(viaPath)) {
|
|
70
|
+
await (0, promises_1.unlink)(viaPath);
|
|
71
|
+
}
|
|
72
|
+
// Remove from mapping
|
|
73
|
+
delete mapping[name];
|
|
74
|
+
await (0, promises_1.writeFile)(mappingPath, JSON.stringify(mapping, null, 2), 'utf-8');
|
|
75
|
+
console.log(chalk_1.default.green(`\n✓ Module "${name}" has been deleted.\n`));
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
console.error(chalk_1.default.red("Error deleting module:"), e);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
exports.removeModule = removeModule;
|
|
82
|
+
//# sourceMappingURL=remove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0CAA0D;AAC1D,2BAAgC;AAChC,kDAA0B;AAC1B,0CAAgD;AAEzC,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;IAC/C,IAAI,CAAC;QACD,MAAM,WAAW,GAAG,IAAA,sBAAc,EAAC,cAAc,CAAC,CAAC;QAEnD,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACnD,OAAO;QACX,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAA,mBAAQ,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAEzB,IAAI,CAAC,EAAE,EAAE,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,aAAa,IAAI,gBAAgB,CAAC,CAAC,CAAC;YAC1D,OAAO;QACX,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,GAAG,wDAAa,mBAAmB,GAAC,CAAC;QACtD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC;YAC/B,OAAO,EAAE,+CAA+C,IAAI,IAAI;YAChE,OAAO,EAAE,KAAK;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACnD,OAAO;QACX,CAAC;QAED,uBAAuB;QACvB,MAAM,OAAO,GAAG,IAAA,sBAAc,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,IAAA,eAAU,EAAC,OAAO,CAAC,EAAE,CAAC;YACtB,MAAM,IAAA,iBAAM,EAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QAED,sBAAsB;QACtB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,IAAA,oBAAS,EAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAExE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,eAAe,IAAI,uBAAuB,CAAC,CAAC,CAAC;IAEzE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;AACL,CAAC,CAAC;AA5CW,QAAA,YAAY,gBA4CvB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ui = void 0;
|
|
7
|
+
const node_server_1 = require("@hono/node-server");
|
|
8
|
+
const open_1 = __importDefault(require("open"));
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const server_1 = require("./server");
|
|
11
|
+
const ui = async (port = 3000) => {
|
|
12
|
+
const app = (0, server_1.createApp)();
|
|
13
|
+
console.log(chalk_1.default.cyan(`\nStarting Via UI server on http://localhost:${port}...`));
|
|
14
|
+
(0, node_server_1.serve)({
|
|
15
|
+
fetch: app.fetch,
|
|
16
|
+
port
|
|
17
|
+
}, (info) => {
|
|
18
|
+
console.log(chalk_1.default.green.bold(`\n✓ Via UI is ready! Open your browser at http://localhost:${info.port}`));
|
|
19
|
+
(0, open_1.default)(`http://localhost:${info.port}`);
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
exports.ui = ui;
|
|
23
|
+
//# sourceMappingURL=index.js.map
|