diff --git a/package.json b/package.json index c487791..7d5b3d1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "scribunto-bundler", "description": "Lua bundler for Scribunto", - "version": "0.1.0", + "version": "0.1.1", "author": "Astrid ", "license": "MIT", "type": "module", @@ -13,7 +13,8 @@ "bundler" ], "files": [ - "dist" + "dist", + "templates" ], "repository": { "type": "git", @@ -29,11 +30,12 @@ }, "dependencies": { "@robertsspaceindustries/sub": "^1.0.8", + "@types/klaw": "^3.0.6", "commander": "^11.1.0", + "klaw": "^4.1.0", "picocolors": "^1.0.0" }, "devDependencies": { - "@types/klaw": "^3.0.6", "@types/node": "^20.11.7", "@typescript-eslint/eslint-plugin": "^6.19.1", "@typescript-eslint/parser": "^6.19.1", @@ -44,9 +46,9 @@ "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", "eslint-plugin-prettier": "^5.1.3", - "klaw": "^4.1.0", "prettier": "^3.2.4", "tsup": "^8.0.1", "typescript": "^5.3.3" } } + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d8292e9..f81723d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,17 +8,20 @@ dependencies: '@robertsspaceindustries/sub': specifier: ^1.0.8 version: 1.0.8 + '@types/klaw': + specifier: ^3.0.6 + version: 3.0.6 commander: specifier: ^11.1.0 version: 11.1.0 + klaw: + specifier: ^4.1.0 + version: 4.1.0 picocolors: specifier: ^1.0.0 version: 1.0.0 devDependencies: - '@types/klaw': - specifier: ^3.0.6 - version: 3.0.6 '@types/node': specifier: ^20.11.7 version: 20.11.10 @@ -49,9 +52,6 @@ devDependencies: eslint-plugin-prettier: specifier: ^5.1.3 version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.4) - klaw: - specifier: ^4.1.0 - version: 4.1.0 prettier: specifier: ^3.2.4 version: 3.2.4 @@ -739,13 +739,12 @@ packages: resolution: {integrity: sha512-BErW5TrTz4nzt/c3VRGf0Bug4JyQJ1o807F4mAfXfvOzFZ8SKgFeHJ0T28Y1KtqlMEB+cUgN7S7CsyQDQ/qxqg==} dependencies: '@types/node': 20.11.10 - dev: true + dev: false /@types/node@20.11.10: resolution: {integrity: sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg==} dependencies: undici-types: 5.26.5 - dev: true /@types/semver@7.5.6: resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} @@ -2099,7 +2098,7 @@ packages: /klaw@4.1.0: resolution: {integrity: sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==} engines: {node: '>=14.14.0'} - dev: true + dev: false /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -2872,7 +2871,6 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} diff --git a/src/bundle.ts b/src/bundle.ts index 6755406..395c3fd 100644 --- a/src/bundle.ts +++ b/src/bundle.ts @@ -15,7 +15,7 @@ export interface Module { export default async function bundleProject() { const workingDir = process.cwd(); - const configPath = path.join(workingDir, `.${name}.js`); + const configPath = path.join(workingDir, '.bundler.js'); info(`Using ${configPath}`); diff --git a/src/components/bundler.ts b/src/components/bundler.ts index 165e0dd..6f103f1 100644 --- a/src/components/bundler.ts +++ b/src/components/bundler.ts @@ -1,10 +1,25 @@ +import fs from 'node:fs'; +import path from 'node:path'; + import formatString from '@robertsspaceindustries/sub'; +import dirname from '../utils/dirname'; + import type { Module } from '../bundle'; -const bundlerManagerTemplate = TEMPLATES.bundler; -const bundlerModuleTemplate = TEMPLATES.bundlerModule; -const bundlerReturnTemplate = TEMPLATES.bundlerReturn; +const bundlerDir = path.resolve(dirname, 'templates/bundler'); +const bundlerManagerTemplate = fs.readFileSync( + path.join(bundlerDir, 'manager.lua'), + 'utf-8', +); +const bundlerModuleTemplate = fs.readFileSync( + path.join(bundlerDir, 'module.lua'), + 'utf-8', +); +const bundlerReturnTemplate = fs.readFileSync( + path.join(bundlerDir, 'return.lua'), + 'utf-8', +); export default function Bundler(modules: Module[]) { const formattedModules = []; diff --git a/src/create.ts b/src/create.ts index eb8a62f..6d71725 100644 --- a/src/create.ts +++ b/src/create.ts @@ -2,37 +2,38 @@ import childProcess from 'node:child_process'; import fs from 'node:fs'; import path from 'node:path'; -import formatString from '@robertsspaceindustries/sub'; - -import { event, ready, wait, warn } from './utils/log'; -import { name, version } from '../package.json'; - -const files = { - [`.${name}.js`]: TEMPLATES.config, - 'package.json': formatString(TEMPLATES.package, { - name, - version, - }), - '.gitignore': TEMPLATES['.gitignore'], - 'src/main.lua': '', -}; - -export default function createProject() { +import klaw from 'klaw'; + +import dirname from './utils/dirname'; +import { error, info, ready, wait } from './utils/log'; +import { name } from '../package.json'; + +const templateDir = path.resolve(dirname, 'templates/create'); + +export default async function createProject() { const workingDir = process.cwd(); - for (const file of Object.keys(files)) { - const target = path.join(workingDir, file); - if (!fs.existsSync(target)) { - fs.mkdirSync(path.dirname(target), { recursive: true }); - fs.writeFileSync(target, files[file], 'utf-8'); - event(`Created file ${file}`); - } else warn(`File ${file} already exists`); - } + let filesCopied = 0; + for await (const file of klaw(templateDir)) + if (file.stats.isFile()) { + const relative = path.relative(templateDir, file.path); + const targetPath = path.relative(workingDir, relative); + + fs.mkdirSync(path.dirname(targetPath), { recursive: true }); + fs.copyFileSync(file.path, targetPath); + filesCopied += 1; + } + info(`Copied ${filesCopied} file${filesCopied === 1 ? '' : 's'}`); wait('Installing packages...'); - childProcess.execSync(`npm install`, { - cwd: workingDir, - }); + try { + childProcess.execSync(`npm install`, { + cwd: workingDir, + }); + } catch (err) { + error(err); + process.exit(1); + } ready(`Base ${name} project created`); } diff --git a/src/enviroment.d.ts b/src/enviroment.d.ts deleted file mode 100644 index d90f7c1..0000000 --- a/src/enviroment.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare const TEMPLATES: Record; diff --git a/src/utils/dirname.ts b/src/utils/dirname.ts new file mode 100644 index 0000000..5e7a524 --- /dev/null +++ b/src/utils/dirname.ts @@ -0,0 +1,7 @@ +import path from 'path'; +import { fileURLToPath } from 'url'; + +// Inner `path.dirname` goes to `dist`, hence the outer +const dirname = path.dirname(path.dirname(fileURLToPath(import.meta.url))); + +export default dirname; diff --git a/src/templates/bundler/bundler.lua b/templates/bundler/manager.lua similarity index 100% rename from src/templates/bundler/bundler.lua rename to templates/bundler/manager.lua diff --git a/src/templates/bundler/bundlerModule.lua b/templates/bundler/module.lua similarity index 100% rename from src/templates/bundler/bundlerModule.lua rename to templates/bundler/module.lua diff --git a/src/templates/bundler/bundlerReturn.lua b/templates/bundler/return.lua similarity index 100% rename from src/templates/bundler/bundlerReturn.lua rename to templates/bundler/return.lua diff --git a/src/templates/create/config.js b/templates/create/.bundler.js similarity index 100% rename from src/templates/create/config.js rename to templates/create/.bundler.js diff --git a/src/templates/create/.gitignore b/templates/create/.gitignore similarity index 76% rename from src/templates/create/.gitignore rename to templates/create/.gitignore index 19a5333..14bb7d0 100644 --- a/src/templates/create/.gitignore +++ b/templates/create/.gitignore @@ -1,5 +1,8 @@ # dependencies /node_modules +# production +/dist + # package managers package-lock.json \ No newline at end of file diff --git a/templates/create/.vscode/settings.json b/templates/create/.vscode/settings.json new file mode 100644 index 0000000..33e5a17 --- /dev/null +++ b/templates/create/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "Lua.diagnostics.globals": ["mw"], + "Lua.workspace.ignoreDir": ["dist"] +} diff --git a/src/templates/create/package.json b/templates/create/package.json similarity index 59% rename from src/templates/create/package.json rename to templates/create/package.json index 86a1f9f..cf89874 100644 --- a/src/templates/create/package.json +++ b/templates/create/package.json @@ -1,6 +1,6 @@ { "type": "module", "dependencies": { - "{{name}}": "^{{version}}" + "scribunto-bundler": "0.1.1" } } diff --git a/templates/create/src/main.lua b/templates/create/src/main.lua new file mode 100644 index 0000000..e69de29 diff --git a/tsconfig.json b/tsconfig.json index 126b28c..a6ba7f3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,6 +14,6 @@ "outDir": "dist", "emitDeclarationOnly": true, }, - "include": ["**/*.ts", "**/*.js"], + "include": ["**/*.ts", "**/*.js", "templates/create/.bundler.js"], "exclude": ["dist", "node_modules"], } diff --git a/tsup.config.ts b/tsup.config.ts index fc7867a..e18da57 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -1,23 +1,15 @@ -import fs from 'node:fs'; -import path from 'node:path'; - -import klaw from 'klaw'; import { defineConfig } from 'tsup'; -const templates: Record = {}; -for await (const file of klaw('src/templates')) - if (file.stats.isFile()) - templates[path.parse(file.path).name] = fs.readFileSync(file.path, 'utf-8'); - export default defineConfig({ + outDir: 'dist', entry: ['src/index.ts'], - splitting: false, clean: true, + sourcemap: false, + splitting: false, target: 'node20', format: 'esm', dts: true, - define: { - TEMPLATES: JSON.stringify(templates), + banner: { + js: '#!/usr/bin/env node', }, - banner: { js: '#!/usr/bin/env node' }, });