From 26fd512b66588b5c05209dfc1d36e78774d81acb Mon Sep 17 00:00:00 2001 From: grego952 Date: Wed, 5 Nov 2025 13:35:22 +0100 Subject: [PATCH 01/11] Provide a CAP bookstore sample --- cap-bookstore/app/index.html | 700 +++++++++++++++++++++++++++ cap-bookstore/docker/Dockerfile | 47 ++ cap-bookstore/init-db.js | 229 +++++++++ cap-bookstore/k8s/apirule.yaml | 19 + cap-bookstore/k8s/configmap.yaml | 8 + cap-bookstore/k8s/deployment.yaml | 91 ++++ cap-bookstore/k8s/service.yaml | 16 + cap-bookstore/lib/postgres-config.js | 17 + cap-bookstore/package.json | 42 ++ cap-bookstore/server.js | 227 +++++++++ cap-bookstore/start-postgres.sh | 35 ++ 11 files changed, 1431 insertions(+) create mode 100644 cap-bookstore/app/index.html create mode 100644 cap-bookstore/docker/Dockerfile create mode 100644 cap-bookstore/init-db.js create mode 100644 cap-bookstore/k8s/apirule.yaml create mode 100644 cap-bookstore/k8s/configmap.yaml create mode 100644 cap-bookstore/k8s/deployment.yaml create mode 100644 cap-bookstore/k8s/service.yaml create mode 100644 cap-bookstore/lib/postgres-config.js create mode 100644 cap-bookstore/package.json create mode 100644 cap-bookstore/server.js create mode 100755 cap-bookstore/start-postgres.sh diff --git a/cap-bookstore/app/index.html b/cap-bookstore/app/index.html new file mode 100644 index 00000000..8368d9d2 --- /dev/null +++ b/cap-bookstore/app/index.html @@ -0,0 +1,700 @@ + + + + + + 📚 CAP Bookstore - PostgreSQL + Kyma Demo + + + +
+
+

📚 CAP Bookstore

+

PostgreSQL + Kyma Runtime Integration Demo

+
+ +
+

đŸŽ¯ PostgreSQL Connectivity Test

+

This demo shows SAP CAP application running in Kyma with PostgreSQL BTP service.

+ + + +
+ + +
+ +
+ + +
+ + + + +
+
+
+

📚 Books Library

+ +
+
+
+ + +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/cap-bookstore/docker/Dockerfile b/cap-bookstore/docker/Dockerfile new file mode 100644 index 00000000..b2201674 --- /dev/null +++ b/cap-bookstore/docker/Dockerfile @@ -0,0 +1,47 @@ +# Multi-stage build for CAP application +FROM node:20-alpine AS builder + +# Set working directory +WORKDIR /app + +# Copy package files +COPY package*.json ./ + +# Install dependencies +RUN npm ci --only=production + +FROM node:20-alpine AS runtime + +# Install system dependencies +RUN apk add --no-cache dumb-init postgresql-client + +# Install @sap/cds-dk globally for production deployment +RUN npm install -g @sap/cds-dk + +# Create app user +RUN addgroup -g 1001 -S nodejs && \ + adduser -S -u 1001 -G nodejs nodejs + +# Set working directory +WORKDIR /app + +# Copy built application +COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules +COPY --chown=nodejs:nodejs . . + +# Remove unnecessary files +RUN rm -rf .git .vscode *.md + +# Switch to non-root user +USER nodejs + +# Expose port +EXPOSE 4004 + +# Health check +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD node -e "require('http').get('http://localhost:4004', (res) => { process.exit(res.statusCode === 200 ? 0 : 1) })" + +# Start application +ENTRYPOINT ["dumb-init", "--"] +CMD ["./start-postgres.sh"] \ No newline at end of file diff --git a/cap-bookstore/init-db.js b/cap-bookstore/init-db.js new file mode 100644 index 00000000..2d77f053 --- /dev/null +++ b/cap-bookstore/init-db.js @@ -0,0 +1,229 @@ +const cds = require('@sap/cds'); +const { Client } = require('pg'); +const fs = require('fs'); +const path = require('path'); +const { getPostgresConfig } = require('./lib/postgres-config'); + +// Helper function to parse CSV files +function parseCSV(filePath) { + try { + const content = fs.readFileSync(filePath, 'utf8'); + const lines = content.trim().split('\n'); + const headers = lines[0].split(','); + + return lines.slice(1).map(line => { + const values = line.split(','); + const row = {}; + headers.forEach((header, index) => { + let value = values[index]; + + // Handle quoted values and remove quotes + if (value.startsWith('"') && value.endsWith('"')) { + value = value.slice(1, -1); + } + + // Convert empty strings to null + if (value === '') { + value = null; + } + + row[header] = value; + }); + return row; + }); + } catch (error) { + console.warn(`âš ī¸ Could not read CSV file ${filePath}:`, error.message); + return []; + } +} + +async function initializeDatabase() { + try { + console.log('🚀 Starting PostgreSQL database initialization...'); + + // Direct PostgreSQL connection for initial setup + const client = new Client(getPostgresConfig()); + + await client.connect(); + console.log('✅ Connected to PostgreSQL'); + + // Check if tables already exist + const tableCheck = await client.query(` + SELECT table_name + FROM information_schema.tables + WHERE table_schema = 'public' + AND table_name LIKE 'sap_%' + `); + + if (tableCheck.rows.length > 0) { + console.log('â„šī¸ Database already initialized, checking schema migration...'); + + // Check if old schema exists and needs migration + const oldAuthorColumn = await client.query(` + SELECT column_name + FROM information_schema.columns + WHERE table_name = 'sap_capire_bookstore_authors' + AND column_name = 'birth_date' + `); + + const oldBookColumn = await client.query(` + SELECT column_name + FROM information_schema.columns + WHERE table_name = 'sap_capire_bookstore_books' + AND column_name = 'author' + `); + + if (oldAuthorColumn.rows.length > 0 || oldBookColumn.rows.length > 0) { + console.log('🔄 Migrating old schema to new schema...'); + + // Drop old tables to recreate with new structure + await client.query('DROP TABLE IF EXISTS sap_capire_bookstore_books CASCADE'); + await client.query('DROP TABLE IF EXISTS sap_capire_bookstore_authors CASCADE'); + + console.log('đŸ—ī¸ Creating new database schema...'); + await createTables(); + } else { + console.log('✅ Schema is up to date'); + } + } else { + console.log('đŸ—ī¸ Creating database schema...'); + await createTables(); + } + + async function createTables() { + + // Create Authors table first (referenced by Books) + await client.query(` + CREATE TABLE IF NOT EXISTS sap_capire_bookstore_authors ( + id VARCHAR(36) PRIMARY KEY, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + created_by VARCHAR(255), + modified_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + modified_by VARCHAR(255), + name VARCHAR(255), + date_of_birth DATE, + nationality VARCHAR(255), + biography TEXT + ) + `); + + // Create Books table + await client.query(` + CREATE TABLE IF NOT EXISTS sap_capire_bookstore_books ( + id VARCHAR(36) PRIMARY KEY, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + created_by VARCHAR(255), + modified_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + modified_by VARCHAR(255), + title VARCHAR(255), + author_id VARCHAR(36), + genre VARCHAR(255), + price DECIMAL(10, 2), + currency_code VARCHAR(3) DEFAULT 'USD', + stock INTEGER DEFAULT 0, + description TEXT, + publisher VARCHAR(255), + published_at DATE, + isbn VARCHAR(13), + FOREIGN KEY (author_id) REFERENCES sap_capire_bookstore_authors(id) + ) + `); + + // Create Currencies table + await client.query(` + CREATE TABLE IF NOT EXISTS sap_common_currencies ( + code VARCHAR(3) PRIMARY KEY, + symbol VARCHAR(5), + minor_unit INTEGER, + name VARCHAR(255), + descr VARCHAR(255) + ) + `); + + console.log('✅ Database schema created'); + } + + // Load sample data from CSV files + console.log('📊 Loading sample data from CSV files...'); + + // Load currencies from CSV + const currenciesPath = path.join(__dirname, 'db/data/sap.common-Currencies.csv'); + const currenciesData = parseCSV(currenciesPath); + + console.log(`💰 Found ${currenciesData.length} currencies in CSV`); + for (const currency of currenciesData) { + await client.query(` + INSERT INTO sap_common_currencies (code, symbol, minor_unit, name, descr) + VALUES ($1, $2, $3, $4, $5) + ON CONFLICT (code) DO NOTHING + `, [currency.code, currency.symbol, parseInt(currency.minorUnit), currency.name, currency.descr]); + } + + // Load authors from CSV first (due to foreign key constraint) + const authorsPath = path.join(__dirname, 'db/data/sap.capire.bookstore-Authors.csv'); + const authorsData = parseCSV(authorsPath); + + console.log(`âœī¸ Found ${authorsData.length} authors in CSV`); + for (const author of authorsData) { + await client.query(` + INSERT INTO sap_capire_bookstore_authors + (id, name, date_of_birth, nationality, biography, created_by) + VALUES ($1, $2, $3, $4, $5, $6) + ON CONFLICT (id) DO NOTHING + `, [ + author.ID, + author.name, + author.dateOfBirth, + author.nationality, + author.biography, + author.createdBy || 'system' + ]); + } + + // Load books from CSV + const booksPath = path.join(__dirname, 'db/data/sap.capire.bookstore-Books.csv'); + const booksData = parseCSV(booksPath); + + console.log(`📚 Found ${booksData.length} books in CSV`); + for (const book of booksData) { + await client.query(` + INSERT INTO sap_capire_bookstore_books + (id, title, author_id, genre, price, currency_code, stock, description, publisher, published_at, isbn, created_by) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) + ON CONFLICT (id) DO NOTHING + `, [ + book.ID, + book.title, + book.author_ID, + book.genre, + parseFloat(book.price), + book.currency_code, + parseInt(book.stock), + book.description, + book.publisher, + book.publishedAt, + book.isbn, + book.createdBy || 'system' + ]); + } + + await client.end(); + + // Test CDS connection + console.log('īŋŊ Testing CDS connection...'); + const db = await cds.connect.to('db'); + const bookCount = await db.run('SELECT COUNT(*) as count FROM sap_capire_bookstore_books'); + console.log(`✅ Database initialization completed! Found ${bookCount[0].count} books.`); + await db.disconnect(); + + console.log('🎉 Database ready!'); + process.exit(0); + + } catch (error) { + console.error('❌ Database initialization failed:', error.message); + process.exit(1); + } +} + +// Run initialization +initializeDatabase(); \ No newline at end of file diff --git a/cap-bookstore/k8s/apirule.yaml b/cap-bookstore/k8s/apirule.yaml new file mode 100644 index 00000000..b53d20e8 --- /dev/null +++ b/cap-bookstore/k8s/apirule.yaml @@ -0,0 +1,19 @@ +apiVersion: gateway.kyma-project.io/v2 +kind: APIRule +metadata: + name: bookstore-api + namespace: cap-bookstore + labels: + app: bookstore +spec: + hosts: + - {YOUR_HOSTNAME} + service: + name: bookstore-service + namespace: cap-bookstore + port: 80 + gateway: kyma-system/kyma-gateway + rules: + - path: /{**} + methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"] + noAuth: true \ No newline at end of file diff --git a/cap-bookstore/k8s/configmap.yaml b/cap-bookstore/k8s/configmap.yaml new file mode 100644 index 00000000..7f9817e0 --- /dev/null +++ b/cap-bookstore/k8s/configmap.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: bookstore-postgres-config + namespace: cap-bookstore +data: + CDS_REQUIRES_KIND: "postgres" + NODE_ENV: "production" \ No newline at end of file diff --git a/cap-bookstore/k8s/deployment.yaml b/cap-bookstore/k8s/deployment.yaml new file mode 100644 index 00000000..da8b0ab6 --- /dev/null +++ b/cap-bookstore/k8s/deployment.yaml @@ -0,0 +1,91 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: bookstore-deployment + namespace: cap-bookstore + labels: + app: bookstore +spec: + replicas: 1 + selector: + matchLabels: + app: bookstore + template: + metadata: + labels: + app: bookstore + annotations: + sidecar.istio.io/inject: "true" + spec: + containers: + - name: bookstore + image: {YOUR_IMAGE} + ports: + - containerPort: 4004 + env: + - name: NODE_ENV + valueFrom: + configMapKeyRef: + name: bookstore-postgres-config + key: NODE_ENV + - name: CDS_REQUIRES_KIND + valueFrom: + configMapKeyRef: + name: bookstore-postgres-config + key: CDS_REQUIRES_KIND + - name: POSTGRES_HOST + valueFrom: + secretKeyRef: + name: postgres-binding + key: hostname + - name: POSTGRES_PORT + valueFrom: + secretKeyRef: + name: postgres-binding + key: port + - name: POSTGRES_USER + valueFrom: + secretKeyRef: + name: postgres-binding + key: username + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: postgres-binding + key: password + - name: POSTGRES_DB + valueFrom: + secretKeyRef: + name: postgres-binding + key: dbname + - name: POSTGRES_URI + valueFrom: + secretKeyRef: + name: postgres-binding + key: uri + - name: CDS_REQUIRES + value: '{"db":{"kind":"postgres","credentials":{"url":"$(POSTGRES_URI)?sslmode=require","ssl":{"rejectUnauthorized":false}}}}' + resources: + limits: + memory: "512Mi" + cpu: "500m" + requests: + memory: "256Mi" + cpu: "250m" + livenessProbe: + httpGet: + path: /odata/v4/catalog/$metadata + port: 4004 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /odata/v4/catalog/$metadata + port: 4004 + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 + restartPolicy: Always \ No newline at end of file diff --git a/cap-bookstore/k8s/service.yaml b/cap-bookstore/k8s/service.yaml new file mode 100644 index 00000000..41b4c130 --- /dev/null +++ b/cap-bookstore/k8s/service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: bookstore-service + namespace: cap-bookstore + labels: + app: bookstore +spec: + selector: + app: bookstore + ports: + - name: http + port: 80 + targetPort: 4004 + protocol: TCP + type: ClusterIP \ No newline at end of file diff --git a/cap-bookstore/lib/postgres-config.js b/cap-bookstore/lib/postgres-config.js new file mode 100644 index 00000000..d73dee8d --- /dev/null +++ b/cap-bookstore/lib/postgres-config.js @@ -0,0 +1,17 @@ +/** + * Centralized PostgreSQL configuration + * Reusable across server.js, init-db.js and other modules + */ + +function getPostgresConfig() { + return { + host: process.env.POSTGRES_HOST || 'localhost', + port: parseInt(process.env.POSTGRES_PORT) || 5432, + database: process.env.POSTGRES_DB || 'capdb', + user: process.env.POSTGRES_USER || 'capuser', + password: process.env.POSTGRES_PASSWORD || '', + ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false + }; +} + +module.exports = { getPostgresConfig }; \ No newline at end of file diff --git a/cap-bookstore/package.json b/cap-bookstore/package.json new file mode 100644 index 00000000..5d62231e --- /dev/null +++ b/cap-bookstore/package.json @@ -0,0 +1,42 @@ +{ + "name": "bookstore", + "version": "1.0.0", + "description": "A simple CAP project.", + "dependencies": { + "@cap-js/postgres": "^2", + "@sap/cds": "^9", + "express": "^4" + }, + "devDependencies": {}, + "scripts": { + "start": "cds-serve", + "build": "cds build", + "deploy": "cds deploy" + }, + "private": true, + "cds": { + "requires": { + "db": { + "kind": "postgres", + "pool": { + "acquireTimeoutMillis": 60000, + "createTimeoutMillis": 60000, + "destroyTimeoutMillis": 10000, + "idleTimeoutMillis": 60000, + "reapIntervalMillis": 5000, + "createRetryIntervalMillis": 1000, + "max": 5, + "min": 1 + } + }, + "auth": { + "kind": "mocked" + } + }, + "migrations": { + "deploy": { + "tmpFile": false + } + } + } +} diff --git a/cap-bookstore/server.js b/cap-bookstore/server.js new file mode 100644 index 00000000..b6109f2d --- /dev/null +++ b/cap-bookstore/server.js @@ -0,0 +1,227 @@ +const cds = require('@sap/cds'); +const { Client } = require('pg'); +const { getPostgresConfig } = require('./lib/postgres-config'); + +// Add a custom endpoint to demonstrate PostgreSQL connectivity +cds.on('served', () => { + const app = cds.app; + const path = require('path'); + + // Add JSON parsing middleware for custom endpoints + app.use('/api', require('express').json()); + + // Serve static frontend + app.use('/app', require('express').static(path.join(__dirname, 'app'))); + + // Redirect root to app + app.get('/', (req, res) => { + res.redirect('/app'); + }); + + // Custom endpoint that bypasses CAP ORM and uses direct PostgreSQL + app.get('/api/test-postgres', async (req, res) => { + const client = new Client(getPostgresConfig()); + + try { + await client.connect(); + console.log('✅ Direct PostgreSQL connection successful'); + + const result = await client.query(` + SELECT + b.title, + a.name as author, + b.price, + b.currency_code + FROM sap_capire_bookstore_books b + LEFT JOIN sap_capire_bookstore_authors a ON b.author_id = a.id + LIMIT 3 + `); + + await client.end(); + + res.json({ + success: true, + message: "đŸŽ¯ PostgreSQL + Kyma Integration Working!", + books: result.rows, + connection_info: { + host: process.env.POSTGRES_HOST || 'localhost', + database: process.env.POSTGRES_DB || 'capdb', + ssl_mode: process.env.NODE_ENV === 'production' ? "required" : "disabled" + } + }); + + } catch (error) { + if (client) await client.end(); + console.error('❌ PostgreSQL connection failed:', error.message); + res.status(500).json({ + success: false, + error: error.message + }); + } + }); + + // Custom endpoint to get all books (bypassing CAP timeout issues) + app.get('/api/books', async (req, res) => { + const client = new Client(getPostgresConfig()); + + try { + await client.connect(); + + const result = await client.query(` + SELECT + b.id, + b.title, + a.name as author, + b.price, + b.currency_code, + b.genre, + b.stock, + b.description, + b.publisher, + b.published_at, + b.isbn, + b.created_at + FROM sap_capire_bookstore_books b + LEFT JOIN sap_capire_bookstore_authors a ON b.author_id = a.id + ORDER BY b.created_at DESC + `); + + await client.end(); + + res.json({ + success: true, + books: result.rows + }); + } catch (error) { + console.error('❌ Database query error:', error); + res.status(500).json({ + success: false, + error: error.message + }); + } + }); + + // Custom endpoint to get authors (bypassing CAP timeout issues) + app.get('/api/authors', async (req, res) => { + const client = new Client(getPostgresConfig()); + + try { + await client.connect(); + + const result = await client.query(` + SELECT id, name, date_of_birth, nationality, biography, created_at + FROM sap_capire_bookstore_authors + ORDER BY name + `); + + await client.end(); + + res.json({ + success: true, + authors: result.rows + }); + + } catch (error) { + if (client) await client.end(); + console.error('❌ Failed to load authors:', error.message); + res.status(500).json({ + success: false, + error: error.message + }); + } + }); + + // Custom endpoint to add authors (bypassing CAP timeout issues) + app.post('/api/authors', async (req, res) => { + const client = new Client(getPostgresConfig()); try { + await client.connect(); + + const { name, biography, dateOfBirth } = req.body; + const authorId = require('crypto').randomUUID(); + + const result = await client.query(` + INSERT INTO sap_capire_bookstore_authors + (id, name, date_of_birth, biography, created_by, created_at, modified_at) + VALUES ($1, $2, $3, $4, $5, $6, $7) + RETURNING * + `, [ + authorId, + name, + dateOfBirth || null, + biography || null, + 'user', + new Date(), + new Date() + ]); + + await client.end(); + + res.json({ + success: true, + message: "✅ Author added successfully!", + author: result.rows[0] + }); + + } catch (error) { + if (client) await client.end(); + console.error('❌ Failed to add author:', error.message); + res.status(500).json({ + success: false, + error: error.message + }); + } + }); + + // Custom endpoint to add books (bypassing CAP timeout issues) + app.post('/api/books', async (req, res) => { + const client = new Client(getPostgresConfig()); + + try { + await client.connect(); + + const { title, author_ID, genre, price, currency_code, stock, description, publisher, isbn, publishedAt } = req.body; + const bookId = require('crypto').randomUUID(); + + const result = await client.query(` + INSERT INTO sap_capire_bookstore_books + (id, title, author_id, genre, price, currency_code, stock, description, publisher, published_at, isbn, created_by, created_at, modified_at) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14) + RETURNING * + `, [ + bookId, + title, + author_ID, + genre, + parseFloat(price), + currency_code || 'USD', + parseInt(stock) || 0, + description || null, + publisher || null, + publishedAt || new Date(), + isbn || null, + 'user', + new Date(), + new Date() + ]); + + await client.end(); + + res.json({ + success: true, + message: "✅ Book added successfully!", + book: result.rows[0] + }); + + } catch (error) { + if (client) await client.end(); + console.error('❌ Failed to add book:', error.message); + res.status(500).json({ + success: false, + error: error.message + }); + } + }); +}); + +// Start the CAP server +module.exports = cds.server; \ No newline at end of file diff --git a/cap-bookstore/start-postgres.sh b/cap-bookstore/start-postgres.sh new file mode 100755 index 00000000..1eabd955 --- /dev/null +++ b/cap-bookstore/start-postgres.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +echo "Starting CAP application with PostgreSQL..." + +# Check if database connection variables are set +if [ -z "$POSTGRES_HOST" ] || [ -z "$POSTGRES_USER" ] || [ -z "$POSTGRES_PASSWORD" ] || [ -z "$POSTGRES_DB" ]; then + echo "Error: Missing PostgreSQL connection variables" + echo "Required: POSTGRES_HOST, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB" + exit 1 +fi + +echo "PostgreSQL connection details:" +echo "Host: $POSTGRES_HOST" +echo "Port: $POSTGRES_PORT" +echo "Database: $POSTGRES_DB" +echo "User: $POSTGRES_USER" + +# Build PostgreSQL URI with SSL parameters - use require mode for BTP +POSTGRES_URI_WITH_SSL="${POSTGRES_URI}?sslmode=require" + +# Build CDS_REQUIRES with SSL-enabled URI and very relaxed timeouts for BTP free tier +export CDS_REQUIRES="{\"db\":{\"kind\":\"postgres\",\"credentials\":{\"url\":\"$POSTGRES_URI_WITH_SSL\"},\"pool\":{\"acquireTimeoutMillis\":30000,\"createTimeoutMillis\":30000,\"destroyTimeoutMillis\":10000,\"idleTimeoutMillis\":30000,\"reapIntervalMillis\":5000,\"createRetryIntervalMillis\":1000,\"max\":2,\"min\":0}}}" + +echo "CDS_REQUIRES: $CDS_REQUIRES" + +# Deploy database schema and data using dedicated script +echo "Attempting to deploy database schema and data..." +echo "Using PostgreSQL initialization script..." + +# Run dedicated database initialization script +node init-db.js || echo "❌ Schema deployment failed, but continuing..." + +# Start the CAP application +echo "Starting CAP application..." +exec npm start \ No newline at end of file From e9c287447bcd0e3360c877baaa5fd3092e196b31 Mon Sep 17 00:00:00 2001 From: grego952 Date: Fri, 14 Nov 2025 10:32:55 +0100 Subject: [PATCH 02/11] Add package-lock.json --- cap-bookstore/package-lock.json | 1107 +++++++++++++++++++++++++++++++ 1 file changed, 1107 insertions(+) create mode 100644 cap-bookstore/package-lock.json diff --git a/cap-bookstore/package-lock.json b/cap-bookstore/package-lock.json new file mode 100644 index 00000000..8dc02cfa --- /dev/null +++ b/cap-bookstore/package-lock.json @@ -0,0 +1,1107 @@ +{ + "name": "bookstore", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "bookstore", + "version": "1.0.0", + "dependencies": { + "@cap-js/postgres": "^2", + "@sap/cds": "^9", + "express": "^4" + }, + "devDependencies": {} + }, + "node_modules/@cap-js/db-service": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@cap-js/db-service/-/db-service-2.6.0.tgz", + "integrity": "sha512-t72/FcAYFbPdx+5iV+lVKcwF2MLOx8II3jJdlC1dX/KXQORoS3wDFwWbakP0f/eharE5hfa7KMFJqrSMtDigbQ==", + "license": "Apache-2.0", + "dependencies": { + "generic-pool": "^3.9.0" + }, + "peerDependencies": { + "@sap/cds": ">=9" + } + }, + "node_modules/@cap-js/postgres": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@cap-js/postgres/-/postgres-2.0.6.tgz", + "integrity": "sha512-KTZJ91778j7Ao2AEqKA2QHxPGaW19WuNtKqQqqgbMw8IMBIRx2NqUcBpcrm7VS88AEmTIyWfLVPcECcdyZka+w==", + "license": "Apache-2.0", + "dependencies": { + "@cap-js/db-service": "^2.6.0", + "pg": "^8" + }, + "peerDependencies": { + "@sap/cds": ">=9", + "@sap/cds-dk": ">=9" + }, + "peerDependenciesMeta": { + "@sap/cds-dk": { + "optional": true + } + } + }, + "node_modules/@eslint/js": { + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@sap/cds": { + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@sap/cds/-/cds-9.4.4.tgz", + "integrity": "sha512-JJCHeEJF4xzFyZSf2ToocvVE9dyHfNLTRXOauOxlmpfyaLg97G7Qp+L4bD132eB0onBG9bQj3eH8DzBm0hVvIw==", + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "@sap/cds-compiler": "^6.3", + "@sap/cds-fiori": "^2", + "js-yaml": "^4.1.0" + }, + "bin": { + "cds-deploy": "bin/deploy.js", + "cds-serve": "bin/serve.js" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@eslint/js": "^9", + "express": "^4", + "tar": "^7" + }, + "peerDependenciesMeta": { + "express": { + "optional": true + }, + "tar": { + "optional": true + } + } + }, + "node_modules/@sap/cds-compiler": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/@sap/cds-compiler/-/cds-compiler-6.4.6.tgz", + "integrity": "sha512-auAjRh9t0KKj4LiGAr/fxikZRIngx9YXVHTJWf0LeaGv0ZpYOi6iWbSnU1XRB2e6hsf+Ou1w5oTOHooC5sZfog==", + "license": "SEE LICENSE IN LICENSE", + "bin": { + "cdsc": "bin/cdsc.js", + "cdshi": "bin/cdshi.js", + "cdsse": "bin/cdsse.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@sap/cds-fiori": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sap/cds-fiori/-/cds-fiori-2.1.1.tgz", + "integrity": "sha512-X+4v4LBAT8HIt0zr28/kJNS15nlNlcM97vAMW+agLrmK134nyBiMwUMcp8BMhxlG9B2PykrnAKH56D9O3tfoBg==", + "license": "SEE LICENSE IN LICENSE", + "peerDependencies": { + "@sap/cds": ">=8", + "express": "^4" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/pg": { + "version": "8.16.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", + "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.9.1", + "pg-pool": "^3.10.1", + "pg-protocol": "^1.10.3", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.2.7" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", + "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", + "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", + "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", + "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + } + } +} From f1b4f24504222eca12346c97d615446acf7c89f3 Mon Sep 17 00:00:00 2001 From: grego952 Date: Fri, 14 Nov 2025 10:39:11 +0100 Subject: [PATCH 03/11] Rename script --- cap-bookstore/docker/Dockerfile | 2 +- cap-bookstore/{start-postgres.sh => start-app.sh} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename cap-bookstore/{start-postgres.sh => start-app.sh} (100%) diff --git a/cap-bookstore/docker/Dockerfile b/cap-bookstore/docker/Dockerfile index b2201674..ad90da3e 100644 --- a/cap-bookstore/docker/Dockerfile +++ b/cap-bookstore/docker/Dockerfile @@ -44,4 +44,4 @@ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ # Start application ENTRYPOINT ["dumb-init", "--"] -CMD ["./start-postgres.sh"] \ No newline at end of file +CMD ["./start-app.sh"] \ No newline at end of file diff --git a/cap-bookstore/start-postgres.sh b/cap-bookstore/start-app.sh similarity index 100% rename from cap-bookstore/start-postgres.sh rename to cap-bookstore/start-app.sh From e438593c4acc5bf385a80b11045664650439b288 Mon Sep 17 00:00:00 2001 From: grego952 Date: Fri, 14 Nov 2025 11:15:24 +0100 Subject: [PATCH 04/11] Fix links --- cdc-extension/README.md | 6 +++--- cdp-extension/README.md | 6 +++--- data-backup-and-restore/README.md | 2 +- dsagtt22/tutorial/step6.md | 2 +- sample-extension-dotnet/README.md | 2 +- sample-extension-java/README.md | 2 +- sample-extension-scala/README.md | 2 +- sentiment-analysis/lambdas/README.md | 2 +- .../lambdas/customer-review-webhook/README.md | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/cdc-extension/README.md b/cdc-extension/README.md index 6949b91e..672eaa7c 100644 --- a/cdc-extension/README.md +++ b/cdc-extension/README.md @@ -4,7 +4,7 @@ This example includes a **Kyma serverless function**, *cdc-extension*, that is exposed as a **SAP Customer Data Cloud extension endpoint**, and demonstrates how to: -* Create an [SAP Customer Data Cloud extension](https://help.sap.com/viewer/8b8d6fffe113457094a17701f63e3d6a/GIGYA/en-US/4153ec2f70b21014bbc5a10ce4041860.html) endpoint using a [Kyma serverless function](https://kyma-project.io/docs/kyma/latest/01-overview/main-areas/serverless/svls-01-overview/#documentation-content) +* Create an [SAP Customer Data Cloud extension](https://help.sap.com/viewer/8b8d6fffe113457094a17701f63e3d6a/GIGYA/en-US/4153ec2f70b21014bbc5a10ce4041860.html) endpoint using a [Kyma Serverless Function](https://kyma-project.io/external-content/serverless/docs/user/resources/06-10-function-cr) * Deploy a Kyma serverless function and an API Rule using the [Kubernetes command-line tool](https://kubernetes.io/docs/reference/kubectl/overview/) * Alternately, deploy a Kyma serverless function and an API Rule using the Kyma Console User Interface * Explore [api.sap.com](https://api.sap.com/) and try out REST API calls using a sandbox environment @@ -28,8 +28,8 @@ This example includes a **Kyma serverless function**, *cdc-extension*, that is e * [What is an SAP Customer Data Cloud Extension?](https://help.sap.com/viewer/8b8d6fffe113457094a17701f63e3d6a/GIGYA/en-US/4153ec2f70b21014bbc5a10ce4041860.html) * [An Introduction to SAP Customer Data Cloud Extensions (video)](https://microlearning.opensap.com/media/1_ucyxrfoj) * [What is Kyma Environment?](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/468c2f3c3ca24c2c8497ef9f83154c44.html) -* [What is a Kyma Serverless Function?](https://kyma-project.io/docs/kyma/latest/01-overview/main-areas/serverless/svls-01-overview/#documentation-content) -* [What is a Kyma API Rule?](https://kyma-project.io/docs/kyma/latest/05-technical-reference/00-custom-resources/apix-01-apirule/#documentation-content) +* [What is a Kyma Serverless Function?](https://kyma-project.io/external-content/serverless/docs/user/resources/06-10-function-cr) +* [What is a Kyma API Rule?](https://kyma-project.io/external-content/api-gateway/docs/user/custom-resources/apirule/README) * [Project Kyma Documentation](https://kyma-project.io/) * [Administration and Operations in the Kyma Environment](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/b8e16869e64a4abe93cc194aa6fdacf5.html) diff --git a/cdp-extension/README.md b/cdp-extension/README.md index ba891b8a..9933b924 100644 --- a/cdp-extension/README.md +++ b/cdp-extension/README.md @@ -4,7 +4,7 @@ This example includes a **Kyma Serverless Function**, *cdp-extension*, that is exposed as an **SAP Customer Data Platform Extension endpoint**, and demonstrates how to: -* Create an [SAP Customer Data Platform Extension](https://help.sap.com/viewer/8438f051ded544d2ba1303e67fc5ff86/PROD/en-US/67ac7304cead44a9a6b762f583fe1fe1.html) endpoint using a [Kyma Serverless Function](https://kyma-project.io/docs/kyma/latest/01-overview/main-areas/serverless/svls-01-overview/#documentation-content) +* Create an [SAP Customer Data Platform Extension](https://help.sap.com/viewer/8438f051ded544d2ba1303e67fc5ff86/PROD/en-US/67ac7304cead44a9a6b762f583fe1fe1.html) endpoint using a [Kyma Serverless Function](https://kyma-project.io/external-content/serverless/docs/user/resources/06-10-function-cr) * Deploy a Kyma Serverless Function and an API Rule with **JWT Access strategy** using the [Kubernetes command-line tool](https://kubernetes.io/docs/reference/kubectl/overview/) * Alternately, deploy a Kyma Serverless Function and an API Rule with **JWT Access strategy** using the Kyma Console User Interface * Explore [api.sap.com](https://api.sap.com/) and try out REST API calls using a sandbox environment @@ -24,8 +24,8 @@ This example includes a **Kyma Serverless Function**, *cdp-extension*, that is e * [SAP Customer Data Platform Sources and Destinations](https://help.sap.com/viewer/8438f051ded544d2ba1303e67fc5ff86/PROD/en-US/f4b17b0302e248da805fd9e4530934e5.html) * [Using Kyma with SAP Customer Data Platform Extensions](https://help.sap.com/viewer/8438f051ded544d2ba1303e67fc5ff86/PROD/en-US/8722f8e5157b4cf9be5f0177906a0351.html) * [What is Kyma Environment?](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/468c2f3c3ca24c2c8497ef9f83154c44.html) -* [What is a Kyma Serverless Function?](https://kyma-project.io/docs/kyma/latest/01-overview/main-areas/serverless/svls-01-overview/#documentation-content) -* [What is a Kyma API Rule?](https://kyma-project.io/docs/kyma/latest/05-technical-reference/00-custom-resources/apix-01-apirule/#documentation-content) +* [What is a Kyma Serverless Function?](https://kyma-project.io/external-content/serverless/docs/user/resources/06-10-function-cr) +* [What is a Kyma API Rule?](https://kyma-project.io/external-content/api-gateway/docs/user/custom-resources/apirule/README) * [Project Kyma Documentation](https://kyma-project.io/) * [Administration and Operations in the Kyma Environment](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/b8e16869e64a4abe93cc194aa6fdacf5.html) diff --git a/data-backup-and-restore/README.md b/data-backup-and-restore/README.md index b75d6827..f45c3d16 100644 --- a/data-backup-and-restore/README.md +++ b/data-backup-and-restore/README.md @@ -47,7 +47,7 @@ As a next step, it demonstrates restoring the data from a volume snapshot. ## Take Snapshot -* Create a snapshot class. The driver specified `driver: disk.csi.azure.com` depends upon the hyperscaler used. Please refer to this [Kyma open source documentation, Gardener Section](https://kyma-project.io/docs/kyma/latest/04-operation-guides/operations/10-backup-kyma/#create-on-demand-volume-snapshots) to provide the appropriate value. +* Create a snapshot class. The driver specified `driver: disk.csi.azure.com` depends upon the hyperscaler used. Please refer to this [Kyma open source documentation, Gardener Section](https://kyma-project.io/04-operation-guides/operations/10-backup-kyma.html#create-on-demand-volume-snapshots) to provide the appropriate value. ```shell script kubectl apply -f k8s/snapshot-class.yaml diff --git a/dsagtt22/tutorial/step6.md b/dsagtt22/tutorial/step6.md index ca642154..dc8001b3 100644 --- a/dsagtt22/tutorial/step6.md +++ b/dsagtt22/tutorial/step6.md @@ -170,7 +170,7 @@ As we have all configuration in place we can start with the implementation of th } ``` - > 📝 **Tip** - All data send to a Kyma Function is stored in the `event` object. The main purpose of this object is to transfer CloudEvents to the Kyma Function. However, the object is also used to transfer the data of incoming HTTP requests (like in our case). To transport the information the `extensions` object of the `event` parameter is used and contains the desired information. You find more information about the `event` object in the [Kyma documentation](https://kyma-project.io/docs/kyma/latest/05-technical-reference/svls-08-function-specification/#event-object). + > 📝 **Tip** - All data send to a Kyma Function is stored in the `event` object. The main purpose of this object is to transfer CloudEvents to the Kyma Function. However, the object is also used to transfer the data of incoming HTTP requests (like in our case). To transport the information the `extensions` object of the `event` parameter is used and contains the desired information. You find more information about the `event` object in the [Kyma documentation](https://github.com/kyma-project/serverless/blob/main/docs/user/technical-reference/07-70-function-specification.md#event-object). - Next we call a function that to fetch the orders based on the material ID. For now we just implement the function call in the body of the main function: diff --git a/sample-extension-dotnet/README.md b/sample-extension-dotnet/README.md index 415be66c..70f2c9cf 100644 --- a/sample-extension-dotnet/README.md +++ b/sample-extension-dotnet/README.md @@ -12,7 +12,7 @@ This sample demonstrates how to: * Create a development Namespace in the Kyma runtime. * Create and deploy an ASP.NET application in the Kyma runtime. -* Expose the ASP.NET application using [APIRules](https://kyma-project.io/docs/components/api-gateway#custom-resource-api-rule). +* Expose the ASP.NET application using [APIRules](https://kyma-project.io/external-content/api-gateway/docs/user/custom-resources/apirule/README). * Call the APIs. ## Prerequisites diff --git a/sample-extension-java/README.md b/sample-extension-java/README.md index ac87dbac..864e248e 100644 --- a/sample-extension-java/README.md +++ b/sample-extension-java/README.md @@ -12,7 +12,7 @@ This sample demonstrates how to: * Create a development Namespace in the Kyma runtime. * Create and deploy a Spring Boot application in the Kyma runtime. -* Expose the Spring Boot application using [APIRules](https://kyma-project.io/docs/components/api-gateway#custom-resource-api-rule). +* Expose the Spring Boot application using [APIRules](https://kyma-project.io/external-content/api-gateway/docs/user/custom-resources/apirule/README). * Explore the APIs. ## Prerequisites diff --git a/sample-extension-scala/README.md b/sample-extension-scala/README.md index 24c7cd5f..7f93d157 100644 --- a/sample-extension-scala/README.md +++ b/sample-extension-scala/README.md @@ -10,7 +10,7 @@ This sample demonstrates how to: * Create a development Namespace in the Kyma runtime. * Create and deploy a Scala AKKA-HTTP microservice in the Kyma runtime. -* Expose the microservice using [APIRules](https://kyma-project.io/docs/components/api-gateway#custom-resource-api-rule). +* Expose the microservice using [APIRules](https://kyma-project.io/external-content/api-gateway/docs/user/custom-resources/apirule/README). * Explore the APIs. ## Prerequisites diff --git a/sentiment-analysis/lambdas/README.md b/sentiment-analysis/lambdas/README.md index 40d3fc07..6b149d85 100644 --- a/sentiment-analysis/lambdas/README.md +++ b/sentiment-analysis/lambdas/README.md @@ -6,4 +6,4 @@ Each function contains a handler file and a dependencies file depending on the F Each function also contains a `k8s` directory that contains the `Function` deployment file and either an `APIRule` or `Subscription` depending on if it is a syncronous or asyncronous process. -The functions are configured to be pulled directly from Git. A `Secret` named `git-creds-basic` and a `GitRepository` resource must be provided in the namespace. See the [Kyma documentation](https://kyma-project.io/docs/kyma/latest/03-tutorials/00-serverless/svls-02-create-git-function/) for details. \ No newline at end of file +The functions are configured to be pulled directly from Git. A `Secret` named `git-creds-basic` and a `GitRepository` resource must be provided in the namespace. See the [Kyma documentation](https://kyma-project.io/external-content/serverless/docs/user/tutorials/01-11-create-git-function) for details. \ No newline at end of file diff --git a/sentiment-analysis/lambdas/customer-review-webhook/README.md b/sentiment-analysis/lambdas/customer-review-webhook/README.md index bf2e87d0..a2d5c894 100644 --- a/sentiment-analysis/lambdas/customer-review-webhook/README.md +++ b/sentiment-analysis/lambdas/customer-review-webhook/README.md @@ -10,7 +10,7 @@ This API is protected with OAuth2 which also must be configured in SAP Commerce. It is configured to pull the source code directly from Git. -[handler.js](handler.js) - Javscript source code for the webhook handler - updated for Kyma v2.10 (see [Set asynchronous communication between Functions](https://kyma-project.io/docs/kyma/latest/03-tutorials/00-serverless/svls-11-set-asynchronous-connection-of-functions#create-the-emitter-function) ) +[handler.js](handler.js) - Javscript source code for the webhook handler - updated for Kyma v2.10 (see [Set asynchronous communication between Functions](https://kyma-project.io/external-content/serverless/docs/user/tutorials/01-90-set-asynchronous-connection#create-the-emitter-function)) [package.json](package.json) - Dependencies for the function From 181402f00c07a8d66771a19852b45c8b65038838 Mon Sep 17 00:00:00 2001 From: grego952 Date: Fri, 14 Nov 2025 11:20:15 +0100 Subject: [PATCH 05/11] Fix remaining link --- sample-extension-dotnet-minimalapi/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample-extension-dotnet-minimalapi/README.md b/sample-extension-dotnet-minimalapi/README.md index 60090674..873c397f 100644 --- a/sample-extension-dotnet-minimalapi/README.md +++ b/sample-extension-dotnet-minimalapi/README.md @@ -10,7 +10,7 @@ This sample demonstrates how to: * Create a development Namespace in the Kyma runtime. * Create and deploy an ASP.NET Core-based application in the Kyma runtime. -* Expose the ASP.NET Core application using [APIRules](https://kyma-project.io/docs/kyma/latest/05-technical-reference/00-custom-resources/apix-01-apirule/#documentation-content). +* Expose the ASP.NET Core application using [APIRules](https://kyma-project.io/external-content/api-gateway/docs/user/custom-resources/apirule/README). * Call the API. ## ToDo App From e56a5810310ea7e0cfe8314056712f3627b82b3c Mon Sep 17 00:00:00 2001 From: grego952 Date: Fri, 14 Nov 2025 11:57:05 +0100 Subject: [PATCH 06/11] Update script --- cap-bookstore/start-app.sh | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/cap-bookstore/start-app.sh b/cap-bookstore/start-app.sh index 1eabd955..ebb748e8 100755 --- a/cap-bookstore/start-app.sh +++ b/cap-bookstore/start-app.sh @@ -1,5 +1,10 @@ #!/bin/sh +POSTGRES_HOST="${POSTGRES_HOST:=localhost}" +POSTGRES_PORT="${POSTGRES_PORT:=5432}" +POSTGRES_DB="${POSTGRES_DB:=capdb}" +POSTGRES_USER="${POSTGRES_USER:=capuser}" + echo "Starting CAP application with PostgreSQL..." # Check if database connection variables are set @@ -16,10 +21,27 @@ echo "Database: $POSTGRES_DB" echo "User: $POSTGRES_USER" # Build PostgreSQL URI with SSL parameters - use require mode for BTP -POSTGRES_URI_WITH_SSL="${POSTGRES_URI}?sslmode=require" +POSTGRES_HOST_WITH_SSL="${POSTGRES_HOST}?sslmode=require" # Build CDS_REQUIRES with SSL-enabled URI and very relaxed timeouts for BTP free tier -export CDS_REQUIRES="{\"db\":{\"kind\":\"postgres\",\"credentials\":{\"url\":\"$POSTGRES_URI_WITH_SSL\"},\"pool\":{\"acquireTimeoutMillis\":30000,\"createTimeoutMillis\":30000,\"destroyTimeoutMillis\":10000,\"idleTimeoutMillis\":30000,\"reapIntervalMillis\":5000,\"createRetryIntervalMillis\":1000,\"max\":2,\"min\":0}}}" +export CDS_REQUIRES='{ + "db": { + "kind": "postgres", + "credentials": { + "url": "'"${POSTGRES_HOST_WITH_SSL}"'" + }, + "pool": { + "acquireTimeoutMillis": 30000, + "createTimeoutMillis": 30000, + "destroyTimeoutMillis": 10000, + "idleTimeoutMillis": 30000, + "reapIntervalMillis": 5000, + "createRetryIntervalMillis": 1000, + "max": 2, + "min": 0 + } + } +}' echo "CDS_REQUIRES: $CDS_REQUIRES" @@ -28,7 +50,7 @@ echo "Attempting to deploy database schema and data..." echo "Using PostgreSQL initialization script..." # Run dedicated database initialization script -node init-db.js || echo "❌ Schema deployment failed, but continuing..." +node init-db.js || echo ":x: Schema deployment failed, but continuing..." # Start the CAP application echo "Starting CAP application..." From 0ed71fa1c8a0761a347c88ef69a28e526b744ecb Mon Sep 17 00:00:00 2001 From: grego952 Date: Fri, 14 Nov 2025 12:01:16 +0100 Subject: [PATCH 07/11] Fix emoji --- cap-bookstore/start-app.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cap-bookstore/start-app.sh b/cap-bookstore/start-app.sh index ebb748e8..39aae9da 100755 --- a/cap-bookstore/start-app.sh +++ b/cap-bookstore/start-app.sh @@ -50,7 +50,7 @@ echo "Attempting to deploy database schema and data..." echo "Using PostgreSQL initialization script..." # Run dedicated database initialization script -node init-db.js || echo ":x: Schema deployment failed, but continuing..." +node init-db.js || echo "❌ Schema deployment failed, but continuing..." # Start the CAP application echo "Starting CAP application..." From 3e9712be86c9a742a694b6c169f0f553c26566a5 Mon Sep 17 00:00:00 2001 From: grego952 Date: Fri, 14 Nov 2025 12:03:47 +0100 Subject: [PATCH 08/11] Fix link --- orders-service/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orders-service/README.md b/orders-service/README.md index 33c52a3e..8a391d6f 100644 --- a/orders-service/README.md +++ b/orders-service/README.md @@ -8,7 +8,7 @@ This example contains: - A sample application (microservice) written in [Go](http://golang.org). It can expose HTTP endpoints used to create, read, and delete basic order JSON entities, as described in the [service's OpenAPI specification](docs/openapi.yaml). This service can run with either a default in-memory database or the external Redis database. -- A [serverless](https://kyma-project.io/#/serverless-manager/user/README) Function with the ability to expose HTTP endpoints used to read all order records or post single orders. Just like the microservice, the Function can run with either the default in-memory database or the external Redis instance. See the source code of this Function in the [`function.yaml`](./deployment/orders-function.yaml)) file under the **spec.source** field. +- A [serverless](https://kyma-project.io/#/serverless/user/README) Function with the ability to expose HTTP endpoints used to read all order records or post single orders. Just like the microservice, the Function can run with either the default in-memory database or the external Redis instance. See the source code of this Function in the [`function.yaml`](./deployment/orders-function.yaml)) file under the **spec.source** field. To see this microservice and Function in action, see the [getting started guides](https://github.com/kyma-project/kyma/blob/release-1.24/docs/getting-started/01-overview.md) and learn more about exposing services and Functions through API Rule CRs. You will also learn how to bind them to an external application like Redis and subscribe them to events from a sample mock application. From 502a33e8571339bc72de5247b29b452a222e7397 Mon Sep 17 00:00:00 2001 From: grego952 Date: Thu, 20 Nov 2025 14:17:35 +0100 Subject: [PATCH 09/11] Remove namespace for the k8s files --- cap-bookstore/k8s/apirule.yaml | 1 - cap-bookstore/k8s/configmap.yaml | 1 - cap-bookstore/k8s/deployment.yaml | 1 - cap-bookstore/k8s/service.yaml | 1 - 4 files changed, 4 deletions(-) diff --git a/cap-bookstore/k8s/apirule.yaml b/cap-bookstore/k8s/apirule.yaml index b53d20e8..280eb0ce 100644 --- a/cap-bookstore/k8s/apirule.yaml +++ b/cap-bookstore/k8s/apirule.yaml @@ -2,7 +2,6 @@ apiVersion: gateway.kyma-project.io/v2 kind: APIRule metadata: name: bookstore-api - namespace: cap-bookstore labels: app: bookstore spec: diff --git a/cap-bookstore/k8s/configmap.yaml b/cap-bookstore/k8s/configmap.yaml index 7f9817e0..cf3757d6 100644 --- a/cap-bookstore/k8s/configmap.yaml +++ b/cap-bookstore/k8s/configmap.yaml @@ -2,7 +2,6 @@ apiVersion: v1 kind: ConfigMap metadata: name: bookstore-postgres-config - namespace: cap-bookstore data: CDS_REQUIRES_KIND: "postgres" NODE_ENV: "production" \ No newline at end of file diff --git a/cap-bookstore/k8s/deployment.yaml b/cap-bookstore/k8s/deployment.yaml index da8b0ab6..e8c3d332 100644 --- a/cap-bookstore/k8s/deployment.yaml +++ b/cap-bookstore/k8s/deployment.yaml @@ -2,7 +2,6 @@ apiVersion: apps/v1 kind: Deployment metadata: name: bookstore-deployment - namespace: cap-bookstore labels: app: bookstore spec: diff --git a/cap-bookstore/k8s/service.yaml b/cap-bookstore/k8s/service.yaml index 41b4c130..2c376e6a 100644 --- a/cap-bookstore/k8s/service.yaml +++ b/cap-bookstore/k8s/service.yaml @@ -2,7 +2,6 @@ apiVersion: v1 kind: Service metadata: name: bookstore-service - namespace: cap-bookstore labels: app: bookstore spec: From 8ec1f5bb6bb7489056b4b99080624ead5ba6658a Mon Sep 17 00:00:00 2001 From: grego952 Date: Thu, 20 Nov 2025 14:23:02 +0100 Subject: [PATCH 10/11] Remove namespace for apirule --- cap-bookstore/k8s/apirule.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/cap-bookstore/k8s/apirule.yaml b/cap-bookstore/k8s/apirule.yaml index 280eb0ce..25684588 100644 --- a/cap-bookstore/k8s/apirule.yaml +++ b/cap-bookstore/k8s/apirule.yaml @@ -9,7 +9,6 @@ spec: - {YOUR_HOSTNAME} service: name: bookstore-service - namespace: cap-bookstore port: 80 gateway: kyma-system/kyma-gateway rules: From d1f1877fee43ad3c1cbfb61db62010626d91af06 Mon Sep 17 00:00:00 2001 From: grego952 Date: Mon, 24 Nov 2025 07:06:03 +0100 Subject: [PATCH 11/11] add dockerignore and remove two lines from Dockerfile --- cap-bookstore/.dockerignore | 1 + cap-bookstore/docker/Dockerfile | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) create mode 100644 cap-bookstore/.dockerignore diff --git a/cap-bookstore/.dockerignore b/cap-bookstore/.dockerignore new file mode 100644 index 00000000..191381ee --- /dev/null +++ b/cap-bookstore/.dockerignore @@ -0,0 +1 @@ +.git \ No newline at end of file diff --git a/cap-bookstore/docker/Dockerfile b/cap-bookstore/docker/Dockerfile index ad90da3e..f9411d6f 100644 --- a/cap-bookstore/docker/Dockerfile +++ b/cap-bookstore/docker/Dockerfile @@ -29,9 +29,6 @@ WORKDIR /app COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules COPY --chown=nodejs:nodejs . . -# Remove unnecessary files -RUN rm -rf .git .vscode *.md - # Switch to non-root user USER nodejs