nsbp-cli 0.2.20 → 0.2.23

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 CHANGED
@@ -147,7 +147,7 @@ node ./bin/nsbp.js --help # Test CLI locally
147
147
 
148
148
  - **Package Name**: `nsbp-cli`
149
149
  - **Bin Command**: `nsbp` (install globally and run `nsbp --help`)
150
- - **Version**: `0.2.20`
150
+ - **Version**: `0.2.23`
151
151
  - **Dependencies**: chalk, commander, fs-extra, inquirer
152
152
  - **Package Manager**: Uses pnpm (also compatible with npm)
153
153
  - **Node Version**: >=16.0.0
package/bin/nsbp.js CHANGED
@@ -21,7 +21,7 @@ program
21
21
  .command('create <project-name>')
22
22
  .description('Create a new NSBP project')
23
23
  .option('-t, --template <template>', 'Specify template (basic, blog, ecommerce)', 'basic')
24
- .option('--skip-install', 'Skip npm install')
24
+ .option('--skip-install', 'Skip pnpm install')
25
25
  .action(async (projectName, options) => {
26
26
  console.log(chalk.cyan(`🚀 Creating NSBP project: ${projectName}`));
27
27
 
@@ -104,15 +104,10 @@ program
104
104
  // Create package.json for new project
105
105
  const originalPackage = require(path.join(templateSource, 'package.json'));
106
106
  const newPackage = {
107
+ ...originalPackage,
107
108
  name: projectName,
108
109
  version: '1.0.0',
109
- description: `NSBP project: ${projectName}`,
110
- scripts: originalPackage.scripts,
111
- dependencies: originalPackage.dependencies,
112
- devDependencies: originalPackage.devDependencies,
113
- keywords: originalPackage.keywords,
114
- author: originalPackage.author,
115
- license: originalPackage.license
110
+ description: `NSBP project: ${projectName}`
116
111
  };
117
112
 
118
113
  fs.writeFileSync(
@@ -120,20 +115,43 @@ program
120
115
  JSON.stringify(newPackage, null, 2)
121
116
  );
122
117
 
118
+ // Remove package-lock.json if exists (use pnpm instead)
119
+ const packageLockPath = path.join(targetDir, 'package-lock.json');
120
+ if (fs.existsSync(packageLockPath)) {
121
+ fs.removeSync(packageLockPath);
122
+ }
123
+
124
+ // Create .npmignore to prevent package-lock.json from being committed
125
+ const npmignorePath = path.join(targetDir, '.npmignore');
126
+ if (!fs.existsSync(npmignorePath)) {
127
+ fs.writeFileSync(npmignorePath, 'package-lock.json\n');
128
+ }
129
+
123
130
  // Optionally install dependencies
124
131
  if (!options.skipInstall) {
132
+ // Check if pnpm is available
133
+ try {
134
+ execSync('which pnpm', { stdio: 'ignore' });
135
+ } catch {
136
+ console.error(chalk.red('❌ pnpm is not installed or not available in PATH.'));
137
+ console.error(chalk.yellow('Please install pnpm before continuing:'));
138
+ console.error(chalk.cyan(' npm install -g pnpm'));
139
+ console.error(chalk.yellow('Or use --skip-install flag to skip dependency installation.'));
140
+ process.exit(1);
141
+ }
142
+
125
143
  console.log(chalk.cyan('📦 Installing dependencies...'));
126
144
  process.chdir(targetDir);
127
- execSync('npm install', { stdio: 'inherit' });
145
+ execSync('pnpm install', { stdio: 'inherit' });
128
146
  }
129
147
 
130
148
  console.log(chalk.green(`✅ NSBP project "${projectName}" created successfully!`));
131
149
  console.log(chalk.yellow('\nNext steps:'));
132
150
  console.log(` cd ${projectName}`);
133
151
  if (options.skipInstall) {
134
- console.log(' npm install');
152
+ console.log(' pnpm install');
135
153
  }
136
- console.log(' npm run dev');
154
+ console.log(' pnpm run dev');
137
155
  console.log(chalk.cyan('\nHappy coding! 🎉'));
138
156
 
139
157
  } catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nsbp-cli",
3
- "version": "0.2.20",
3
+ "version": "0.2.23",
4
4
  "description": "CLI tool for creating NSBP (Node React SSR by Webpack) projects",
5
5
  "main": "index.js",
6
6
  "homepage": "https://nsbp.erishen.cn/",
@@ -17,7 +17,7 @@
17
17
  "start": "node ./bin/nsbp.js",
18
18
  "test": "echo \"Error: no test specified\" && exit 1",
19
19
  "sync-template": "node ./scripts/sync-template.js",
20
- "update": "npm run sync-template",
20
+ "update": "pnpm run sync-template",
21
21
  "update-changelog": "node ./scripts/update-changelog.js",
22
22
  "changelog": "npx conventional-changelog -p angular -i CHANGELOG.md -s"
23
23
  },
@@ -16,7 +16,7 @@ RUN npm install -g pnpm && pnpm install
16
16
  COPY . .
17
17
 
18
18
  # Build application
19
- RUN npm run build
19
+ RUN pnpm run build
20
20
 
21
21
  # Stage 2: Production
22
22
  FROM node:20-alpine AS production
@@ -49,4 +49,4 @@ EXPOSE 3001
49
49
  ENTRYPOINT ["/entrypoint.sh"]
50
50
 
51
51
  # Start development server
52
- CMD ["dumb-init", "--", "npm", "run", "dev"]
52
+ CMD ["dumb-init", "--", "pnpm", "run", "dev"]
@@ -63,4 +63,4 @@ shell-dev: ## Open shell in development container
63
63
  $(COMPOSE) -f docker-compose.dev.yml exec app sh
64
64
 
65
65
  test: ## Run tests (if configured)
66
- $(COMPOSE) exec app npm test
66
+ $(COMPOSE) exec app $(PM) test
@@ -3,9 +3,9 @@
3
3
  🌐 **Online Demo**: [https://nsbp.erishen.cn/](https://nsbp.erishen.cn/)
4
4
 
5
5
  ## 开发
6
- - npm run dev (开发运行)
7
- - npm run build (生产编译)
8
- - npm start (生产运行)
6
+ - pnpm run dev (开发运行)
7
+ - pnpm run build (生产编译)
8
+ - pnpm start (生产运行)
9
9
 
10
10
  ### 本地访问
11
11
 
@@ -23,7 +23,7 @@ services:
23
23
  - node_modules:/app/node_modules
24
24
  # Build output - named volume for persistence
25
25
  - build_output:/app/build
26
- command: ["dumb-init", "--", "npm", "run", "dev"]
26
+ command: ["dumb-init", "--", "pnpm", "run", "dev"]
27
27
  restart: unless-stopped
28
28
  networks:
29
29
  - nsbp-network
@@ -10,7 +10,7 @@
10
10
  "dev:build:server": "webpack --config webpack.server.js --mode development --watch",
11
11
  "dev:build:client": "webpack --config webpack.client.js --mode development --watch",
12
12
  "dev:build:start": "node ./scripts/start.js",
13
- "build": "npm run clean && npm-run-all -l -p build:**",
13
+ "build": "pnpm run clean && npm-run-all -l -p build:**",
14
14
  "build:server": "webpack --config webpack.server.js --mode production",
15
15
  "build:client": "webpack --config webpack.client.js --mode production",
16
16
  "start": "node ./scripts/start.js",
@@ -29,6 +29,7 @@
29
29
  ],
30
30
  "author": "Erishen Sun",
31
31
  "license": "ISC",
32
+ "packageManager": "pnpm@10.27.0",
32
33
  "dependencies": {
33
34
  "@loadable/component": "^5.15.0",
34
35
  "@loadable/server": "^5.15.0",
@@ -4,7 +4,7 @@ import Loading from './Loading'
4
4
 
5
5
  const Layout = ({ children, query }: any) => {
6
6
  let seo: any = 0
7
- if (query) {
7
+ if (query !== undefined && query !== null) {
8
8
  seo = query.seo
9
9
  }
10
10
 
@@ -369,7 +369,7 @@ export const getPhotoMenu = (req: any, res: any) => {
369
369
 
370
370
  <QuickStartCard>
371
371
  <QuickStartTitle>2️⃣ 启动开发</QuickStartTitle>
372
- <QuickStartCode>$ npm run dev</QuickStartCode>
372
+ <QuickStartCode>$ pnpm run dev</QuickStartCode>
373
373
  <QuickStartDescription>
374
374
  启动开发服务器,默认端口 3001
375
375
  </QuickStartDescription>
@@ -73,7 +73,7 @@ const Photo = ({ query, data, menu, getPhotoMenu }: any) => {
73
73
  if (!isSEO()) {
74
74
  doGetPhotoMenu()
75
75
  } else {
76
- if(from === 'link'){
76
+ if (from === 'link') {
77
77
  doGetPhotoMenu()
78
78
  }
79
79
  }
@@ -154,7 +154,7 @@ const mapStateToProps = (state: any) => {
154
154
  }
155
155
 
156
156
  const mapDispatchToProps = (dispatch: any) => ({
157
- getPhotoMenu(dic:any) {
157
+ getPhotoMenu: (dic: any) => {
158
158
  dispatch(loadData(null, dic))
159
159
  }
160
160
  })
@@ -2,15 +2,10 @@ import { GITHUB_ZEITNEXT_GET } from '../store/constants'
2
2
 
3
3
  export const homeReducer = (state = { data: {} }, action: any) => {
4
4
  const { type, data } = action
5
- let newState = null
6
5
 
7
6
  switch (type) {
8
7
  case GITHUB_ZEITNEXT_GET:
9
- newState = Object.assign({}, state)
10
-
11
- if (data) newState.data = data
12
-
13
- return newState
8
+ return { ...state, data: data !== undefined ? data : state.data }
14
9
  default:
15
10
  return state
16
11
  }
@@ -5,7 +5,7 @@ let prefix = 'http://localhost:3001'
5
5
  export const doGet = (action:any) => {
6
6
  return new Promise((resolve, reject) => {
7
7
 
8
- if(typeof window !== "undefined"){
8
+ if(typeof window !== "undefined") {
9
9
  prefix = window.location.origin
10
10
  }
11
11