If you’re working with AWS AppSync or any modular GraphQL API, you’ve probably want to split your schema across multiple files. This is great for developer sanity—but AppSync prefers a single .graphql file.
Let’s automate that.
This post walks through a simple Node.js script that uses the @graphql-tools ecosystem to:
✅ Load and merge your GraphQL schemas
✅ Resolve conflicts
✅ Write the final result to a single .graphql file
✅ load schema into your AppSync deployment flow
🛠 Setup
Install the necessary dependencies:
npm install @graphql-tools/load-files @graphql-tools/merge graphql
📦 Your Project Structure
Assume your project is organized like this:
project-root/
├── appsync/
│ ├── mutations/
│ │ └── addCustomer.graphql
│ ├── queries/
│ │ └── getCustomer.graphql
│ └── schema_chatbot_quicksight_merged.graphql (output)
├── mergeSchemas.js
🧩 The Merge Script
Here’s the full script to merge your GraphQL schema files:
import { loadFilesSync } from "@graphql-tools/load-files";
import { mergeTypeDefs } from "@graphql-tools/merge";
import { print } from "graphql";
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
try {
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const mergedFileName = "schema_chatbot_quicksight_merged.graphql";
const outputPath = path.join(__dirname, "./appsync", mergedFileName);
const typesArray = loadFilesSync(path.join(__dirname, "./appsync/**/*.graphql"), {
extensions: [".graphql"],
ignore: [mergedFileName],
});
if (!typesArray || typesArray.length === 0) {
throw new Error("No GraphQL schema files found");
}
console.log(
"Loaded files:",
typesArray.map((t) => t?.loc?.source?.name || typeof t),
);
const mergedTypeDefs = mergeTypeDefs(typesArray, {
all: true,
throwOnConflict: true,
});
const sdl = print(mergedTypeDefs);
const outputDir = path.dirname(outputPath);
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
fs.writeFileSync(outputPath, sdl);
console.log(`✅ Merged schema written to appsync/${mergedFileName}`);
} catch (error) {
console.error("❌ Error merging GraphQL schemas:", error.message);
process.exit(1);
}
🚀 Using It in AWS CDK
Once your merged schema is generated, you can use it directly in your CDK stack with aws-cdk-lib/aws-appsync.
Here’s an example:
import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";
import * as appsync from "aws-cdk-lib/aws-appsync";
import * as path from "path";
export class AppsyncStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const api = new appsync.GraphqlApi(this, "graphql-api", {
name: "ChatbotQuickSightApi",
schema: appsync.SchemaFile.fromAsset(
path.join(__dirname, "../appsync/schema_chatbot_quicksight_merged.graphql")
),
authorizationConfig: {
defaultAuthorization: {
authorizationType: appsync.AuthorizationType.API_KEY,
},
},
xrayEnabled: true,
});
new cdk.CfnOutput(this, "GraphQLAPIURL", {
value: api.graphqlUrl,
});
}
}
🧠 Tip
You can run your mergeSchemas.js script as part of your CDK build pipeline. For example:
"scripts": {
"prepare-schema": "node mergeSchemas.js",
"build": "npm run prepare-schema && cdk synth"
}
🧼 Why This Matters
- Keep your schema modular for readability and reuse
- Deliver a single file AppSync expects without error-prone copy/paste
- Enable CI/CD integration with schema validation and bundling in one step
United States
NORTH AMERICA
Related News
How Braze’s CTO is rethinking engineering for the agentic area
10h ago
Amazon Employees Are 'Tokenmaxxing' Due To Pressure To Use AI Tools
21h ago

Implementing Multicloud Data Sharding with Hexagonal Storage Adapters
15h ago

DeepMind’s CEO Says AGI May Be ~4 Years Away. The Last Three Missing Pieces Are Not What Most People Think.
15h ago

CCSnapshot - A Claude Code Configs Transfer Tool
21h ago