diff --git a/packages/create-rslib/package.json b/packages/create-rslib/package.json index 6de943609..6e538ae8a 100644 --- a/packages/create-rslib/package.json +++ b/packages/create-rslib/package.json @@ -31,6 +31,7 @@ "create-rstack": "1.0.7" }, "devDependencies": { + "@rslib/core": "workspace:*", "@rslib/tsconfig": "workspace:*", "@types/fs-extra": "^11.0.4", "@types/node": "~18.19.39", diff --git a/packages/create-rslib/src/index.ts b/packages/create-rslib/src/index.ts index 2f9662f10..08ee74e96 100644 --- a/packages/create-rslib/src/index.ts +++ b/packages/create-rslib/src/index.ts @@ -13,15 +13,21 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url)); async function getTemplateName({ template }: Argv) { if (typeof template === 'string') { const pair = template.split('-'); - const language = pair[1] ?? 'js'; - const type = pair[0]; - return `${type}-${language}`; + const lang = pair[pair.length - 1]; + if (lang && ['js', 'ts'].includes(lang)) { + return template; + } + // default to ts + return `${template}-ts`; } const type = checkCancel( await select({ message: 'Select template', - options: [{ value: 'example', label: 'Example' }], + options: [ + { value: 'node-dual', label: 'Node.js dual ESM/CJS package' }, + { value: 'node-esm', label: 'Node.js pure ESM package' }, + ], }), ); @@ -39,14 +45,14 @@ async function getTemplateName({ template }: Argv) { } function mapESLintTemplate(templateName: string) { - const language = templateName.split('-')[1]; + const language = templateName.split('-').pop(); return `vanilla-${language}` as ESLintTemplateName; } create({ root: path.resolve(__dirname, '..'), name: 'rslib', - templates: ['example-js', 'example-ts'], + templates: ['node-dual-js', 'node-dual-ts', 'node-esm-js', 'node-esm-ts'], getTemplateName, mapESLintTemplate, }); diff --git a/packages/create-rslib/template-example-js/package.json b/packages/create-rslib/template-example-js/package.json deleted file mode 100644 index b50194614..000000000 --- a/packages/create-rslib/template-example-js/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "rslib-vanilla-js", - "version": "1.0.0", - "private": true, - "scripts": { - "build": "rslib build", - "dev": "rslib build --watch" - }, - "devDependencies": { - "@rslib/core": "workspace:*" - } -} diff --git a/packages/create-rslib/template-example-js/rslib.config.mjs b/packages/create-rslib/template-example-js/rslib.config.mjs deleted file mode 100644 index dcd096638..000000000 --- a/packages/create-rslib/template-example-js/rslib.config.mjs +++ /dev/null @@ -1,5 +0,0 @@ -import { defineConfig } from '@rslib/core'; - -export default defineConfig({ - lib: [{ format: 'esm' }], -}); diff --git a/packages/create-rslib/template-example-ts/package.json b/packages/create-rslib/template-example-ts/package.json deleted file mode 100644 index d8eebc175..000000000 --- a/packages/create-rslib/template-example-ts/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "rslib-example-ts", - "version": "1.0.0", - "private": true, - "scripts": { - "build": "rslib build", - "dev": "rslib build --watch" - }, - "devDependencies": { - "@rslib/core": "workspace:*", - "typescript": "^5.6.3" - } -} diff --git a/packages/create-rslib/template-example-ts/rslib.config.ts b/packages/create-rslib/template-example-ts/rslib.config.ts deleted file mode 100644 index dcd096638..000000000 --- a/packages/create-rslib/template-example-ts/rslib.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { defineConfig } from '@rslib/core'; - -export default defineConfig({ - lib: [{ format: 'esm' }], -}); diff --git a/packages/create-rslib/template-node-dual-js/package.json b/packages/create-rslib/template-node-dual-js/package.json new file mode 100644 index 000000000..89901052e --- /dev/null +++ b/packages/create-rslib/template-node-dual-js/package.json @@ -0,0 +1,23 @@ +{ + "name": "rslib-node-dual-js", + "version": "0.0.0", + "type": "module", + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + }, + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "files": [ + "dist" + ], + "scripts": { + "build": "rslib build", + "dev": "rslib build --watch" + }, + "devDependencies": { + "@rslib/core": "workspace:*" + } +} diff --git a/packages/create-rslib/template-node-dual-js/rslib.config.mjs b/packages/create-rslib/template-node-dual-js/rslib.config.mjs new file mode 100644 index 000000000..2e440385b --- /dev/null +++ b/packages/create-rslib/template-node-dual-js/rslib.config.mjs @@ -0,0 +1,15 @@ +import { defineConfig } from '@rslib/core'; + +export default defineConfig({ + lib: [ + { + format: 'esm', + syntax: 'es2021', + }, + { + format: 'cjs', + syntax: 'es2021', + }, + ], + output: { target: 'node' }, +}); diff --git a/packages/create-rslib/template-example-js/src/index.js b/packages/create-rslib/template-node-dual-js/src/index.js similarity index 100% rename from packages/create-rslib/template-example-js/src/index.js rename to packages/create-rslib/template-node-dual-js/src/index.js diff --git a/packages/create-rslib/template-node-dual-ts/package.json b/packages/create-rslib/template-node-dual-ts/package.json new file mode 100644 index 000000000..dc167f993 --- /dev/null +++ b/packages/create-rslib/template-node-dual-ts/package.json @@ -0,0 +1,26 @@ +{ + "name": "rslib-node-dual-ts", + "version": "0.0.0", + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + }, + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "rslib build", + "dev": "rslib build --watch" + }, + "devDependencies": { + "@rslib/core": "workspace:*", + "typescript": "^5.6.3" + } +} diff --git a/packages/create-rslib/template-node-dual-ts/rslib.config.ts b/packages/create-rslib/template-node-dual-ts/rslib.config.ts new file mode 100644 index 000000000..f1f926319 --- /dev/null +++ b/packages/create-rslib/template-node-dual-ts/rslib.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from '@rslib/core'; + +export default defineConfig({ + lib: [ + { + format: 'esm', + syntax: 'es2021', + dts: {}, + }, + { + format: 'cjs', + syntax: 'es2021', + }, + ], + output: { target: 'node' }, +}); diff --git a/packages/create-rslib/template-example-ts/src/index.ts b/packages/create-rslib/template-node-dual-ts/src/index.ts similarity index 100% rename from packages/create-rslib/template-example-ts/src/index.ts rename to packages/create-rslib/template-node-dual-ts/src/index.ts diff --git a/packages/create-rslib/template-example-ts/tsconfig.json b/packages/create-rslib/template-node-dual-ts/tsconfig.json similarity index 100% rename from packages/create-rslib/template-example-ts/tsconfig.json rename to packages/create-rslib/template-node-dual-ts/tsconfig.json diff --git a/packages/create-rslib/template-node-esm-js/package.json b/packages/create-rslib/template-node-esm-js/package.json new file mode 100644 index 000000000..ee41bc11c --- /dev/null +++ b/packages/create-rslib/template-node-esm-js/package.json @@ -0,0 +1,21 @@ +{ + "name": "rslib-node-esm-js", + "version": "0.0.0", + "type": "module", + "exports": { + ".": { + "import": "./dist/index.js" + } + }, + "module": "./dist/index.js", + "files": [ + "dist" + ], + "scripts": { + "build": "rslib build", + "dev": "rslib build --watch" + }, + "devDependencies": { + "@rslib/core": "workspace:*" + } +} diff --git a/packages/create-rslib/template-node-esm-js/rslib.config.mjs b/packages/create-rslib/template-node-esm-js/rslib.config.mjs new file mode 100644 index 000000000..5b320ba49 --- /dev/null +++ b/packages/create-rslib/template-node-esm-js/rslib.config.mjs @@ -0,0 +1,11 @@ +import { defineConfig } from '@rslib/core'; + +export default defineConfig({ + lib: [ + { + format: 'esm', + syntax: 'es2021', + }, + ], + output: { target: 'node' }, +}); diff --git a/packages/create-rslib/template-node-esm-js/src/index.js b/packages/create-rslib/template-node-esm-js/src/index.js new file mode 100644 index 000000000..8df150441 --- /dev/null +++ b/packages/create-rslib/template-node-esm-js/src/index.js @@ -0,0 +1,3 @@ +export function example() { + return 'hello world'; +} diff --git a/packages/create-rslib/template-node-esm-ts/package.json b/packages/create-rslib/template-node-esm-ts/package.json new file mode 100644 index 000000000..89f24593b --- /dev/null +++ b/packages/create-rslib/template-node-esm-ts/package.json @@ -0,0 +1,24 @@ +{ + "name": "rslib-node-esm-ts", + "version": "0.0.0", + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "rslib build", + "dev": "rslib build --watch" + }, + "devDependencies": { + "@rslib/core": "workspace:*", + "typescript": "^5.6.3" + } +} diff --git a/packages/create-rslib/template-node-esm-ts/rslib.config.ts b/packages/create-rslib/template-node-esm-ts/rslib.config.ts new file mode 100644 index 000000000..db48f353d --- /dev/null +++ b/packages/create-rslib/template-node-esm-ts/rslib.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from '@rslib/core'; + +export default defineConfig({ + lib: [ + { + format: 'esm', + syntax: 'es2021', + dts: {}, + }, + ], + output: { target: 'node' }, +}); diff --git a/packages/create-rslib/template-node-esm-ts/src/index.ts b/packages/create-rslib/template-node-esm-ts/src/index.ts new file mode 100644 index 000000000..cfc19c8a6 --- /dev/null +++ b/packages/create-rslib/template-node-esm-ts/src/index.ts @@ -0,0 +1,3 @@ +export function example(): string { + return 'hello world'; +} diff --git a/packages/create-rslib/template-node-esm-ts/tsconfig.json b/packages/create-rslib/template-node-esm-ts/tsconfig.json new file mode 100644 index 000000000..98e777aad --- /dev/null +++ b/packages/create-rslib/template-node-esm-ts/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2021", + "lib": ["DOM", "ES2021"], + "module": "ESNext", + "noEmit": true, + "strict": true, + "skipLibCheck": true, + "isolatedModules": true, + "resolveJsonModule": true, + "moduleResolution": "bundler", + "useDefineForClassFields": true, + "allowImportingTsExtensions": true + }, + "include": ["src"] +} diff --git a/packages/create-rslib/test/index.test.ts b/packages/create-rslib/test/index.test.ts index ec6b614c7..151bfa867 100644 --- a/packages/create-rslib/test/index.test.ts +++ b/packages/create-rslib/test/index.test.ts @@ -3,28 +3,36 @@ import { join } from 'node:path'; import { expect, test } from 'vitest'; import { createAndValidate } from './helper'; -test('should create example-js project as expected', async () => { - createAndValidate(__dirname, 'example-js'); +test('should create node-dual-js project as expected', async () => { + createAndValidate(__dirname, 'node-dual-js'); }); -test('should create example-ts project as expected', async () => { - createAndValidate(__dirname, 'example-ts'); +test('should create node-dual-ts project as expected', async () => { + createAndValidate(__dirname, 'node-dual-ts'); +}); + +test('should create node-esm-js project as expected', async () => { + createAndValidate(__dirname, 'node-esm-js'); +}); + +test('should create node-esm-ts project as expected', async () => { + createAndValidate(__dirname, 'node-esm-ts'); }); test('should allow to create project in sub dir', async () => { - createAndValidate(__dirname, 'example', { + createAndValidate(__dirname, 'node-esm-js', { name: 'test-temp-dir/rslib-project', }); }); test('should allow to create project in relative dir', async () => { - createAndValidate(__dirname, 'example', { + createAndValidate(__dirname, 'node-esm-js', { name: './test-temp-relative-dir', }); }); test('should create project with eslint as expected', async () => { - const { dir, pkgJson, clean } = createAndValidate(__dirname, 'example', { + const { dir, pkgJson, clean } = createAndValidate(__dirname, 'node-esm-js', { name: 'test-temp-eslint', tools: ['eslint'], clean: false, @@ -35,7 +43,7 @@ test('should create project with eslint as expected', async () => { }); test('should create project with prettier as expected', async () => { - const { dir, pkgJson, clean } = createAndValidate(__dirname, 'example', { + const { dir, pkgJson, clean } = createAndValidate(__dirname, 'node-esm-js', { name: 'test-temp-prettier', tools: ['prettier'], clean: false, @@ -46,7 +54,7 @@ test('should create project with prettier as expected', async () => { }); test('should create project with eslint and prettier as expected', async () => { - const { dir, pkgJson, clean } = createAndValidate(__dirname, 'example', { + const { dir, pkgJson, clean } = createAndValidate(__dirname, 'node-esm-js', { name: 'test-temp-eslint-prettier', tools: ['eslint', 'prettier'], clean: false, @@ -59,7 +67,7 @@ test('should create project with eslint and prettier as expected', async () => { }); test('should create project with biome as expected', async () => { - const { dir, pkgJson, clean } = createAndValidate(__dirname, 'example', { + const { dir, pkgJson, clean } = createAndValidate(__dirname, 'node-esm-js', { name: 'test-temp-eslint', tools: ['biome'], clean: false, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d347a13a..ed0fa23bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -272,6 +272,9 @@ importers: specifier: 1.0.7 version: 1.0.7 devDependencies: + '@rslib/core': + specifier: workspace:* + version: link:../core '@rslib/tsconfig': specifier: workspace:* version: link:../../scripts/tsconfig diff --git a/website/docs/en/guide/start/quick-start.mdx b/website/docs/en/guide/start/quick-start.mdx index 228fb52a2..f7f818712 100644 --- a/website/docs/en/guide/start/quick-start.mdx +++ b/website/docs/en/guide/start/quick-start.mdx @@ -38,6 +38,17 @@ import { PackageManagerTabs } from '@theme'; Then follow the prompts to complete the operation. +### Templates + +When creating a project, you can choose from the following templates provided by `create-rslib`: + +| Template | Description | +| ------------ | -------------------------------------------------- | +| node-dual-js | Node.js dual ESM/CJS package | +| node-dual-ts | Node.js dual ESM/CJS package written in TypeScript | +| node-esm-js | Node.js pure ESM package | +| node-esm-ts | Node.js pure ESM package written in TypeScript | + ### Optional Tools `create-rslib` can help you set up some commonly used tools, including [Biome](https://github.com/biomejs/biome), [ESLint](https://github.com/eslint/eslint), and [prettier](https://github.com/prettier/prettier). You can use the arrow keys and the space bar to make your selections. If you don't need these tools, you can simply press Enter to skip.