From ea3c54e3541a5e1da7780f6905e9e421677d1948 Mon Sep 17 00:00:00 2001 From: James Stout Date: Thu, 17 Jul 2025 15:00:17 -0400 Subject: [PATCH 01/14] Delete api/discovery.js --- api/discovery.js | 52 ------------------------------------------------ 1 file changed, 52 deletions(-) delete mode 100644 api/discovery.js diff --git a/api/discovery.js b/api/discovery.js deleted file mode 100644 index 8898828..0000000 --- a/api/discovery.js +++ /dev/null @@ -1,52 +0,0 @@ -//discovery.js -export default function handler(req, res) { - if (req.method !== 'GET') { - return res.status(405).json({ error: 'Method not allowed' }); - } - const baseUrl = process.env.BASE_URL || ''; - - const functions = [ - { - name: "greeting", - description: "Greets a person in a random language (English, Spanish, or French)", - parameters: [ - { - name: "name", - type: "string", - description: "Name of the person to greet", - required: true - }, - { - name: "language", - type: "string", - description: "Language for greeting (defaults to random)", - required: false - } - ], - endpoint: `${baseUrl}/tools/greeting`, - http_method: "POST" - }, - { - name: "todays-date", - description: "Returns today's date in the specified format", - parameters: [ - { - name: "format", - type: "string", - description: "Date format (defaults to ISO format)", - required: false - } - ], - endpoint: `${baseUrl}/tools/todays-date`, - http_method: "POST" - }, - { - name: "rick-roll", - description: "Rick rolls the user", - parameters: [], - endpoint: `${baseUrl}/tools/rick-roll`, - http_method: "POST" - } - ]; - res.status(200).json({ functions }); -} From dbf11aa0ae6b53ba351aa04ce44137096288ff7a Mon Sep 17 00:00:00 2001 From: James Stout Date: Thu, 17 Jul 2025 15:00:32 -0400 Subject: [PATCH 02/14] Delete api/tools directory --- api/tools/greeting.js | 32 ------------------------------- api/tools/rick-roll.js | 27 -------------------------- api/tools/todays-date.js | 41 ---------------------------------------- 3 files changed, 100 deletions(-) delete mode 100644 api/tools/greeting.js delete mode 100644 api/tools/rick-roll.js delete mode 100644 api/tools/todays-date.js diff --git a/api/tools/greeting.js b/api/tools/greeting.js deleted file mode 100644 index ef316c6..0000000 --- a/api/tools/greeting.js +++ /dev/null @@ -1,32 +0,0 @@ -// api/tools/greeting.js -export default function handler(req, res) { - if (req.method !== 'POST') { - return res.status(405).json({ error: 'Method not allowed' }); - } - - const { name, language } = req.body; - - if (!name) { - return res.status(400).json({ error: 'Name parameter is required' }); - } - - try { - const availableLanguages = (process.env.GREETING_LANGUAGES || 'english,spanish,french').split(','); - - const greetings = { - english: `Hello, ${name}!`, - spanish: `Β‘Hola, ${name}!`, - french: `Bonjour, ${name}!` - }; - - const selectedLanguage = language || availableLanguages[Math.floor(Math.random() * availableLanguages.length)]; - const greeting = greetings[selectedLanguage.toLowerCase()] || greetings.english; - - res.status(200).json({ - result: greeting, - language: selectedLanguage - }); - } catch (error) { - res.status(500).json({ error: 'Internal server error' }); - } -} diff --git a/api/tools/rick-roll.js b/api/tools/rick-roll.js deleted file mode 100644 index 8814444..0000000 --- a/api/tools/rick-roll.js +++ /dev/null @@ -1,27 +0,0 @@ -// api/tools/rick-roll.js -export default function handler(req, res) { - if (req.method !== 'POST') { - return res.status(405).json({ error: 'Method not allowed' }); - } - - try { - const rickRollMessages = [ - "🎡 Never gonna give you up, never gonna let you down! 🎡", - "You've been Rick Rolled! πŸ•Ί", - "🎀 Never gonna run around and desert you! 🎀", - "Rick Astley strikes again! 🎸", - "🎡 We're no strangers to love... 🎡" - ]; - - const randomMessage = rickRollMessages[Math.floor(Math.random() * rickRollMessages.length)]; - const videoUrl = process.env.RICK_ROLL_VIDEO_URL || "https://www.youtube.com/watch?v=dQw4w9WgXcQ"; - - res.status(200).json({ - result: randomMessage, - video_url: videoUrl, - message: "You've been Rick Rolled! πŸŽ‰" - }); - } catch (error) { - res.status(500).json({ error: 'Internal server error' }); - } -} diff --git a/api/tools/todays-date.js b/api/tools/todays-date.js deleted file mode 100644 index 9912436..0000000 --- a/api/tools/todays-date.js +++ /dev/null @@ -1,41 +0,0 @@ -// api/tools/todays-date.js -export default function handler(req, res) { - if (req.method !== 'POST') { - return res.status(405).json({ error: 'Method not allowed' }); - } - - const { format } = req.body; - - try { - const today = new Date(); - const defaultFormat = process.env.DEFAULT_DATE_FORMAT || 'iso'; - const requestedFormat = format || defaultFormat; - let formattedDate; - - switch (requestedFormat.toLowerCase()) { - case 'short': - formattedDate = today.toLocaleDateString(); - break; - case 'long': - formattedDate = today.toLocaleDateString('en-US', { - weekday: 'long', - year: 'numeric', - month: 'long', - day: 'numeric' - }); - break; - case 'time': - formattedDate = today.toLocaleString(); - break; - default: - formattedDate = today.toISOString().split('T')[0]; // ISO format (YYYY-MM-DD) - } - - res.status(200).json({ - result: formattedDate, - format: requestedFormat - }); - } catch (error) { - res.status(500).json({ error: 'Internal server error' }); - } -} From 13d4e46b27d6f24ff28b42127bb3a27dc55d8c8a Mon Sep 17 00:00:00 2001 From: James Stout Date: Thu, 17 Jul 2025 15:00:41 -0400 Subject: [PATCH 03/14] Delete api/test.js --- api/test.js | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 api/test.js diff --git a/api/test.js b/api/test.js deleted file mode 100644 index 2f48f32..0000000 --- a/api/test.js +++ /dev/null @@ -1,5 +0,0 @@ - -// api/test.js -export default function handler(req, res) { - res.status(200).json({ message: "Test endpoint working!" }); -} From 2eb8b1833ccec3407297893931b5aa277029d2f2 Mon Sep 17 00:00:00 2001 From: James Stout Date: Thu, 17 Jul 2025 15:00:54 -0400 Subject: [PATCH 04/14] Delete package.json --- package.json | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 package.json diff --git a/package.json b/package.json deleted file mode 100644 index a42a5c0..0000000 --- a/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "opal-tools-registry", - "version": "1.0.0", - "description": "Simple Opal Tools Registry for Vercel", - "scripts": { - "dev": "dev", - "build": "build", - "deploy": "vercel --prod" - }, - "dependencies": {}, - "devDependencies": { - "vercel": "^32.0.0" - }, - "engines": { - "node": ">=16.0.0" - } -} From f781087fd1ca42f9be3131ed4a36bf80cc0c1c2b Mon Sep 17 00:00:00 2001 From: James Stout Date: Thu, 17 Jul 2025 15:01:18 -0400 Subject: [PATCH 05/14] Create hello.js --- api/hello.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 api/hello.js diff --git a/api/hello.js b/api/hello.js new file mode 100644 index 0000000..b75573f --- /dev/null +++ b/api/hello.js @@ -0,0 +1,14 @@ +const handler = async (req, res) => { + try { + const { name = 'World' } = req.query; + res.status(200).json({ + message: `Hello, ${name}!`, + timestamp: new Date().toISOString(), + method: req.method + }); + } catch (error) { + res.status(500).json({ error: 'Internal Server Error' }); + } +}; + +module.exports = handler; From 2851d573501f98d0f285a185b2970602c898564f Mon Sep 17 00:00:00 2001 From: James Stout Date: Thu, 17 Jul 2025 15:01:40 -0400 Subject: [PATCH 06/14] Update vercel.json --- vercel.json | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/vercel.json b/vercel.json index a308e33..b22e070 100644 --- a/vercel.json +++ b/vercel.json @@ -1,8 +1,15 @@ { - "$schema": "https://openapi.vercel.sh/vercel.json", + "version": 2, "builds": [ - { "src": "*.html", "use": "@vercel/static" }, - { "src": "*.py", "use": "@vercel/python" }, - { "src": "*.js", "use": "@vercel/node" } + { + "src": "api/**/*.js", + "use": "@vercel/node" + } + ], + "routes": [ + { + "src": "/api/(.*)", + "dest": "/api/$1" + } ] } From c7e5c1acaa39e72c55e3764e39ffe993ae9cb672 Mon Sep 17 00:00:00 2001 From: James Stout Date: Thu, 17 Jul 2025 15:18:25 -0400 Subject: [PATCH 07/14] Update vercel.json --- vercel.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vercel.json b/vercel.json index b22e070..a025833 100644 --- a/vercel.json +++ b/vercel.json @@ -8,8 +8,8 @@ ], "routes": [ { - "src": "/api/(.*)", - "dest": "/api/$1" + "src": "/api/(.+)", + "dest": "/api/$1.s" } ] } From 5107fcf0a1d99d6b8583757f8611276720797337 Mon Sep 17 00:00:00 2001 From: James Stout Date: Thu, 17 Jul 2025 15:20:20 -0400 Subject: [PATCH 08/14] Update vercel.json --- vercel.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/vercel.json b/vercel.json index a025833..ad1998e 100644 --- a/vercel.json +++ b/vercel.json @@ -8,8 +8,14 @@ ], "routes": [ { - "src": "/api/(.+)", - "dest": "/api/$1.s" + "src": "/api/([^/]+)", + "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"], + "dest": "/api/$1.js" + }, + { + "src": "/api/([^/]+).*", + "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"], + "dest": "/api/$1.js" } ] } From 776b88b46d9bb80c1f772b881d0a14f068b0e1f7 Mon Sep 17 00:00:00 2001 From: James Stout Date: Thu, 17 Jul 2025 15:22:12 -0400 Subject: [PATCH 09/14] Update vercel.json --- vercel.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/vercel.json b/vercel.json index ad1998e..4a76343 100644 --- a/vercel.json +++ b/vercel.json @@ -16,6 +16,16 @@ "src": "/api/([^/]+).*", "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"], "dest": "/api/$1.js" + }, + { + "src": "/api/tools/([^/]+)", + "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"], + "dest": "/api/tools/$1.js" + }, + { + "src": "/api/tools/([^/]+).*", + "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"], + "dest": "/api/tools/$1.js" } ] } From fba66176f1f4b11a476c7cb69e1c64ffc8568971 Mon Sep 17 00:00:00 2001 From: James Stout Date: Thu, 17 Jul 2025 15:23:20 -0400 Subject: [PATCH 10/14] Create discovery.js --- api/discovery.js | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 api/discovery.js diff --git a/api/discovery.js b/api/discovery.js new file mode 100644 index 0000000..18643b9 --- /dev/null +++ b/api/discovery.js @@ -0,0 +1,53 @@ +//discovery.js +const handler = async (req, res) => { + if (req.method !== 'GET') { + return res.status(405).json({ error: 'Method not allowed' }); + } + const baseUrl = process.env.BASE_URL || ''; + + const functions = [ + { + name: "greeting", + description: "Greets a person in a random language (English, Spanish, or French)", + parameters: [ + { + name: "name", + type: "string", + description: "Name of the person to greet", + required: true + }, + { + name: "language", + type: "string", + description: "Language for greeting (defaults to random)", + required: false + } + ], + endpoint: `${baseUrl}/tools/greeting`, + http_method: "POST" + }, + { + name: "todays-date", + description: "Returns today's date in the specified format", + parameters: [ + { + name: "format", + type: "string", + description: "Date format (defaults to ISO format)", + required: false + } + ], + endpoint: `${baseUrl}/tools/todays-date`, + http_method: "POST" + }, + { + name: "rick-roll", + description: "Rick rolls the user", + parameters: [], + endpoint: `${baseUrl}/tools/rick-roll`, + http_method: "POST" + } + ]; + res.status(200).json({ functions }); +} +module.exports = handler; From 507c3f6d4319368fa811035159bb733b8fb81990 Mon Sep 17 00:00:00 2001 From: James Stout Date: Thu, 17 Jul 2025 15:24:44 -0400 Subject: [PATCH 11/14] Create greeting.js --- api/tools/greeting.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 api/tools/greeting.js diff --git a/api/tools/greeting.js b/api/tools/greeting.js new file mode 100644 index 0000000..9b1ded5 --- /dev/null +++ b/api/tools/greeting.js @@ -0,0 +1,33 @@ +// api/tools/greeting.js +const handler = async (req, res) => { + if (req.method !== 'POST') { + return res.status(405).json({ error: 'Method not allowed' }); + } + + const { name, language } = req.body; + + if (!name) { + return res.status(400).json({ error: 'Name parameter is required' }); + } + + try { + const availableLanguages = (process.env.GREETING_LANGUAGES || 'english,spanish,french').split(','); + + const greetings = { + english: `Hello, ${name}!`, + spanish: `Β‘Hola, ${name}!`, + french: `Bonjour, ${name}!` + }; + + const selectedLanguage = language || availableLanguages[Math.floor(Math.random() * availableLanguages.length)]; + const greeting = greetings[selectedLanguage.toLowerCase()] || greetings.english; + + res.status(200).json({ + result: greeting, + language: selectedLanguage + }); + } catch (error) { + res.status(500).json({ error: 'Internal server error' }); + } +} +module.exports = handler; From ce81072e1fe113ea39b9549754a20094895452d1 Mon Sep 17 00:00:00 2001 From: James Stout Date: Thu, 17 Jul 2025 15:25:13 -0400 Subject: [PATCH 12/14] Create rick-roll.js --- api/tools/rick-roll.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 api/tools/rick-roll.js diff --git a/api/tools/rick-roll.js b/api/tools/rick-roll.js new file mode 100644 index 0000000..e2d01c3 --- /dev/null +++ b/api/tools/rick-roll.js @@ -0,0 +1,28 @@ +// api/tools/rick-roll.js +const handler = async (req, res) => { + if (req.method !== 'POST') { + return res.status(405).json({ error: 'Method not allowed' }); + } + + try { + const rickRollMessages = [ + "🎡 Never gonna give you up, never gonna let you down! 🎡", + "You've been Rick Rolled! πŸ•Ί", + "🎀 Never gonna run around and desert you! 🎀", + "Rick Astley strikes again! 🎸", + "🎡 We're no strangers to love... 🎡" + ]; + + const randomMessage = rickRollMessages[Math.floor(Math.random() * rickRollMessages.length)]; + const videoUrl = process.env.RICK_ROLL_VIDEO_URL || "https://www.youtube.com/watch?v=dQw4w9WgXcQ"; + + res.status(200).json({ + result: randomMessage, + video_url: videoUrl, + message: "You've been Rick Rolled! πŸŽ‰" + }); + } catch (error) { + res.status(500).json({ error: 'Internal server error' }); + } +} +module.exports = handler; From 787e686d513b6968e7430d218b402ce7d9b3b81c Mon Sep 17 00:00:00 2001 From: James Stout Date: Thu, 17 Jul 2025 15:25:33 -0400 Subject: [PATCH 13/14] Create todays-date.js --- api/tools/todays-date.js | 42 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 api/tools/todays-date.js diff --git a/api/tools/todays-date.js b/api/tools/todays-date.js new file mode 100644 index 0000000..09eca87 --- /dev/null +++ b/api/tools/todays-date.js @@ -0,0 +1,42 @@ +// api/tools/todays-date.js +const handler = async (req, res) => { + if (req.method !== 'POST') { + return res.status(405).json({ error: 'Method not allowed' }); + } + + const { format } = req.body; + + try { + const today = new Date(); + const defaultFormat = process.env.DEFAULT_DATE_FORMAT || 'iso'; + const requestedFormat = format || defaultFormat; + let formattedDate; + + switch (requestedFormat.toLowerCase()) { + case 'short': + formattedDate = today.toLocaleDateString(); + break; + case 'long': + formattedDate = today.toLocaleDateString('en-US', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric' + }); + break; + case 'time': + formattedDate = today.toLocaleString(); + break; + default: + formattedDate = today.toISOString().split('T')[0]; // ISO format (YYYY-MM-DD) + } + + res.status(200).json({ + result: formattedDate, + format: requestedFormat + }); + } catch (error) { + res.status(500).json({ error: 'Internal server error' }); + } +} +module.exports = handler; From 127548601c2d691b2f6c82a4a8af0f856110eec9 Mon Sep 17 00:00:00 2001 From: James Stout Date: Thu, 17 Jul 2025 15:32:45 -0400 Subject: [PATCH 14/14] Update discovery.js --- api/discovery.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api/discovery.js b/api/discovery.js index 18643b9..2c55d5a 100644 --- a/api/discovery.js +++ b/api/discovery.js @@ -23,7 +23,7 @@ const handler = async (req, res) => { required: false } ], - endpoint: `${baseUrl}/tools/greeting`, + endpoint: `/tools/greeting`, http_method: "POST" }, { @@ -37,14 +37,14 @@ const handler = async (req, res) => { required: false } ], - endpoint: `${baseUrl}/tools/todays-date`, + endpoint: `/tools/todays-date`, http_method: "POST" }, { name: "rick-roll", description: "Rick rolls the user", parameters: [], - endpoint: `${baseUrl}/tools/rick-roll`, + endpoint: `/tools/rick-roll`, http_method: "POST" } ];