diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 36d4234ba..69a48fc76 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,4 +35,4 @@ jobs: - name: Install run: npm ci - name: Test - run: npx jest --runInBand + run: npm test -- --runInBand --watchAll=false diff --git a/.gitignore b/.gitignore index 74b758634..f859072b0 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,6 @@ yarn-error.log* # vercel .vercel + +# generated schema introspection +/lib/apolloClient/fragmentTypes.json diff --git a/lib/apolloClient/fragmentTypes.json b/lib/apolloClient/fragmentTypes.json deleted file mode 100644 index 918e89497..000000000 --- a/lib/apolloClient/fragmentTypes.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "__schema": { - "types": [ - { - "kind": "INTERFACE", - "name": "Node", - "possibleTypes": [ - { "name": "Address" }, - { "name": "DefinedValueList" }, - { "name": "DefinedValue" }, - { "name": "Person" }, - { "name": "Campus" }, - { "name": "Event" }, - { "name": "Device" }, - { "name": "ContentChannel" }, - { "name": "EventContentItem" }, - { "name": "CheckInable" }, - { "name": "CheckInOption" }, - { "name": "LiveStream" }, - { "name": "StreamChatChannel" }, - { "name": "WebsitePagesContentItem" }, - { "name": "Message" }, - { "name": "Pass" }, - { "name": "PrayerRequest" }, - { "name": "Scripture" }, - { "name": "WebsiteNavigation" }, - { "name": "Group" }, - { "name": "UniversalContentItem" }, - { "name": "DevotionalContentItem" }, - { "name": "MediaContentItem" }, - { "name": "ContentSeriesContentItem" }, - { "name": "WeekendContentItem" }, - { "name": "InformationalContentItem" }, - { "name": "WebsiteHtmlBlockItem" }, - { "name": "WebsiteFeature" }, - { "name": "WebsiteGroupItem" }, - { "name": "WebsiteBlockItem" }, - { "name": "Url" }, - { "name": "ActionListFeature" }, - { "name": "HeroListFeature" }, - { "name": "VerticalCardListFeature" }, - { "name": "HorizontalCardListFeature" }, - { "name": "TextFeature" }, - { "name": "ScriptureFeature" }, - { "name": "WebviewFeature" }, - { "name": "ActionBarFeature" }, - { "name": "AvatarListFeature" }, - { "name": "LiveStreamListFeature" }, - { "name": "VolunteerGroup" }, - { "name": "ContentBlockFeature" }, - { "name": "ContentGridFeature" }, - { "name": "CampusContentFeature" }, - { "name": "MetadataFeature" }, - { "name": "PrayerListFeature" } - ] - }, - { - "kind": "INTERFACE", - "name": "MediaSource", - "possibleTypes": [ - { "name": "ImageMediaSource" }, - { "name": "VideoMediaSource" }, - { "name": "AudioMediaSource" } - ] - }, - { - "kind": "INTERFACE", - "name": "Media", - "possibleTypes": [ - { "name": "ImageMedia" }, - { "name": "VideoMedia" }, - { "name": "AudioMedia" } - ] - }, - { - "kind": "INTERFACE", - "name": "GroupItem", - "possibleTypes": [{ "name": "Group" }, { "name": "VolunteerGroup" }] - }, - { - "kind": "INTERFACE", - "name": "ContentItem", - "possibleTypes": [ - { "name": "EventContentItem" }, - { "name": "WebsitePagesContentItem" }, - { "name": "UniversalContentItem" }, - { "name": "DevotionalContentItem" }, - { "name": "MediaContentItem" }, - { "name": "ContentSeriesContentItem" }, - { "name": "WeekendContentItem" }, - { "name": "InformationalContentItem" }, - { "name": "WebsiteHtmlBlockItem" }, - { "name": "WebsiteFeature" }, - { "name": "WebsiteGroupItem" }, - { "name": "WebsiteBlockItem" } - ] - }, - { - "kind": "INTERFACE", - "name": "Sharable", - "possibleTypes": [ - { "name": "SharableContentItem" }, - { "name": "SharableFeature" } - ] - }, - { - "kind": "INTERFACE", - "name": "CheckInableNode", - "possibleTypes": [ - { "name": "EventContentItem" }, - { "name": "LiveStream" }, - { "name": "Group" }, - { "name": "VolunteerGroup" } - ] - }, - { - "kind": "INTERFACE", - "name": "LiveNode", - "possibleTypes": [{ "name": "EventContentItem" }] - }, - { - "kind": "INTERFACE", - "name": "StreamChatChannelNode", - "possibleTypes": [ - { "name": "LiveStream" }, - { "name": "Group" }, - { "name": "VolunteerGroup" } - ] - }, - { - "kind": "INTERFACE", - "name": "Feature", - "possibleTypes": [ - { "name": "ActionListFeature" }, - { "name": "HeroListFeature" }, - { "name": "VerticalCardListFeature" }, - { "name": "HorizontalCardListFeature" }, - { "name": "TextFeature" }, - { "name": "ScriptureFeature" }, - { "name": "WebviewFeature" }, - { "name": "ActionBarFeature" }, - { "name": "AvatarListFeature" }, - { "name": "LiveStreamListFeature" }, - { "name": "PrayerListFeature" } - ] - }, - { - "kind": "INTERFACE", - "name": "PageBuilderFeature", - "possibleTypes": [ - { "name": "ContentBlockFeature" }, - { "name": "ContentGridFeature" }, - { "name": "CampusContentFeature" }, - { "name": "MetadataFeature" } - ] - }, - { - "kind": "INTERFACE", - "name": "LikableNode", - "possibleTypes": [ - { "name": "UniversalContentItem" }, - { "name": "DevotionalContentItem" }, - { "name": "MediaContentItem" }, - { "name": "ContentSeriesContentItem" }, - { "name": "WeekendContentItem" } - ] - }, - { - "kind": "INTERFACE", - "name": "ContentNode", - "possibleTypes": [ - { "name": "UniversalContentItem" }, - { "name": "DevotionalContentItem" }, - { "name": "MediaContentItem" }, - { "name": "ContentSeriesContentItem" }, - { "name": "WeekendContentItem" } - ] - }, - { - "kind": "INTERFACE", - "name": "Card", - "possibleTypes": [ - { "name": "UniversalContentItem" }, - { "name": "DevotionalContentItem" }, - { "name": "MediaContentItem" }, - { "name": "ContentSeriesContentItem" }, - { "name": "WeekendContentItem" } - ] - }, - { - "kind": "INTERFACE", - "name": "VideoNode", - "possibleTypes": [ - { "name": "UniversalContentItem" }, - { "name": "DevotionalContentItem" }, - { "name": "MediaContentItem" }, - { "name": "ContentSeriesContentItem" }, - { "name": "WeekendContentItem" } - ] - }, - { - "kind": "INTERFACE", - "name": "AudioNode", - "possibleTypes": [ - { "name": "UniversalContentItem" }, - { "name": "DevotionalContentItem" }, - { "name": "MediaContentItem" }, - { "name": "ContentSeriesContentItem" }, - { "name": "WeekendContentItem" } - ] - }, - { - "kind": "INTERFACE", - "name": "ContentChildNode", - "possibleTypes": [ - { "name": "UniversalContentItem" }, - { "name": "DevotionalContentItem" }, - { "name": "MediaContentItem" }, - { "name": "ContentSeriesContentItem" }, - { "name": "WeekendContentItem" } - ] - }, - { - "kind": "INTERFACE", - "name": "ContentParentNode", - "possibleTypes": [ - { "name": "UniversalContentItem" }, - { "name": "DevotionalContentItem" }, - { "name": "MediaContentItem" }, - { "name": "ContentSeriesContentItem" }, - { "name": "WeekendContentItem" } - ] - }, - { - "kind": "INTERFACE", - "name": "ThemedNode", - "possibleTypes": [ - { "name": "UniversalContentItem" }, - { "name": "DevotionalContentItem" }, - { "name": "MediaContentItem" }, - { "name": "ContentSeriesContentItem" }, - { "name": "WeekendContentItem" } - ] - }, - { - "kind": "INTERFACE", - "name": "ShareableNode", - "possibleTypes": [ - { "name": "UniversalContentItem" }, - { "name": "DevotionalContentItem" }, - { "name": "MediaContentItem" }, - { "name": "ContentSeriesContentItem" }, - { "name": "WeekendContentItem" } - ] - }, - { - "kind": "INTERFACE", - "name": "ScriptureNode", - "possibleTypes": [ - { "name": "DevotionalContentItem" }, - { "name": "MediaContentItem" } - ] - }, - { - "kind": "INTERFACE", - "name": "FeaturesNode", - "possibleTypes": [ - { "name": "ContentSeriesContentItem" }, - { "name": "WeekendContentItem" } - ] - }, - { - "kind": "INTERFACE", - "name": "ProgressNode", - "possibleTypes": [{ "name": "ContentSeriesContentItem" }] - } - ] - } -} diff --git a/package.json b/package.json index fd205d7b3..88a3acc42 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,16 @@ }, "scripts": { "dev": "next dev", + "predev": "node scripts/generate-fragment-types.js", "build": "next build", + "prebuild": "node scripts/generate-fragment-types.js", "start": "next start", + "prestart": "node scripts/generate-fragment-types.js", "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"", "lint": "eslint .", - "test": "jest --watch" + "pretest": "node scripts/generate-fragment-types.js", + "test": "jest --watch", + "generate:fragment-types": "node scripts/generate-fragment-types.js" }, "dependencies": { "@apollo/client": "^3.14.0", diff --git a/scripts/generate-fragment-types.js b/scripts/generate-fragment-types.js new file mode 100644 index 000000000..478650994 --- /dev/null +++ b/scripts/generate-fragment-types.js @@ -0,0 +1,47 @@ +const fs = require('fs'); +const path = require('path'); + +const fetch = require('cross-fetch'); +const { getIntrospectionQuery } = require('graphql'); + +const schemaUrl = + process.env.APOLLO_SCHEMA_URL || + process.env.NEXT_PUBLIC_APOLLOS_API || + 'https://longhollow-cdn.global.ssl.fastly.net'; + +const outputPath = path.join( + __dirname, + '..', + 'lib', + 'apolloClient', + 'fragmentTypes.json' +); + +async function main() { + const query = getIntrospectionQuery({ descriptions: false }); + const response = await fetch(schemaUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ query }), + }); + + if (!response.ok) { + const bodyText = await response.text().catch(() => ''); + throw new Error( + `Schema introspection failed (${response.status} ${response.statusText}). ${bodyText}` + ); + } + + const payload = await response.json(); + if (payload.errors) { + throw new Error(`Schema introspection errors: ${JSON.stringify(payload.errors)}`); + } + + fs.writeFileSync(outputPath, `${JSON.stringify(payload.data, null, 2)}\n`, 'utf8'); + console.log(`Wrote ${outputPath}`); +} + +main().catch(error => { + console.error('[generate-fragment-types]', error.message || error); + process.exit(1); +});