#!/usr/bin/env node /** * 🔍 Проверка доступности GraphQL сервера для Code Generator * * Проверяет доступность v3.dscrs.site/graphql и переключается на локальные схемы * если сервер недоступен (например, в CI окружении Vercel/Netlify) */ import { readFileSync, writeFileSync, existsSync } from 'fs' import { join } from 'path' const GRAPHQL_URL = 'https://v3.dscrs.site/graphql' const TIMEOUT = 10000 // 10 секунд /** * Проверяет доступность GraphQL сервера */ async function checkGraphQLServer() { try { console.log('🔍 Проверяем доступность GraphQL сервера...') const controller = new AbortController() const timeoutId = setTimeout(() => controller.abort(), TIMEOUT) const response = await fetch(GRAPHQL_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', 'User-Agent': 'GraphQL-Codegen-Check/1.0' }, body: JSON.stringify({ query: '{ __typename }' }), signal: controller.signal }) clearTimeout(timeoutId) if (response.ok) { console.log('✅ GraphQL сервер доступен') return true } else { console.log(`⚠️ GraphQL сервер вернул статус: ${response.status}`) return false } } catch (error) { if (error.name === 'AbortError') { console.log('⏰ Таймаут подключения к GraphQL серверу') } else { console.log(`❌ Ошибка подключения к GraphQL серверу: ${error.message}`) } return false } } /** * Создает fallback конфигурацию с локальными схемами */ function createFallbackConfig() { console.log('🔄 Создаем fallback конфигурацию с локальными схемами...') const fallbackConfig = `import type { CodegenConfig } from '@graphql-codegen/cli' const config: CodegenConfig = { overwrite: true, // 🚨 FALLBACK: Используем локальные схемы вместо удаленного сервера schema: ['schema/*.graphql'], documents: ['panel/graphql/queries/**/*.ts', 'panel/**/*.{ts,tsx}', '!panel/graphql/generated/**'], generates: { './panel/graphql/generated/introspection.json': { plugins: ['introspection'], config: { minify: true } }, './panel/graphql/generated/schema.graphql': { plugins: ['schema-ast'], config: { includeDirectives: false } }, './panel/graphql/generated/': { preset: 'client', plugins: [], presetConfig: { gqlTagName: 'gql', fragmentMasking: false }, config: { scalars: { DateTime: 'string', JSON: 'Record' }, skipTypename: false, useTypeImports: true, dedupeOperationSuffix: true, dedupeFragments: true, avoidOptionals: false, enumsAsTypes: false } } }, config: { skipTypename: false, useTypeImports: true, dedupeOperationSuffix: true, dedupeFragments: true, avoidOptionals: false, enumsAsTypes: false } } export default config` writeFileSync('codegen.fallback.ts', fallbackConfig) console.log('✅ Fallback конфигурация создана: codegen.fallback.ts') } /** * Проверяет наличие локальных схем */ function checkLocalSchemas() { const schemaFiles = [ 'schema/admin.graphql', 'schema/enum.graphql', 'schema/input.graphql', 'schema/mutation.graphql', 'schema/query.graphql', 'schema/type.graphql' ] const missingFiles = schemaFiles.filter(file => !existsSync(file)) if (missingFiles.length > 0) { console.log('❌ Отсутствуют локальные схемы:') missingFiles.forEach(file => console.log(` - ${file}`)) return false } console.log('✅ Все локальные схемы найдены') return true } /** * Основная функция */ async function main() { const isCI = process.env.CI === 'true' || process.env.VERCEL || process.env.NETLIFY if (isCI) { console.log('🏗️ CI окружение обнаружено, используем локальные схемы') } const serverAvailable = await checkGraphQLServer() if (!serverAvailable || isCI) { if (!checkLocalSchemas()) { console.log('❌ Локальные схемы недоступны, сборка невозможна') process.exit(1) } createFallbackConfig() // Обновляем package.json для использования fallback конфигурации const packageJson = JSON.parse(readFileSync('package.json', 'utf8')) packageJson.scripts.codegen = 'graphql-codegen --config codegen.fallback.ts' writeFileSync('package.json', JSON.stringify(packageJson, null, 2)) console.log('🔄 package.json обновлен для использования fallback конфигурации') } else { console.log('✅ Используем удаленный GraphQL сервер') } } main().catch(error => { console.error('💥 Критическая ошибка:', error) process.exit(1) })