# API Documentation Generation Scripts TypeScript-based scripts for generating Hugo data files and content pages from OpenAPI specifications. ## Overview These scripts convert OpenAPI v3 specifications into Hugo-compatible data files and content pages for all InfluxDB products. ### What Gets Generated For each product, the scripts generate: 1. **OpenAPI Spec Copies** (static directory): - `influxdb-{product}.yml` - YAML version of the spec - `influxdb-{product}.json` - JSON version of the spec 2. **Path Group Fragments** (static/openapi/{product}/paths/): - Separate YAML and JSON files for each API path group - Example: `ref-api-v2-buckets.yaml` and `ref-api-v2-buckets.json` 3. **Article Metadata** (data/article-data/influxdb/{product}/): - `articles.yml` - Hugo data file with article metadata - `articles.json` - JSON version for programmatic access 4. **Hugo Content Pages** (content/{product}/api/): - Markdown files generated from article data - One page per API path group ## Quick Start ### Build Scripts Compile TypeScript to JavaScript (required before running): ```bash yarn build:api-scripts ``` ### Generate API Pages **Generate all products:** ```bash yarn build:api-pages ``` **Generate specific product(s):** ```bash yarn build:api-pages:product cloud-v2 yarn build:api-pages:product cloud-v2 oss-v2 ``` ## Supported Products | Product ID | Description | Spec File | Content Path | | ---------------------- | ------------------------- | ------------------------------------------------ | -------------------------------------------- | | `cloud-v2` | InfluxDB Cloud (v2 API) | `api-docs/cloud/v2/ref.yml` | `content/influxdb/cloud/api/v2` | | `oss-v2` | InfluxDB OSS v2 | `api-docs/v2/ref.yml` | `content/influxdb/v2/api/v2` | | `influxdb3-core` | InfluxDB 3 Core | `api-docs/influxdb3/core/v3/ref.yml` | `content/influxdb3/core/reference/api` | | `influxdb3-enterprise` | InfluxDB 3 Enterprise | `api-docs/influxdb3/enterprise/v3/ref.yml` | `content/influxdb3/enterprise/reference/api` | | `cloud-dedicated` | InfluxDB Cloud Dedicated | `api-docs/influxdb3/cloud-dedicated/v2/ref.yml` | `content/influxdb/cloud-dedicated/api` | | `cloud-serverless` | InfluxDB Cloud Serverless | `api-docs/influxdb3/cloud-serverless/v2/ref.yml` | `content/influxdb/cloud-serverless/api` | | `clustered` | InfluxDB Clustered | `api-docs/influxdb3/clustered/v2/ref.yml` | `content/influxdb/clustered/api` | ## Architecture ### TypeScript Files ``` api-docs/scripts/ ├── tsconfig.json # TypeScript configuration ├── generate-openapi-articles.ts # Main orchestration script └── openapi-paths-to-hugo-data/ ├── index.ts # Core conversion logic └── package.json # Module dependencies ``` ### Compiled JavaScript After running `yarn build:api-scripts`, compiled files are in: ``` api-docs/scripts/dist/ ├── generate-openapi-articles.js ├── generate-openapi-articles.d.ts └── openapi-paths-to-hugo-data/ ├── index.js └── index.d.ts ``` ## Script Details ### generate-openapi-articles.ts Main orchestration script that processes products. **For each product, it:** 1. Runs `getswagger.sh` to fetch/bundle the OpenAPI spec 2. Copies spec to `static/openapi/influxdb-{product}.yml` 3. Generates JSON version at `static/openapi/influxdb-{product}.json` 4. Generates path group fragments (YAML and JSON) 5. Creates article metadata (YAML and JSON) 6. Generates Hugo content pages **Usage:** ```bash node api-docs/scripts/dist/generate-openapi-articles.js [product-ids...] # Examples: node api-docs/scripts/dist/generate-openapi-articles.js # All products node api-docs/scripts/dist/generate-openapi-articles.js cloud-v2 # Single product node api-docs/scripts/dist/generate-openapi-articles.js cloud-v2 oss-v2 # Multiple products ``` **Output:** ``` 📋 Processing all products... ================================================================================ Processing InfluxDB Cloud (v2 API) ================================================================================ Fetching OpenAPI spec for cloud-v2... ✓ Copied spec to static/openapi/influxdb-cloud-v2.yml ✓ Generated JSON spec at static/openapi/influxdb-cloud-v2.json Generating OpenAPI path files in static/openapi/influxdb-cloud-v2/paths.... Generated: ref-api-v2-buckets.yaml and ref-api-v2-buckets.json ... Generating OpenAPI article data in data/article-data/influxdb/cloud-v2... Generated 32 articles in data/article-data/influxdb/cloud-v2 ✅ Successfully processed InfluxDB Cloud (v2 API) ``` ### openapi-paths-to-hugo-data/index.ts Core conversion library that processes OpenAPI specs. **Key Functions:** - `generateHugoData(options)` - Main entry point - `writePathOpenapis()` - Groups paths and writes fragments - `createArticleDataForPathGroup()` - Generates article metadata **Path Grouping Logic:** Paths are grouped by their base path (first 3-4 segments, excluding placeholders): ``` /api/v2/buckets → api-v2-buckets /api/v2/buckets/{id} → api-v2-buckets (same group) /api/v2/authorizations → api-v2-authorizations ``` **Output Formats:** - **YAML**: Hugo-compatible data files - **JSON**: Programmatic access and tooling ## Development ### Prerequisites - Node.js >= 16.0.0 - Yarn package manager - TypeScript installed (via root package.json) ### Setup ```bash # Install dependencies (from repo root) yarn install # Or install in the openapi-paths-to-hugo-data module cd api-docs/scripts/openapi-paths-to-hugo-data yarn install ``` ### TypeScript Configuration The scripts use a dedicated `tsconfig.json` with CommonJS output: ```json { "compilerOptions": { "target": "ES2021", "module": "CommonJS", "outDir": "./dist", "strict": true, ... } } ``` ### Making Changes 1. Edit TypeScript files in `api-docs/scripts/` 2. Compile: `yarn build:api-scripts` 3. Test: `yarn build:api-pages:product cloud-v2` ### Watch Mode For active development: ```bash cd api-docs/scripts/openapi-paths-to-hugo-data yarn build:watch ``` ## Testing ### Unit Test Example ```javascript const converter = require('./api-docs/scripts/dist/openapi-paths-to-hugo-data/index.js'); converter.generateHugoData({ specFile: 'api-docs/influxdb/cloud/v2/ref.yml', dataOutPath: './test-output/paths', articleOutPath: './test-output/articles' }); ``` ### Verify Output After generation, check: 1. **Path fragments exist:** ```bash ls -l static/openapi/influxdb-cloud-v2/paths/ ``` 2. **Both formats generated:** ```bash ls -l static/openapi/influxdb-cloud-v2/paths/*.{yaml,json} ``` 3. **Article data created:** ```bash cat data/article-data/influxdb/cloud-v2/articles.yml cat data/article-data/influxdb/cloud-v2/articles.json ``` 4. **Hugo pages generated:** ```bash ls -l content/influxdb/cloud/api/v2/ ``` ## Troubleshooting ### TypeScript Compilation Errors ```bash # Clean and rebuild rm -rf api-docs/scripts/dist yarn build:api-scripts ``` ### Missing Type Definitions ```bash cd api-docs/scripts/openapi-paths-to-hugo-data yarn add --dev @types/js-yaml @types/node ``` ### Spec File Not Found Make sure to run `getswagger.sh` first: ```bash cd api-docs ./getswagger.sh cloud-v2 -B ``` ### Path Grouping Issues The script groups paths by their first 3-4 segments. If you need different grouping: 1. Edit `writePathOpenapis()` in `openapi-paths-to-hugo-data/index.ts` 2. Modify the `key.slice(0, 4)` logic 3. Rebuild: `yarn build:api-scripts` ## Migration from JavaScript The original JavaScript files are preserved for reference: - `api-docs/scripts/generate-openapi-articles.js` (original) - `api-docs/scripts/openapi-paths-to-hugo-data/index.js` (original) ### Key Improvements 1. **TypeScript**: Full type safety and IDE support 2. **Dual Formats**: Generates both YAML and JSON 3. **All Products**: Includes all 7 InfluxDB products 4. **Better Errors**: Clear error messages with product validation 5. **CLI Arguments**: Support for processing specific products 6. **Comprehensive Logging**: Progress indicators and status messages ## Related Documentation - **API Docs README**: `api-docs/README.md` - Complete API documentation workflow - **OpenAPI Plugins**: `api-docs/openapi/plugins/` - Custom processing plugins - **Hugo Data to Pages**: `hugo-data-to-pages/` - Page generation from data files ## Examples ### Generate Only Cloud Products ```bash yarn build:api-pages:product cloud-v2 cloud-dedicated cloud-serverless ``` ### Generate Only InfluxDB 3 Products ```bash yarn build:api-pages:product influxdb3-core influxdb3-enterprise ``` ### Process Single Product Manually ```bash # Compile first yarn build:api-scripts # Run for specific product node api-docs/scripts/dist/generate-openapi-articles.js oss-v2 ``` ## API Reference ### generateHugoData(options) Generate Hugo data files from an OpenAPI specification. **Parameters:** - `options.specFile` (string) - Path to the OpenAPI spec file - `options.dataOutPath` (string) - Output path for OpenAPI path fragments - `options.articleOutPath` (string) - Output path for article metadata **Example:** ```javascript const { generateHugoData } = require('./api-docs/scripts/dist/openapi-paths-to-hugo-data/index.js'); generateHugoData({ specFile: 'api-docs/influxdb/cloud/v2/ref.yml', dataOutPath: 'static/openapi/influxdb-cloud-v2/paths', articleOutPath: 'data/article-data/influxdb/cloud-v2' }); ``` ### productConfigs Map of product configurations exported from `generate-openapi-articles.ts`. **Type:** ```typescript type ProductConfig = { specFile: string; // Path to OpenAPI spec pagesDir: string; // Hugo content directory description?: string; // Product description }; const productConfigs: Record; ``` **Usage:** ```javascript const { productConfigs } = require('./api-docs/scripts/dist/generate-openapi-articles.js'); console.log(productConfigs['cloud-v2']); // { // specFile: 'api-docs/cloud/v2/ref.yml', // pagesDir: 'content/influxdb/cloud/api/v2', // description: 'InfluxDB Cloud (v2 API)' // } ``` ## License Same as parent docs-v2 repository (MIT).