valence-cli 1.0.2 → 1.0.4
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/dist/commands/build.js +1 -1
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/generate.js +1 -1
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/lifecycle.js +1 -1
- package/dist/commands/lifecycle.js.map +1 -1
- package/dist/commands/new.d.ts +2 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +417 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/publish.js +1 -1
- package/dist/commands/publish.js.map +1 -1
- package/dist/index.js +2 -413
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/build.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/commands/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/commands/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;IAC5B,YAAY;IACZ,MAAM,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,EAAE;QACrC,GAAG,EAAE,EAAE,uBAAuB,EAAE,MAAM,EAAE;QACxC,KAAK,EAAE,SAAS;KACnB,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;IAC3B,MAAM,KAAK,EAAE,CAAC;IAEd,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IAC/C,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;IACrE,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACrE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,UAAU,GAAU,MAAM,MAAM,kBAwb5C,CAAC"}
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import shell from 'shelljs';
|
|
6
|
+
import { runStage, execWithScrollingLogger } from '../utils/logger.js';
|
|
7
|
+
import { checkUpdate } from '../utils/update.js';
|
|
8
|
+
export const newProject = async (name) => {
|
|
9
|
+
// 0. Update Check
|
|
10
|
+
await checkUpdate();
|
|
11
|
+
console.log(chalk.bold.blue(`\n VALENCE CLI `));
|
|
12
|
+
console.log(chalk.gray(` Creating new project: ${chalk.white(name)}\n`));
|
|
13
|
+
// 1. Prerequisites
|
|
14
|
+
await runStage('Checking Prerequisites', async () => {
|
|
15
|
+
if (!shell.which('git'))
|
|
16
|
+
throw new Error('Git is required');
|
|
17
|
+
if (!shell.which('npm'))
|
|
18
|
+
throw new Error('NPM is required');
|
|
19
|
+
return 'Environment is ready';
|
|
20
|
+
});
|
|
21
|
+
const projectPath = path.join(process.cwd(), name);
|
|
22
|
+
// 2. Scaffold Angular
|
|
23
|
+
await runStage('Scaffolding Angular', async (spinner) => {
|
|
24
|
+
const ngCommand = `npx`;
|
|
25
|
+
const ngArgs = ['-y', '@angular/cli', 'new', name, '--directory', name, '--style', 'scss', '--routing', '--ssr=false', '--skip-git'];
|
|
26
|
+
await execWithScrollingLogger(spinner, ngCommand, ngArgs, { title: 'Running Angular CLI...' });
|
|
27
|
+
shell.cd(projectPath);
|
|
28
|
+
return 'Angular project created';
|
|
29
|
+
});
|
|
30
|
+
// 3. Install Dependencies
|
|
31
|
+
await runStage('Installing Dependencies', async (spinner) => {
|
|
32
|
+
// Babylon
|
|
33
|
+
await execWithScrollingLogger(spinner, 'npm', ['install', 'babylonjs', '@babylonjs/core', '@babylonjs/loaders'], { title: 'Installing Babylon.js...' });
|
|
34
|
+
// Electron
|
|
35
|
+
await execWithScrollingLogger(spinner, 'npm', ['install', '--save-dev', 'electron', 'electron-forge', '@electron-forge/cli', '@electron-forge/maker-squirrel', '@electron-forge/maker-zip'], { title: 'Installing Electron...' });
|
|
36
|
+
return 'Dependencies installed';
|
|
37
|
+
});
|
|
38
|
+
// 4. Configure Project Files
|
|
39
|
+
await runStage('Configuring Project', async () => {
|
|
40
|
+
// Create Electron folder
|
|
41
|
+
const electronDir = path.join(projectPath, 'electron');
|
|
42
|
+
await fs.ensureDir(electronDir);
|
|
43
|
+
// Electron Main Process (TypeScript)
|
|
44
|
+
const electronMain = `
|
|
45
|
+
import { app, BrowserWindow } from 'electron';
|
|
46
|
+
import * as path from 'path';
|
|
47
|
+
|
|
48
|
+
function createWindow () {
|
|
49
|
+
const win = new BrowserWindow({
|
|
50
|
+
width: 800,
|
|
51
|
+
height: 600,
|
|
52
|
+
webPreferences: {
|
|
53
|
+
preload: path.join(__dirname, 'preload.js'),
|
|
54
|
+
nodeIntegration: true,
|
|
55
|
+
contextIsolation: false
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const isDev = process.env.NODE_ENV === 'development';
|
|
60
|
+
|
|
61
|
+
if (isDev) {
|
|
62
|
+
win.loadURL('http://localhost:4200');
|
|
63
|
+
win.webContents.openDevTools();
|
|
64
|
+
} else {
|
|
65
|
+
// Path to angular build output.
|
|
66
|
+
// If angular builds to dist/browser, we are in dist/electron/main.js
|
|
67
|
+
// So ../browser/index.html is correct relative path from __dirname
|
|
68
|
+
win.loadFile(path.join(__dirname, '../browser/index.html'));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
app.whenReady().then(() => {
|
|
73
|
+
createWindow();
|
|
74
|
+
|
|
75
|
+
app.on('activate', () => {
|
|
76
|
+
if (BrowserWindow.getAllWindows().length === 0) {
|
|
77
|
+
createWindow();
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
app.on('window-all-closed', () => {
|
|
83
|
+
if (process.platform !== 'darwin') {
|
|
84
|
+
app.quit();
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
`;
|
|
88
|
+
await fs.writeFile(path.join(electronDir, 'main.ts'), electronMain.trim());
|
|
89
|
+
// Electron Preload
|
|
90
|
+
const electronPreload = `
|
|
91
|
+
window.addEventListener('DOMContentLoaded', () => {
|
|
92
|
+
const replaceText = (selector: string, text: string) => {
|
|
93
|
+
const element = document.getElementById(selector);
|
|
94
|
+
if (element) element.innerText = text;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
for (const type of ['chrome', 'node', 'electron']) {
|
|
98
|
+
replaceText(\`\${type}-version\`, process.versions[type as keyof NodeJS.ProcessVersions] || '');
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
`;
|
|
102
|
+
await fs.writeFile(path.join(electronDir, 'preload.ts'), electronPreload.trim());
|
|
103
|
+
// Electron tsconfig
|
|
104
|
+
const electronTsConfig = {
|
|
105
|
+
"compilerOptions": {
|
|
106
|
+
"module": "commonjs",
|
|
107
|
+
"target": "es2020",
|
|
108
|
+
"outDir": "../dist/electron",
|
|
109
|
+
"rootDir": ".",
|
|
110
|
+
"sourceMap": true,
|
|
111
|
+
"strict": true
|
|
112
|
+
},
|
|
113
|
+
"include": [
|
|
114
|
+
"**/*.ts"
|
|
115
|
+
]
|
|
116
|
+
};
|
|
117
|
+
await fs.writeFile(path.join(electronDir, 'tsconfig.json'), JSON.stringify(electronTsConfig, null, 2));
|
|
118
|
+
// Forge Config
|
|
119
|
+
const forgeConfig = `
|
|
120
|
+
module.exports = {
|
|
121
|
+
packagerConfig: {},
|
|
122
|
+
rebuildConfig: {},
|
|
123
|
+
makers: [
|
|
124
|
+
{
|
|
125
|
+
name: '@electron-forge/maker-squirrel',
|
|
126
|
+
config: {},
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
name: '@electron-forge/maker-zip',
|
|
130
|
+
platforms: ['darwin', 'win32'],
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: '@electron-forge/maker-deb',
|
|
134
|
+
config: {},
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: '@electron-forge/maker-rpm',
|
|
138
|
+
config: {},
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
};
|
|
142
|
+
`;
|
|
143
|
+
await fs.writeFile(path.join(projectPath, 'forge.config.js'), forgeConfig.trim());
|
|
144
|
+
// Angular Config
|
|
145
|
+
const angularJsonPath = path.join(projectPath, 'angular.json');
|
|
146
|
+
try {
|
|
147
|
+
const angularJson = await fs.readJson(angularJsonPath);
|
|
148
|
+
if (angularJson.projects && angularJson.projects[name] && angularJson.projects[name].architect && angularJson.projects[name].architect.build) {
|
|
149
|
+
angularJson.projects[name].architect.build.options.outputPath = 'dist/browser';
|
|
150
|
+
angularJson.projects[name].architect.build.options.baseHref = './';
|
|
151
|
+
await fs.writeFile(angularJsonPath, JSON.stringify(angularJson, null, 2));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
// ignore
|
|
156
|
+
}
|
|
157
|
+
// Package.json
|
|
158
|
+
const packageJsonPath = path.join(projectPath, 'package.json');
|
|
159
|
+
const packageJson = await fs.readJson(packageJsonPath);
|
|
160
|
+
packageJson.main = 'dist/electron/main.js';
|
|
161
|
+
packageJson.scripts['start'] = 'valence start';
|
|
162
|
+
packageJson.scripts['build'] = 'valence build';
|
|
163
|
+
packageJson.scripts['package'] = 'valence package';
|
|
164
|
+
packageJson.scripts['publish'] = 'valence publish';
|
|
165
|
+
packageJson.scripts['ng'] = 'ng';
|
|
166
|
+
if (packageJson.config && packageJson.config.forge) {
|
|
167
|
+
delete packageJson.config.forge;
|
|
168
|
+
}
|
|
169
|
+
await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
170
|
+
return 'Configuration complete';
|
|
171
|
+
});
|
|
172
|
+
// 5. Enhance Template
|
|
173
|
+
await runStage('Enhancing Template', async () => {
|
|
174
|
+
// standard body reset
|
|
175
|
+
const stylesScssPath = path.join(projectPath, 'src/styles.scss');
|
|
176
|
+
const stylesContent = `
|
|
177
|
+
html, body {
|
|
178
|
+
margin: 0;
|
|
179
|
+
padding: 0;
|
|
180
|
+
width: 100%;
|
|
181
|
+
height: 100%;
|
|
182
|
+
overflow: hidden;
|
|
183
|
+
background-color: #1a1a1a;
|
|
184
|
+
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
|
185
|
+
}
|
|
186
|
+
`;
|
|
187
|
+
await fs.writeFile(stylesScssPath, stylesContent.trim());
|
|
188
|
+
// AppComponent TS
|
|
189
|
+
const appComponentPath = path.join(projectPath, 'src/app/app.component.ts');
|
|
190
|
+
const appComponentTs = `
|
|
191
|
+
import { Component, ElementRef, AfterViewInit, ViewChild, OnDestroy, NgZone } from '@angular/core';
|
|
192
|
+
import { CommonModule } from '@angular/common';
|
|
193
|
+
import { RouterOutlet } from '@angular/router';
|
|
194
|
+
import { Engine, Scene, FreeCamera, Vector3, HemisphericLight, MeshBuilder, Color4, Mesh } from 'babylonjs';
|
|
195
|
+
|
|
196
|
+
@Component({
|
|
197
|
+
selector: 'app-root',
|
|
198
|
+
standalone: true,
|
|
199
|
+
imports: [CommonModule, RouterOutlet],
|
|
200
|
+
templateUrl: './app.component.html',
|
|
201
|
+
styleUrl: './app.component.scss'
|
|
202
|
+
})
|
|
203
|
+
export class AppComponent implements AfterViewInit, OnDestroy {
|
|
204
|
+
@ViewChild('renderCanvas', { static: true }) canvasRef!: ElementRef<HTMLCanvasElement>;
|
|
205
|
+
|
|
206
|
+
private engine!: Engine;
|
|
207
|
+
private scene!: Scene;
|
|
208
|
+
private plane!: Mesh;
|
|
209
|
+
|
|
210
|
+
// Debug Stats
|
|
211
|
+
public fps: string = '0';
|
|
212
|
+
public cameraPos: { x: string, y: string, z: string } = { x: '0.00', y: '0.00', z: '0.00' };
|
|
213
|
+
|
|
214
|
+
constructor(private ngZone: NgZone) {}
|
|
215
|
+
|
|
216
|
+
ngAfterViewInit(): void {
|
|
217
|
+
this.ngZone.runOutsideAngular(() => {
|
|
218
|
+
this.initBabylon();
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
// UI Update Loop (Low Frequency)
|
|
222
|
+
setInterval(() => {
|
|
223
|
+
if (this.engine) {
|
|
224
|
+
this.fps = this.engine.getFps().toFixed(0);
|
|
225
|
+
if (this.scene && this.scene.activeCamera) {
|
|
226
|
+
const p = this.scene.activeCamera.position;
|
|
227
|
+
this.cameraPos = {
|
|
228
|
+
x: p.x.toFixed(2),
|
|
229
|
+
y: p.y.toFixed(2),
|
|
230
|
+
z: p.z.toFixed(2)
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}, 500);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
private initBabylon(): void {
|
|
238
|
+
const canvas = this.canvasRef.nativeElement;
|
|
239
|
+
this.engine = new Engine(canvas, true);
|
|
240
|
+
this.scene = this.createScene();
|
|
241
|
+
|
|
242
|
+
this.engine.runRenderLoop(() => {
|
|
243
|
+
this.scene.render();
|
|
244
|
+
if (this.plane) {
|
|
245
|
+
this.plane.rotation.y += 0.01;
|
|
246
|
+
this.plane.rotation.x += 0.005;
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
window.addEventListener('resize', () => {
|
|
251
|
+
this.engine.resize();
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
private createScene(): Scene {
|
|
256
|
+
const scene = new Scene(this.engine);
|
|
257
|
+
scene.clearColor = new Color4(0.1, 0.1, 0.1, 1);
|
|
258
|
+
|
|
259
|
+
// Camera
|
|
260
|
+
const camera = new FreeCamera('camera1', new Vector3(0, 0, -5), scene);
|
|
261
|
+
camera.setTarget(Vector3.Zero());
|
|
262
|
+
camera.attachControl(this.canvasRef.nativeElement, true);
|
|
263
|
+
|
|
264
|
+
// Light
|
|
265
|
+
const light = new HemisphericLight('light1', new Vector3(0, 1, 0), scene);
|
|
266
|
+
light.intensity = 0.7;
|
|
267
|
+
|
|
268
|
+
// Rotating Plane
|
|
269
|
+
this.plane = MeshBuilder.CreatePlane('plane', { size: 2 }, scene);
|
|
270
|
+
// Double sided
|
|
271
|
+
this.plane.material = new (window as any).BABYLON.StandardMaterial('mat', scene);
|
|
272
|
+
(this.plane.material as any).backFaceCulling = false;
|
|
273
|
+
(this.plane.material as any).diffuseColor = new Color4(0.4, 0.8, 1, 1);
|
|
274
|
+
(this.plane.material as any).wireframe = true;
|
|
275
|
+
|
|
276
|
+
return scene;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
ngOnDestroy(): void {
|
|
280
|
+
if (this.engine) {
|
|
281
|
+
this.engine.dispose();
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
`;
|
|
286
|
+
await fs.writeFile(appComponentPath, appComponentTs.trim());
|
|
287
|
+
// AppComponent HTML
|
|
288
|
+
const appComponentHtml = `
|
|
289
|
+
<div class="app-container">
|
|
290
|
+
<canvas #renderCanvas id="renderCanvas"></canvas>
|
|
291
|
+
|
|
292
|
+
<!-- UI Overlay -->
|
|
293
|
+
<div class="ui-overlay">
|
|
294
|
+
<div class="logo-container">
|
|
295
|
+
<svg width="150" height="150" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
|
|
296
|
+
<defs>
|
|
297
|
+
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
298
|
+
<stop offset="0%" style="stop-color:#DD0031;stop-opacity:1" />
|
|
299
|
+
<stop offset="50%" style="stop-color:#47848F;stop-opacity:1" />
|
|
300
|
+
<stop offset="100%" style="stop-color:#ffffff;stop-opacity:1" />
|
|
301
|
+
</linearGradient>
|
|
302
|
+
<filter id="glow">
|
|
303
|
+
<feGaussianBlur stdDeviation="2.5" result="coloredBlur"/>
|
|
304
|
+
<feMerge>
|
|
305
|
+
<feMergeNode in="coloredBlur"/>
|
|
306
|
+
<feMergeNode in="SourceGraphic"/>
|
|
307
|
+
</feMerge>
|
|
308
|
+
</filter>
|
|
309
|
+
</defs>
|
|
310
|
+
<!-- Stylized V / Triangle Structure -->
|
|
311
|
+
<path d="M100 20 L180 170 L20 170 Z" fill="none" stroke="url(#grad1)" stroke-width="8" filter="url(#glow)" />
|
|
312
|
+
<circle cx="100" cy="90" r="30" fill="rgba(255,255,255,0.1)" stroke="white" stroke-width="2" />
|
|
313
|
+
<text x="100" y="195" font-family="Arial" font-size="24" fill="white" text-anchor="middle" font-weight="bold" letter-spacing="4">VALENCE</text>
|
|
314
|
+
</svg>
|
|
315
|
+
</div>
|
|
316
|
+
|
|
317
|
+
<div class="debug-panel">
|
|
318
|
+
<div class="stat-row"><span class="label">FPS:</span> <span class="value">{{ fps }}</span></div>
|
|
319
|
+
<div class="stat-row"><span class="label">POS:</span> <span class="value">X:{{ cameraPos.x }} Y:{{ cameraPos.y }} Z:{{ cameraPos.z }}</span></div>
|
|
320
|
+
<div class="stat-row info"><small>Angular + Electron + Babylon</small></div>
|
|
321
|
+
<div class="instructions">Use Arrow Keys / Mouse Drag to move</div>
|
|
322
|
+
</div>
|
|
323
|
+
</div>
|
|
324
|
+
</div>
|
|
325
|
+
`;
|
|
326
|
+
await fs.writeFile(path.join(projectPath, 'src/app/app.component.html'), appComponentHtml.trim());
|
|
327
|
+
// AppComponent SCSS
|
|
328
|
+
const appComponentScss = `
|
|
329
|
+
.app-container {
|
|
330
|
+
width: 100vw;
|
|
331
|
+
height: 100vh;
|
|
332
|
+
position: relative;
|
|
333
|
+
overflow: hidden;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
#renderCanvas {
|
|
337
|
+
width: 100%;
|
|
338
|
+
height: 100%;
|
|
339
|
+
touch-action: none;
|
|
340
|
+
outline: none;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.ui-overlay {
|
|
344
|
+
position: absolute;
|
|
345
|
+
top: 0;
|
|
346
|
+
left: 0;
|
|
347
|
+
width: 100%;
|
|
348
|
+
height: 100%;
|
|
349
|
+
pointer-events: none; // Let clicks pass to canvas
|
|
350
|
+
|
|
351
|
+
display: flex;
|
|
352
|
+
flex-direction: column;
|
|
353
|
+
justify-content: space-between;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
.logo-container {
|
|
357
|
+
padding: 2rem;
|
|
358
|
+
opacity: 0.8;
|
|
359
|
+
animation: float 6s ease-in-out infinite;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
.debug-panel {
|
|
363
|
+
position: absolute;
|
|
364
|
+
top: 2rem;
|
|
365
|
+
right: 2rem;
|
|
366
|
+
background: rgba(0, 0, 0, 0.7);
|
|
367
|
+
border-left: 4px solid #47848F;
|
|
368
|
+
padding: 1rem;
|
|
369
|
+
border-radius: 4px;
|
|
370
|
+
color: #fff;
|
|
371
|
+
font-family: 'Consolas', 'Monaco', monospace;
|
|
372
|
+
backdrop-filter: blur(5px);
|
|
373
|
+
pointer-events: auto; // Allow selecting text
|
|
374
|
+
|
|
375
|
+
.stat-row {
|
|
376
|
+
display: flex;
|
|
377
|
+
justify-content: space-between;
|
|
378
|
+
margin-bottom: 0.5rem;
|
|
379
|
+
min-width: 200px;
|
|
380
|
+
|
|
381
|
+
.label {
|
|
382
|
+
color: #aaa;
|
|
383
|
+
margin-right: 1rem;
|
|
384
|
+
}
|
|
385
|
+
.value {
|
|
386
|
+
color: #4dbf00;
|
|
387
|
+
font-weight: bold;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
.info {
|
|
391
|
+
margin-top: 1rem;
|
|
392
|
+
padding-top: 0.5rem;
|
|
393
|
+
border-top: 1px solid #333;
|
|
394
|
+
text-align: right;
|
|
395
|
+
opacity: 0.7;
|
|
396
|
+
}
|
|
397
|
+
.instructions {
|
|
398
|
+
margin-top: 0.5rem;
|
|
399
|
+
font-size: 0.8rem;
|
|
400
|
+
color: #ddd;
|
|
401
|
+
text-align: right;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
@keyframes float {
|
|
406
|
+
0% { transform: translateY(0px); }
|
|
407
|
+
50% { transform: translateY(-10px); }
|
|
408
|
+
100% { transform: translateY(0px); }
|
|
409
|
+
}
|
|
410
|
+
`;
|
|
411
|
+
await fs.writeFile(path.join(projectPath, 'src/app/app.component.scss'), appComponentScss.trim());
|
|
412
|
+
return 'Template Applied';
|
|
413
|
+
});
|
|
414
|
+
console.log(chalk.bold.green('\n✓ Project Created Successfully!'));
|
|
415
|
+
console.log(chalk.white(`\nNext steps:\n cd ${name}\n valence start\n`));
|
|
416
|
+
};
|
|
417
|
+
//# sourceMappingURL=new.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/publish.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import { start, pack } from './commands/lifecycle.js';
|
|
|
8
8
|
import { publish } from './commands/publish.js';
|
|
9
9
|
import { generateScene } from './commands/generate.js';
|
|
10
10
|
import { doctor } from './commands/doctor.js';
|
|
11
|
-
import {
|
|
11
|
+
import { newProject } from './commands/new.js';
|
|
12
12
|
const program = new Command();
|
|
13
13
|
program
|
|
14
14
|
.version('1.0.1')
|
|
@@ -61,418 +61,7 @@ program
|
|
|
61
61
|
.command('new <name>')
|
|
62
62
|
.description('Create a new project')
|
|
63
63
|
.action(async (name) => {
|
|
64
|
-
await
|
|
65
|
-
console.log(chalk.blue(`Creating new project: ${name}`));
|
|
66
|
-
if (!shell.which('git')) {
|
|
67
|
-
shell.echo('Sorry, this script requires git');
|
|
68
|
-
shell.exit(1);
|
|
69
|
-
}
|
|
70
|
-
if (!shell.which('npm')) {
|
|
71
|
-
shell.echo('Sorry, this script requires npm');
|
|
72
|
-
shell.exit(1);
|
|
73
|
-
}
|
|
74
|
-
// 1. Scaffold Angular Project
|
|
75
|
-
console.log(chalk.green('Scaffolding Angular project...'));
|
|
76
|
-
// Using npx to ensure we use a recent version of Angular CLI without requiring global install
|
|
77
|
-
// --skip-git because we might want to do our own init, or let the user do it.
|
|
78
|
-
// --directory . to create in current dir if name matches, but here we want a subfolder.
|
|
79
|
-
const ngCommand = `npx -y @angular/cli new ${name} --directory ${name} --style scss --routing --ssr=false --skip-git`;
|
|
80
|
-
if (shell.exec(ngCommand).code !== 0) {
|
|
81
|
-
shell.echo('Error: Angular CLI failed');
|
|
82
|
-
shell.exit(1);
|
|
83
|
-
}
|
|
84
|
-
const projectPath = path.join(process.cwd(), name);
|
|
85
|
-
shell.cd(projectPath);
|
|
86
|
-
// 2. Install Babylon.js
|
|
87
|
-
console.log(chalk.green('Installing Babylon.js...'));
|
|
88
|
-
shell.exec('npm install babylonjs @babylonjs/core @babylonjs/loaders');
|
|
89
|
-
// 3. Setup Electron
|
|
90
|
-
console.log(chalk.green('Setting up Electron...'));
|
|
91
|
-
shell.exec('npm install --save-dev electron electron-forge @electron-forge/cli @electron-forge/maker-squirrel @electron-forge/maker-zip');
|
|
92
|
-
// Create Electron folder
|
|
93
|
-
const electronDir = path.join(projectPath, 'electron');
|
|
94
|
-
if (!fs.existsSync(electronDir)) {
|
|
95
|
-
fs.mkdirSync(electronDir);
|
|
96
|
-
}
|
|
97
|
-
// Electron Main Process (TypeScript)
|
|
98
|
-
const electronMain = `
|
|
99
|
-
import { app, BrowserWindow } from 'electron';
|
|
100
|
-
import * as path from 'path';
|
|
101
|
-
|
|
102
|
-
function createWindow () {
|
|
103
|
-
const win = new BrowserWindow({
|
|
104
|
-
width: 800,
|
|
105
|
-
height: 600,
|
|
106
|
-
webPreferences: {
|
|
107
|
-
preload: path.join(__dirname, 'preload.js'),
|
|
108
|
-
nodeIntegration: true,
|
|
109
|
-
contextIsolation: false
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
const isDev = process.env.NODE_ENV === 'development';
|
|
114
|
-
|
|
115
|
-
if (isDev) {
|
|
116
|
-
win.loadURL('http://localhost:4200');
|
|
117
|
-
win.webContents.openDevTools();
|
|
118
|
-
} else {
|
|
119
|
-
// Path to angular build output.
|
|
120
|
-
// If angular builds to dist/browser, we are in dist/electron/main.js
|
|
121
|
-
// So ../browser/index.html is correct relative path from __dirname
|
|
122
|
-
win.loadFile(path.join(__dirname, '../browser/index.html'));
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
app.whenReady().then(() => {
|
|
127
|
-
createWindow();
|
|
128
|
-
|
|
129
|
-
app.on('activate', () => {
|
|
130
|
-
if (BrowserWindow.getAllWindows().length === 0) {
|
|
131
|
-
createWindow();
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
app.on('window-all-closed', () => {
|
|
137
|
-
if (process.platform !== 'darwin') {
|
|
138
|
-
app.quit();
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
`;
|
|
142
|
-
fs.writeFileSync(path.join(electronDir, 'main.ts'), electronMain.trim());
|
|
143
|
-
// Electron Preload (TypeScript)
|
|
144
|
-
const electronPreload = `
|
|
145
|
-
window.addEventListener('DOMContentLoaded', () => {
|
|
146
|
-
const replaceText = (selector: string, text: string) => {
|
|
147
|
-
const element = document.getElementById(selector);
|
|
148
|
-
if (element) element.innerText = text;
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
for (const type of ['chrome', 'node', 'electron']) {
|
|
152
|
-
replaceText(\`\${type}-version\`, process.versions[type as keyof NodeJS.ProcessVersions] || '');
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
`;
|
|
156
|
-
fs.writeFileSync(path.join(electronDir, 'preload.ts'), electronPreload.trim());
|
|
157
|
-
// Electron tsconfig
|
|
158
|
-
const electronTsConfig = {
|
|
159
|
-
"compilerOptions": {
|
|
160
|
-
"module": "commonjs",
|
|
161
|
-
"target": "es2020",
|
|
162
|
-
"outDir": "../dist/electron",
|
|
163
|
-
"rootDir": ".",
|
|
164
|
-
"sourceMap": true,
|
|
165
|
-
"strict": true
|
|
166
|
-
},
|
|
167
|
-
"include": [
|
|
168
|
-
"**/*.ts"
|
|
169
|
-
]
|
|
170
|
-
};
|
|
171
|
-
fs.writeFileSync(path.join(electronDir, 'tsconfig.json'), JSON.stringify(electronTsConfig, null, 2));
|
|
172
|
-
// 4. Create forge.config.js
|
|
173
|
-
console.log(chalk.green('Creating forge.config.js...'));
|
|
174
|
-
const forgeConfig = `
|
|
175
|
-
module.exports = {
|
|
176
|
-
packagerConfig: {},
|
|
177
|
-
rebuildConfig: {},
|
|
178
|
-
makers: [
|
|
179
|
-
{
|
|
180
|
-
name: '@electron-forge/maker-squirrel',
|
|
181
|
-
config: {},
|
|
182
|
-
},
|
|
183
|
-
{
|
|
184
|
-
name: '@electron-forge/maker-zip',
|
|
185
|
-
platforms: ['darwin', 'win32'],
|
|
186
|
-
},
|
|
187
|
-
{
|
|
188
|
-
name: '@electron-forge/maker-deb',
|
|
189
|
-
config: {},
|
|
190
|
-
},
|
|
191
|
-
{
|
|
192
|
-
name: '@electron-forge/maker-rpm',
|
|
193
|
-
config: {},
|
|
194
|
-
},
|
|
195
|
-
],
|
|
196
|
-
};
|
|
197
|
-
`;
|
|
198
|
-
fs.writeFileSync(path.join(projectPath, 'forge.config.js'), forgeConfig.trim());
|
|
199
|
-
// 5. Configure Angular Output Path
|
|
200
|
-
console.log(chalk.green('Configuring Angular build output...'));
|
|
201
|
-
const angularJsonPath = path.join(projectPath, 'angular.json');
|
|
202
|
-
try {
|
|
203
|
-
const angularJson = JSON.parse(fs.readFileSync(angularJsonPath, 'utf8'));
|
|
204
|
-
// Angular 17+ structure often has projects[name].architect.build.options.outputPath
|
|
205
|
-
// We want to set it to 'dist/browser' (or similar, but simple 'dist' might conflict if we want dist/electron too)
|
|
206
|
-
// Let's use 'dist/browser'
|
|
207
|
-
if (angularJson.projects && angularJson.projects[name] && angularJson.projects[name].architect && angularJson.projects[name].architect.build) {
|
|
208
|
-
angularJson.projects[name].architect.build.options.outputPath = 'dist/browser';
|
|
209
|
-
angularJson.projects[name].architect.build.options.baseHref = './';
|
|
210
|
-
fs.writeFileSync(angularJsonPath, JSON.stringify(angularJson, null, 2));
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
catch (e) {
|
|
214
|
-
console.warn(chalk.yellow('Could not auto-configure angular.json output path. You may need to set it manually.'));
|
|
215
|
-
}
|
|
216
|
-
// 6. Configure Package.json
|
|
217
|
-
console.log(chalk.green('Configuring package.json...'));
|
|
218
|
-
const packageJsonPath = path.join(projectPath, 'package.json');
|
|
219
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
220
|
-
packageJson.main = 'dist/electron/main.js';
|
|
221
|
-
// Scripts - delegation to valence is best for DX, or standard npm scripts
|
|
222
|
-
packageJson.scripts['start'] = 'valence start';
|
|
223
|
-
packageJson.scripts['build'] = 'valence build';
|
|
224
|
-
packageJson.scripts['package'] = 'valence package';
|
|
225
|
-
packageJson.scripts['publish'] = 'valence publish';
|
|
226
|
-
// Keep standard ones as fallbacks or underlying checks
|
|
227
|
-
packageJson.scripts['ng'] = 'ng';
|
|
228
|
-
// Remove inline forge config if present (we use file now)
|
|
229
|
-
if (packageJson.config && packageJson.config.forge) {
|
|
230
|
-
delete packageJson.config.forge;
|
|
231
|
-
}
|
|
232
|
-
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
233
|
-
// 7. Template Enhancement (Rich Default)
|
|
234
|
-
console.log(chalk.green('Enhancing default template...'));
|
|
235
|
-
// standard body reset
|
|
236
|
-
const stylesScssPath = path.join(projectPath, 'src/styles.scss');
|
|
237
|
-
const stylesContent = `
|
|
238
|
-
html, body {
|
|
239
|
-
margin: 0;
|
|
240
|
-
padding: 0;
|
|
241
|
-
width: 100%;
|
|
242
|
-
height: 100%;
|
|
243
|
-
overflow: hidden;
|
|
244
|
-
background-color: #1a1a1a;
|
|
245
|
-
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
|
246
|
-
}
|
|
247
|
-
`;
|
|
248
|
-
fs.writeFileSync(stylesScssPath, stylesContent.trim());
|
|
249
|
-
// AppComponent TS
|
|
250
|
-
const appComponentPath = path.join(projectPath, 'src/app/app.component.ts');
|
|
251
|
-
const appComponentTs = `
|
|
252
|
-
import { Component, ElementRef, AfterViewInit, ViewChild, OnDestroy, NgZone } from '@angular/core';
|
|
253
|
-
import { CommonModule } from '@angular/common';
|
|
254
|
-
import { RouterOutlet } from '@angular/router';
|
|
255
|
-
import { Engine, Scene, FreeCamera, Vector3, HemisphericLight, MeshBuilder, Color4, Mesh } from 'babylonjs';
|
|
256
|
-
|
|
257
|
-
@Component({
|
|
258
|
-
selector: 'app-root',
|
|
259
|
-
standalone: true,
|
|
260
|
-
imports: [CommonModule, RouterOutlet],
|
|
261
|
-
templateUrl: './app.component.html',
|
|
262
|
-
styleUrl: './app.component.scss'
|
|
263
|
-
})
|
|
264
|
-
export class AppComponent implements AfterViewInit, OnDestroy {
|
|
265
|
-
@ViewChild('renderCanvas', { static: true }) canvasRef!: ElementRef<HTMLCanvasElement>;
|
|
266
|
-
|
|
267
|
-
private engine!: Engine;
|
|
268
|
-
private scene!: Scene;
|
|
269
|
-
private plane!: Mesh;
|
|
270
|
-
|
|
271
|
-
// Debug Stats
|
|
272
|
-
public fps: string = '0';
|
|
273
|
-
public cameraPos: { x: string, y: string, z: string } = { x: '0.00', y: '0.00', z: '0.00' };
|
|
274
|
-
|
|
275
|
-
constructor(private ngZone: NgZone) {}
|
|
276
|
-
|
|
277
|
-
ngAfterViewInit(): void {
|
|
278
|
-
this.ngZone.runOutsideAngular(() => {
|
|
279
|
-
this.initBabylon();
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
// UI Update Loop (Low Frequency)
|
|
283
|
-
setInterval(() => {
|
|
284
|
-
if (this.engine) {
|
|
285
|
-
this.fps = this.engine.getFps().toFixed(0);
|
|
286
|
-
if (this.scene && this.scene.activeCamera) {
|
|
287
|
-
const p = this.scene.activeCamera.position;
|
|
288
|
-
this.cameraPos = {
|
|
289
|
-
x: p.x.toFixed(2),
|
|
290
|
-
y: p.y.toFixed(2),
|
|
291
|
-
z: p.z.toFixed(2)
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
// Trigger change detection manually if needed, or rely on Zone.js if we were inside zone.
|
|
295
|
-
// Since we are updating properties bound in template, and we are inside a setInterval which is patched by Zone.js,
|
|
296
|
-
// Angular should detect this automatically.
|
|
297
|
-
}
|
|
298
|
-
}, 500);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
private initBabylon(): void {
|
|
302
|
-
const canvas = this.canvasRef.nativeElement;
|
|
303
|
-
this.engine = new Engine(canvas, true);
|
|
304
|
-
this.scene = this.createScene();
|
|
305
|
-
|
|
306
|
-
this.engine.runRenderLoop(() => {
|
|
307
|
-
this.scene.render();
|
|
308
|
-
if (this.plane) {
|
|
309
|
-
this.plane.rotation.y += 0.01;
|
|
310
|
-
this.plane.rotation.x += 0.005;
|
|
311
|
-
}
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
window.addEventListener('resize', () => {
|
|
315
|
-
this.engine.resize();
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
private createScene(): Scene {
|
|
320
|
-
const scene = new Scene(this.engine);
|
|
321
|
-
scene.clearColor = new Color4(0.1, 0.1, 0.1, 1);
|
|
322
|
-
|
|
323
|
-
// Camera
|
|
324
|
-
const camera = new FreeCamera('camera1', new Vector3(0, 0, -5), scene);
|
|
325
|
-
camera.setTarget(Vector3.Zero());
|
|
326
|
-
camera.attachControl(this.canvasRef.nativeElement, true);
|
|
327
|
-
|
|
328
|
-
// Light
|
|
329
|
-
const light = new HemisphericLight('light1', new Vector3(0, 1, 0), scene);
|
|
330
|
-
light.intensity = 0.7;
|
|
331
|
-
|
|
332
|
-
// Rotating Plane
|
|
333
|
-
this.plane = MeshBuilder.CreatePlane('plane', { size: 2 }, scene);
|
|
334
|
-
// Double sided
|
|
335
|
-
this.plane.material = new (window as any).BABYLON.StandardMaterial('mat', scene);
|
|
336
|
-
(this.plane.material as any).backFaceCulling = false;
|
|
337
|
-
(this.plane.material as any).diffuseColor = new Color4(0.4, 0.8, 1, 1);
|
|
338
|
-
(this.plane.material as any).wireframe = true;
|
|
339
|
-
|
|
340
|
-
return scene;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
ngOnDestroy(): void {
|
|
344
|
-
if (this.engine) {
|
|
345
|
-
this.engine.dispose();
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
`;
|
|
350
|
-
fs.writeFileSync(appComponentPath, appComponentTs.trim());
|
|
351
|
-
// AppComponent HTML
|
|
352
|
-
const appComponentHtml = `
|
|
353
|
-
<div class="app-container">
|
|
354
|
-
<canvas #renderCanvas id="renderCanvas"></canvas>
|
|
355
|
-
|
|
356
|
-
<!-- UI Overlay -->
|
|
357
|
-
<div class="ui-overlay">
|
|
358
|
-
<div class="logo-container">
|
|
359
|
-
<svg width="150" height="150" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
|
|
360
|
-
<defs>
|
|
361
|
-
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
362
|
-
<stop offset="0%" style="stop-color:#DD0031;stop-opacity:1" />
|
|
363
|
-
<stop offset="50%" style="stop-color:#47848F;stop-opacity:1" />
|
|
364
|
-
<stop offset="100%" style="stop-color:#ffffff;stop-opacity:1" />
|
|
365
|
-
</linearGradient>
|
|
366
|
-
<filter id="glow">
|
|
367
|
-
<feGaussianBlur stdDeviation="2.5" result="coloredBlur"/>
|
|
368
|
-
<feMerge>
|
|
369
|
-
<feMergeNode in="coloredBlur"/>
|
|
370
|
-
<feMergeNode in="SourceGraphic"/>
|
|
371
|
-
</feMerge>
|
|
372
|
-
</filter>
|
|
373
|
-
</defs>
|
|
374
|
-
<!-- Stylized V / Triangle Structure -->
|
|
375
|
-
<path d="M100 20 L180 170 L20 170 Z" fill="none" stroke="url(#grad1)" stroke-width="8" filter="url(#glow)" />
|
|
376
|
-
<circle cx="100" cy="90" r="30" fill="rgba(255,255,255,0.1)" stroke="white" stroke-width="2" />
|
|
377
|
-
<text x="100" y="195" font-family="Arial" font-size="24" fill="white" text-anchor="middle" font-weight="bold" letter-spacing="4">VALENCE</text>
|
|
378
|
-
</svg>
|
|
379
|
-
</div>
|
|
380
|
-
|
|
381
|
-
<div class="debug-panel">
|
|
382
|
-
<div class="stat-row"><span class="label">FPS:</span> <span class="value">{{ fps }}</span></div>
|
|
383
|
-
<div class="stat-row"><span class="label">POS:</span> <span class="value">X:{{ cameraPos.x }} Y:{{ cameraPos.y }} Z:{{ cameraPos.z }}</span></div>
|
|
384
|
-
<div class="stat-row info"><small>Angular + Electron + Babylon</small></div>
|
|
385
|
-
<div class="instructions">Use Arrow Keys / Mouse Drag to move</div>
|
|
386
|
-
</div>
|
|
387
|
-
</div>
|
|
388
|
-
</div>
|
|
389
|
-
`;
|
|
390
|
-
fs.writeFileSync(path.join(projectPath, 'src/app/app.component.html'), appComponentHtml.trim());
|
|
391
|
-
// AppComponent SCSS
|
|
392
|
-
const appComponentScss = `
|
|
393
|
-
.app-container {
|
|
394
|
-
width: 100vw;
|
|
395
|
-
height: 100vh;
|
|
396
|
-
position: relative;
|
|
397
|
-
overflow: hidden;
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
#renderCanvas {
|
|
401
|
-
width: 100%;
|
|
402
|
-
height: 100%;
|
|
403
|
-
touch-action: none;
|
|
404
|
-
outline: none;
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
.ui-overlay {
|
|
408
|
-
position: absolute;
|
|
409
|
-
top: 0;
|
|
410
|
-
left: 0;
|
|
411
|
-
width: 100%;
|
|
412
|
-
height: 100%;
|
|
413
|
-
pointer-events: none; // Let clicks pass to canvas
|
|
414
|
-
|
|
415
|
-
display: flex;
|
|
416
|
-
flex-direction: column;
|
|
417
|
-
justify-content: space-between;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
.logo-container {
|
|
421
|
-
padding: 2rem;
|
|
422
|
-
opacity: 0.8;
|
|
423
|
-
animation: float 6s ease-in-out infinite;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
.debug-panel {
|
|
427
|
-
position: absolute;
|
|
428
|
-
top: 2rem;
|
|
429
|
-
right: 2rem;
|
|
430
|
-
background: rgba(0, 0, 0, 0.7);
|
|
431
|
-
border-left: 4px solid #47848F;
|
|
432
|
-
padding: 1rem;
|
|
433
|
-
border-radius: 4px;
|
|
434
|
-
color: #fff;
|
|
435
|
-
font-family: 'Consolas', 'Monaco', monospace;
|
|
436
|
-
backdrop-filter: blur(5px);
|
|
437
|
-
pointer-events: auto; // Allow selecting text
|
|
438
|
-
|
|
439
|
-
.stat-row {
|
|
440
|
-
display: flex;
|
|
441
|
-
justify-content: space-between;
|
|
442
|
-
margin-bottom: 0.5rem;
|
|
443
|
-
min-width: 200px;
|
|
444
|
-
|
|
445
|
-
.label {
|
|
446
|
-
color: #aaa;
|
|
447
|
-
margin-right: 1rem;
|
|
448
|
-
}
|
|
449
|
-
.value {
|
|
450
|
-
color: #4dbf00;
|
|
451
|
-
font-weight: bold;
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
.info {
|
|
455
|
-
margin-top: 1rem;
|
|
456
|
-
padding-top: 0.5rem;
|
|
457
|
-
border-top: 1px solid #333;
|
|
458
|
-
text-align: right;
|
|
459
|
-
opacity: 0.7;
|
|
460
|
-
}
|
|
461
|
-
.instructions {
|
|
462
|
-
margin-top: 0.5rem;
|
|
463
|
-
font-size: 0.8rem;
|
|
464
|
-
color: #ddd;
|
|
465
|
-
text-align: right;
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
@keyframes float {
|
|
470
|
-
0% { transform: translateY(0px); }
|
|
471
|
-
50% { transform: translateY(-10px); }
|
|
472
|
-
100% { transform: translateY(0px); }
|
|
473
|
-
}
|
|
474
|
-
`;
|
|
475
|
-
fs.writeFileSync(path.join(projectPath, 'src/app/app.component.scss'), appComponentScss.trim());
|
|
64
|
+
await newProject(name);
|
|
476
65
|
});
|
|
477
66
|
program.parse(process.argv);
|
|
478
67
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,SAAS,CAAC;AAC5B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,SAAS,CAAC;AAC5B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,+DAA+D,CAAC,CAAC;AAEhF,OAAO;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,MAAM,MAAM,EAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,wBAAwB,CAAC;KACjC,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IACzB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACnB,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,IAAI,0BAA0B,CAAC,CAAC,CAAC;IAC7E,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC;KACnC,MAAM,CAAC,OAAO,EAAE,uBAAuB,CAAC;KACxC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACtB,MAAM,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,MAAM,KAAK,EAAE,CAAC;AAClB,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,MAAM,IAAI,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,MAAM,OAAO,EAAE,CAAC;AACpB,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC3B,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEP,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|