Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| abc1cef7c2 | |||
| 766ff96137 | |||
| e22b3c82a2 | |||
| c9ce0d14b9 | |||
| ef2c1931d8 | |||
| d027459678 |
25
Dockerfile
25
Dockerfile
@@ -1,6 +1,10 @@
|
||||
# Build stage
|
||||
FROM node:24-alpine AS builder
|
||||
|
||||
# Accept build arguments for version info
|
||||
ARG VERSION=""
|
||||
ARG IS_RELEASE="false"
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
|
||||
@@ -16,8 +20,25 @@ COPY public/ ./public/
|
||||
COPY scripts/ ./scripts/
|
||||
COPY server.js ./server.js
|
||||
|
||||
# Build the application
|
||||
RUN npm run build
|
||||
# Generate version.js if version info provided, otherwise run normal build
|
||||
RUN if [ -n "$VERSION" ]; then \
|
||||
echo "// Auto-generated version file - do not edit manually" > src/version.js && \
|
||||
echo "// Generated at: $(date -Iseconds)" >> src/version.js && \
|
||||
echo "" >> src/version.js && \
|
||||
echo "export const VERSION = '$VERSION';" >> src/version.js && \
|
||||
echo "export const IS_RELEASE = $IS_RELEASE;" >> src/version.js && \
|
||||
echo "export const BUILD_TIME = '$(date -Iseconds)';" >> src/version.js && \
|
||||
echo "📝 Generated version.js with VERSION=$VERSION, IS_RELEASE=$IS_RELEASE"; \
|
||||
fi
|
||||
|
||||
# Build the application (skip prebuild if we already generated version.js)
|
||||
RUN if [ -n "$VERSION" ]; then \
|
||||
echo "🚀 Building with pre-generated version.js" && \
|
||||
npx react-scripts build; \
|
||||
else \
|
||||
echo "🚀 Building with version-check.js" && \
|
||||
npm run build; \
|
||||
fi
|
||||
|
||||
# Production stage
|
||||
FROM node:24-alpine AS production
|
||||
|
||||
41
bin/upload-jmespath
Executable file
41
bin/upload-jmespath
Executable file
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
API_URL="https://jmespath-playground.koszewscy.waw.pl"
|
||||
JSON_FILE="-"
|
||||
|
||||
function usage() {
|
||||
echo "Usage: $0 [--api-url <url>] [--json-file <file>]"
|
||||
exit 1
|
||||
}
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--api-url)
|
||||
API_URL="$2"
|
||||
shift 2
|
||||
;;
|
||||
--json-file)
|
||||
JSON_FILE="$2"
|
||||
shift 2
|
||||
;;
|
||||
-h|--help)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "ERROR: Unknown argument: $1"
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Send the POST request
|
||||
curl -s -X POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Accept: application/json" \
|
||||
--data @${JSON_FILE} \
|
||||
"$API_URL/api/v1/upload"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jmespath-playground",
|
||||
"version": "1.1.2",
|
||||
"version": "1.1.7",
|
||||
"description": "A React-based web application for testing JMESPath expressions against JSON data",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
|
||||
63
scripts/build-image.sh
Executable file
63
scripts/build-image.sh
Executable file
@@ -0,0 +1,63 @@
|
||||
#!/bin/bash
|
||||
|
||||
# JMESPath Testing Tool - Docker Image Build Script
|
||||
|
||||
set -e
|
||||
|
||||
echo "🐳 JMESPath Testing Tool - Docker Image Build"
|
||||
echo "=============================================="
|
||||
echo ""
|
||||
|
||||
# Check if Docker is available
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo "❌ Docker not found. Please install Docker to build container images."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Determine version information for Docker build
|
||||
VERSION=$(git tag --points-at HEAD 2>/dev/null | sed 's/^v//' | head -n 1)
|
||||
|
||||
if [ -n "$VERSION" ]; then
|
||||
# We're at a tagged commit - release build
|
||||
echo "📦 Building release version: $VERSION"
|
||||
docker build \
|
||||
--build-arg VERSION="$VERSION" \
|
||||
--build-arg IS_RELEASE="true" \
|
||||
-t skoszewski/jmespath-playground:$VERSION \
|
||||
-t skoszewski/jmespath-playground:latest .
|
||||
echo "✅ Built Docker images: skoszewski/jmespath-playground:$VERSION, skoszewski/jmespath-playground:latest"
|
||||
|
||||
echo ""
|
||||
echo "To run the release container:"
|
||||
echo " docker run -p 3000:3000 skoszewski/jmespath-playground:$VERSION"
|
||||
echo " docker run -p 3000:3000 skoszewski/jmespath-playground:latest"
|
||||
|
||||
echo ""
|
||||
echo "To push to Docker Hub:"
|
||||
echo " docker push skoszewski/jmespath-playground:$VERSION"
|
||||
echo " docker push skoszewski/jmespath-playground:latest"
|
||||
else
|
||||
# Development build
|
||||
PACKAGE_VERSION=$(grep '"version"' package.json | cut -d'"' -f4)
|
||||
DEV_VERSION="${PACKAGE_VERSION}-dev"
|
||||
echo "📦 Building development version: $DEV_VERSION"
|
||||
docker build \
|
||||
--build-arg VERSION="$DEV_VERSION" \
|
||||
--build-arg IS_RELEASE="false" \
|
||||
-t skoszewski/jmespath-playground:dev \
|
||||
-t skoszewski/jmespath-playground:latest .
|
||||
echo "✅ Built Docker images: skoszewski/jmespath-playground:dev, skoszewski/jmespath-playground:latest"
|
||||
|
||||
echo ""
|
||||
echo "To run the development container:"
|
||||
echo " docker run -p 3000:3000 skoszewski/jmespath-playground:dev"
|
||||
echo " docker run -p 3000:3000 skoszewski/jmespath-playground:latest"
|
||||
|
||||
echo ""
|
||||
echo "To push to Docker Hub:"
|
||||
echo " docker push skoszewski/jmespath-playground:dev"
|
||||
echo " docker push skoszewski/jmespath-playground:latest"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "🎉 Docker image build completed successfully!"
|
||||
@@ -30,20 +30,10 @@ npm install
|
||||
echo "🔨 Building production bundle..."
|
||||
npm run build
|
||||
|
||||
# Optional container build with Docker
|
||||
if command -v docker &> /dev/null; then
|
||||
echo "🐳 Building Docker container (optional)..."
|
||||
docker build -t jmespath-playground .
|
||||
else
|
||||
echo "💡 Docker not found. Container build is optional."
|
||||
echo " Install Docker if you want to build containers."
|
||||
fi
|
||||
|
||||
echo "✅ Build completed successfully!"
|
||||
echo ""
|
||||
echo "To run the application:"
|
||||
echo " npm run serve # Serve production build locally"
|
||||
echo " docker run -p 3000:3000 jmespath-playground # Run container (if built)"
|
||||
if command -v docker &> /dev/null; then
|
||||
echo " docker run -p 3000:3000 jmespath-playground # Run with Docker"
|
||||
fi
|
||||
echo " npm run server # Run integrated server locally"
|
||||
echo ""
|
||||
echo "To build Docker image:"
|
||||
echo " scripts/build-image.sh # Build Docker container image"
|
||||
@@ -4,7 +4,7 @@ const fs = require('fs');
|
||||
const { execSync } = require('child_process');
|
||||
|
||||
function showUsage() {
|
||||
console.log('Usage: node scripts/new-version.js <version> [--force]');
|
||||
console.log('Usage: node scripts/new-version.js <version> [--force] [-m|--message "commit message"]');
|
||||
console.log(' node scripts/new-version.js --check <version>');
|
||||
console.log('');
|
||||
console.log('Creates a new version by tagging the current commit.');
|
||||
@@ -12,10 +12,12 @@ function showUsage() {
|
||||
console.log('Options:');
|
||||
console.log(' --force Force version creation even with dirty repo or package.json mismatch');
|
||||
console.log(' --check Analyze repository status and report what would happen for specified version');
|
||||
console.log(' -m, --message TEXT Custom commit message (only used when commit is needed)');
|
||||
console.log('');
|
||||
console.log('Example:');
|
||||
console.log(' node scripts/new-version.js 1.2.0');
|
||||
console.log(' node scripts/new-version.js 1.2.0 --force');
|
||||
console.log(' node scripts/new-version.js 1.2.0 -m "Add new feature XYZ"');
|
||||
console.log(' node scripts/new-version.js --check 1.3.0');
|
||||
}
|
||||
|
||||
@@ -178,10 +180,17 @@ function main() {
|
||||
const isCheck = args.includes('--check');
|
||||
const isForce = args.includes('--force');
|
||||
|
||||
// Parse custom commit message
|
||||
let customMessage = null;
|
||||
const messageIndex = args.findIndex(arg => arg === '-m' || arg === '--message');
|
||||
if (messageIndex !== -1 && messageIndex + 1 < args.length) {
|
||||
customMessage = args[messageIndex + 1];
|
||||
}
|
||||
|
||||
let newVersion;
|
||||
if (isCheck) {
|
||||
// For --check, version is required
|
||||
newVersion = args.find(arg => !arg.startsWith('--'));
|
||||
newVersion = args.find(arg => !arg.startsWith('--') && arg !== '-m' && arg !== customMessage);
|
||||
if (!newVersion) {
|
||||
console.error('Error: Version argument required for --check');
|
||||
showUsage();
|
||||
@@ -189,11 +198,8 @@ function main() {
|
||||
}
|
||||
} else {
|
||||
// For normal operation, version is required
|
||||
newVersion = args[0];
|
||||
if (!newVersion || newVersion.startsWith('-')) {
|
||||
console.error('Error: Version argument required');
|
||||
showUsage();
|
||||
process.exit(1);
|
||||
newVersion = args.find(arg => !arg.startsWith('--') && arg !== '-m' && arg !== customMessage);
|
||||
if (!newVersion) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -268,7 +274,7 @@ function main() {
|
||||
execSync('git add .', { stdio: 'inherit' });
|
||||
|
||||
// Commit
|
||||
const commitMessage = needsPackageUpdate ? `Version ${newVersion}` : `Prepare for version ${newVersion}`;
|
||||
const commitMessage = customMessage || (needsPackageUpdate ? `Version ${newVersion}` : `Prepare for version ${newVersion}`);
|
||||
execSync(`git commit -m "${commitMessage}"`, { stdio: 'inherit' });
|
||||
console.log(`✅ Committed changes`);
|
||||
} else {
|
||||
|
||||
@@ -51,7 +51,13 @@ function createApp() {
|
||||
|
||||
app.get('/api/v1/sample', (req, res) => {
|
||||
try {
|
||||
res.json(sampleData);
|
||||
const dataToReturn = sampleData;
|
||||
|
||||
// Security: Clear the sample data after it's retrieved (one-time use)
|
||||
sampleData = null;
|
||||
console.log('📤 Sample data retrieved and cleared from server memory');
|
||||
|
||||
res.json(dataToReturn);
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: 'Failed to retrieve sample data' });
|
||||
}
|
||||
|
||||
24
src/App.js
24
src/App.js
@@ -54,22 +54,30 @@ function App() {
|
||||
localStorage.setItem('theme', theme);
|
||||
}, [theme]);
|
||||
|
||||
// API polling for state changes
|
||||
// API polling for state changes and initial sample data load
|
||||
useEffect(() => {
|
||||
// Initial state load
|
||||
const loadInitialState = async () => {
|
||||
// Initial load: get both state and sample data
|
||||
const loadInitialData = async () => {
|
||||
try {
|
||||
const response = await fetch('/api/v1/state');
|
||||
if (response.ok) {
|
||||
const data = await response.json();
|
||||
setCurrentStateGuid(data.state);
|
||||
// Load sample data first
|
||||
const sampleResponse = await fetch('/api/v1/sample');
|
||||
if (sampleResponse.ok) {
|
||||
const sampleData = await sampleResponse.json();
|
||||
setJsonData(JSON.stringify(sampleData, null, 2));
|
||||
}
|
||||
|
||||
// Then load state GUID
|
||||
const stateResponse = await fetch('/api/v1/state');
|
||||
if (stateResponse.ok) {
|
||||
const stateData = await stateResponse.json();
|
||||
setCurrentStateGuid(stateData.state);
|
||||
}
|
||||
} catch (error) {
|
||||
console.debug('API not available:', error);
|
||||
}
|
||||
};
|
||||
|
||||
loadInitialState();
|
||||
loadInitialData();
|
||||
|
||||
// Poll for state changes every 3 seconds
|
||||
const interval = setInterval(async () => {
|
||||
|
||||
Reference in New Issue
Block a user