diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml
index be202b4..9420e6e 100644
--- a/.github/workflows/sync.yml
+++ b/.github/workflows/sync.yml
@@ -187,3 +187,190 @@ jobs:
if: always()
run: |
rm -rf /tmp/page-conversion
+
+ convert-to-edgeone:
+ runs-on: ubuntu-latest
+ timeout-minutes: 15
+ permissions:
+ contents: write
+
+ steps:
+ - name: Checkout main branch
+ uses: actions/checkout@v5
+ with:
+ ref: main
+ fetch-depth: 0
+
+ - name: Configure Git
+ run: |
+ git config user.name "github-actions[bot]"
+ git config user.email "github-actions[bot]@users.noreply.github.com"
+
+ - name: Create temporary working directory
+ run: |
+ mkdir -p /tmp/edgeone-conversion
+ cd /tmp/edgeone-conversion
+
+ - name: Copy source code files only
+ run: |
+ # Copy only runtime-required files (no documentation, tests, or dev configs)
+ cp -r src /tmp/edgeone-conversion/
+ cp package.json /tmp/edgeone-conversion/
+ cp package-lock.json /tmp/edgeone-conversion/ 2>/dev/null || true
+ cp LICENSE /tmp/edgeone-conversion/
+
+ - name: Create EdgeOne Pages Function handler
+ run: |
+ mkdir -p /tmp/edgeone-conversion/functions
+ cat > /tmp/edgeone-conversion/functions/[[path]].js << 'EOF'
+ /**
+ * Xget - High-performance acceleration engine for developer resources
+ * Copyright (C) 2025 Xi Xu
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+ import { handleRequest } from '../src/index.js';
+
+ /**
+ * EdgeOne Pages Function handler for all routes.
+ *
+ * This catch-all route handler processes all incoming requests to the Xget
+ * acceleration engine. It delegates request processing to the main handleRequest
+ * function from the Worker code, maintaining full compatibility with the
+ * existing implementation.
+ *
+ * The [[path]] syntax in the filename creates a catch-all route that matches
+ * any path, allowing this single function to handle all requests to the Pages
+ * application.
+ *
+ * EdgeOne Pages Functions are compatible with Cloudflare Pages Functions,
+ * using the same onRequest() handler signature and context object structure.
+ *
+ * @param {Object} context - EdgeOne Pages Function context
+ * @param {Request} context.request - The incoming HTTP request
+ * @param {Object} context.env - Environment variables and bindings (KV, secrets, etc.)
+ * @param {Object} context.params - Route parameters (path segments from [[path]])
+ * @param {Function} context.waitUntil - Extend function execution for background tasks
+ * @param {Function} context.next - Call next middleware in chain (not used here)
+ * @param {Object} context.data - Shared data between functions
+ * @returns {Promise} The HTTP response to return to the client
+ *
+ * @example
+ * // This is called automatically by EdgeOne Pages
+ * // User requests: https://xget.pages.edgeone.app/npm/lodash
+ * // Runtime invokes: onRequest(context)
+ * // Returns: Response with package data
+ *
+ * @example
+ * // Environment variables usage
+ * // edgeone.json or Console: TIMEOUT_SECONDS = "60"
+ * // context.env contains: { TIMEOUT_SECONDS: "60" }
+ * // handleRequest uses createConfig(env) to override defaults
+ */
+ export async function onRequest(context) {
+ // Extract request, env, and create an execution context compatible with Workers
+ const { request, env, waitUntil } = context;
+
+ // Create a minimal ExecutionContext-like object for compatibility
+ const ctx = {
+ waitUntil: waitUntil,
+ passThroughOnException: () => {
+ // Pages doesn't support passThroughOnException, so this is a no-op
+ console.warn('passThroughOnException is not supported in EdgeOne Pages Functions');
+ }
+ };
+
+ // Delegate to the main request handler
+ return handleRequest(request, env, ctx);
+ }
+ EOF
+
+ - name: Export handleRequest from src/index.js
+ run: |
+ cd /tmp/edgeone-conversion
+ # Add export statement before the default export at the end of the file
+ sed -i '/^export default {$/i\
+ export { handleRequest };' src/index.js
+
+ - name: Create edgeone.json configuration
+ run: |
+ cd /tmp/edgeone-conversion
+ cat > edgeone.json << 'EOF'
+ {
+ "buildCommand": "",
+ "installCommand": "npm install",
+ "outputDirectory": ".",
+ "nodeVersion": "22.11.0",
+ "headers": [
+ {
+ "source": "/*",
+ "headers": [
+ {
+ "key": "X-Content-Type-Options",
+ "value": "nosniff"
+ },
+ {
+ "key": "X-Frame-Options",
+ "value": "DENY"
+ },
+ {
+ "key": "Referrer-Policy",
+ "value": "no-referrer"
+ }
+ ]
+ }
+ ]
+ }
+ EOF
+
+ - name: Update package.json for EdgeOne Pages
+ run: |
+ cd /tmp/edgeone-conversion
+ # Update deployment commands for EdgeOne Pages
+ cat package.json | \
+ sed 's/\"deploy\": \"wrangler deploy\"/\"deploy\": \"echo \\\"Deploy via EdgeOne Pages Console\\\"\"/' | \
+ sed 's/\"start\": \"wrangler dev\"/\"start\": \"echo \\\"Use EdgeOne Pages local development\\\"\"/' \
+ > package.json.tmp && mv package.json.tmp package.json
+
+ - name: Initialize pages branch
+ run: |
+ cd /tmp/edgeone-conversion
+ git init
+ git config user.name "github-actions[bot]"
+ git config user.email "github-actions[bot]@users.noreply.github.com"
+ git checkout -b pages
+ git add .
+ git commit -m "Convert Worker to EdgeOne Pages
+
+ Auto-converted from main branch commit ${{ github.sha }}
+
+ Changes:
+ - Add functions/[[path]].js: Catch-all EdgeOne Pages Function handler
+ - Update src/index.js: Export handleRequest for Pages Function import
+ - Add edgeone.json: Configure for EdgeOne Pages deployment
+ - Update package.json: Note deployment via EdgeOne Console
+
+ Runtime files only (documentation, tests, and dev configs excluded)."
+
+ - name: Force push to pages branch
+ run: |
+ cd /tmp/edgeone-conversion
+ git remote add origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git
+ git push -f origin pages
+
+ - name: Clean up
+ if: always()
+ run: |
+ rm -rf /tmp/edgeone-conversion