fix(build): 解决 lodash.template 中 assignWith 函数缺失问题
- 添加 JavaScript 脚本修复 lodash.template 模块中的 assignWith 问题 - 提供 Shell 脚本支持 Linux/Mac 系统的自动修复功能 - 实现 assignWith 函数的简单 polyfill 版本以确保兼容性 - 添加补丁检测机制防止重复修补同一文件 - 在构建前自动运行修复脚本确保依赖完整性
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* Fix lodash.template assignWith issue - Manual fix script
|
||||
* Run this after npm/yarn install and before build
|
||||
*
|
||||
* Usage: node fix-lodash-manual.js
|
||||
*/
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const lodashTemplatePath = path.join(__dirname, 'node_modules', 'lodash.template', 'index.js');
|
||||
|
||||
if (!fs.existsSync(lodashTemplatePath)) {
|
||||
console.error('❌ lodash.template not found at:', lodashTemplatePath);
|
||||
console.error('Please run npm install or yarn install first');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
let content = fs.readFileSync(lodashTemplatePath, 'utf8');
|
||||
|
||||
// Check if already patched
|
||||
if (content.includes('/* LODASH_TEMPLATE_PATCHED */')) {
|
||||
console.log('✓ lodash.template already patched');
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
// Check if assignWith is actually missing
|
||||
if (content.includes('assignWith')) {
|
||||
// Check if it's used but not defined
|
||||
const hasFunctionDefinition = /function\s+assignWith|var\s+assignWith\s*=/.test(content);
|
||||
if (hasFunctionDefinition) {
|
||||
console.log('✓ assignWith is already defined in lodash.template');
|
||||
process.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
console.log('🔧 Patching lodash.template...');
|
||||
|
||||
// Simple assignWith implementation
|
||||
const assignWithImpl = `/* LODASH_TEMPLATE_PATCHED */
|
||||
// assignWith polyfill for lodash.template
|
||||
function assignWith(object, source, customizer) {
|
||||
if (object == null) return object;
|
||||
var props = Object.keys(Object(source));
|
||||
for (var i = 0; i < props.length; i++) {
|
||||
var key = props[i];
|
||||
var value = source[key];
|
||||
var assignedValue = customizer ? customizer(object[key], value, key, object, source) : value;
|
||||
if (assignedValue !== undefined) {
|
||||
object[key] = assignedValue;
|
||||
}
|
||||
}
|
||||
return object;
|
||||
}
|
||||
`;
|
||||
|
||||
// Find first line break after comments
|
||||
let insertPos = 0;
|
||||
const lines = content.split('\n');
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
if (lines[i].trim() === ' */' || lines[i].trim() === '*/') {
|
||||
insertPos = content.indexOf('\n', content.indexOf(lines[i])) + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (insertPos === 0) {
|
||||
insertPos = content.indexOf('\n') + 1;
|
||||
}
|
||||
|
||||
const before = content.substring(0, insertPos);
|
||||
const after = content.substring(insertPos);
|
||||
|
||||
content = before + '\n' + assignWithImpl + after;
|
||||
|
||||
fs.writeFileSync(lodashTemplatePath, content);
|
||||
console.log('✅ Successfully patched lodash.template with assignWith function');
|
||||
console.log(' File:', lodashTemplatePath);
|
||||
@@ -0,0 +1,55 @@
|
||||
/**
|
||||
* Fix lodash.template assignWith issue
|
||||
* This script patches the lodash.template module to include assignWith
|
||||
*/
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const lodashTemplatePath = path.join(__dirname, 'node_modules', 'lodash.template', 'index.js');
|
||||
|
||||
if (!fs.existsSync(lodashTemplatePath)) {
|
||||
console.log('lodash.template not found, skipping patch');
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
let content = fs.readFileSync(lodashTemplatePath, 'utf8');
|
||||
|
||||
// Check if already patched
|
||||
if (content.includes('/* LODASH_TEMPLATE_PATCHED */')) {
|
||||
console.log('lodash.template already patched');
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
// Simple assignWith implementation
|
||||
const assignWithImpl = `
|
||||
/* LODASH_TEMPLATE_PATCHED */
|
||||
// Simple assignWith implementation
|
||||
function assignWith(object, source, customizer) {
|
||||
if (object == null) {
|
||||
return object;
|
||||
}
|
||||
var props = Object.keys(Object(source));
|
||||
var index = -1;
|
||||
var length = props.length;
|
||||
|
||||
while (++index < length) {
|
||||
var key = props[index];
|
||||
var value = source[key];
|
||||
var assignedValue = customizer ? customizer(object[key], value, key, object, source) : value;
|
||||
if (assignedValue !== undefined) {
|
||||
object[key] = assignedValue;
|
||||
}
|
||||
}
|
||||
return object;
|
||||
}
|
||||
`;
|
||||
|
||||
// Insert at the beginning of the file after any comments
|
||||
const firstLineEnd = content.indexOf('\n') + 1;
|
||||
const before = content.substring(0, firstLineEnd);
|
||||
const after = content.substring(firstLineEnd);
|
||||
|
||||
content = before + assignWithImpl + after;
|
||||
|
||||
fs.writeFileSync(lodashTemplatePath, content);
|
||||
console.log('✓ Patched lodash.template with assignWith function');
|
||||
@@ -0,0 +1,48 @@
|
||||
#!/bin/bash
|
||||
# Fix lodash.template assignWith issue for Linux/Mac servers
|
||||
# Run this script after npm/yarn install
|
||||
|
||||
LODGASH_TEMPLATE="node_modules/lodash.template/index.js"
|
||||
|
||||
if [ ! -f "$LODGASH_TEMPLATE" ]; then
|
||||
echo "❌ lodash.template not found. Please run npm install or yarn install first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if already patched
|
||||
if grep -q "LODASH_TEMPLATE_PATCHED" "$LODGASH_TEMPLATE"; then
|
||||
echo "✓ lodash.template already patched"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "🔧 Patching lodash.template..."
|
||||
|
||||
# Create a temporary file with the patch
|
||||
PATCH=$(cat <<'EOF'
|
||||
/* LODASH_TEMPLATE_PATCHED */
|
||||
// assignWith polyfill for lodash.template
|
||||
function assignWith(object, source, customizer) {
|
||||
if (object == null) return object;
|
||||
var props = Object.keys(Object(source));
|
||||
for (var i = 0; i < props.length; i++) {
|
||||
var key = props[i];
|
||||
var value = source[key];
|
||||
var assignedValue = customizer ? customizer(object[key], value, key, object, source) : value;
|
||||
if (assignedValue !== undefined) {
|
||||
object[key] = assignedValue;
|
||||
}
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
EOF
|
||||
)
|
||||
|
||||
# Insert after the first line (license comment)
|
||||
{
|
||||
head -n 1 "$LODGASH_TEMPLATE"
|
||||
echo "$PATCH"
|
||||
tail -n +2 "$LODGASH_TEMPLATE"
|
||||
} > "$LODGASH_TEMPLATE.tmp" && mv "$LODGASH_TEMPLATE.tmp" "$LODGASH_TEMPLATE"
|
||||
|
||||
echo "✅ Successfully patched lodash.template with assignWith function"
|
||||
Reference in New Issue
Block a user