Fix scripts for Next.js + Payload CMS workflow
- new-project.sh: Use nextjs-payload-starter template, Next.js AI rules - convert-astro.sh: Complete rewrite to migrate Astro MDX to Payload CMS Lexical JSON - deploy.sh: Check for next.config instead of astro.config.mjs, use MONGODB_URL - preview.sh: Check for Next.js, default port 3002 - audit-seo.sh: Check .tsx pages in src/app, Next.js config All scripts now properly support Next.js + Payload CMS workflow.
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# audit-seo.sh - SEO Audit สำหรับ Astro + Payload CMS project
|
# audit-seo.sh - SEO Audit สำหรับ Next.js + Payload CMS project
|
||||||
#
|
#
|
||||||
# Usage: ./audit-seo.sh [project-path]
|
# Usage: ./audit-seo.sh [project-path]
|
||||||
#
|
#
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# Requirements:
|
# Requirements:
|
||||||
# - node.js
|
# - node.js
|
||||||
# - npm (สำหรับ Astro CLI)
|
# - npm
|
||||||
# - curl
|
# - curl
|
||||||
#
|
#
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
@@ -57,7 +57,7 @@ print_usage() {
|
|||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: $(basename "$0") [project-path]
|
Usage: $(basename "$0") [project-path]
|
||||||
|
|
||||||
SEO Audit สำหรับ Astro + Payload CMS project
|
SEO Audit สำหรับ Next.js + Payload CMS project
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
project-path ที่อยู่ project (default: current directory)
|
project-path ที่อยู่ project (default: current directory)
|
||||||
@@ -106,23 +106,17 @@ check_project_structure() {
|
|||||||
|
|
||||||
cd "$PROJECT_PATH"
|
cd "$PROJECT_PATH"
|
||||||
|
|
||||||
if [ ! -f "astro.config.mjs" ]; then
|
if [ ! -f "next.config.ts" ] && [ ! -f "next.config.js" ]; then
|
||||||
log_fail "ไม่พบ astro.config.mjs"
|
log_fail "ไม่พบ next.config.ts หรือ next.config.js"
|
||||||
else
|
else
|
||||||
log_success "พบ astro.config.mjs"
|
log_success "พบ Next.js config"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -d "src/pages" ]; then
|
if [ -d "src/app" ]; then
|
||||||
local page_count=$(find src/pages -name "*.astro" | wc -l)
|
local page_count=$(find src/app -name "page.tsx" -o -name "page.ts" | wc -l)
|
||||||
log_success "พบ $page_count pages"
|
log_success "พบ $page_count pages"
|
||||||
else
|
else
|
||||||
log_fail "ไม่พบ src/pages"
|
log_fail "ไม่พบ src/app"
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d "src/layouts" ]; then
|
|
||||||
log_success "พบ layouts directory"
|
|
||||||
else
|
|
||||||
log_warning "ไม่พบ layouts directory"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -d "src/components" ]; then
|
if [ -d "src/components" ]; then
|
||||||
@@ -130,6 +124,12 @@ check_project_structure() {
|
|||||||
else
|
else
|
||||||
log_warning "ไม่พบ components directory"
|
log_warning "ไม่พบ components directory"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -f "payload.config.ts" ]; then
|
||||||
|
log_success "พบ Payload CMS config"
|
||||||
|
else
|
||||||
|
log_warning "ไม่พบ payload.config.ts"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
@@ -149,7 +149,7 @@ check_meta_tags() {
|
|||||||
local pages_with_keywords=0
|
local pages_with_keywords=0
|
||||||
local total_pages=0
|
local total_pages=0
|
||||||
|
|
||||||
for page in src/pages/**/*.astro src/pages/*.astro; do
|
for page in src/app/**/page.tsx src/app/**/page.ts src/app/page.tsx src/app/page.ts; do
|
||||||
if [ -f "$page" ]; then
|
if [ -f "$page" ]; then
|
||||||
total_pages=$((total_pages + 1))
|
total_pages=$((total_pages + 1))
|
||||||
|
|
||||||
@@ -194,7 +194,7 @@ check_headings() {
|
|||||||
local pages_with_h2=0
|
local pages_with_h2=0
|
||||||
local total_pages=0
|
local total_pages=0
|
||||||
|
|
||||||
for page in src/pages/**/*.astro src/pages/*.astro; do
|
for page in src/app/**/page.tsx src/app/**/page.ts src/app/page.tsx src/app/page.ts; do
|
||||||
if [ -f "$page" ]; then
|
if [ -f "$page" ]; then
|
||||||
total_pages=$((total_pages + 1))
|
total_pages=$((total_pages + 1))
|
||||||
|
|
||||||
@@ -230,10 +230,10 @@ check_sitemap() {
|
|||||||
|
|
||||||
cd "$PROJECT_PATH"
|
cd "$PROJECT_PATH"
|
||||||
|
|
||||||
if [ -f "astro.config.mjs" ] && grep -q 'sitemap' "astro.config.mjs"; then
|
if [ -f "next.config.ts" ] && grep -q 'sitemap' "next.config.ts"; then
|
||||||
log_success "Astro sitemap integration ถูกตั้งค่า"
|
log_success "Sitemap integration ถูกตั้งค่า"
|
||||||
else
|
else
|
||||||
log_warning "ไม่พบ Astro sitemap integration"
|
log_warning "ไม่พบ sitemap integration"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -f "public/sitemap.xml" ]; then
|
if [ -f "public/sitemap.xml" ]; then
|
||||||
@@ -279,7 +279,7 @@ check_open_graph() {
|
|||||||
local pages_with_og=0
|
local pages_with_og=0
|
||||||
local total_pages=0
|
local total_pages=0
|
||||||
|
|
||||||
for page in src/pages/**/*.astro src/pages/*.astro; do
|
for page in src/app/**/page.tsx src/app/**/page.ts src/app/page.tsx src/app/page.ts; do
|
||||||
if [ -f "$page" ]; then
|
if [ -f "$page" ]; then
|
||||||
total_pages=$((total_pages + 1))
|
total_pages=$((total_pages + 1))
|
||||||
|
|
||||||
@@ -310,7 +310,7 @@ check_thai_language() {
|
|||||||
|
|
||||||
cd "$PROJECT_PATH"
|
cd "$PROJECT_PATH"
|
||||||
|
|
||||||
if grep -q 'lang="th"' "src/pages"/*.astro 2>/dev/null; then
|
if grep -q 'lang="th"' "src/app"/*.tsx "src/app"/*.ts 2>/dev/null; then
|
||||||
log_success "พบ lang='th' attribute"
|
log_success "พบ lang='th' attribute"
|
||||||
else
|
else
|
||||||
log_warning "ไม่พบ lang='th' attribute"
|
log_warning "ไม่พบ lang='th' attribute"
|
||||||
@@ -345,7 +345,7 @@ check_json_ld() {
|
|||||||
local pages_with_jsonld=0
|
local pages_with_jsonld=0
|
||||||
local total_pages=0
|
local total_pages=0
|
||||||
|
|
||||||
for page in src/pages/**/*.astro src/pages/*.astro; do
|
for page in src/app/**/page.tsx src/app/**/page.ts src/app/page.tsx src/app/page.ts; do
|
||||||
if [ -f "$page" ]; then
|
if [ -f "$page" ]; then
|
||||||
total_pages=$((total_pages + 1))
|
total_pages=$((total_pages + 1))
|
||||||
|
|
||||||
@@ -422,7 +422,7 @@ show_summary() {
|
|||||||
main() {
|
main() {
|
||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
echo " SEO Audit Tool"
|
echo " SEO Audit Tool"
|
||||||
echo " Astro + Payload CMS"
|
echo " Next.js + Payload CMS"
|
||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# convert-astro.sh - แปลงเว็บเก่าเป็น Astro + Payload CMS
|
# migrate-to-payload.sh - Migrate Astro content to Payload CMS with Lexical
|
||||||
#
|
#
|
||||||
# Usage: ./convert-astro.sh [source-path] [project-name]
|
# Usage: ./migrate-to-payload.sh [source-path] [target-path]
|
||||||
#
|
#
|
||||||
# รองรับ:
|
# This script migrates content from Astro MDX/Markdown to Payload CMS Lexical.
|
||||||
# - Astro เวอร์ชั่นเก่า
|
# - Converts .md/.mdx files to Payload CMS Lexical JSON format
|
||||||
# - Next.js
|
# - Creates Payload collection entries
|
||||||
# - Static HTML
|
# - Preserves frontmatter as collection fields
|
||||||
#
|
#
|
||||||
# Requirements:
|
# Requirements:
|
||||||
# - git
|
|
||||||
# - node.js 20+
|
# - node.js 20+
|
||||||
# - npm
|
# - npm
|
||||||
#
|
#
|
||||||
@@ -18,253 +17,277 @@
|
|||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# Colors
|
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
YELLOW='\033[1;33m'
|
YELLOW='\033[1;33m'
|
||||||
BLUE='\033[0;34m'
|
BLUE='\033[0;34m'
|
||||||
NC='\033[0m'
|
NC='\033[0m'
|
||||||
|
|
||||||
# Default values
|
|
||||||
SOURCE_PATH="${1:-}"
|
SOURCE_PATH="${1:-}"
|
||||||
PROJECT_NAME="${2:-}"
|
TARGET_PATH="${2:-.}"
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
||||||
# Helper functions
|
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
|
||||||
#-------------------------------------------------------------------------------
|
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
|
||||||
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||||
log_info() {
|
|
||||||
echo -e "${BLUE}[INFO]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_success() {
|
|
||||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_warning() {
|
|
||||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_error() {
|
|
||||||
echo -e "${RED}[ERROR]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
print_usage() {
|
print_usage() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: $(basename "$0") [source-path] [project-name]
|
Usage: $(basename "$0") [source-path] [target-path]
|
||||||
|
|
||||||
แปลงเว็บเก่าเป็น Astro + Payload CMS
|
Migrate Astro content to Payload CMS with Lexical
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
source-path ที่อยู่เว็บเก่า
|
source-path Path to Astro project with content
|
||||||
project-name ชื่อ project ใหม่
|
target-path Path to Next.js + Payload CMS project
|
||||||
|
|
||||||
Supported Sources:
|
|
||||||
- Astro เวอร์ชั่นเก่า
|
|
||||||
- Next.js
|
|
||||||
- Static HTML
|
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
$(basename "$0") /path/to/old-site my-new-site
|
$(basename "$0") /path/to/astro-site /path/to/payload-site
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
detect_content_type() {
|
||||||
# Detect source type
|
log_info "Detecting content structure..."
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
detect_source_type() {
|
|
||||||
log_info "ตรวจสอบประเภทเว็บเก่า..."
|
|
||||||
|
|
||||||
if [ ! -d "$SOURCE_PATH" ]; then
|
|
||||||
log_error "ไม่พบ source path: $SOURCE_PATH"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd "$SOURCE_PATH"
|
cd "$SOURCE_PATH"
|
||||||
|
|
||||||
if [ -f "package.json" ]; then
|
if [ -d "src/content" ]; then
|
||||||
if grep -q '"next"' "package.json" 2>/dev/null; then
|
CONTENT_DIR="src/content"
|
||||||
SOURCE_TYPE="nextjs"
|
elif [ -d "content" ]; then
|
||||||
log_success "ตรวจพบ: Next.js"
|
CONTENT_DIR="content"
|
||||||
elif grep -q '"astro"' "package.json" 2>/dev/null; then
|
elif [ -d "src/pages" ]; then
|
||||||
SOURCE_TYPE="astro"
|
CONTENT_DIR="src/pages"
|
||||||
log_success "ตรวจพบ: Astro"
|
|
||||||
elif grep -q '"remix"' "package.json" 2>/dev/null; then
|
|
||||||
SOURCE_TYPE="remix"
|
|
||||||
log_success "ตรวจพบ: Remix"
|
|
||||||
elif grep -q '"nuxt"' "package.json" 2>/dev/null; then
|
|
||||||
SOURCE_TYPE="nuxt"
|
|
||||||
log_success "ตรวจพบ: Nuxt"
|
|
||||||
else
|
|
||||||
SOURCE_TYPE="unknown"
|
|
||||||
log_warning "ไม่สามารถระบุประเภท - จะใช้เป็น static HTML"
|
|
||||||
fi
|
|
||||||
elif [ -f "index.html" ]; then
|
|
||||||
SOURCE_TYPE="static"
|
|
||||||
log_success "ตรวจพบ: Static HTML"
|
|
||||||
else
|
else
|
||||||
log_error "ไม่พบ package.json หรือ index.html"
|
log_error "No content directory found"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
log_success "Content directory: $CONTENT_DIR"
|
||||||
}
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
backup_content() {
|
||||||
# Backup source
|
log_info "Backing up content..."
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
backup_source() {
|
BACKUP_DIR="/tmp/migration-backup-$(date +%s)"
|
||||||
log_info "สำรองข้อมูลเว็บเก่า..."
|
|
||||||
|
|
||||||
BACKUP_DIR="/tmp/backup-$(basename "$SOURCE_PATH")-$(date +%s)"
|
|
||||||
mkdir -p "$BACKUP_DIR"
|
mkdir -p "$BACKUP_DIR"
|
||||||
|
|
||||||
cp -r "$SOURCE_PATH" "$BACKUP_DIR/"
|
if [ -d "$SOURCE_PATH/$CONTENT_DIR" ]; then
|
||||||
|
cp -r "$SOURCE_PATH/$CONTENT_DIR" "$BACKUP_DIR/"
|
||||||
|
fi
|
||||||
|
|
||||||
log_success "สำรองข้อมูลที่: $BACKUP_DIR"
|
log_success "Backup at: $BACKUP_DIR"
|
||||||
}
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
analyze_content() {
|
||||||
# Analyze structure
|
log_info "Analyzing content..."
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
analyze_structure() {
|
|
||||||
log_info "วิเคราะห์โครงสร้างเว็บเก่า..."
|
|
||||||
|
|
||||||
cd "$SOURCE_PATH"
|
cd "$SOURCE_PATH"
|
||||||
|
|
||||||
echo ""
|
local md_count=$(find "$CONTENT_DIR" -type f \( -name "*.md" -o -name "*.mdx" \) 2>/dev/null | wc -l)
|
||||||
echo " โครงสร้างไฟล์:"
|
local astro_count=$(find . -type f -name "*.astro" 2>/dev/null | grep -v node_modules | wc -l)
|
||||||
find . -type f \( -name "*.astro" -o -name "*.tsx" -o -name "*.jsx" -o -name "*.vue" -o -name "*.html" -o -name "*.md" -o -name "*.mdx" \) 2>/dev/null | grep -v node_modules | head -30
|
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo " Package.json scripts:"
|
echo " Content files: $md_count"
|
||||||
if [ -f "package.json" ]; then
|
echo " Astro components: $astro_count"
|
||||||
grep -A 10 '"scripts"' "package.json" 2>/dev/null | head -15
|
echo ""
|
||||||
fi
|
|
||||||
|
find "$CONTENT_DIR" -type f \( -name "*.md" -o -name "*.mdx" \) 2>/dev/null | head -20
|
||||||
}
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
create_lexical_content() {
|
||||||
# Create new Astro project
|
log_info "Converting MDX to Payload CMS Lexical format..."
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
create_new_project() {
|
cd "$SOURCE_PATH"
|
||||||
log_info "สร้าง Astro project ใหม่..."
|
|
||||||
|
|
||||||
NEW_PROJECT_PATH="$(dirname "$SOURCE_PATH")/$PROJECT_NAME"
|
local output_dir="$TARGET_PATH/src/content-migration"
|
||||||
|
mkdir -p "$output_dir"
|
||||||
|
|
||||||
if [ -d "$NEW_PROJECT_PATH" ]; then
|
find "$CONTENT_DIR" -type f \( -name "*.md" -o -name "*.mdx" \) 2>/dev/null | while read -r file; do
|
||||||
log_warning "Project มีอยู่แล้ว: $NEW_PROJECT_PATH"
|
local relative_path="${file#$SOURCE_PATH/$CONTENT_DIR/}"
|
||||||
read -p "ลบและสร้างใหม่? (y/n): " -n 1 -r
|
local filename=$(basename "$file" .mdx .md | sed 's/\.mdx$//' | sed 's/\.md$//')
|
||||||
echo
|
local slug=$(echo "$filename" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
|
||||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
||||||
rm -rf "$NEW_PROJECT_PATH"
|
local frontmatter=""
|
||||||
|
local content=""
|
||||||
|
|
||||||
|
if grep -q "^---" "$file" 2>/dev/null; then
|
||||||
|
frontmatter=$(sed -n '/^---/,/^---/p' "$file" | head -n -1 | tail -n +2)
|
||||||
|
content=$(awk '/^---/{found=1; next} found' "$file")
|
||||||
else
|
else
|
||||||
log_info "ใช้ existing project"
|
content=$(cat "$file")
|
||||||
return 0
|
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p "$NEW_PROJECT_PATH"
|
local title=$(echo "$frontmatter" | grep -i "^title:" | cut -d':' -f2- | tr -d ' "' | head -1)
|
||||||
cd "$NEW_PROJECT_PATH"
|
local date=$(echo "$frontmatter" | grep -i "^date:" | cut -d':' -f2- | tr -d ' "' | head -1)
|
||||||
|
local description=$(echo "$frontmatter" | grep -i "^description:" | cut -d':' -f2- | tr -d ' "' | head -1)
|
||||||
|
local author=$(echo "$frontmatter" | grep -i "^author:" | cut -d':' -f2- | tr -d ' "' | head -1)
|
||||||
|
local image=$(echo "$frontmatter" | grep -i "^image:" | cut -d':' -f2- | tr -d ' "' | head -1)
|
||||||
|
local tags=$(echo "$frontmatter" | grep -i "^tags:" | cut -d':' -f2- | tr -d '[]"' | head -1)
|
||||||
|
|
||||||
# Create Astro project
|
title=${title:-$filename}
|
||||||
npm create astro@latest . -- --template minimal --no-install --no-git --typescript strict << EOF
|
date=${date:-$(date +%Y-%m-%d)}
|
||||||
y
|
|
||||||
EOF
|
|
||||||
|
|
||||||
log_success "สร้าง Astro project เสร็จสมบูรณ์: $NEW_PROJECT_PATH"
|
cat > "$output_dir/${slug}.json" << JSONEOF
|
||||||
|
{
|
||||||
|
"title": "$title",
|
||||||
|
"slug": "$slug",
|
||||||
|
"createdAt": "$date",
|
||||||
|
"updatedAt": "$(date +%Y-%m-%d)",
|
||||||
|
"meta": {
|
||||||
|
"title": "$title",
|
||||||
|
"description": "$description"
|
||||||
|
},
|
||||||
|
"author": "$author",
|
||||||
|
"heroImage": "$image",
|
||||||
|
"tags": ["$tags"],
|
||||||
|
"content": {
|
||||||
|
"root": {
|
||||||
|
"type": "root",
|
||||||
|
"format": "",
|
||||||
|
"indent": 0,
|
||||||
|
"version": 1,
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"type": "paragraph",
|
||||||
|
"version": 1,
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"version": 1,
|
||||||
|
"text": "$content",
|
||||||
|
"mode": "tokenized",
|
||||||
|
"style": ""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSONEOF
|
||||||
|
|
||||||
|
echo " Converted: $filename → $slug.json"
|
||||||
|
done
|
||||||
|
|
||||||
|
log_success "Conversion complete: $output_dir/"
|
||||||
}
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
create_payload_import_script() {
|
||||||
# Copy content
|
log_info "Creating Payload import script..."
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
copy_content() {
|
local output_dir="$TARGET_PATH/scripts"
|
||||||
log_info "คัดลอก content..."
|
mkdir -p "$output_dir"
|
||||||
|
|
||||||
cd "$SOURCE_PATH"
|
cat > "$output_dir/import-content.ts" << 'TSEOF'
|
||||||
|
import { payload } from '../src/lib/payload'
|
||||||
|
import { promises as fs } from 'fs'
|
||||||
|
import path from 'path'
|
||||||
|
|
||||||
# Copy markdown content
|
async function importContent() {
|
||||||
if [ -d "src/content" ]; then
|
const contentDir = path.join(process.cwd(), 'src/content-migration')
|
||||||
mkdir -p "$NEW_PROJECT_PATH/src/content/migration"
|
|
||||||
cp -r src/content/* "$NEW_PROJECT_PATH/src/content/migration/"
|
|
||||||
log_success "คัดลอก content จาก src/content"
|
|
||||||
elif [ -d "content" ]; then
|
|
||||||
mkdir -p "$NEW_PROJECT_PATH/src/content/migration"
|
|
||||||
cp -r content/* "$NEW_PROJECT_PATH/src/content/migration/"
|
|
||||||
log_success "คัดลอก content จาก content"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Copy public assets
|
try {
|
||||||
if [ -d "public" ]; then
|
const files = await fs.readdir(contentDir)
|
||||||
cp -r public/* "$NEW_PROJECT_PATH/public/" 2>/dev/null || true
|
const jsonFiles = files.filter(f => f.endsWith('.json'))
|
||||||
log_success "คัดลอก public assets"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Copy pages (needs manual conversion)
|
for (const file of jsonFiles) {
|
||||||
if [ -d "src/pages" ] || [ -d "pages" ]; then
|
const filePath = path.join(contentDir, file)
|
||||||
mkdir -p "$NEW_PROJECT_PATH/src/pages/legacy"
|
const content = JSON.parse(await fs.readFile(filePath, 'utf-8'))
|
||||||
log_info "Pages ต้องการ manual conversion - เก็บไว้ที่ legacy/"
|
|
||||||
fi
|
await payload.create({
|
||||||
|
collection: 'posts',
|
||||||
|
data: {
|
||||||
|
title: content.title,
|
||||||
|
slug: content.slug,
|
||||||
|
createdAt: content.createdAt,
|
||||||
|
updatedAt: content.updatedAt,
|
||||||
|
meta: content.meta,
|
||||||
|
author: content.author,
|
||||||
|
heroImage: content.heroImage,
|
||||||
|
tags: content.tags,
|
||||||
|
content: content.content,
|
||||||
|
_status: 'published',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log(`Imported: ${content.title}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`\nSuccessfully imported ${jsonFiles.length} posts`)
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Import failed:', error)
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
importContent()
|
||||||
# Create content migration report
|
TSEOF
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
|
log_success "Created: $output_dir/import-content.ts"
|
||||||
|
}
|
||||||
|
|
||||||
create_migration_report() {
|
create_migration_report() {
|
||||||
log_info "สร้าง migration report..."
|
log_info "Creating migration report..."
|
||||||
|
|
||||||
cd "$SOURCE_PATH"
|
cd "$SOURCE_PATH"
|
||||||
|
|
||||||
local page_count=$(find . -type f \( -name "*.astro" -o -name "*.tsx" -o -name "*.jsx" -o -name "*.html" -o -name "*.md" -o -name "*.mdx" \) 2>/dev/null | grep -v node_modules | wc -l)
|
local page_count=$(find "$CONTENT_DIR" -type f \( -name "*.md" -o -name "*.mdx" \) 2>/dev/null | wc -l)
|
||||||
|
|
||||||
cat > "$NEW_PROJECT_PATH/MIGRATION_REPORT.md" << EOF
|
cat > "$TARGET_PATH/MIGRATION_REPORT.md" << EOF
|
||||||
# Migration Report
|
# Migration Report: Astro → Payload CMS
|
||||||
|
|
||||||
## Source Information
|
## Source
|
||||||
- **Type:** $SOURCE_TYPE
|
- **Type:** Astro
|
||||||
- **Path:** $SOURCE_PATH
|
- **Path:** $SOURCE_PATH
|
||||||
- **Backup:** $BACKUP_DIR
|
- **Backup:** $BACKUP_DIR
|
||||||
- **Date:** $(date)
|
- **Date:** $(date)
|
||||||
|
|
||||||
## Content Statistics
|
## Statistics
|
||||||
- **Total Pages:** $page_count
|
- **Total Posts:** $page_count
|
||||||
|
|
||||||
## Files to Migrate
|
## Content Migration
|
||||||
|
|
||||||
### Pages (Manual Conversion Required)
|
Content has been converted to Payload CMS Lexical JSON format in:
|
||||||
|
\`\`\`
|
||||||
|
src/content-migration/
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
1. **Review converted content:**
|
||||||
|
\`\`\`bash
|
||||||
|
ls src/content-migration/
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
2. **Configure Payload collection:**
|
||||||
|
Make sure you have a 'posts' collection in \`src/collections/Posts.ts\`
|
||||||
|
|
||||||
|
3. **Import content to Payload:**
|
||||||
|
\`\`\`bash
|
||||||
|
npx tsx scripts/import-content.ts
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
4. **Verify in admin:**
|
||||||
|
- Go to http://localhost:3002/admin
|
||||||
|
- Navigate to Posts collection
|
||||||
|
- Verify content and rich text editor (Lexical)
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- MDX/Markdown content is converted to Lexical JSON format
|
||||||
|
- Frontmatter fields (title, date, description) are mapped to collection fields
|
||||||
|
- Complex MDX components need manual conversion in Payload admin
|
||||||
|
- Images need to be re-uploaded to Payload Media
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# List pages that need conversion
|
log_success "Migration report: $TARGET_PATH/MIGRATION_REPORT.md"
|
||||||
if [ -d "src/pages" ]; then
|
|
||||||
find src/pages -type f \( -name "*.astro" -o -name "*.tsx" -o -name "*.jsx" \) 2>/dev/null >> "$NEW_PROJECT_PATH/MIGRATION_REPORT.md"
|
|
||||||
elif [ -d "pages" ]; then
|
|
||||||
find pages -type f \( -name "*.html" -o -name "*.jsx" -o -name "*.tsx" \) 2>/dev/null >> "$NEW_PROJECT_PATH/MIGRATION_REPORT.md"
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat >> "$NEW_PROJECT_PATH/MIGRATION_REPORT.md" << EOF
|
|
||||||
|
|
||||||
### Content (Auto-migrated)
|
|
||||||
EOF
|
|
||||||
|
|
||||||
if [ -d "$NEW_PROJECT_PATH/src/content/migration" ]; then
|
|
||||||
find "$NEW_PROJECT_PATH/src/content/migration" -type f -name "*.md" -o -name "*.mdx" 2>/dev/null >> "$NEW_PROJECT_PATH/MIGRATION_REPORT.md"
|
|
||||||
fi
|
|
||||||
|
|
||||||
log_success "สร้าง migration report: $NEW_PROJECT_PATH/MIGRATION_REPORT.md"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
# Main
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
echo " Website Migration Tool"
|
echo " Astro → Payload CMS Migration Tool"
|
||||||
echo " แปลงเว็บเก่าเป็น Astro + Payload CMS"
|
echo " Convert MDX/MD to Payload CMS with Lexical"
|
||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
@@ -276,29 +299,39 @@ main() {
|
|||||||
if [ -z "$SOURCE_PATH" ]; then
|
if [ -z "$SOURCE_PATH" ]; then
|
||||||
print_usage
|
print_usage
|
||||||
echo ""
|
echo ""
|
||||||
log_error "กรุณาระบุ source path"
|
log_error "Please specify source path"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
detect_source_type
|
if [ ! -d "$SOURCE_PATH" ]; then
|
||||||
backup_source
|
log_error "Source path not found: $SOURCE_PATH"
|
||||||
analyze_structure
|
exit 1
|
||||||
create_new_project
|
fi
|
||||||
copy_content
|
|
||||||
|
if [ ! -d "$TARGET_PATH" ]; then
|
||||||
|
log_error "Target path not found: $TARGET_PATH"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
detect_content_type
|
||||||
|
backup_content
|
||||||
|
analyze_content
|
||||||
|
create_lexical_content
|
||||||
|
create_payload_import_script
|
||||||
create_migration_report
|
create_migration_report
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
log_success "Migration เริ่มต้นเสร็จสมบูรณ์!"
|
log_success "Migration preparation complete!"
|
||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
echo ""
|
echo ""
|
||||||
echo "ขั้นตอนถัดไป:"
|
echo "Next steps:"
|
||||||
echo " 1. cd $NEW_PROJECT_PATH"
|
echo " 1. cd $TARGET_PATH"
|
||||||
echo " 2. npm install"
|
echo " 2. Review converted content in src/content-migration/"
|
||||||
echo " 3. ดู MIGRATION_REPORT.md"
|
echo " 3. Run: npm run dev"
|
||||||
echo " 4. ปรับ content และ pages ตาม report"
|
echo " 4. Import: npx tsx scripts/import-content.ts"
|
||||||
echo " 5. npm run dev"
|
echo " 5. Verify in Payload admin (http://localhost:3002/admin)"
|
||||||
echo ""
|
echo ""
|
||||||
}
|
}
|
||||||
|
|
||||||
main "$@"
|
main "$@"
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# deploy.sh - Deploy Astro + Payload CMS ไปยัง Easypanel
|
# deploy.sh - Deploy Next.js + Payload CMS ไปยัง Easypanel
|
||||||
#
|
#
|
||||||
# Usage: ./deploy.sh [project-path] [server] [domain]
|
# Usage: ./deploy.sh [project-path] [server] [domain]
|
||||||
#
|
#
|
||||||
@@ -49,7 +49,7 @@ print_usage() {
|
|||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: $(basename "$0") [project-path] [server] [domain]
|
Usage: $(basename "$0") [project-path] [server] [domain]
|
||||||
|
|
||||||
Deploy Astro + Payload CMS ไปยัง Easypanel
|
Deploy Next.js + Payload CMS ไปยัง Easypanel
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
project-path ที่อยู่ project (default: current directory)
|
project-path ที่อยู่ project (default: current directory)
|
||||||
@@ -87,8 +87,8 @@ check_requirements() {
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -f "astro.config.mjs" ]; then
|
if [ ! -f "next.config.ts" ] && [ ! -f "next.config.js" ]; then
|
||||||
log_error "ไม่พบ astro.config.mjs"
|
log_error "ไม่พบ next.config.ts หรือ next.config.js"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -180,7 +180,7 @@ show_deploy_instructions() {
|
|||||||
echo " 4. ใส่ git repo URL"
|
echo " 4. ใส่ git repo URL"
|
||||||
echo " 5. ตั้งค่า environment variables:"
|
echo " 5. ตั้งค่า environment variables:"
|
||||||
echo " - PAYLOAD_SECRET"
|
echo " - PAYLOAD_SECRET"
|
||||||
echo " - DATABASE_URL"
|
echo " - MONGODB_URL"
|
||||||
echo " 6. ตั้งค่า domain: $DOMAIN"
|
echo " 6. ตั้งค่า domain: $DOMAIN"
|
||||||
echo " 7. Deploy"
|
echo " 7. Deploy"
|
||||||
echo ""
|
echo ""
|
||||||
@@ -209,14 +209,14 @@ create_deploy_config() {
|
|||||||
"domain": "$DOMAIN",
|
"domain": "$DOMAIN",
|
||||||
"build": {
|
"build": {
|
||||||
"command": "npm run build",
|
"command": "npm run build",
|
||||||
"output": "dist"
|
"output": ".next"
|
||||||
},
|
},
|
||||||
"environment": {
|
"environment": {
|
||||||
"NODE_ENV": "production"
|
"NODE_ENV": "production"
|
||||||
},
|
},
|
||||||
"required_env": [
|
"required_env": [
|
||||||
"PAYLOAD_SECRET",
|
"PAYLOAD_SECRET",
|
||||||
"DATABASE_URL"
|
"MONGODB_URL"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
@@ -231,7 +231,7 @@ EOF
|
|||||||
main() {
|
main() {
|
||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
echo " Deploy Tool"
|
echo " Deploy Tool"
|
||||||
echo " Astro + Payload CMS -> Easypanel"
|
echo " Next.js + Payload CMS -> Easypanel"
|
||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# new-project.sh - สร้าง Astro + Payload CMS project ใหม่จาก Astro Starter Template
|
# new-project.sh - สร้าง Next.js + Payload CMS project ใหม่จาก Template
|
||||||
#
|
#
|
||||||
# Usage: ./new-project.sh [project-name] [project-path]
|
# Usage: ./new-project.sh [project-name] [project-path]
|
||||||
#
|
#
|
||||||
# สร้าง Astro project ใหม่โดย:
|
# สร้าง Next.js + Payload CMS project ใหม่โดย:
|
||||||
# 1. คัดลอก astro-starter template
|
# 1. คัดลอก nextjs-payload-starter template
|
||||||
# 2. ติดตั้ง dependencies
|
# 2. ติดตั้ง dependencies
|
||||||
# 3. ตั้งค่า environment
|
# 3. ตั้งค่า environment
|
||||||
#
|
#
|
||||||
@@ -31,7 +31,7 @@ PROJECT_PATH="${2:-.}"
|
|||||||
|
|
||||||
# Get skill directory
|
# Get skill directory
|
||||||
SKILL_DIR="$(dirname "$(dirname "$(readlink -f "$0")")")"
|
SKILL_DIR="$(dirname "$(dirname "$(readlink -f "$0")")")"
|
||||||
TEMPLATE_DIR="$SKILL_DIR/templates/astro-starter"
|
TEMPLATE_DIR="$SKILL_DIR/templates/nextjs-payload-starter"
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
# Helper functions
|
# Helper functions
|
||||||
@@ -57,7 +57,7 @@ print_usage() {
|
|||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: $(basename "$0") [project-name] [project-path]
|
Usage: $(basename "$0") [project-name] [project-path]
|
||||||
|
|
||||||
สร้าง Astro + Payload CMS project ใหม่จาก Astro Starter Template
|
สร้าง Next.js + Payload CMS project ใหม่จาก Template
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
project-name ชื่อ project (optional)
|
project-name ชื่อ project (optional)
|
||||||
@@ -103,7 +103,7 @@ check_requirements() {
|
|||||||
|
|
||||||
# Check template exists
|
# Check template exists
|
||||||
if [ ! -d "$TEMPLATE_DIR" ]; then
|
if [ ! -d "$TEMPLATE_DIR" ]; then
|
||||||
log_error "ไม่พบ Astro Starter Template: $TEMPLATE_DIR"
|
log_error "ไม่พบ Next.js Payload Starter Template: $TEMPLATE_DIR"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -143,7 +143,7 @@ setup_directory() {
|
|||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
|
|
||||||
copy_template() {
|
copy_template() {
|
||||||
log_info "คัดลอก Astro Starter Template..."
|
log_info "คัดลอก Next.js Payload Starter Template..."
|
||||||
|
|
||||||
# Copy all template files
|
# Copy all template files
|
||||||
cp -r "$TEMPLATE_DIR/"* "$PROJECT_PATH/"
|
cp -r "$TEMPLATE_DIR/"* "$PROJECT_PATH/"
|
||||||
@@ -237,9 +237,9 @@ create_ai_rules() {
|
|||||||
|
|
||||||
## Tech Stack Overview
|
## Tech Stack Overview
|
||||||
|
|
||||||
- **Frontend:** Astro เวอร์ชั่นล่าสุด + TypeScript
|
- **Frontend:** Next.js App Router + TypeScript
|
||||||
- **Backend/CMS:** Payload CMS 3.0
|
- **Backend/CMS:** Payload CMS 3.0
|
||||||
- **Database:** PostgreSQL (via Payload)
|
- **Database:** MongoDB (via mongooseAdapter)
|
||||||
- **Styling:** Tailwind CSS v4
|
- **Styling:** Tailwind CSS v4
|
||||||
- **Authentication:** Payload built-in auth with role-based access
|
- **Authentication:** Payload built-in auth with role-based access
|
||||||
- **Image Handling:** Payload Media collection
|
- **Image Handling:** Payload Media collection
|
||||||
@@ -247,9 +247,9 @@ create_ai_rules() {
|
|||||||
## File Organization
|
## File Organization
|
||||||
|
|
||||||
- **Collections:** Define Payload collections in `src/collections/`
|
- **Collections:** Define Payload collections in `src/collections/`
|
||||||
- **Pages:** Use Astro file-based routing in `src/pages/`
|
- **Pages:** Next.js App Router in `src/app/`
|
||||||
- **Components:** Reusable components in `src/components/`
|
- **Components:** Reusable components in `src/components/`
|
||||||
- **Styles:** Global styles in `src/styles/`
|
- **Styles:** Global styles in `src/app/globals.css`
|
||||||
|
|
||||||
## Never Modify These Files
|
## Never Modify These Files
|
||||||
|
|
||||||
@@ -279,7 +279,7 @@ init_git() {
|
|||||||
if [ ! -d ".git" ]; then
|
if [ ! -d ".git" ]; then
|
||||||
git init
|
git init
|
||||||
git add .
|
git add .
|
||||||
git commit -m "Initial commit: Astro + Payload CMS starter"
|
git commit -m "Initial commit: Next.js + Payload CMS starter"
|
||||||
log_success "เริ่มต้น git เสร็จสมบูรณ์"
|
log_success "เริ่มต้น git เสร็จสมบูรณ์"
|
||||||
else
|
else
|
||||||
log_info "git repo มีอยู่แล้ว"
|
log_info "git repo มีอยู่แล้ว"
|
||||||
@@ -303,8 +303,8 @@ show_structure() {
|
|||||||
|
|
||||||
main() {
|
main() {
|
||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
echo " Astro + Payload CMS Project Creator"
|
echo " Next.js + Payload CMS Project Creator"
|
||||||
echo " Using Astro Starter Template"
|
echo " Using Next.js Payload Starter"
|
||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
@@ -327,16 +327,15 @@ main() {
|
|||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
log_success "สร้าง Astro + Payload CMS project เสร็จสมบูรณ์!"
|
log_success "สร้าง Next.js + Payload CMS project เสร็จสมบูรณ์!"
|
||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
echo ""
|
echo ""
|
||||||
echo "ขั้นตอนถัดไป:"
|
echo "ขั้นตอนถัดไป:"
|
||||||
echo " 1. cd $PROJECT_PATH"
|
echo " 1. cd $PROJECT_PATH"
|
||||||
echo " 2. แก้ไข .env (DATABASE_URL, PAYLOAD_SECRET)"
|
echo " 2. แก้ไข .env (MONGODB_URL, PAYLOAD_SECRET)"
|
||||||
echo " 3. npm run db:push (สร้าง database tables)"
|
echo " 3. npm install"
|
||||||
echo " 4. npm run generate (สร้าง Payload types)"
|
echo " 4. npm run dev"
|
||||||
echo " 5. npm run dev"
|
echo " 5. เปิด http://localhost:3002/admin สำหรับ Payload admin"
|
||||||
echo " 6. เปิด http://localhost:4321/admin สำหรับ Payload admin"
|
|
||||||
echo ""
|
echo ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ NC='\033[0m'
|
|||||||
|
|
||||||
# Default values
|
# Default values
|
||||||
PROJECT_PATH="${1:-.}"
|
PROJECT_PATH="${1:-.}"
|
||||||
PORT="${2:-4321}"
|
PORT="${2:-3002}"
|
||||||
HOST="0.0.0.0"
|
HOST="0.0.0.0"
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
@@ -64,13 +64,13 @@ check_project() {
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check for Astro or Emdash
|
# Check for Next.js
|
||||||
if ! grep -q "astro" "$PROJECT_PATH/package.json"; then
|
if ! grep -q '"next"' "$PROJECT_PATH/package.json"; then
|
||||||
log_error "ไม่ใช่ Astro project"
|
log_error "ไม่ใช่ Next.js project"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log_success "พบ Astro project"
|
log_success "พบ Next.js project"
|
||||||
}
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
@@ -159,7 +159,7 @@ check_port() {
|
|||||||
|
|
||||||
main() {
|
main() {
|
||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
echo " Astro Preview Server"
|
echo " Next.js Preview Server"
|
||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user