valence-cli 1.2.7 → 1.3.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.
Files changed (95) hide show
  1. package/README.md +9 -2
  2. package/README.original.md +9 -20
  3. package/dist/README.md +133 -0
  4. package/dist/commands/add.d.ts.map +1 -1
  5. package/dist/commands/add.js +55 -1
  6. package/dist/commands/add.js.map +1 -1
  7. package/dist/commands/build.d.ts.map +1 -1
  8. package/dist/commands/build.js +115 -1
  9. package/dist/commands/build.js.map +1 -1
  10. package/dist/commands/codegen.js +42 -1
  11. package/dist/commands/doctor.d.ts.map +1 -1
  12. package/dist/commands/doctor.js +65 -1
  13. package/dist/commands/doctor.js.map +1 -1
  14. package/dist/commands/features/assets.d.ts +6 -0
  15. package/dist/commands/features/assets.d.ts.map +1 -0
  16. package/dist/commands/features/assets.js +113 -0
  17. package/dist/commands/features/assets.js.map +1 -0
  18. package/dist/commands/features/multiplayer.d.ts +2 -0
  19. package/dist/commands/features/multiplayer.d.ts.map +1 -0
  20. package/dist/commands/features/multiplayer.js +81 -0
  21. package/dist/commands/features/multiplayer.js.map +1 -0
  22. package/dist/commands/features/native.d.ts +2 -0
  23. package/dist/commands/features/native.d.ts.map +1 -0
  24. package/dist/commands/features/native.js +83 -0
  25. package/dist/commands/features/native.js.map +1 -0
  26. package/dist/commands/features/physics.d.ts +2 -0
  27. package/dist/commands/features/physics.d.ts.map +1 -0
  28. package/dist/commands/features/physics.js +44 -0
  29. package/dist/commands/features/physics.js.map +1 -0
  30. package/dist/commands/features/pipeline.d.ts +2 -0
  31. package/dist/commands/features/pipeline.d.ts.map +1 -0
  32. package/dist/commands/features/pipeline.js +28 -0
  33. package/dist/commands/features/pipeline.js.map +1 -0
  34. package/dist/commands/features/tailwind.d.ts +2 -0
  35. package/dist/commands/features/tailwind.d.ts.map +1 -0
  36. package/dist/commands/features/tailwind.js +46 -0
  37. package/dist/commands/features/tailwind.js.map +1 -0
  38. package/dist/commands/generate.js +186 -1
  39. package/dist/commands/lifecycle.d.ts.map +1 -1
  40. package/dist/commands/lifecycle.js +45 -1
  41. package/dist/commands/lifecycle.js.map +1 -1
  42. package/dist/commands/new-helpers.d.ts +11 -0
  43. package/dist/commands/new-helpers.d.ts.map +1 -0
  44. package/dist/commands/new-helpers.js +109 -0
  45. package/dist/commands/new-helpers.js.map +1 -0
  46. package/dist/commands/new.d.ts.map +1 -1
  47. package/dist/commands/new.js +153 -1
  48. package/dist/commands/new.js.map +1 -1
  49. package/dist/commands/publish.js +86 -1
  50. package/dist/commands/template.d.ts.map +1 -1
  51. package/dist/commands/template.js +259 -1
  52. package/dist/commands/template.js.map +1 -1
  53. package/dist/commands/verify.d.ts +2 -0
  54. package/dist/commands/verify.d.ts.map +1 -0
  55. package/dist/commands/verify.js +80 -0
  56. package/dist/commands/verify.js.map +1 -0
  57. package/dist/constants/versions.d.ts +38 -0
  58. package/dist/constants/versions.d.ts.map +1 -0
  59. package/dist/constants/versions.js +38 -0
  60. package/dist/constants/versions.js.map +1 -0
  61. package/dist/index.js +106 -1
  62. package/dist/index.js.map +1 -1
  63. package/dist/templates/angular.js +376 -1
  64. package/dist/templates/components.js +54 -1
  65. package/dist/templates/config.js +26 -1
  66. package/dist/templates/electron.js +124 -1
  67. package/dist/templates/index.d.ts +2 -0
  68. package/dist/templates/index.d.ts.map +1 -1
  69. package/dist/templates/index.js +7 -1
  70. package/dist/templates/index.js.map +1 -1
  71. package/dist/templates/multiplayer.d.ts +7 -0
  72. package/dist/templates/multiplayer.d.ts.map +1 -0
  73. package/dist/templates/multiplayer.js +151 -0
  74. package/dist/templates/multiplayer.js.map +1 -0
  75. package/dist/templates/native.d.ts +4 -0
  76. package/dist/templates/native.d.ts.map +1 -0
  77. package/dist/templates/native.js +40 -0
  78. package/dist/templates/native.js.map +1 -0
  79. package/dist/templates.js +2 -1
  80. package/dist/utils/ast.d.ts +20 -0
  81. package/dist/utils/ast.d.ts.map +1 -0
  82. package/dist/utils/ast.js +95 -0
  83. package/dist/utils/ast.js.map +1 -0
  84. package/dist/utils/engine.d.ts +9 -0
  85. package/dist/utils/engine.d.ts.map +1 -0
  86. package/dist/utils/engine.js +43 -0
  87. package/dist/utils/engine.js.map +1 -0
  88. package/dist/utils/logger.js +65 -1
  89. package/dist/utils/pipeline.d.ts +2 -0
  90. package/dist/utils/pipeline.d.ts.map +1 -0
  91. package/dist/utils/pipeline.js +69 -0
  92. package/dist/utils/pipeline.js.map +1 -0
  93. package/dist/utils/update.js +33 -1
  94. package/dist/utils/validation.js +12 -1
  95. package/package.json +3 -2
@@ -0,0 +1,81 @@
1
+ import chalk from 'chalk';
2
+ import * as path from 'path';
3
+ import fs from 'fs-extra';
4
+ import { runStage, execWithScrollingLogger } from '../../utils/logger.js';
5
+ import { ensureNamedImport } from '../../utils/ast.js';
6
+ import { getEngineService, insertInInitEngine } from '../../utils/engine.js';
7
+ import { VERSIONS } from '../../constants/versions.js';
8
+ import { serverPackageJson, serverTsConfig, serverIndex, roomTemplate, schemaTemplate, networkServiceTemplate } from '../../templates.js';
9
+ export async function addMultiplayer(cwd) {
10
+ console.log(chalk.cyan('\nAdding Multiplayer Support (Colyseus)...\n'));
11
+ // 1. Scaffold Server Directory
12
+ await runStage('Scaffolding Server', async () => {
13
+ const serverDir = path.join(cwd, 'server');
14
+ if (!await fs.pathExists(serverDir)) {
15
+ await fs.mkdir(serverDir);
16
+ await fs.mkdir(path.join(serverDir, 'src'));
17
+ await fs.mkdir(path.join(serverDir, 'src', 'rooms'));
18
+ await fs.mkdir(path.join(serverDir, 'src', 'schema'));
19
+ }
20
+ // Write Server Files
21
+ await fs.writeFile(path.join(serverDir, 'package.json'), serverPackageJson.trim());
22
+ await fs.writeFile(path.join(serverDir, 'tsconfig.json'), serverTsConfig.trim());
23
+ await fs.writeFile(path.join(serverDir, 'src', 'index.ts'), serverIndex.trim());
24
+ await fs.writeFile(path.join(serverDir, 'src', 'rooms', 'GameRoom.ts'), roomTemplate.trim());
25
+ await fs.writeFile(path.join(serverDir, 'src', 'schema', 'GameState.ts'), schemaTemplate.trim());
26
+ return 'Server files created';
27
+ });
28
+ // 2. Install Server Dependencies
29
+ await runStage('Installing Server Deps', async (spinner) => {
30
+ const serverDir = path.join(cwd, 'server');
31
+ // We use 'npm install' inside the server directory
32
+ await execWithScrollingLogger(spinner, 'npm', ['install'], { cwd: serverDir, title: 'Server npm install...', rows: 5 });
33
+ return 'Server dependencies installed';
34
+ });
35
+ // 3. Install Client Dependencies
36
+ await runStage('Installing Client Deps', async (spinner) => {
37
+ await execWithScrollingLogger(spinner, 'npm', ['install', `colyseus.js@${VERSIONS.libs.colyseus}`], { title: 'Client npm install...', rows: 5 });
38
+ return 'colyseus.js installed';
39
+ });
40
+ // 4. Create Angular Service
41
+ await runStage('Creating Network Service', async () => {
42
+ const servicePath = path.join(cwd, 'src/app/core/network.service.ts');
43
+ await fs.ensureDir(path.dirname(servicePath)); // Ensure core exists
44
+ if (!await fs.pathExists(servicePath)) {
45
+ await fs.writeFile(servicePath, networkServiceTemplate.trim());
46
+ }
47
+ return 'NetworkService created';
48
+ });
49
+ // 5. Inject into Engine
50
+ await runStage('Injecting Network Logic', async () => {
51
+ const { sourceFile, classDecl } = await getEngineService(cwd);
52
+ // Import NetworkService
53
+ ensureNamedImport(sourceFile, './core/network.service', 'NetworkService');
54
+ // Add to constructor
55
+ const constructor = classDecl.getConstructors()[0] || classDecl.addConstructor({});
56
+ const param = constructor.getParameter('networkService');
57
+ if (!param) {
58
+ constructor.addParameter({
59
+ name: 'networkService',
60
+ type: 'NetworkService',
61
+ scope: 'private'
62
+ });
63
+ }
64
+ insertInInitEngine(classDecl, `
65
+ try {
66
+ const room = await this.networkService.connect('game_room');
67
+ console.log("Connected to room:", room.roomId);
68
+
69
+ room.onMessage("hello", (message) => {
70
+ console.log("Server says:", message);
71
+ });
72
+ } catch {
73
+ console.warn("Multiplayer connection failed. Is the server running? (valence start)");
74
+ }`, 'after-scene');
75
+ await sourceFile.save();
76
+ return 'Engine connected to NetworkService';
77
+ });
78
+ console.log(chalk.bold.green('\n✓ Multiplayer Ready!'));
79
+ console.log(chalk.gray(' Run "valence start" to launch both client and server.\n'));
80
+ }
81
+ //# sourceMappingURL=multiplayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiplayer.js","sourceRoot":"","sources":["../../../src/commands/features/multiplayer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function addNative(cwd: string): Promise<void>;
2
+ //# sourceMappingURL=native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../src/commands/features/native.ts"],"names":[],"mappings":"AAWA,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,iBAkF1C"}
@@ -0,0 +1,83 @@
1
+ import chalk from 'chalk';
2
+ import * as path from 'path';
3
+ import fs from 'fs-extra';
4
+ import { execa } from 'execa';
5
+ import { runStage, execWithScrollingLogger } from '../../utils/logger.js';
6
+ import { nativePackageJson, nativeCargoToml, nativeLibRs } from '../../templates.js';
7
+ export async function addNative(cwd) {
8
+ console.log(chalk.cyan('\nAdding Native Rust Module (Neon)...\n'));
9
+ // Check Cargo
10
+ try {
11
+ await execa('cargo', ['--version']);
12
+ }
13
+ catch (e) {
14
+ throw new Error('Rust/Cargo is not installed or not in PATH. Please install Rust: https://rustup.rs/');
15
+ }
16
+ // 1. Scaffold Native Directory
17
+ await runStage('Scaffolding Native Module', async () => {
18
+ const nativeDir = path.join(cwd, 'native');
19
+ if (!await fs.pathExists(nativeDir)) {
20
+ await fs.mkdir(nativeDir);
21
+ await fs.mkdir(path.join(nativeDir, 'src'));
22
+ }
23
+ // Write Files
24
+ await fs.writeFile(path.join(nativeDir, 'package.json'), nativePackageJson.trim());
25
+ await fs.writeFile(path.join(nativeDir, 'Cargo.toml'), nativeCargoToml.trim());
26
+ await fs.writeFile(path.join(nativeDir, 'src', 'lib.rs'), nativeLibRs.trim());
27
+ return 'Native files created';
28
+ });
29
+ // 2. Install Deps - Skipped (No npm deps needed for direct cargo build)
30
+ /*
31
+ await runStage('Installing Native Deps', async (spinner) => {
32
+ const nativeDir = path.join(cwd, 'native');
33
+ await execWithScrollingLogger(spinner, 'npm', ['install'], { cwd: nativeDir, title: 'Installing neon...', rows: 5 });
34
+ return 'Neon installed';
35
+ });
36
+ */
37
+ await runStage('Linking Native Module', async (spinner) => {
38
+ const rootPkgPath = path.join(cwd, 'package.json');
39
+ const rootPkg = await fs.readJSON(rootPkgPath);
40
+ rootPkg.dependencies = rootPkg.dependencies || {};
41
+ rootPkg.dependencies['native'] = 'file:native';
42
+ await fs.writeJSON(rootPkgPath, rootPkg, { spaces: 2 });
43
+ // Manually link to avoid npm install gyp errors
44
+ const target = path.join(cwd, 'node_modules', 'native');
45
+ await fs.ensureDir(path.join(cwd, 'node_modules'));
46
+ if (await fs.pathExists(target))
47
+ await fs.remove(target);
48
+ // Use junction for Windows compatibility
49
+ await fs.ensureSymlink(path.join(cwd, 'native'), target, 'junction');
50
+ return 'Native module linked';
51
+ });
52
+ // 4. First Build
53
+ await runStage('Building Native Module', async (spinner) => {
54
+ const nativeDir = path.join(cwd, 'native');
55
+ try {
56
+ // Direct cargo build to avoid npm/neon spawning issues
57
+ await execWithScrollingLogger(spinner, 'cargo', ['build', '--release'], { cwd: nativeDir, title: 'Compiling Rust...', rows: 5 });
58
+ // Move artifact
59
+ const target = process.platform === 'win32' ? 'native.dll' : 'libnative.so'; // Cargo defaults
60
+ let builtFile = path.join(nativeDir, 'target', 'release', 'native.dll');
61
+ if (process.platform !== 'win32')
62
+ builtFile = path.join(nativeDir, 'target', 'release', 'libnative.so');
63
+ if (process.platform === 'darwin')
64
+ builtFile = path.join(nativeDir, 'target', 'release', 'libnative.dylib');
65
+ if (await fs.pathExists(builtFile)) {
66
+ await fs.copy(builtFile, path.join(nativeDir, 'index.node'), { overwrite: true });
67
+ return 'Compiled successfully';
68
+ }
69
+ else {
70
+ throw new Error(`Build artifact not found at ${builtFile}`);
71
+ }
72
+ }
73
+ catch (e) {
74
+ console.warn(chalk.yellow('\n⚠ Native build failed (Missing Prerequisites?). Continuing...'));
75
+ // Create dummy file to prevent resolve errors
76
+ await fs.ensureFile(path.join(nativeDir, 'index.node'));
77
+ return 'Scaffolding complete (Build skipped)';
78
+ }
79
+ });
80
+ console.log(chalk.bold.green('\n✓ Native Module Ready!'));
81
+ console.log(chalk.gray(' Import it in Electron Main: require("../../native")\n'));
82
+ }
83
+ //# sourceMappingURL=native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../../../src/commands/features/native.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function addPhysics(cwd: string): Promise<void>;
2
+ //# sourceMappingURL=physics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physics.d.ts","sourceRoot":"","sources":["../../../src/commands/features/physics.ts"],"names":[],"mappings":"AAQA,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,iBA0C3C"}
@@ -0,0 +1,44 @@
1
+ import chalk from 'chalk';
2
+ import * as path from 'path';
3
+ import fs from 'fs-extra';
4
+ import { runStage, execWithScrollingLogger } from '../../utils/logger.js';
5
+ import { ensureDefaultImport, ensureNamedImport, ensureClassProperty } from '../../utils/ast.js';
6
+ import { getEngineService, insertInInitEngine } from '../../utils/engine.js';
7
+ import { VERSIONS } from '../../constants/versions.js';
8
+ export async function addPhysics(cwd) {
9
+ console.log(chalk.cyan('\nAdding Havok Physics Support...\n'));
10
+ await runStage('Installing Havok Engine', async (spinner) => {
11
+ await execWithScrollingLogger(spinner, 'npm', ['install', `@babylonjs/havok@${VERSIONS.babylon.havok}`], { title: 'Installing Havok...', rows: 5 });
12
+ return 'Havok installed';
13
+ });
14
+ await runStage('Updating Assets Config', async () => {
15
+ const angularJsonPath = path.join(cwd, 'angular.json');
16
+ const angularJson = await fs.readJson(angularJsonPath);
17
+ const projectName = Object.keys(angularJson.projects)[0];
18
+ const assets = angularJson.projects[projectName].architect.build.options.assets;
19
+ const wasmEntry = {
20
+ "glob": "**/*.wasm",
21
+ "input": "node_modules/@babylonjs/havok/lib/esm",
22
+ "output": "assets"
23
+ };
24
+ const exists = assets.some((a) => a.input === wasmEntry.input);
25
+ if (!exists) {
26
+ assets.push(wasmEntry);
27
+ await fs.writeFile(angularJsonPath, JSON.stringify(angularJson, null, 2));
28
+ }
29
+ return 'angular.json updated';
30
+ });
31
+ await runStage('Injecting Engine Logic', async () => {
32
+ const { sourceFile, classDecl } = await getEngineService(cwd);
33
+ ensureDefaultImport(sourceFile, '@babylonjs/havok', 'HavokPhysics');
34
+ ensureNamedImport(sourceFile, 'babylonjs', 'HavokPlugin');
35
+ ensureClassProperty(classDecl, 'havokPlugin?', 'HavokPlugin');
36
+ insertInInitEngine(classDecl, `const havokInstance = await HavokPhysics();\n this.havokPlugin = new HavokPlugin(true, havokInstance);`, 'before-scene');
37
+ // Post init: enable physics
38
+ insertInInitEngine(classDecl, `if (this.scene && this.havokPlugin) {\n this.scene.enablePhysics(new Vector3(0, -9.81, 0), this.havokPlugin);\n }`, 'after-scene');
39
+ await sourceFile.save();
40
+ return 'Physics logic injected';
41
+ });
42
+ console.log(chalk.bold.green('\n✓ Physics Ready!'));
43
+ }
44
+ //# sourceMappingURL=physics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physics.js","sourceRoot":"","sources":["../../../src/commands/features/physics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function addPipeline(cwd: string): Promise<void>;
2
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/commands/features/pipeline.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,iBAwB5C"}
@@ -0,0 +1,28 @@
1
+ import chalk from 'chalk';
2
+ import * as path from 'path';
3
+ import fs from 'fs-extra';
4
+ import { runStage, execWithScrollingLogger } from '../../utils/logger.js';
5
+ import { VERSIONS } from '../../constants/versions.js';
6
+ export async function addPipeline(cwd) {
7
+ console.log(chalk.cyan('\nAdding Asset Pipeline...'));
8
+ await runStage('Installing Optimization Tools', async (spinner) => {
9
+ // Installing sharp as dev dependency
10
+ await execWithScrollingLogger(spinner, 'npm', ['install', '-D', `sharp@${VERSIONS.tools.sharp}`], { title: 'Installing sharp...', rows: 5 });
11
+ return 'Sharp installed';
12
+ });
13
+ await runStage('Configuring Pipeline', async () => {
14
+ const valenceConfigPath = path.join(cwd, '.valence/valence.json');
15
+ if (await fs.pathExists(valenceConfigPath)) {
16
+ const config = await fs.readJson(valenceConfigPath);
17
+ config.pipeline = {
18
+ enabled: true,
19
+ assets: ['src/assets']
20
+ };
21
+ await fs.writeJson(valenceConfigPath, config, { spaces: 2 });
22
+ }
23
+ return 'Pipeline enabled in valence.json';
24
+ });
25
+ console.log(chalk.bold.green('\n✓ Asset Pipeline Ready!'));
26
+ console.log(chalk.gray(' Assets will be optimized automatically during "valence build".\n'));
27
+ }
28
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/commands/features/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAEtD,MAAM,QAAQ,CAAC,+BAA+B,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9D,qCAAqC;QACrC,MAAM,uBAAuB,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7I,OAAO,iBAAiB,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;QAClE,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACpD,MAAM,CAAC,QAAQ,GAAG;gBACd,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,CAAC,YAAY,CAAC;aACzB,CAAC;YACF,MAAM,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,kCAAkC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC,CAAC;AAClG,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function addTailwind(cwd: string): Promise<void>;
2
+ //# sourceMappingURL=tailwind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind.d.ts","sourceRoot":"","sources":["../../../src/commands/features/tailwind.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,iBA4C5C"}
@@ -0,0 +1,46 @@
1
+ import chalk from 'chalk';
2
+ import * as path from 'path';
3
+ import fs from 'fs-extra';
4
+ import { runStage, execWithScrollingLogger } from '../../utils/logger.js';
5
+ import { VERSIONS } from '../../constants/versions.js';
6
+ export async function addTailwind(cwd) {
7
+ console.log(chalk.cyan('\nAdding TailwindCSS...\n'));
8
+ await runStage('Installing Dependencies', async (spinner) => {
9
+ await execWithScrollingLogger(spinner, 'npm', ['install', '-D',
10
+ `tailwindcss@${VERSIONS.tools.tailwindcss}`,
11
+ `postcss@${VERSIONS.tools.postcss}`,
12
+ `autoprefixer@${VERSIONS.tools.autoprefixer}`
13
+ ], { title: 'Installing...', rows: 5 });
14
+ return 'Packages installed';
15
+ });
16
+ await runStage('Initializing Config', async (spinner) => {
17
+ await execWithScrollingLogger(spinner, 'npx', ['tailwindcss', 'init'], { title: 'Init...', rows: 5 });
18
+ // Update tailwind.config.js
19
+ const configPath = path.join(cwd, 'tailwind.config.js');
20
+ const configParams = `/** @type {import('tailwindcss').Config} */
21
+ module.exports = {
22
+ content: [
23
+ "./src/**/*.{html,ts}",
24
+ ],
25
+ theme: {
26
+ extend: {},
27
+ },
28
+ plugins: [],
29
+ }`;
30
+ await fs.writeFile(configPath, configParams);
31
+ return 'Config verified';
32
+ });
33
+ await runStage('Updating Styles', async () => {
34
+ const stylesPath = path.join(cwd, 'src/styles.scss');
35
+ if (await fs.pathExists(stylesPath)) {
36
+ let content = await fs.readFile(stylesPath, 'utf8');
37
+ const directives = `@tailwind base;\n@tailwind components;\n@tailwind utilities;\n`;
38
+ if (!content.includes('@tailwind base')) {
39
+ await fs.writeFile(stylesPath, directives + content);
40
+ }
41
+ }
42
+ return 'styles.scss updated';
43
+ });
44
+ console.log(chalk.bold.green('\n✓ TailwindCSS Ready!'));
45
+ }
46
+ //# sourceMappingURL=tailwind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind.js","sourceRoot":"","sources":["../../../src/commands/features/tailwind.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAErD,MAAM,QAAQ,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACxD,MAAM,uBAAuB,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,IAAI;YAC1D,eAAe,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE;YAC3C,WAAW,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE;YACnC,gBAAgB,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE;SAChD,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACxC,OAAO,oBAAoB,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACpD,MAAM,uBAAuB,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAEtG,4BAA4B;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG;;;;;;;;;EAS3B,CAAC;QACK,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC7C,OAAO,iBAAiB,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QACrD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,gEAAgE,CAAC;YACpF,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACtC,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC;YACzD,CAAC;QACL,CAAC;QACD,OAAO,qBAAqB,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;AAC5D,CAAC"}