create-babylonjs 9.0.0 ā 9.2.2
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/generators/bundlerConfig.d.ts +7 -0
- package/dist/generators/bundlerConfig.js +105 -0
- package/dist/generators/indexHtml.d.ts +2 -0
- package/dist/generators/indexHtml.js +128 -0
- package/dist/generators/packageJson.d.ts +2 -0
- package/dist/generators/packageJson.js +78 -0
- package/dist/generators/sceneCode.d.ts +2 -0
- package/dist/generators/sceneCode.js +141 -0
- package/dist/generators/tsConfig.d.ts +2 -0
- package/dist/generators/tsConfig.js +25 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +126 -0
- package/package.json +1 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateBundlerConfig = generateBundlerConfig;
|
|
4
|
+
function viteConfig(options) {
|
|
5
|
+
const filename = options.language === "ts" ? "vite.config.ts" : "vite.config.js";
|
|
6
|
+
const content = `import { defineConfig } from "vite";
|
|
7
|
+
|
|
8
|
+
export default defineConfig({
|
|
9
|
+
// https://vitejs.dev/config/
|
|
10
|
+
});
|
|
11
|
+
`;
|
|
12
|
+
return { filename, content };
|
|
13
|
+
}
|
|
14
|
+
function webpackConfig(options) {
|
|
15
|
+
const { language } = options;
|
|
16
|
+
const ext = language === "ts" ? "ts" : "js";
|
|
17
|
+
const filename = "webpack.config.js";
|
|
18
|
+
const tsRule = language === "ts"
|
|
19
|
+
? `
|
|
20
|
+
{
|
|
21
|
+
test: /\\.tsx?$/,
|
|
22
|
+
use: "ts-loader",
|
|
23
|
+
exclude: /node_modules/,
|
|
24
|
+
},`
|
|
25
|
+
: "";
|
|
26
|
+
const resolve = language === "ts"
|
|
27
|
+
? `
|
|
28
|
+
resolve: {
|
|
29
|
+
extensions: [".tsx", ".ts", ".js"],
|
|
30
|
+
},`
|
|
31
|
+
: "";
|
|
32
|
+
const content = `const path = require("path");
|
|
33
|
+
const HtmlWebpackPlugin = require("html-webpack-plugin");
|
|
34
|
+
|
|
35
|
+
module.exports = {
|
|
36
|
+
entry: "./src/index.${ext}",
|
|
37
|
+
output: {
|
|
38
|
+
filename: "bundle.js",
|
|
39
|
+
path: path.resolve(__dirname, "dist"),
|
|
40
|
+
clean: true,
|
|
41
|
+
},${resolve}
|
|
42
|
+
module: {
|
|
43
|
+
rules: [${tsRule}
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
plugins: [
|
|
47
|
+
new HtmlWebpackPlugin({
|
|
48
|
+
template: "./index.html",
|
|
49
|
+
}),
|
|
50
|
+
],
|
|
51
|
+
devServer: {
|
|
52
|
+
static: "./dist",
|
|
53
|
+
hot: true,
|
|
54
|
+
open: true,
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
`;
|
|
58
|
+
return { filename, content };
|
|
59
|
+
}
|
|
60
|
+
function rollupConfig(options) {
|
|
61
|
+
const { language } = options;
|
|
62
|
+
const ext = language === "ts" ? "ts" : "js";
|
|
63
|
+
const filename = "rollup.config.mjs";
|
|
64
|
+
const tsImport = language === "ts" ? `import typescript from "@rollup/plugin-typescript";\n` : "";
|
|
65
|
+
const tsPlugin = language === "ts" ? ` typescript(),\n` : "";
|
|
66
|
+
const content = `import resolve from "@rollup/plugin-node-resolve";
|
|
67
|
+
import commonjs from "@rollup/plugin-commonjs";
|
|
68
|
+
${tsImport}import serve from "rollup-plugin-serve";
|
|
69
|
+
import livereload from "rollup-plugin-livereload";
|
|
70
|
+
|
|
71
|
+
const production = process.env.BUILD === "production";
|
|
72
|
+
|
|
73
|
+
export default {
|
|
74
|
+
input: "src/index.${ext}",
|
|
75
|
+
output: {
|
|
76
|
+
file: "dist/bundle.js",
|
|
77
|
+
format: "iife",
|
|
78
|
+
sourcemap: !production,
|
|
79
|
+
},
|
|
80
|
+
plugins: [
|
|
81
|
+
resolve({ browser: true }),
|
|
82
|
+
commonjs(),
|
|
83
|
+
${tsPlugin} !production && serve({
|
|
84
|
+
open: true,
|
|
85
|
+
contentBase: ["", "dist"],
|
|
86
|
+
port: 3000,
|
|
87
|
+
}),
|
|
88
|
+
!production && livereload("dist"),
|
|
89
|
+
],
|
|
90
|
+
};
|
|
91
|
+
`;
|
|
92
|
+
return { filename, content };
|
|
93
|
+
}
|
|
94
|
+
function generateBundlerConfig(options) {
|
|
95
|
+
switch (options.bundler) {
|
|
96
|
+
case "vite":
|
|
97
|
+
return viteConfig(options);
|
|
98
|
+
case "webpack":
|
|
99
|
+
return webpackConfig(options);
|
|
100
|
+
case "rollup":
|
|
101
|
+
return rollupConfig(options);
|
|
102
|
+
case "none":
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateIndexHtml = generateIndexHtml;
|
|
4
|
+
function generateIndexHtml(options) {
|
|
5
|
+
const { bundler, moduleFormat } = options;
|
|
6
|
+
const styles = `
|
|
7
|
+
html, body {
|
|
8
|
+
overflow: hidden;
|
|
9
|
+
width: 100%;
|
|
10
|
+
height: 100%;
|
|
11
|
+
margin: 0;
|
|
12
|
+
padding: 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
#renderCanvas {
|
|
16
|
+
width: 100%;
|
|
17
|
+
height: 100%;
|
|
18
|
+
touch-action: none;
|
|
19
|
+
}`;
|
|
20
|
+
// CDN-only (no bundler, UMD)
|
|
21
|
+
if (bundler === "none") {
|
|
22
|
+
return `<!DOCTYPE html>
|
|
23
|
+
<html lang="en">
|
|
24
|
+
<head>
|
|
25
|
+
<meta charset="UTF-8" />
|
|
26
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
27
|
+
<title>Babylon.js App</title>
|
|
28
|
+
<style>${styles}
|
|
29
|
+
</style>
|
|
30
|
+
<script src="https://cdn.babylonjs.com/babylon.js"><\/script>
|
|
31
|
+
<script src="https://cdn.babylonjs.com/loaders/babylonjs.loaders.min.js"><\/script>
|
|
32
|
+
</head>
|
|
33
|
+
<body>
|
|
34
|
+
<canvas id="renderCanvas"></canvas>
|
|
35
|
+
<script>
|
|
36
|
+
const canvas = document.getElementById("renderCanvas");
|
|
37
|
+
const engine = new BABYLON.Engine(canvas, true);
|
|
38
|
+
|
|
39
|
+
const createScene = async function () {
|
|
40
|
+
const scene = new BABYLON.Scene(engine);
|
|
41
|
+
|
|
42
|
+
// Load a glTF model
|
|
43
|
+
await BABYLON.AppendSceneAsync("https://assets.babylonjs.com/meshes/boombox.glb", scene);
|
|
44
|
+
|
|
45
|
+
// Create a default camera that frames the loaded model
|
|
46
|
+
scene.createDefaultCamera(true, true, true);
|
|
47
|
+
// Rotate the camera to face the front of the model
|
|
48
|
+
scene.activeCamera.alpha += Math.PI;
|
|
49
|
+
|
|
50
|
+
// Create a default environment (skybox + ground + environment lighting)
|
|
51
|
+
scene.createDefaultEnvironment({
|
|
52
|
+
createGround: true,
|
|
53
|
+
createSkybox: true,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
return scene;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
createScene().then(function (scene) {
|
|
60
|
+
engine.runRenderLoop(function () {
|
|
61
|
+
scene.render();
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
window.addEventListener("resize", function () {
|
|
66
|
+
engine.resize();
|
|
67
|
+
});
|
|
68
|
+
<\/script>
|
|
69
|
+
</body>
|
|
70
|
+
</html>
|
|
71
|
+
`;
|
|
72
|
+
}
|
|
73
|
+
// Vite serves index.html from root ā entry via <script type="module">
|
|
74
|
+
if (bundler === "vite") {
|
|
75
|
+
const ext = moduleFormat === "umd" && options.language === "js" ? "js" : options.language === "ts" ? "ts" : "js";
|
|
76
|
+
return `<!DOCTYPE html>
|
|
77
|
+
<html lang="en">
|
|
78
|
+
<head>
|
|
79
|
+
<meta charset="UTF-8" />
|
|
80
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
81
|
+
<title>Babylon.js App</title>
|
|
82
|
+
<style>${styles}
|
|
83
|
+
</style>
|
|
84
|
+
</head>
|
|
85
|
+
<body>
|
|
86
|
+
<canvas id="renderCanvas"></canvas>
|
|
87
|
+
<script type="module" src="/src/index.${ext}"><\/script>
|
|
88
|
+
</body>
|
|
89
|
+
</html>
|
|
90
|
+
`;
|
|
91
|
+
}
|
|
92
|
+
// Webpack uses HtmlWebpackPlugin ā no script tag needed
|
|
93
|
+
if (bundler === "webpack") {
|
|
94
|
+
return `<!DOCTYPE html>
|
|
95
|
+
<html lang="en">
|
|
96
|
+
<head>
|
|
97
|
+
<meta charset="UTF-8" />
|
|
98
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
99
|
+
<title>Babylon.js App</title>
|
|
100
|
+
<style>${styles}
|
|
101
|
+
</style>
|
|
102
|
+
</head>
|
|
103
|
+
<body>
|
|
104
|
+
<canvas id="renderCanvas"></canvas>
|
|
105
|
+
</body>
|
|
106
|
+
</html>
|
|
107
|
+
`;
|
|
108
|
+
}
|
|
109
|
+
// Rollup ā bundle injected into dist/, reference it
|
|
110
|
+
if (bundler === "rollup") {
|
|
111
|
+
return `<!DOCTYPE html>
|
|
112
|
+
<html lang="en">
|
|
113
|
+
<head>
|
|
114
|
+
<meta charset="UTF-8" />
|
|
115
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
116
|
+
<title>Babylon.js App</title>
|
|
117
|
+
<style>${styles}
|
|
118
|
+
</style>
|
|
119
|
+
</head>
|
|
120
|
+
<body>
|
|
121
|
+
<canvas id="renderCanvas"></canvas>
|
|
122
|
+
<script src="dist/bundle.js"><\/script>
|
|
123
|
+
</body>
|
|
124
|
+
</html>
|
|
125
|
+
`;
|
|
126
|
+
}
|
|
127
|
+
return "";
|
|
128
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generatePackageJson = generatePackageJson;
|
|
4
|
+
function generatePackageJson(options) {
|
|
5
|
+
const { projectName, moduleFormat, language, bundler } = options;
|
|
6
|
+
const deps = {};
|
|
7
|
+
const devDeps = {};
|
|
8
|
+
const scripts = {};
|
|
9
|
+
// Core Babylon.js dependency + loaders
|
|
10
|
+
if (moduleFormat === "es6") {
|
|
11
|
+
deps["@babylonjs/core"] = "^9.0.0";
|
|
12
|
+
deps["@babylonjs/loaders"] = "^9.0.0";
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
deps["babylonjs"] = "^9.0.0";
|
|
16
|
+
deps["babylonjs-loaders"] = "^9.0.0";
|
|
17
|
+
}
|
|
18
|
+
// TypeScript
|
|
19
|
+
if (language === "ts") {
|
|
20
|
+
devDeps["typescript"] = "^5.4.0";
|
|
21
|
+
}
|
|
22
|
+
// Bundler-specific deps and scripts
|
|
23
|
+
switch (bundler) {
|
|
24
|
+
case "vite":
|
|
25
|
+
devDeps["vite"] = "^6.0.0";
|
|
26
|
+
if (language === "ts") {
|
|
27
|
+
scripts["dev"] = "vite";
|
|
28
|
+
scripts["build"] = "tsc && vite build";
|
|
29
|
+
scripts["preview"] = "vite preview";
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
scripts["dev"] = "vite";
|
|
33
|
+
scripts["build"] = "vite build";
|
|
34
|
+
scripts["preview"] = "vite preview";
|
|
35
|
+
}
|
|
36
|
+
break;
|
|
37
|
+
case "webpack":
|
|
38
|
+
devDeps["webpack"] = "^5.90.0";
|
|
39
|
+
devDeps["webpack-cli"] = "^6.0.0";
|
|
40
|
+
devDeps["webpack-dev-server"] = "^5.0.0";
|
|
41
|
+
devDeps["html-webpack-plugin"] = "^5.6.0";
|
|
42
|
+
if (language === "ts") {
|
|
43
|
+
devDeps["ts-loader"] = "^9.5.0";
|
|
44
|
+
}
|
|
45
|
+
scripts["dev"] = "webpack serve --mode development";
|
|
46
|
+
scripts["build"] = "webpack --mode production";
|
|
47
|
+
break;
|
|
48
|
+
case "rollup":
|
|
49
|
+
devDeps["rollup"] = "^4.10.0";
|
|
50
|
+
devDeps["@rollup/plugin-node-resolve"] = "^16.0.0";
|
|
51
|
+
devDeps["@rollup/plugin-commonjs"] = "^28.0.0";
|
|
52
|
+
devDeps["rollup-plugin-serve"] = "^3.0.0";
|
|
53
|
+
devDeps["rollup-plugin-livereload"] = "^2.0.0";
|
|
54
|
+
if (language === "ts") {
|
|
55
|
+
devDeps["@rollup/plugin-typescript"] = "^12.0.0";
|
|
56
|
+
devDeps["tslib"] = "^2.6.0";
|
|
57
|
+
}
|
|
58
|
+
scripts["dev"] = "rollup -c -w";
|
|
59
|
+
scripts["build"] = "rollup -c --environment BUILD:production";
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
const pkg = {
|
|
63
|
+
name: projectName,
|
|
64
|
+
version: "1.0.0",
|
|
65
|
+
private: true,
|
|
66
|
+
type: bundler === "vite" ? "module" : undefined,
|
|
67
|
+
scripts,
|
|
68
|
+
dependencies: deps,
|
|
69
|
+
devDependencies: devDeps,
|
|
70
|
+
};
|
|
71
|
+
// Remove undefined fields
|
|
72
|
+
Object.keys(pkg).forEach((key) => {
|
|
73
|
+
if (pkg[key] === undefined) {
|
|
74
|
+
delete pkg[key];
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return JSON.stringify(pkg, null, 2) + "\n";
|
|
78
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateSceneCode = generateSceneCode;
|
|
4
|
+
const GLTF_MODEL_URL = "https://assets.babylonjs.com/meshes/boombox.glb";
|
|
5
|
+
// ES6 scene code ā tree-shakeable imports
|
|
6
|
+
function es6Scene(language) {
|
|
7
|
+
const canvasCast = language === "ts" ? " as HTMLCanvasElement" : "";
|
|
8
|
+
const arcCamImport = language === "ts" ? '\nimport { ArcRotateCamera } from "@babylonjs/core/Cameras/arcRotateCamera";' : "";
|
|
9
|
+
const alphaCast = language === "ts" ? "(scene.activeCamera as ArcRotateCamera)" : "scene.activeCamera";
|
|
10
|
+
return `import { Engine } from "@babylonjs/core/Engines/engine";
|
|
11
|
+
import { Scene } from "@babylonjs/core/scene";
|
|
12
|
+
import { AppendSceneAsync } from "@babylonjs/core/Loading/sceneLoader";${arcCamImport}
|
|
13
|
+
|
|
14
|
+
// Side-effect imports: these register plugins and augment prototypes at load time
|
|
15
|
+
import "@babylonjs/core/Loading/loadingScreen";
|
|
16
|
+
import "@babylonjs/core/Helpers/sceneHelpers";
|
|
17
|
+
import "@babylonjs/core/Materials/standardMaterial";
|
|
18
|
+
import "@babylonjs/core/Materials/PBR/pbrMaterial";
|
|
19
|
+
import "@babylonjs/core/Materials/Textures/Loaders/envTextureLoader";
|
|
20
|
+
import "@babylonjs/loaders/glTF";
|
|
21
|
+
|
|
22
|
+
const canvas = document.getElementById("renderCanvas")${canvasCast};
|
|
23
|
+
const engine = new Engine(canvas, true);
|
|
24
|
+
|
|
25
|
+
const createScene = async () => {
|
|
26
|
+
const scene = new Scene(engine);
|
|
27
|
+
|
|
28
|
+
// Load a glTF model
|
|
29
|
+
await AppendSceneAsync("${GLTF_MODEL_URL}", scene);
|
|
30
|
+
|
|
31
|
+
// Create a default camera that frames the loaded model
|
|
32
|
+
scene.createDefaultCamera(true, true, true);
|
|
33
|
+
// Rotate the camera to face the front of the model
|
|
34
|
+
${alphaCast}.alpha += Math.PI;
|
|
35
|
+
|
|
36
|
+
// Create a default environment (skybox + ground + environment lighting)
|
|
37
|
+
scene.createDefaultEnvironment({
|
|
38
|
+
createGround: true,
|
|
39
|
+
createSkybox: true,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
return scene;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
createScene().then((scene) => {
|
|
46
|
+
engine.runRenderLoop(() => {
|
|
47
|
+
scene.render();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
window.addEventListener("resize", () => {
|
|
52
|
+
engine.resize();
|
|
53
|
+
});
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
// UMD scene code ā global BABYLON namespace
|
|
57
|
+
function umdScene(language) {
|
|
58
|
+
if (language === "ts") {
|
|
59
|
+
return `import * as BABYLON from "babylonjs";
|
|
60
|
+
import "babylonjs-loaders";
|
|
61
|
+
|
|
62
|
+
const canvas = document.getElementById("renderCanvas") as HTMLCanvasElement;
|
|
63
|
+
const engine = new BABYLON.Engine(canvas, true);
|
|
64
|
+
|
|
65
|
+
const createScene = async (): Promise<BABYLON.Scene> => {
|
|
66
|
+
const scene = new BABYLON.Scene(engine);
|
|
67
|
+
|
|
68
|
+
// Load a glTF model
|
|
69
|
+
await BABYLON.AppendSceneAsync("${GLTF_MODEL_URL}", scene);
|
|
70
|
+
|
|
71
|
+
// Create a default camera that frames the loaded model
|
|
72
|
+
scene.createDefaultCamera(true, true, true);
|
|
73
|
+
// Rotate the camera to face the front of the model
|
|
74
|
+
(scene.activeCamera as BABYLON.ArcRotateCamera).alpha += Math.PI;
|
|
75
|
+
|
|
76
|
+
// Create a default environment (skybox + ground + environment lighting)
|
|
77
|
+
scene.createDefaultEnvironment({
|
|
78
|
+
createGround: true,
|
|
79
|
+
createSkybox: true,
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
return scene;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
createScene().then((scene) => {
|
|
86
|
+
engine.runRenderLoop(() => {
|
|
87
|
+
scene.render();
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
window.addEventListener("resize", () => {
|
|
92
|
+
engine.resize();
|
|
93
|
+
});
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
// UMD + JS ā imports needed because this file is always bundled
|
|
97
|
+
// (CDN-only projects inline the scene code directly in index.html)
|
|
98
|
+
return `import * as BABYLON from "babylonjs";
|
|
99
|
+
import "babylonjs-loaders";
|
|
100
|
+
|
|
101
|
+
const canvas = document.getElementById("renderCanvas");
|
|
102
|
+
const engine = new BABYLON.Engine(canvas, true);
|
|
103
|
+
|
|
104
|
+
const createScene = async () => {
|
|
105
|
+
const scene = new BABYLON.Scene(engine);
|
|
106
|
+
|
|
107
|
+
// Load a glTF model
|
|
108
|
+
await BABYLON.AppendSceneAsync("${GLTF_MODEL_URL}", scene);
|
|
109
|
+
|
|
110
|
+
// Create a default camera that frames the loaded model
|
|
111
|
+
scene.createDefaultCamera(true, true, true);
|
|
112
|
+
// Rotate the camera to face the front of the model
|
|
113
|
+
scene.activeCamera.alpha += Math.PI;
|
|
114
|
+
|
|
115
|
+
// Create a default environment (skybox + ground + environment lighting)
|
|
116
|
+
scene.createDefaultEnvironment({
|
|
117
|
+
createGround: true,
|
|
118
|
+
createSkybox: true,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
return scene;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
createScene().then((scene) => {
|
|
125
|
+
engine.runRenderLoop(() => {
|
|
126
|
+
scene.render();
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
window.addEventListener("resize", () => {
|
|
131
|
+
engine.resize();
|
|
132
|
+
});
|
|
133
|
+
`;
|
|
134
|
+
}
|
|
135
|
+
function generateSceneCode(options) {
|
|
136
|
+
const { moduleFormat, language } = options;
|
|
137
|
+
if (moduleFormat === "es6") {
|
|
138
|
+
return es6Scene(language);
|
|
139
|
+
}
|
|
140
|
+
return umdScene(language);
|
|
141
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateTsConfig = generateTsConfig;
|
|
4
|
+
function generateTsConfig(options) {
|
|
5
|
+
const { bundler, moduleFormat } = options;
|
|
6
|
+
const base = {
|
|
7
|
+
compilerOptions: {
|
|
8
|
+
target: "ES2020",
|
|
9
|
+
module: bundler === "vite" ? "ESNext" : "ES2020",
|
|
10
|
+
moduleResolution: bundler === "vite" ? "bundler" : "node",
|
|
11
|
+
strict: true,
|
|
12
|
+
esModuleInterop: true,
|
|
13
|
+
skipLibCheck: true,
|
|
14
|
+
forceConsistentCasingInFileNames: true,
|
|
15
|
+
outDir: "./dist",
|
|
16
|
+
sourceMap: true,
|
|
17
|
+
},
|
|
18
|
+
include: ["src"],
|
|
19
|
+
};
|
|
20
|
+
// UMD packages ship their own typings via the `babylonjs` package
|
|
21
|
+
if (moduleFormat === "umd") {
|
|
22
|
+
base.compilerOptions.types = ["babylonjs"];
|
|
23
|
+
}
|
|
24
|
+
return JSON.stringify(base, null, 2) + "\n";
|
|
25
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export type ModuleFormat = "es6" | "umd";
|
|
3
|
+
export type Language = "ts" | "js";
|
|
4
|
+
export type Bundler = "vite" | "webpack" | "rollup" | "none";
|
|
5
|
+
export interface ProjectOptions {
|
|
6
|
+
projectName: string;
|
|
7
|
+
moduleFormat: ModuleFormat;
|
|
8
|
+
language: Language;
|
|
9
|
+
bundler: Bundler;
|
|
10
|
+
}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const prompts_1 = __importDefault(require("prompts"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const packageJson_1 = require("./generators/packageJson");
|
|
11
|
+
const indexHtml_1 = require("./generators/indexHtml");
|
|
12
|
+
const sceneCode_1 = require("./generators/sceneCode");
|
|
13
|
+
const bundlerConfig_1 = require("./generators/bundlerConfig");
|
|
14
|
+
const tsConfig_1 = require("./generators/tsConfig");
|
|
15
|
+
async function main() {
|
|
16
|
+
console.log("\nšļø Create Babylon.js Project\n");
|
|
17
|
+
const response = await (0, prompts_1.default)([
|
|
18
|
+
{
|
|
19
|
+
type: "text",
|
|
20
|
+
name: "projectName",
|
|
21
|
+
message: "Project name:",
|
|
22
|
+
initial: "my-babylonjs-app",
|
|
23
|
+
validate: (value) => (value.trim().length > 0 ? true : "Project name is required"),
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
type: "select",
|
|
27
|
+
name: "moduleFormat",
|
|
28
|
+
message: "Module format:",
|
|
29
|
+
choices: [
|
|
30
|
+
{ title: "ES6 (@babylonjs/core) ā tree-shakeable ES modules", value: "es6" },
|
|
31
|
+
{ title: "UMD (babylonjs) ā global BABYLON namespace", value: "umd" },
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
type: "select",
|
|
36
|
+
name: "language",
|
|
37
|
+
message: "Language:",
|
|
38
|
+
choices: [
|
|
39
|
+
{ title: "TypeScript", value: "ts" },
|
|
40
|
+
{ title: "JavaScript", value: "js" },
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
type: "select",
|
|
45
|
+
name: "bundler",
|
|
46
|
+
message: "Bundler:",
|
|
47
|
+
choices: (_, values) => {
|
|
48
|
+
const base = [
|
|
49
|
+
{ title: "Vite", value: "vite" },
|
|
50
|
+
{ title: "Webpack", value: "webpack" },
|
|
51
|
+
{ title: "Rollup", value: "rollup" },
|
|
52
|
+
];
|
|
53
|
+
if (values.moduleFormat === "umd") {
|
|
54
|
+
base.push({ title: "None (CDN script tags only)", value: "none" });
|
|
55
|
+
}
|
|
56
|
+
return base;
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
], {
|
|
60
|
+
onCancel: () => {
|
|
61
|
+
console.log("\nProject creation cancelled.");
|
|
62
|
+
process.exit(0);
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
const options = {
|
|
66
|
+
projectName: response.projectName.trim(),
|
|
67
|
+
moduleFormat: response.moduleFormat,
|
|
68
|
+
language: response.language,
|
|
69
|
+
bundler: response.bundler,
|
|
70
|
+
};
|
|
71
|
+
const targetDir = path_1.default.resolve(process.cwd(), options.projectName);
|
|
72
|
+
if (fs_1.default.existsSync(targetDir)) {
|
|
73
|
+
const { overwrite } = await (0, prompts_1.default)({
|
|
74
|
+
type: "confirm",
|
|
75
|
+
name: "overwrite",
|
|
76
|
+
message: `Directory "${options.projectName}" already exists. Overwrite?`,
|
|
77
|
+
initial: false,
|
|
78
|
+
});
|
|
79
|
+
if (!overwrite) {
|
|
80
|
+
console.log("Cancelled.");
|
|
81
|
+
process.exit(0);
|
|
82
|
+
}
|
|
83
|
+
fs_1.default.rmSync(targetDir, { recursive: true, force: true });
|
|
84
|
+
}
|
|
85
|
+
scaffoldProject(targetDir, options);
|
|
86
|
+
console.log(`\nā
Project created in ./${options.projectName}\n`);
|
|
87
|
+
console.log("Next steps:\n");
|
|
88
|
+
console.log(` cd ${options.projectName}`);
|
|
89
|
+
if (options.bundler !== "none") {
|
|
90
|
+
console.log(" npm install");
|
|
91
|
+
console.log(" npm run dev\n");
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.log(" Open index.html in your browser\n");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function scaffoldProject(targetDir, options) {
|
|
98
|
+
fs_1.default.mkdirSync(targetDir, { recursive: true });
|
|
99
|
+
if (options.bundler === "none") {
|
|
100
|
+
// CDN-only: just an HTML file
|
|
101
|
+
writeFile(targetDir, "index.html", (0, indexHtml_1.generateIndexHtml)(options));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// All bundler-based projects get these
|
|
105
|
+
writeFile(targetDir, "package.json", (0, packageJson_1.generatePackageJson)(options));
|
|
106
|
+
writeFile(targetDir, "index.html", (0, indexHtml_1.generateIndexHtml)(options));
|
|
107
|
+
const ext = options.language === "ts" ? "ts" : "js";
|
|
108
|
+
fs_1.default.mkdirSync(path_1.default.join(targetDir, "src"), { recursive: true });
|
|
109
|
+
writeFile(targetDir, `src/index.${ext}`, (0, sceneCode_1.generateSceneCode)(options));
|
|
110
|
+
if (options.language === "ts") {
|
|
111
|
+
writeFile(targetDir, "tsconfig.json", (0, tsConfig_1.generateTsConfig)(options));
|
|
112
|
+
}
|
|
113
|
+
const bundlerConfig = (0, bundlerConfig_1.generateBundlerConfig)(options);
|
|
114
|
+
if (bundlerConfig) {
|
|
115
|
+
writeFile(targetDir, bundlerConfig.filename, bundlerConfig.content);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function writeFile(dir, filePath, content) {
|
|
119
|
+
const fullPath = path_1.default.join(dir, filePath);
|
|
120
|
+
fs_1.default.mkdirSync(path_1.default.dirname(fullPath), { recursive: true });
|
|
121
|
+
fs_1.default.writeFileSync(fullPath, content, "utf-8");
|
|
122
|
+
}
|
|
123
|
+
main().catch((err) => {
|
|
124
|
+
console.error("Error:", err);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
});
|