valence-cli 1.3.0 → 1.3.1
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 +56 -53
- package/README.original.md +56 -53
- package/dist/README.md +56 -53
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +39 -1
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/features/audio.d.ts +2 -0
- package/dist/commands/features/audio.d.ts.map +1 -0
- package/dist/commands/features/audio.js +17 -0
- package/dist/commands/features/audio.js.map +1 -0
- package/dist/commands/features/input.d.ts +2 -0
- package/dist/commands/features/input.d.ts.map +1 -0
- package/dist/commands/features/input.js +13 -0
- package/dist/commands/features/input.js.map +1 -0
- package/dist/commands/features/settings.d.ts +2 -0
- package/dist/commands/features/settings.d.ts.map +1 -0
- package/dist/commands/features/settings.js +13 -0
- package/dist/commands/features/settings.js.map +1 -0
- package/dist/commands/features/state.d.ts +2 -0
- package/dist/commands/features/state.d.ts.map +1 -0
- package/dist/commands/features/state.js +12 -0
- package/dist/commands/features/state.js.map +1 -0
- package/dist/commands/features/storage.d.ts +2 -0
- package/dist/commands/features/storage.d.ts.map +1 -0
- package/dist/commands/features/storage.js +33 -0
- package/dist/commands/features/storage.js.map +1 -0
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +19 -0
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/new-helpers.d.ts +2 -1
- package/dist/commands/new-helpers.d.ts.map +1 -1
- package/dist/commands/new-helpers.js +28 -76
- package/dist/commands/new-helpers.js.map +1 -1
- package/dist/commands/new.d.ts +1 -0
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +58 -38
- package/dist/commands/new.js.map +1 -1
- package/dist/constants/versions.d.ts +3 -0
- package/dist/constants/versions.d.ts.map +1 -1
- package/dist/constants/versions.js +3 -0
- package/dist/constants/versions.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/templates/angular.d.ts +2 -2
- package/dist/templates/angular.d.ts.map +1 -1
- package/dist/templates/angular.js +4 -5
- package/dist/templates/angular.js.map +1 -1
- package/dist/templates/audio.d.ts +2 -0
- package/dist/templates/audio.d.ts.map +1 -0
- package/dist/templates/audio.js +95 -0
- package/dist/templates/audio.js.map +1 -0
- package/dist/templates/index.d.ts +5 -0
- package/dist/templates/index.d.ts.map +1 -1
- package/dist/templates/index.js +5 -0
- package/dist/templates/index.js.map +1 -1
- package/dist/templates/input.d.ts +2 -0
- package/dist/templates/input.d.ts.map +1 -0
- package/dist/templates/input.js +159 -0
- package/dist/templates/input.js.map +1 -0
- package/dist/templates/phaser-scene.d.ts +2 -0
- package/dist/templates/phaser-scene.d.ts.map +1 -0
- package/dist/templates/phaser-scene.js +27 -0
- package/dist/templates/phaser-scene.js.map +1 -0
- package/dist/templates/phaser.d.ts +2 -0
- package/dist/templates/phaser.d.ts.map +1 -0
- package/dist/templates/phaser.js +147 -0
- package/dist/templates/phaser.js.map +1 -0
- package/dist/templates/settings.d.ts +2 -0
- package/dist/templates/settings.d.ts.map +1 -0
- package/dist/templates/settings.js +66 -0
- package/dist/templates/settings.js.map +1 -0
- package/dist/templates/state.d.ts +2 -0
- package/dist/templates/state.d.ts.map +1 -0
- package/dist/templates/state.js +35 -0
- package/dist/templates/state.js.map +1 -0
- package/dist/templates/storage.d.ts +4 -0
- package/dist/templates/storage.d.ts.map +1 -0
- package/dist/templates/storage.js +121 -0
- package/dist/templates/storage.js.map +1 -0
- package/dist/templates.d.ts +2 -0
- package/dist/templates.d.ts.map +1 -1
- package/dist/templates.js +2 -0
- package/dist/templates.js.map +1 -1
- package/dist/utils/ast/modify-app-component.d.ts +2 -0
- package/dist/utils/ast/modify-app-component.d.ts.map +1 -0
- package/dist/utils/ast/modify-app-component.js +136 -0
- package/dist/utils/ast/modify-app-component.js.map +1 -0
- package/dist/utils/configurators/angular.d.ts +2 -0
- package/dist/utils/configurators/angular.d.ts.map +1 -0
- package/dist/utils/configurators/angular.js +28 -0
- package/dist/utils/configurators/angular.js.map +1 -0
- package/dist/utils/configurators/electron.d.ts +2 -0
- package/dist/utils/configurators/electron.d.ts.map +1 -0
- package/dist/utils/configurators/electron.js +12 -0
- package/dist/utils/configurators/electron.js.map +1 -0
- package/dist/utils/configurators/meta.d.ts +5 -0
- package/dist/utils/configurators/meta.d.ts.map +1 -0
- package/dist/utils/configurators/meta.js +14 -0
- package/dist/utils/configurators/meta.js.map +1 -0
- package/dist/utils/configurators/package.d.ts +5 -0
- package/dist/utils/configurators/package.d.ts.map +1 -0
- package/dist/utils/configurators/package.js +23 -0
- package/dist/utils/configurators/package.js.map +1 -0
- package/dist/utils/files.d.ts +17 -0
- package/dist/utils/files.d.ts.map +1 -0
- package/dist/utils/files.js +41 -0
- package/dist/utils/files.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export const settingsServiceTemplate = `
|
|
2
|
+
import { Injectable, signal, effect } from '@angular/core';
|
|
3
|
+
import { StorageService } from '../storage/storage.service';
|
|
4
|
+
import { AudioService, SoundChannel } from '../audio/audio.service';
|
|
5
|
+
|
|
6
|
+
export interface GameSettings {
|
|
7
|
+
audio: {
|
|
8
|
+
master: number;
|
|
9
|
+
music: number;
|
|
10
|
+
sfx: number;
|
|
11
|
+
};
|
|
12
|
+
graphics: {
|
|
13
|
+
resolutionScale: number;
|
|
14
|
+
antialiasing: boolean;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const DEFAULT_SETTINGS: GameSettings = {
|
|
19
|
+
audio: { master: 1.0, music: 0.8, sfx: 1.0 },
|
|
20
|
+
graphics: { resolutionScale: 1.0, antialiasing: true }
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
@Injectable({
|
|
24
|
+
providedIn: 'root'
|
|
25
|
+
})
|
|
26
|
+
export class SettingsService {
|
|
27
|
+
|
|
28
|
+
public settings = signal<GameSettings>(DEFAULT_SETTINGS);
|
|
29
|
+
|
|
30
|
+
constructor(
|
|
31
|
+
private storage: StorageService,
|
|
32
|
+
private audio: AudioService
|
|
33
|
+
) {
|
|
34
|
+
|
|
35
|
+
// Auto-save on change (debounced effect could be better, but simple for now)
|
|
36
|
+
effect(() => {
|
|
37
|
+
const s = this.settings();
|
|
38
|
+
this.applySettings(s);
|
|
39
|
+
this.storage.save('settings', s);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private async loadSettings() {
|
|
44
|
+
const saved = await this.storage.load<GameSettings>('settings');
|
|
45
|
+
if (saved) {
|
|
46
|
+
this.settings.set({ ...DEFAULT_SETTINGS, ...saved });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private applySettings(s: GameSettings) {
|
|
51
|
+
this.audio.setVolume(SoundChannel.MASTER, s.audio.master);
|
|
52
|
+
this.audio.setVolume(SoundChannel.MUSIC, s.audio.music);
|
|
53
|
+
this.audio.setVolume(SoundChannel.SFX, s.audio.sfx);
|
|
54
|
+
|
|
55
|
+
// Graphics would typically be pulled by the EngineService from this signal
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public updateAudio(channel: keyof GameSettings['audio'], value: number) {
|
|
59
|
+
this.settings.update(s => ({
|
|
60
|
+
...s,
|
|
61
|
+
audio: { ...s.audio, [channel]: value }
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
`;
|
|
66
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/templates/settings.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEtC,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const gameStateServiceTemplate = "\nimport { Injectable, signal, computed } from '@angular/core';\n\nexport enum GameState {\n BOOT = 'boot',\n MAIN_MENU = 'main_menu',\n LOADING = 'loading',\n GAMEPLAY = 'gameplay',\n PAUSED = 'paused',\n GAME_OVER = 'game_over'\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GameStateService {\n \n private _state = signal<GameState>(GameState.BOOT);\n public state = this._state.asReadonly();\n\n // Computed checks for UI bindings\n public isMenu = computed(() => this._state() === GameState.MAIN_MENU);\n public isGameplay = computed(() => this._state() === GameState.GAMEPLAY);\n public isPaused = computed(() => this._state() === GameState.PAUSED);\n\n public set(newState: GameState) {\n console.log(`Game State Change: ${this._state()} -> ${newState}`);\n this._state.set(newState);\n \n // Trigger side effects here (e.g. pause engine, show overlay)\n // ValenceEngineService can listen to this signal.\n }\n}\n";
|
|
2
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/templates/state.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,y8BAiCpC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export const gameStateServiceTemplate = `
|
|
2
|
+
import { Injectable, signal, computed } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
export enum GameState {
|
|
5
|
+
BOOT = 'boot',
|
|
6
|
+
MAIN_MENU = 'main_menu',
|
|
7
|
+
LOADING = 'loading',
|
|
8
|
+
GAMEPLAY = 'gameplay',
|
|
9
|
+
PAUSED = 'paused',
|
|
10
|
+
GAME_OVER = 'game_over'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@Injectable({
|
|
14
|
+
providedIn: 'root'
|
|
15
|
+
})
|
|
16
|
+
export class GameStateService {
|
|
17
|
+
|
|
18
|
+
private _state = signal<GameState>(GameState.BOOT);
|
|
19
|
+
public state = this._state.asReadonly();
|
|
20
|
+
|
|
21
|
+
// Computed checks for UI bindings
|
|
22
|
+
public isMenu = computed(() => this._state() === GameState.MAIN_MENU);
|
|
23
|
+
public isGameplay = computed(() => this._state() === GameState.GAMEPLAY);
|
|
24
|
+
public isPaused = computed(() => this._state() === GameState.PAUSED);
|
|
25
|
+
|
|
26
|
+
public set(newState: GameState) {
|
|
27
|
+
console.log(\`Game State Change: \${this._state()} -> \${newState}\`);
|
|
28
|
+
this._state.set(newState);
|
|
29
|
+
|
|
30
|
+
// Trigger side effects here (e.g. pause engine, show overlay)
|
|
31
|
+
// ValenceEngineService can listen to this signal.
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
`;
|
|
35
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/templates/state.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCvC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const storageServiceTemplate = "\nimport { Injectable } from '@angular/core';\n\nexport interface StorageBridge {\n save: (key: string, data: string) => Promise<boolean>;\n load: (key: string) => Promise<string | null>;\n exists: (key: string) => Promise<boolean>;\n delete: (key: string) => Promise<boolean>;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class StorageService {\n \n private bridge?: StorageBridge;\n\n constructor() {\n const w = window as unknown as { valenceStorage?: StorageBridge };\n if (w.valenceStorage) {\n this.bridge = w.valenceStorage;\n } else {\n console.warn('Valence Storage Bridge not found. Data will be volatile (localStorage fallback).');\n }\n }\n\n public async save(key: string, data: unknown): Promise<boolean> {\n const serialized = JSON.stringify(data);\n if (this.bridge) {\n return await this.bridge.save(key, serialized);\n }\n localStorage.setItem(key, serialized);\n return true;\n }\n\n public async load<T>(key: string): Promise<T | null> {\n if (this.bridge) {\n const raw = await this.bridge.load(key);\n if (!raw) return null;\n try { return JSON.parse(raw); } catch { return null; }\n }\n const raw = localStorage.getItem(key);\n return raw ? JSON.parse(raw) : null;\n }\n\n public async delete(key: string): Promise<boolean> {\n if (this.bridge) {\n return await this.bridge.delete(key);\n }\n localStorage.removeItem(key);\n return true;\n }\n}\n";
|
|
2
|
+
export declare const storageBridgeTemplate = "\n// VALENCE: STORAGE_IPC\n// VALENCE: STORAGE_IPC\n// (Imports handled by injector)\n\n// Store data in User Data directory\nconst STORAGE_PATH = path.join(app.getPath('userData'), 'saves');\n\nif (!fs.existsSync(STORAGE_PATH)) {\n fs.mkdirSync(STORAGE_PATH, { recursive: true });\n}\n\nipcMain.handle('storage:save', async (_, key: string, data: string) => {\n try {\n const target = path.join(STORAGE_PATH, `${key}.json`);\n const temp = `${target}.tmp`;\n await fs.promises.writeFile(temp, data, 'utf8');\n await fs.promises.rename(temp, target); // Atomic write\n return true;\n } catch (e) {\n console.error('Storage Save Error:', e);\n return false;\n }\n});\n\nipcMain.handle('storage:load', async (_, key: string) => {\n try {\n const target = path.join(STORAGE_PATH, `${key}.json`);\n if (fs.existsSync(target)) {\n return await fs.promises.readFile(target, 'utf8');\n }\n return null;\n } catch (e) {\n console.error('Storage Load Error:', e);\n return null;\n }\n});\n\nipcMain.handle('storage:delete', async (_, key: string) => {\n try {\n const target = path.join(STORAGE_PATH, `${key}.json`);\n if (fs.existsSync(target)) {\n await fs.promises.unlink(target);\n }\n return true;\n } catch (e) {\n return false;\n }\n});\n\nipcMain.handle('storage:exists', async (_, key: string) => {\n const target = path.join(STORAGE_PATH, `${key}.json`);\n return fs.existsSync(target);\n});\n";
|
|
3
|
+
export declare const storagePreloadTemplate = "\n// VALENCE: STORAGE_PRELOAD\nimport { contextBridge, ipcRenderer } from 'electron';\n\ncontextBridge.exposeInMainWorld('valenceStorage', {\n save: (key: string, data: string) => ipcRenderer.invoke('storage:save', key, data),\n load: (key: string) => ipcRenderer.invoke('storage:load', key),\n delete: (key: string) => ipcRenderer.invoke('storage:delete', key),\n exists: (key: string) => ipcRenderer.invoke('storage:exists', key),\n});\n";
|
|
4
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/templates/storage.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,28CAqDlC,CAAC;AAEF,eAAO,MAAM,qBAAqB,q8CAsDjC,CAAC;AAEF,eAAO,MAAM,sBAAsB,gcAUlC,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
export const storageServiceTemplate = `
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
export interface StorageBridge {
|
|
5
|
+
save: (key: string, data: string) => Promise<boolean>;
|
|
6
|
+
load: (key: string) => Promise<string | null>;
|
|
7
|
+
exists: (key: string) => Promise<boolean>;
|
|
8
|
+
delete: (key: string) => Promise<boolean>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
@Injectable({
|
|
12
|
+
providedIn: 'root'
|
|
13
|
+
})
|
|
14
|
+
export class StorageService {
|
|
15
|
+
|
|
16
|
+
private bridge?: StorageBridge;
|
|
17
|
+
|
|
18
|
+
constructor() {
|
|
19
|
+
const w = window as unknown as { valenceStorage?: StorageBridge };
|
|
20
|
+
if (w.valenceStorage) {
|
|
21
|
+
this.bridge = w.valenceStorage;
|
|
22
|
+
} else {
|
|
23
|
+
console.warn('Valence Storage Bridge not found. Data will be volatile (localStorage fallback).');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public async save(key: string, data: unknown): Promise<boolean> {
|
|
28
|
+
const serialized = JSON.stringify(data);
|
|
29
|
+
if (this.bridge) {
|
|
30
|
+
return await this.bridge.save(key, serialized);
|
|
31
|
+
}
|
|
32
|
+
localStorage.setItem(key, serialized);
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public async load<T>(key: string): Promise<T | null> {
|
|
37
|
+
if (this.bridge) {
|
|
38
|
+
const raw = await this.bridge.load(key);
|
|
39
|
+
if (!raw) return null;
|
|
40
|
+
try { return JSON.parse(raw); } catch { return null; }
|
|
41
|
+
}
|
|
42
|
+
const raw = localStorage.getItem(key);
|
|
43
|
+
return raw ? JSON.parse(raw) : null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public async delete(key: string): Promise<boolean> {
|
|
47
|
+
if (this.bridge) {
|
|
48
|
+
return await this.bridge.delete(key);
|
|
49
|
+
}
|
|
50
|
+
localStorage.removeItem(key);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
`;
|
|
55
|
+
export const storageBridgeTemplate = `
|
|
56
|
+
// VALENCE: STORAGE_IPC
|
|
57
|
+
// VALENCE: STORAGE_IPC
|
|
58
|
+
// (Imports handled by injector)
|
|
59
|
+
|
|
60
|
+
// Store data in User Data directory
|
|
61
|
+
const STORAGE_PATH = path.join(app.getPath('userData'), 'saves');
|
|
62
|
+
|
|
63
|
+
if (!fs.existsSync(STORAGE_PATH)) {
|
|
64
|
+
fs.mkdirSync(STORAGE_PATH, { recursive: true });
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
ipcMain.handle('storage:save', async (_, key: string, data: string) => {
|
|
68
|
+
try {
|
|
69
|
+
const target = path.join(STORAGE_PATH, \`\${key}.json\`);
|
|
70
|
+
const temp = \`\${target}.tmp\`;
|
|
71
|
+
await fs.promises.writeFile(temp, data, 'utf8');
|
|
72
|
+
await fs.promises.rename(temp, target); // Atomic write
|
|
73
|
+
return true;
|
|
74
|
+
} catch (e) {
|
|
75
|
+
console.error('Storage Save Error:', e);
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
ipcMain.handle('storage:load', async (_, key: string) => {
|
|
81
|
+
try {
|
|
82
|
+
const target = path.join(STORAGE_PATH, \`\${key}.json\`);
|
|
83
|
+
if (fs.existsSync(target)) {
|
|
84
|
+
return await fs.promises.readFile(target, 'utf8');
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
} catch (e) {
|
|
88
|
+
console.error('Storage Load Error:', e);
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
ipcMain.handle('storage:delete', async (_, key: string) => {
|
|
94
|
+
try {
|
|
95
|
+
const target = path.join(STORAGE_PATH, \`\${key}.json\`);
|
|
96
|
+
if (fs.existsSync(target)) {
|
|
97
|
+
await fs.promises.unlink(target);
|
|
98
|
+
}
|
|
99
|
+
return true;
|
|
100
|
+
} catch (e) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
ipcMain.handle('storage:exists', async (_, key: string) => {
|
|
106
|
+
const target = path.join(STORAGE_PATH, \`\${key}.json\`);
|
|
107
|
+
return fs.existsSync(target);
|
|
108
|
+
});
|
|
109
|
+
`;
|
|
110
|
+
export const storagePreloadTemplate = `
|
|
111
|
+
// VALENCE: STORAGE_PRELOAD
|
|
112
|
+
import { contextBridge, ipcRenderer } from 'electron';
|
|
113
|
+
|
|
114
|
+
contextBridge.exposeInMainWorld('valenceStorage', {
|
|
115
|
+
save: (key: string, data: string) => ipcRenderer.invoke('storage:save', key, data),
|
|
116
|
+
load: (key: string) => ipcRenderer.invoke('storage:load', key),
|
|
117
|
+
delete: (key: string) => ipcRenderer.invoke('storage:delete', key),
|
|
118
|
+
exists: (key: string) => ipcRenderer.invoke('storage:exists', key),
|
|
119
|
+
});
|
|
120
|
+
`;
|
|
121
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/templates/storage.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDrC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsDpC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;CAUrC,CAAC"}
|
package/dist/templates.d.ts
CHANGED
package/dist/templates.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC"}
|
package/dist/templates.js
CHANGED
package/dist/templates.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modify-app-component.d.ts","sourceRoot":"","sources":["../../../src/utils/ast/modify-app-component.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB,GAAU,aAAa,MAAM,EAAE,YAAY,iBAAiB,GAAG,aAAa,kBAuI1G,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import { Project, SyntaxKind } from 'ts-morph';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
export const modifyAppComponent = async (projectPath, engineType) => {
|
|
5
|
+
const project = new Project();
|
|
6
|
+
const appInfo = await findAppFile(projectPath);
|
|
7
|
+
if (!appInfo) {
|
|
8
|
+
throw new Error('Could not find app.component.ts');
|
|
9
|
+
}
|
|
10
|
+
const { filePath, className } = appInfo;
|
|
11
|
+
const sourceFile = project.addSourceFileAtPath(filePath);
|
|
12
|
+
if (!className)
|
|
13
|
+
throw new Error('Could not determine AppComponent class name');
|
|
14
|
+
const classDecl = sourceFile.getClass(className);
|
|
15
|
+
if (!classDecl) {
|
|
16
|
+
throw new Error(`Class ${className} not found in ${filePath}`);
|
|
17
|
+
}
|
|
18
|
+
// 1. Add Imports
|
|
19
|
+
const serviceName = engineType === '3D (Babylon.js)' ? 'ValenceEngineService' : 'PhaserEngineService';
|
|
20
|
+
const serviceMethod = engineType === '3D (Babylon.js)' ? 'initEngine' : 'initGame';
|
|
21
|
+
sourceFile.addImportDeclaration({
|
|
22
|
+
namedImports: [serviceName],
|
|
23
|
+
moduleSpecifier: './valence-engine.service'
|
|
24
|
+
});
|
|
25
|
+
// Ensure Core Angular imports
|
|
26
|
+
const angularCoreImport = sourceFile.getImportDeclaration('@angular/core')
|
|
27
|
+
|| sourceFile.addImportDeclaration({ moduleSpecifier: '@angular/core' });
|
|
28
|
+
const requiredCoreImports = ['NgZone', 'ElementRef', 'ViewChild', 'AfterViewInit', 'OnDestroy'];
|
|
29
|
+
requiredCoreImports.forEach(imp => {
|
|
30
|
+
if (!angularCoreImport.getNamedImports().some(ni => ni.getName() === imp)) {
|
|
31
|
+
angularCoreImport.addNamedImport(imp);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
// 2. Implement Interfaces
|
|
35
|
+
classDecl.addImplements('AfterViewInit');
|
|
36
|
+
classDecl.addImplements('OnDestroy');
|
|
37
|
+
// 3. Add Properties
|
|
38
|
+
// @ViewChild('renderCanvas', { static: true }) canvasRef!: ElementRef<HTMLCanvasElement>;
|
|
39
|
+
// Check if property exists first to avoid duplicates (idempotency)
|
|
40
|
+
if (!classDecl.getProperty('canvasRef')) {
|
|
41
|
+
classDecl.addProperty({
|
|
42
|
+
name: 'canvasRef',
|
|
43
|
+
type: 'ElementRef<HTMLCanvasElement>',
|
|
44
|
+
decorators: [{
|
|
45
|
+
name: 'ViewChild',
|
|
46
|
+
arguments: ["'renderCanvas'", "{ static: true }"]
|
|
47
|
+
}],
|
|
48
|
+
hasExclamationToken: true
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// 4. Update Constructor
|
|
52
|
+
const ctor = classDecl.getConstructors()[0] || classDecl.addConstructor({});
|
|
53
|
+
if (!ctor.getParameter('engineService')) {
|
|
54
|
+
ctor.addParameter({
|
|
55
|
+
name: 'engineService',
|
|
56
|
+
type: serviceName,
|
|
57
|
+
scope: 'public'
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
if (!ctor.getParameter('ngZone')) {
|
|
61
|
+
ctor.addParameter({
|
|
62
|
+
name: 'ngZone',
|
|
63
|
+
type: 'NgZone',
|
|
64
|
+
scope: 'private'
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
// 5. Add Lifecycle Methods
|
|
68
|
+
const ngAfterViewInit = classDecl.getMethod('ngAfterViewInit') || classDecl.addMethod({ name: 'ngAfterViewInit' });
|
|
69
|
+
ngAfterViewInit.setBodyText(writer => {
|
|
70
|
+
writer.writeLine(`this.ngZone.runOutsideAngular(() => {`);
|
|
71
|
+
writer.writeLine(` this.engineService.${serviceMethod}(this.canvasRef.nativeElement);`);
|
|
72
|
+
writer.writeLine(`});`);
|
|
73
|
+
});
|
|
74
|
+
const ngOnDestroy = classDecl.getMethod('ngOnDestroy') || classDecl.addMethod({ name: 'ngOnDestroy' });
|
|
75
|
+
ngOnDestroy.setBodyText(writer => {
|
|
76
|
+
// Only Babylon service currently has dispose, but Phaser service has ngOnDestroy which is auto called if provided in root?
|
|
77
|
+
// Actually the service is injected. We might want to manually clean up if needed.
|
|
78
|
+
// The template calls engineService.dispose() or destroy depending on implementation.
|
|
79
|
+
// Let's assume the service handles its own destruction if it's singleton, but for explicit cleanup:
|
|
80
|
+
if (engineType === '3D (Babylon.js)') {
|
|
81
|
+
writer.writeLine(`this.engineService.dispose();`);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Phaser service has ngOnDestroy but we can explicitly null it if we want
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
// 6. Update Component Decorator (Standalone Imports)
|
|
88
|
+
const decorator = classDecl.getDecorator('Component');
|
|
89
|
+
if (decorator) {
|
|
90
|
+
const arg = decorator.getArguments()[0];
|
|
91
|
+
if (arg && arg.getKind() === SyntaxKind.ObjectLiteralExpression) {
|
|
92
|
+
const obj = arg.asKindOrThrow(SyntaxKind.ObjectLiteralExpression);
|
|
93
|
+
const importsProp = obj.getProperty('imports');
|
|
94
|
+
// Add TopnavComponent if not present
|
|
95
|
+
// We need to import it first
|
|
96
|
+
sourceFile.addImportDeclaration({
|
|
97
|
+
namedImports: ['TopnavComponent'],
|
|
98
|
+
moduleSpecifier: './core/topnav/topnav.component'
|
|
99
|
+
});
|
|
100
|
+
if (importsProp && importsProp.getKind() === SyntaxKind.PropertyAssignment) {
|
|
101
|
+
const arr = importsProp.asKindOrThrow(SyntaxKind.PropertyAssignment).getInitializerIfKind(SyntaxKind.ArrayLiteralExpression);
|
|
102
|
+
if (arr) {
|
|
103
|
+
if (!arr.getElements().some(e => e.getText() === 'TopnavComponent')) {
|
|
104
|
+
arr.addElement('TopnavComponent');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// If imports doesn't exist, we add it? Angular 19 might default to standalone: true
|
|
110
|
+
// But for now let's assume if it exists we patch it.
|
|
111
|
+
obj.addPropertyAssignment({
|
|
112
|
+
name: 'imports',
|
|
113
|
+
initializer: '[CommonModule, RouterOutlet, TopnavComponent]'
|
|
114
|
+
});
|
|
115
|
+
// Ensure CommonModule/RouterOutlet imports
|
|
116
|
+
sourceFile.addImportDeclaration({ namedImports: ['CommonModule'], moduleSpecifier: '@angular/common' });
|
|
117
|
+
sourceFile.addImportDeclaration({ namedImports: ['RouterOutlet'], moduleSpecifier: '@angular/router' });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
await sourceFile.save();
|
|
122
|
+
};
|
|
123
|
+
async function findAppFile(projectPath) {
|
|
124
|
+
const appDir = path.join(projectPath, 'src/app');
|
|
125
|
+
const files = await fs.readdir(appDir);
|
|
126
|
+
const tsFile = files.find(f => (f === 'app.ts' || f === 'app.component.ts'));
|
|
127
|
+
if (!tsFile)
|
|
128
|
+
return null;
|
|
129
|
+
const content = await fs.readFile(path.join(appDir, tsFile), 'utf8');
|
|
130
|
+
const match = content.match(/export class (\w+)/);
|
|
131
|
+
return {
|
|
132
|
+
filePath: path.join(appDir, tsFile),
|
|
133
|
+
className: match ? match[1] : 'AppComponent'
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=modify-app-component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modify-app-component.js","sourceRoot":"","sources":["../../../src/utils/ast/modify-app-component.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angular.d.ts","sourceRoot":"","sources":["../../../src/utils/configurators/angular.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,GAAU,aAAa,MAAM,EAAE,aAAa,MAAM,kBAyB9E,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
export const configureAngular = async (projectPath, projectName) => {
|
|
4
|
+
const angularJsonPath = path.join(projectPath, 'angular.json');
|
|
5
|
+
try {
|
|
6
|
+
const angularJson = await fs.readJson(angularJsonPath);
|
|
7
|
+
if (angularJson.projects && angularJson.projects[projectName]?.architect?.build) {
|
|
8
|
+
angularJson.projects[projectName].architect.build.options.outputPath = 'dist';
|
|
9
|
+
angularJson.projects[projectName].architect.build.options.baseHref = './';
|
|
10
|
+
// Remove Budgets
|
|
11
|
+
const productionConfig = angularJson.projects[projectName].architect.build.configurations?.production;
|
|
12
|
+
if (productionConfig?.budgets)
|
|
13
|
+
delete productionConfig.budgets;
|
|
14
|
+
await fs.writeFile(angularJsonPath, JSON.stringify(angularJson, null, 2));
|
|
15
|
+
}
|
|
16
|
+
// Patch index.html
|
|
17
|
+
const indexHtmlPath = path.join(projectPath, 'src/index.html');
|
|
18
|
+
if (await fs.pathExists(indexHtmlPath)) {
|
|
19
|
+
let indexHtml = await fs.readFile(indexHtmlPath, 'utf8');
|
|
20
|
+
indexHtml = indexHtml.replace('<base href="/">', '<base href="./">');
|
|
21
|
+
await fs.writeFile(indexHtmlPath, indexHtml);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
console.warn('Failed to configure Angular JSON', e);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=angular.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angular.js","sourceRoot":"","sources":["../../../src/utils/configurators/angular.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,WAAmB,EAAE,WAAmB,EAAE,EAAE;IAC/E,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC/D,IAAI,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QACvD,IAAI,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC9E,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC;YAC9E,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;YAE1E,iBAAiB;YACjB,MAAM,gBAAgB,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,EAAE,UAAU,CAAC;YACtG,IAAI,gBAAgB,EAAE,OAAO;gBAAE,OAAO,gBAAgB,CAAC,OAAO,CAAC;YAE/D,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC;QAED,mBAAmB;QACnB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QAC/D,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACrC,IAAI,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YACzD,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;YACrE,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;IACL,CAAC;IAAC,OAAM,CAAC,EAAE,CAAC;QACR,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"electron.d.ts","sourceRoot":"","sources":["../../../src/utils/configurators/electron.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,iBAAiB,GAAU,aAAa,MAAM,EAAE,SAAS,MAAM,kBAQ3E,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { electronMainTemplate, electronPreloadTemplate, electronTsConfigTemplate, forgeConfigTemplate } from '../../templates.js';
|
|
4
|
+
export const configureElectron = async (projectPath, repoUrl) => {
|
|
5
|
+
const electronDir = path.join(projectPath, 'electron');
|
|
6
|
+
await fs.ensureDir(electronDir);
|
|
7
|
+
await fs.writeFile(path.join(electronDir, 'main.ts'), electronMainTemplate.trim());
|
|
8
|
+
await fs.writeFile(path.join(electronDir, 'preload.ts'), electronPreloadTemplate.trim());
|
|
9
|
+
await fs.writeFile(path.join(electronDir, 'tsconfig.json'), JSON.stringify(electronTsConfigTemplate, null, 2));
|
|
10
|
+
await fs.writeFile(path.join(projectPath, 'forge.config.js'), forgeConfigTemplate(repoUrl).trim());
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=electron.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"electron.js","sourceRoot":"","sources":["../../../src/utils/configurators/electron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EACH,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,WAAmB,EAAE,OAAe,EAAE,EAAE;IAC5E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACvD,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAEhC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC;IACnF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,uBAAuB,CAAC,IAAI,EAAE,CAAC,CAAC;IACzF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,wBAAwB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/G,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACvG,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/utils/configurators/meta.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,GAAU,aAAa,MAAM,EAAE,QAAQ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,kBAUnG,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
export const configureValence = async (projectPath, config) => {
|
|
4
|
+
const valenceDir = path.join(projectPath, '.valence');
|
|
5
|
+
await fs.ensureDir(valenceDir);
|
|
6
|
+
await fs.writeJson(path.join(valenceDir, 'valence.json'), {
|
|
7
|
+
name: config.name,
|
|
8
|
+
type: 'valence-project',
|
|
9
|
+
engine: config.engine === '2D (Phaser)' ? '2d' : '3d',
|
|
10
|
+
version: '0.0.0',
|
|
11
|
+
createdAt: new Date().toISOString()
|
|
12
|
+
}, { spaces: 2 });
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/utils/configurators/meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,WAAmB,EAAE,MAAwC,EAAE,EAAE;IACpG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACtD,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC/B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE;QACtD,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QACrD,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../../src/utils/configurators/package.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB,GAAU,aAAa,MAAM,EAAE,QAAQ;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,kBAsB1G,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { eslintConfigTemplate } from '../../templates.js';
|
|
4
|
+
export const configurePackage = async (projectPath, config) => {
|
|
5
|
+
const packageJsonPath = path.join(projectPath, 'package.json');
|
|
6
|
+
const packageJson = await fs.readJson(packageJsonPath);
|
|
7
|
+
packageJson.scripts = {}; // Clear default scripts
|
|
8
|
+
packageJson.description = config.description;
|
|
9
|
+
packageJson.author = config.author;
|
|
10
|
+
packageJson.main = 'dist/electron/main.js';
|
|
11
|
+
// Valence Scripts
|
|
12
|
+
packageJson.scripts['start'] = 'valence start';
|
|
13
|
+
packageJson.scripts['build'] = 'valence build';
|
|
14
|
+
packageJson.scripts['package'] = 'valence package';
|
|
15
|
+
packageJson.scripts['publish'] = 'valence publish';
|
|
16
|
+
packageJson.scripts['lint'] = 'eslint .';
|
|
17
|
+
if (packageJson.config?.forge)
|
|
18
|
+
delete packageJson.config.forge;
|
|
19
|
+
await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
20
|
+
// ESLint Config (often paired with package setup)
|
|
21
|
+
await fs.writeFile(path.join(projectPath, 'eslint.config.js'), eslintConfigTemplate.trim());
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../../src/utils/configurators/package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,WAAmB,EAAE,MAA+C,EAAE,EAAE;IAC3G,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAEvD,WAAW,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,wBAAwB;IAClD,WAAW,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IAC7C,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACnC,WAAW,CAAC,IAAI,GAAG,uBAAuB,CAAC;IAE3C,kBAAkB;IAClB,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,eAAe,CAAC;IAC/C,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,eAAe,CAAC;IAC/C,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,iBAAiB,CAAC;IACnD,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,iBAAiB,CAAC;IACnD,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;IAEzC,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK;QAAE,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;IAE/D,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE1E,kDAAkD;IAClD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC;AAChG,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensures a specific import line exists in the content.
|
|
3
|
+
* @param content The file content
|
|
4
|
+
* @param importLine The full import line to add (e.g., "import * as fs from 'fs';")
|
|
5
|
+
* @param anchor The string to insert after (defaults to Electron import)
|
|
6
|
+
*/
|
|
7
|
+
export declare function ensureImport(content: string, importLine: string, anchor?: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Appends a block of code if a check string is not found.
|
|
10
|
+
*/
|
|
11
|
+
export declare function appendBlock(content: string, checkString: string, block: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Modifies a file safely.
|
|
14
|
+
* @returns true if file was modified, false otherwise.
|
|
15
|
+
*/
|
|
16
|
+
export declare function modifyFile(filePath: string, modifier: (content: string) => string): Promise<boolean>;
|
|
17
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,YAAY,CACxB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAkE,GAC3E,MAAM,CASR;AAED;;GAEG;AACH,wBAAgB,WAAW,CACvB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACd,MAAM,CAGR;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GACtC,OAAO,CAAC,OAAO,CAAC,CASlB"}
|