feat: 分别打包: 文件夹和utils

main
Lei OT 4 months ago
parent 32b1af8b94
commit 22032e45e0

2
.gitignore vendored

@ -1,5 +1,5 @@
node_modules node_modules
build/ build
dist dist
package-lock.json package-lock.json

@ -7,7 +7,15 @@
## 📦 Installation ## 📦 Installation
```sh ```sh
# 安装整个包
npm install http://xxxx/npm/haina-npm-0.1.0.tgz npm install http://xxxx/npm/haina-npm-0.1.0.tgz
# 安装单个模块
npm install http://xxxx/npm/utils-0.1.0.tgz
# 安装Utils的子模块
npm install http://xxxx/npm/utils-commons-0.1.0.tgz
``` ```
## 🚀 Usage ## 🚀 Usage
@ -15,10 +23,15 @@ npm install http://xxxx/npm/haina-npm-0.1.0.tgz
```js ```js
// Import everything // Import everything
import { commons, request } from '@haina/npm'; import { commons, request } from '@haina/npm';
// Import only common utilities // Import only common utilities
import { isEmpty } from '@haina/npm/esm/utils/commons.js'; import { isEmpty } from '@haina/npm/esm/utils/commons.js';
// Import only request utilities // Import only request utilities
import { fetchJSON } from '@haina/npm/esm/utils/request.js'; import { fetchJSON } from '@haina/npm/esm/utils/request.js';
// Import only common utilities
import { isEmpty } from '@haina/utils-commons';
// Import only common utilities
import { commons } from '@haina/utils';
``` ```

@ -15,8 +15,9 @@
], ],
"scripts": { "scripts": {
"clean": "rimraf build", "clean": "rimraf build",
"build:cjs": "babel src --out-dir build/cjs --plugins=@babel/plugin-transform-modules-commonjs", "generate-indexes": "node scripts/generate-indexes.js",
"build:esm": "babel src --out-dir build/esm", "build:cjs": "npm run generate-indexes && babel src --out-dir build/cjs --plugins=@babel/plugin-transform-modules-commonjs",
"build:esm": "npm run generate-indexes && babel src --out-dir build/esm",
"build": "npm run clean && npm run build:cjs && npm run build:esm", "build": "npm run clean && npm run build:cjs && npm run build:esm",
"pack": "npm run build && node scripts/pack-modules.js", "pack": "npm run build && node scripts/pack-modules.js",
"pack:all": "npm run build && npm pack --pack-destination ./dist && node scripts/pack-modules.js", "pack:all": "npm run build && npm pack --pack-destination ./dist && node scripts/pack-modules.js",
@ -28,4 +29,4 @@
"@babel/preset-env": "^7.28.5", "@babel/preset-env": "^7.28.5",
"rimraf": "^6.1.2" "rimraf": "^6.1.2"
} }
} }

@ -0,0 +1,72 @@
const fs = require('fs');
const path = require('path');
function generateIndexFile(dirPath) {
const files = fs.readdirSync(dirPath).filter(file =>
file.endsWith('.js') && file !== 'index.js'
);
if (files.length === 0) return;
let content = '\/\/ Auto Generated index.js\n';
// Import each file and export it as a namespace
files.forEach(file => {
const moduleName = path.basename(file, '.js');
content += `export * as ${moduleName} from './${file}';\n`;
});
const indexPath = path.join(dirPath, 'index.js');
fs.writeFileSync(indexPath, content);
console.log(`Generated index.js for: ${dirPath}`);
}
// Generate index for each subdirectory in src
const srcDir = path.join(__dirname, '..', 'src');
const srcItems = fs.readdirSync(srcDir);
srcItems.forEach(item => {
const itemPath = path.join(srcDir, item);
if (fs.statSync(itemPath).isDirectory()) {
generateIndexFile(itemPath);
}
});
// Generate index for src directory that imports subdirectories
let srcContent = '\/\/ Auto Generated index.js\n';
// Add imports for each subdirectory
srcItems.forEach(item => {
const itemPath = path.join(srcDir, item);
if (fs.statSync(itemPath).isDirectory() ) { // && item !== 'utils'
// Check if the subdirectory has JS files to determine if we should export it
const subDirFiles = fs.readdirSync(itemPath).filter(file =>
file.endsWith('.js') && file !== 'index.js'
);
if (subDirFiles.length > 0) {
srcContent += `export * as ${item} from './${item}/index.js';\n`;
}
}
});
// Add imports for files in the utils directory
const utilsDir = path.join(srcDir, 'utils');
if (fs.existsSync(utilsDir)) {
generateIndexFile(utilsDir);
// Export individual files from utils
const utilsFiles = fs.readdirSync(utilsDir).filter(file =>
file.endsWith('.js') && file !== 'index.js'
);
utilsFiles.forEach(file => {
const moduleName = path.basename(file, '.js');
srcContent += `export * as ${moduleName} from './utils/${file}';\n`;
});
}
// Write the src index.js file
const srcIndexPath = path.join(srcDir, 'index.js');
fs.writeFileSync(srcIndexPath, srcContent);
console.log(`Generated index.js for: ${srcDir}`);

@ -3,15 +3,9 @@ const path = require('path');
const { execSync } = require('child_process'); const { execSync } = require('child_process');
const rimraf = require('rimraf'); const rimraf = require('rimraf');
// Get all files in src/utils directory // Get all items in src directory
const utilsDir = path.join(__dirname, '..', 'src', 'utils');
const files = fs.readdirSync(utilsDir);
// Also get files directly in src directory (excluding utils directory)
const srcDir = path.join(__dirname, '..', 'src'); const srcDir = path.join(__dirname, '..', 'src');
const srcFiles = fs.readdirSync(srcDir).filter(file => const srcItems = fs.readdirSync(srcDir);
file !== 'utils' && file.endsWith('.js')
);
// Create dist directory if it doesn't exist // Create dist directory if it doesn't exist
const distDir = path.join(__dirname, '..', 'dist'); const distDir = path.join(__dirname, '..', 'dist');
@ -31,165 +25,218 @@ fs.mkdirSync(tempDir, { recursive: true });
console.log('Building main package...'); console.log('Building main package...');
execSync('npm run build', { stdio: 'inherit' }); execSync('npm run build', { stdio: 'inherit' });
// Process each module file in utils // Process each item in src directory
files.forEach(file => { srcItems.forEach(item => {
if (file.endsWith('.js')) { const itemPath = path.join(srcDir, item);
const moduleName = path.basename(file, '.js');
const moduleDir = path.join(tempDir, moduleName); // If it's a directory (like utils), pack the whole directory as a module
if (fs.statSync(itemPath).isDirectory() ) { // && item !== 'utils'
// Create module-specific directory // Special case: if the directory is 'utils', we'll handle individual files inside it later
fs.mkdirSync(moduleDir, { recursive: true }); packDirectory(item, itemPath);
// Create a module-specific package.json
const packageJson = {
name: `@haina/${moduleName}`,
version: require('../package.json').version,
description: `Haina ${moduleName} module - part of @haina/npm utility library`,
main: `cjs/utils/${file}`,
module: `esm/utils/${file}`,
type: 'module',
files: [
"build"
],
scripts: {
postinstall: "node -e \"console.log('This is a sub-module of @haina/npm. For full documentation, see https://github.com/your-repo/haina-npm')\""
}
};
fs.writeFileSync(
path.join(moduleDir, 'package.json'),
JSON.stringify(packageJson, null, 2)
);
// Copy README if exists
const readmePath = path.join(__dirname, '..', 'README.MD');
if (fs.existsSync(readmePath)) {
const readmeContent = fs.readFileSync(readmePath, 'utf8');
// Add module-specific information to README
const moduleReadmeContent = `# @haina/${moduleName}\n\n${readmeContent}\n\n## Note\n\nThis is a standalone module from the \`@haina/npm\` package. \n\nFor more information about the full package, visit the [original repository](https://github.com/your-repo/haina-npm).\n`;
fs.writeFileSync(path.join(moduleDir, 'README.MD'), moduleReadmeContent);
}
// Create build directories and copy built files
const moduleBuildDir = path.join(moduleDir, 'build');
fs.mkdirSync(moduleBuildDir, { recursive: true });
// Copy the built ESM and CJS versions of the module
const esmSrcDir = path.join(__dirname, '..', 'build', 'esm', 'utils');
const cjsSrcDir = path.join(__dirname, '..', 'build', 'cjs', 'utils');
const esmDestDir = path.join(moduleBuildDir, 'esm', 'utils');
const cjsDestDir = path.join(moduleBuildDir, 'cjs', 'utils');
fs.mkdirSync(esmDestDir, { recursive: true });
fs.mkdirSync(cjsDestDir, { recursive: true });
// Copy the specific module file
fs.copyFileSync(
path.join(esmSrcDir, file),
path.join(esmDestDir, file)
);
fs.copyFileSync(
path.join(cjsSrcDir, file),
path.join(cjsDestDir, file)
);
// Run npm pack in the module directory
console.log(`Packing module: ${moduleName}`);
const result = execSync(`cd "${moduleDir}" && npm pack`, { encoding: 'utf8' });
console.log(result);
// Move the resulting .tgz file to the main dist directory
const tgzFiles = fs.readdirSync(moduleDir).filter(f => f.endsWith('.tgz'));
tgzFiles.forEach(tgzFile => {
const srcPath = path.join(moduleDir, tgzFile);
const destPath = path.join(distDir, `${moduleName}-${require('../package.json').version.replace(/v/, '')}.tgz`);
fs.renameSync(srcPath, destPath);
console.log(`Created: ${path.basename(destPath)}`);
});
} }
}); });
// Process each file directly in src directory // Process individual files in utils directory
srcFiles.forEach(file => { const utilsDir = path.join(__dirname, '..', 'src', 'utils');
if (file.endsWith('.js')) { if (fs.existsSync(utilsDir)) {
const moduleName = path.basename(file, '.js'); const utilsFiles = fs.readdirSync(utilsDir);
const moduleDir = path.join(tempDir, moduleName);
utilsFiles.forEach(file => {
// Create module-specific directory if (file.endsWith('.js') && file !== 'index.js') {
fs.mkdirSync(moduleDir, { recursive: true }); packIndividualFile(file, 'utils', utilsDir);
}
// Create a module-specific package.json });
const packageJson = { }
name: `@haina/${moduleName}`,
version: require('../package.json').version, // // Process each individual file in src directory (not in subdirectories)
description: `Haina ${moduleName} module - part of @haina/npm utility library`, // const srcFiles = fs.readdirSync(srcDir).filter(file => {
main: `cjs/${file}`, // const filePath = path.join(srcDir, file);
module: `esm/${file}`, // return fs.statSync(filePath).isFile() && file.endsWith('.js');
type: 'module', // });
files: [
"build" // srcFiles.forEach(file => {
], // if (file.endsWith('.js')) {
scripts: { // packIndividualFile(file, 'src', srcDir);
postinstall: "node -e \"console.log('This is a sub-module of @haina/npm. For full documentation, see https://github.com/your-repo/haina-npm')\"" // }
} // });
};
// Function to pack an entire directory as a module
fs.writeFileSync( function packDirectory(dirName, dirPath) {
path.join(moduleDir, 'package.json'), const moduleDir = path.join(tempDir, dirName);
JSON.stringify(packageJson, null, 2)
); // Create module-specific directory
fs.mkdirSync(moduleDir, { recursive: true });
// Copy README if exists
const readmePath = path.join(__dirname, '..', 'README.MD'); // Create a module-specific package.json
if (fs.existsSync(readmePath)) { const packageJson = {
const readmeContent = fs.readFileSync(readmePath, 'utf8'); name: `@haina/${dirName}`,
// Add module-specific information to README version: require('../package.json').version,
const moduleReadmeContent = `# @haina/${moduleName}\n\n${readmeContent}\n\n## Note\n\nThis is a standalone module from the \`@haina/npm\` package. \n\nFor more information about the full package, visit the [original repository](https://github.com/your-repo/haina-npm).\n`; description: `Haina ${dirName} module - part of @haina/npm utility library`,
fs.writeFileSync(path.join(moduleDir, 'README.MD'), moduleReadmeContent); main: `build/esm/${dirName}/index.js`, // Assuming there's an index.js in the directory
module: `build/esm/${dirName}/index.js`,
type: 'module',
files: [
"build"
],
scripts: {
postinstall: "node -e \"console.log('This is a sub-module of @haina/npm. For full documentation, see https://github.com/your-repo/haina-npm')\""
} }
};
// Create build directories and copy built files
const moduleBuildDir = path.join(moduleDir, 'build'); fs.writeFileSync(
fs.mkdirSync(moduleBuildDir, { recursive: true }); path.join(moduleDir, 'package.json'),
JSON.stringify(packageJson, null, 2)
// Copy the built ESM and CJS versions of the module );
const esmSrcDir = path.join(__dirname, '..', 'build', 'esm');
const cjsSrcDir = path.join(__dirname, '..', 'build', 'cjs'); // Copy README if exists
const esmDestDir = path.join(moduleBuildDir, 'esm'); const readmePath = path.join(__dirname, '..', 'README.MD');
const cjsDestDir = path.join(moduleBuildDir, 'cjs'); if (fs.existsSync(readmePath)) {
const readmeContent = fs.readFileSync(readmePath, 'utf8');
fs.mkdirSync(esmDestDir, { recursive: true }); // Add module-specific information to README
fs.mkdirSync(cjsDestDir, { recursive: true }); const moduleReadmeContent = `# @haina/${dirName}\n\n${readmeContent}\n\n## Note\n\nThis is a standalone module from the \`@haina/npm\` package. \n\nFor more information about the full package, visit the [original repository](https://github.com/your-repo/haina-npm).\n`;
fs.writeFileSync(path.join(moduleDir, 'README.MD'), moduleReadmeContent);
// Copy the specific module file
fs.copyFileSync(
path.join(esmSrcDir, file),
path.join(esmDestDir, file)
);
fs.copyFileSync(
path.join(cjsSrcDir, file),
path.join(cjsDestDir, file)
);
// Run npm pack in the module directory
console.log(`Packing module: ${moduleName}`);
const result = execSync(`cd "${moduleDir}" && npm pack`, { encoding: 'utf8' });
console.log(result);
// Move the resulting .tgz file to the main dist directory
const tgzFiles = fs.readdirSync(moduleDir).filter(f => f.endsWith('.tgz'));
tgzFiles.forEach(tgzFile => {
const srcPath = path.join(moduleDir, tgzFile);
const destPath = path.join(distDir, `${moduleName}-${require('../package.json').version.replace(/v/, '')}.tgz`);
fs.renameSync(srcPath, destPath);
console.log(`Created: ${path.basename(destPath)}`);
});
} }
});
// Create build directories and copy built files
const moduleBuildDir = path.join(moduleDir, 'build');
fs.mkdirSync(moduleBuildDir, { recursive: true });
// Copy the built ESM and CJS versions of the directory
const esmSrcDir = path.join(__dirname, '..', 'build', 'esm', dirName);
const cjsSrcDir = path.join(__dirname, '..', 'build', 'cjs', dirName);
const esmDestDir = path.join(moduleBuildDir, 'esm', dirName);
const cjsDestDir = path.join(moduleBuildDir, 'cjs', dirName);
// Only copy if source directories exist
if (fs.existsSync(esmSrcDir)) {
copyDir(esmSrcDir, esmDestDir);
}
if (fs.existsSync(cjsSrcDir)) {
copyDir(cjsSrcDir, cjsDestDir);
}
// Run npm pack in the module directory
console.log(`Packing directory module: ${dirName}`);
const result = execSync(`cd "${moduleDir}" && npm pack`, { encoding: 'utf8' });
console.log(result);
// Move the resulting .tgz file to the main dist directory
const tgzFiles = fs.readdirSync(moduleDir).filter(f => f.endsWith('.tgz'));
tgzFiles.forEach(tgzFile => {
const srcPath = path.join(moduleDir, tgzFile);
const destPath = path.join(distDir, `${dirName}-${require('../package.json').version.replace(/v/, '')}.tgz`);
fs.renameSync(srcPath, destPath);
console.log(`Created: ${path.basename(destPath)}`);
});
}
// Function to pack an individual file as a module
function packIndividualFile(fileName, parentDir, parentPath) {
const moduleName = path.basename(fileName, '.js');
const moduleDir = path.join(tempDir, moduleName);
// Create module-specific directory
fs.mkdirSync(moduleDir, { recursive: true });
// Create a module-specific package.json
const packageJson = {
name: `@haina/${parentDir}-${moduleName}`,
version: require('../package.json').version,
description: `Haina ${moduleName} module - part of @haina/npm utility library`,
main: parentDir === 'src' ? `build/esm/${fileName}` : `build/esm/${parentDir}/${fileName}`,
module: parentDir === 'src' ? `build/esm/${fileName}` : `build/esm/${parentDir}/${fileName}`,
type: 'module',
files: [
"build"
],
scripts: {
postinstall: "node -e \"console.log('This is a sub-module of @haina/npm. For full documentation, see https://github.com/your-repo/haina-npm')\""
}
};
fs.writeFileSync(
path.join(moduleDir, 'package.json'),
JSON.stringify(packageJson, null, 2)
);
// Copy README if exists
const readmePath = path.join(__dirname, '..', 'README.MD');
if (fs.existsSync(readmePath)) {
const readmeContent = fs.readFileSync(readmePath, 'utf8');
// Add module-specific information to README
const moduleReadmeContent = `# @haina/${moduleName}\n\n${readmeContent}\n\n## Note\n\nThis is a standalone module from the \`@haina/npm\` package. \n\nFor more information about the full package, visit the [original repository](https://github.com/your-repo/haina-npm).\n`;
fs.writeFileSync(path.join(moduleDir, 'README.MD'), moduleReadmeContent);
}
// Create build directories and copy built files
const moduleBuildDir = path.join(moduleDir, 'build');
fs.mkdirSync(moduleBuildDir, { recursive: true });
// Copy the built ESM and CJS versions of the module
const esmSrcDir = parentDir === 'src'
? path.join(__dirname, '..', 'build', 'esm')
: path.join(__dirname, '..', 'build', 'esm', parentDir);
const cjsSrcDir = parentDir === 'src'
? path.join(__dirname, '..', 'build', 'cjs')
: path.join(__dirname, '..', 'build', 'cjs', parentDir);
const esmDestDir = parentDir === 'src'
? path.join(moduleBuildDir, 'esm')
: path.join(moduleBuildDir, 'esm', parentDir);
const cjsDestDir = parentDir === 'src'
? path.join(moduleBuildDir, 'cjs')
: path.join(moduleBuildDir, 'cjs', parentDir);
fs.mkdirSync(esmDestDir, { recursive: true });
fs.mkdirSync(cjsDestDir, { recursive: true });
// Copy the specific module file
const srcFile = fileName;
fs.copyFileSync(
path.join(esmSrcDir, srcFile),
path.join(esmDestDir, srcFile)
);
fs.copyFileSync(
path.join(cjsSrcDir, srcFile),
path.join(cjsDestDir, srcFile)
);
// Run npm pack in the module directory
console.log(`Packing individual file module: ${moduleName}`);
const result = execSync(`cd "${moduleDir}" && npm pack`, { encoding: 'utf8' });
console.log(result);
// Move the resulting .tgz file to the main dist directory
const tgzFiles = fs.readdirSync(moduleDir).filter(f => f.endsWith('.tgz'));
tgzFiles.forEach(tgzFile => {
const srcPath = path.join(moduleDir, tgzFile);
const destPath = path.join(distDir, `${parentDir}-${moduleName}-${require('../package.json').version.replace(/v/, '')}.tgz`);
fs.renameSync(srcPath, destPath);
console.log(`Created: ${path.basename(destPath)}`);
});
}
// Helper function to copy directory recursively
function copyDir(src, dest) {
fs.mkdirSync(dest, { recursive: true });
const items = fs.readdirSync(src);
items.forEach(item => {
const srcPath = path.join(src, item);
const destPath = path.join(dest, item);
if (fs.statSync(srcPath).isDirectory()) {
copyDir(srcPath, destPath);
} else {
fs.copyFileSync(srcPath, destPath);
}
});
}
// Clean up temporary directory // Clean up temporary directory
rimraf.sync(tempDir); rimraf.sync(tempDir);
console.log('Module packing completed!'); console.log('Module packing completed!');

@ -0,0 +1,2 @@
// Auto Generated index.js
export * as useHTLanguageSets from './useHTLanguageSets.js';

@ -0,0 +1,20 @@
export const useHTLanguageSets = () => {
const newData = [
{ key: '1', value: '1', label: 'English' },
{ key: '2', value: '2', label: 'Chinese (中文)' },
{ key: '3', value: '3', label: 'Japanese (日本語)' },
{ key: '4', value: '4', label: 'German (Deutsch)' },
{ key: '5', value: '5', label: 'French (Français)' },
{ key: '6', value: '6', label: 'Spanish (Español)' },
{ key: '7', value: '7', label: 'Russian (Русский)' },
{ key: '8', value: '8', label: 'Italian (Italiano)' },
];
return newData;
};
export const useHTLanguageSetsMapVal = () => {
const stateSets = useHTLanguageSets();
const stateMapVal = stateSets.reduce((r, c) => ({ ...r, [`${c.value}`]: c }), {});
return stateMapVal;
};

@ -1,3 +1,5 @@
// Auto Generated index.js
export * as commons from './utils/commons.js'; export * as hooks from './hooks/index.js';
export * as request from './utils/request.js'; export * as utils from './utils/index.js';
export * as commons from './utils/commons.js';
export * as request from './utils/request.js';

@ -0,0 +1,3 @@
// Auto Generated index.js
export * as commons from './commons.js';
export * as request from './request.js';
Loading…
Cancel
Save