@embrace-ai/infra-api-schema-sync 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +77 -1
- package/dist/src/dispatch-update.d.ts.map +1 -1
- package/dist/src/dispatch-update.js +114 -5
- package/dist/src/dispatch-update.js.map +1 -1
- package/dist/src/fetch-schema.d.ts.map +1 -1
- package/dist/src/fetch-schema.js +3 -18
- package/dist/src/fetch-schema.js.map +1 -1
- package/package.json +1 -1
- package/src/dispatch-update.js +172 -5
- package/src/fetch-schema.js +5 -31
- package/templates/workflows/graphql-schema-validate.yml +67 -14
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.0.4](https://github.com/Embrace-AI/infra-api-schema-sync/compare/v1.0.3...v1.0.4) (2025-10-14)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **fetch-schema:** use GET and remove introspection for schema fetch ([#17](https://github.com/Embrace-AI/infra-api-schema-sync/issues/17)) ([023c64f](https://github.com/Embrace-AI/infra-api-schema-sync/commit/023c64f3d5a05dba31ef817cbbb26d6fee675b9e))
|
|
9
|
+
|
|
10
|
+
## [1.0.3](https://github.com/Embrace-AI/infra-api-schema-sync/compare/v1.0.2...v1.0.3) (2025-10-08)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **dispatch:** check candidate repo for repository dispatch types ([#15](https://github.com/Embrace-AI/infra-api-schema-sync/issues/15)) ([9b3c97b](https://github.com/Embrace-AI/infra-api-schema-sync/commit/9b3c97bbfb11547b7720e0149b6553663f38f20a))
|
|
16
|
+
|
|
3
17
|
## [1.0.2](https://github.com/Embrace-AI/infra-api-schema-sync/compare/v1.0.1...v1.0.2) (2025-10-07)
|
|
4
18
|
|
|
5
19
|
|
package/README.md
CHANGED
|
@@ -1,4 +1,30 @@
|
|
|
1
|
-
#
|
|
1
|
+
# GraphQL API Schema Sync Tool
|
|
2
|
+
|
|
3
|
+
A CLI tool and GitHub Actions workflow templates for synchronizing GraphQL schema changes across multiple repositories in an organization.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Schema Fetching**: Download GraphQL schemas via introspection
|
|
8
|
+
- **Schema Validation**: Validate GraphQL queries against a schema
|
|
9
|
+
- **Smart Dispatch**: Automatically notify repositories that have the schema validation workflow
|
|
10
|
+
- **Workflow Templates**: Ready-to-use GitHub Actions workflows for emitting and consuming schema updates
|
|
11
|
+
|
|
12
|
+
## Key Capabilities
|
|
13
|
+
|
|
14
|
+
### Intelligent Repository Discovery
|
|
15
|
+
|
|
16
|
+
The `dispatch-update` command automatically:
|
|
17
|
+
|
|
18
|
+
- Scans all repositories in your organization
|
|
19
|
+
- Checks each repository for the `graphql-schema-updated` workflow
|
|
20
|
+
- Only dispatches to repositories that can handle the event
|
|
21
|
+
- Skips repositories without the workflow (avoiding 403 errors)
|
|
22
|
+
|
|
23
|
+
This ensures that:
|
|
24
|
+
|
|
25
|
+
- The main `embrace` repository receives schema updates
|
|
26
|
+
- Repositories without GraphQL dependencies are not notified
|
|
27
|
+
- You get clear feedback about which repos were notified vs. skipped
|
|
2
28
|
|
|
3
29
|
## Setup
|
|
4
30
|
|
|
@@ -78,6 +104,56 @@ pnpm test
|
|
|
78
104
|
pnpm build
|
|
79
105
|
```
|
|
80
106
|
|
|
107
|
+
## Usage
|
|
108
|
+
|
|
109
|
+
### CLI Commands
|
|
110
|
+
|
|
111
|
+
#### `dispatch-update`
|
|
112
|
+
|
|
113
|
+
Dispatch schema update events to repositories in your organization:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
pnpm exec api-tool dispatch-update \
|
|
117
|
+
--schema-url "https://api.dev.embrace.ai/v2/graphql/schema" \
|
|
118
|
+
--token "$GITHUB_TOKEN" \
|
|
119
|
+
--source-repo "Embrace-AI/my-api" \
|
|
120
|
+
--commit "$GITHUB_SHA" \
|
|
121
|
+
--branch "$GITHUB_REF_NAME" \
|
|
122
|
+
--org-name "Embrace-AI"
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**How it works:**
|
|
126
|
+
|
|
127
|
+
1. Fetches all repositories in the organization
|
|
128
|
+
2. Checks each repository for `.github/workflows/*.yml` files
|
|
129
|
+
3. Looks for workflows with `repository_dispatch` trigger and `graphql-schema-updated` event type
|
|
130
|
+
4. Only dispatches to repositories that have the workflow configured
|
|
131
|
+
5. Reports which repositories were notified and which were skipped
|
|
132
|
+
|
|
133
|
+
**Example output:**
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
🔍 Checking 50 repositories for workflow files...
|
|
137
|
+
|
|
138
|
+
✅ Found 2 repositories with workflow:
|
|
139
|
+
- Embrace-AI/embrace
|
|
140
|
+
- Embrace-AI/frontend
|
|
141
|
+
|
|
142
|
+
⏭️ Skipped 48 repositories without workflow:
|
|
143
|
+
- Embrace-AI/sse.js
|
|
144
|
+
- Embrace-AI/terraboard
|
|
145
|
+
...
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
#### Other Commands
|
|
149
|
+
|
|
150
|
+
- `fetch` - Fetch GraphQL schema from a URL
|
|
151
|
+
- `validate` - Validate queries against schema
|
|
152
|
+
- `summarize` - Generate markdown from validation report
|
|
153
|
+
- `generate-schema-url` - Generate dynamic schema URL
|
|
154
|
+
|
|
155
|
+
See workflow templates in `templates/workflows/` for complete examples.
|
|
156
|
+
|
|
81
157
|
## Releasing
|
|
82
158
|
|
|
83
159
|
This project uses Github Actions to release to npmjs.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch-update.d.ts","sourceRoot":"","sources":["../../src/dispatch-update.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dispatch-update.d.ts","sourceRoot":"","sources":["../../src/dispatch-update.js"],"names":[],"mappings":"AAqJO,wCAVJ;IAAwB,SAAS,EAAzB,MAAM;IACU,UAAU,EAA1B,MAAM;IACU,MAAM,EAAtB,MAAM;IACU,MAAM,EAAtB,MAAM;IACU,SAAS,EAAzB,MAAM;IACU,KAAK,EAArB,MAAM;IACU,OAAO,EAAvB,MAAM;IACU,UAAU,EAA1B,MAAM;IACW,MAAM,EAAvB,OAAO;CACjB;;;;;;;;;;GA6NA;AA2DM;;;;;;;;;;GAyDN"}
|
|
@@ -1,4 +1,91 @@
|
|
|
1
1
|
import { execSync } from "child_process";
|
|
2
|
+
import { parse as parseYaml } from "yaml";
|
|
3
|
+
const checkForSchemaWorkflow = async (repo, token, dryRun) => {
|
|
4
|
+
if (dryRun) {
|
|
5
|
+
return repo.includes("embrace");
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
const response = await fetch(`https://api.github.com/repos/${repo}/contents/.github/workflows`, {
|
|
9
|
+
headers: {
|
|
10
|
+
Authorization: `Bearer ${token}`,
|
|
11
|
+
Accept: "application/vnd.github.v3+json",
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
if (response.status === 404) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
if (!response.ok) {
|
|
18
|
+
console.warn(` ⚠️ Could not check workflows for ${repo}: HTTP ${response.status}`);
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const files = await response.json();
|
|
22
|
+
for (const file of files) {
|
|
23
|
+
if (file.name.endsWith(".yml") || file.name.endsWith(".yaml")) {
|
|
24
|
+
try {
|
|
25
|
+
const fileResponse = await fetch(file.download_url, {
|
|
26
|
+
headers: {
|
|
27
|
+
Authorization: `Bearer ${token}`,
|
|
28
|
+
Accept: "application/vnd.github.v3.raw",
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
if (!fileResponse.ok) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const content = await fileResponse.text();
|
|
35
|
+
try {
|
|
36
|
+
const workflow = parseYaml(content);
|
|
37
|
+
if (!workflow?.on) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const triggers = workflow.on;
|
|
41
|
+
let hasRepositoryDispatch = false;
|
|
42
|
+
let types = null;
|
|
43
|
+
if (typeof triggers === "string" &&
|
|
44
|
+
triggers === "repository_dispatch") {
|
|
45
|
+
hasRepositoryDispatch = true;
|
|
46
|
+
}
|
|
47
|
+
else if (Array.isArray(triggers) &&
|
|
48
|
+
triggers.includes("repository_dispatch")) {
|
|
49
|
+
hasRepositoryDispatch = true;
|
|
50
|
+
}
|
|
51
|
+
else if (triggers?.repository_dispatch !== undefined) {
|
|
52
|
+
hasRepositoryDispatch = true;
|
|
53
|
+
types = triggers.repository_dispatch?.types;
|
|
54
|
+
}
|
|
55
|
+
if (!hasRepositoryDispatch) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (types !== null && types !== undefined) {
|
|
59
|
+
if (Array.isArray(types)) {
|
|
60
|
+
if (types.includes("graphql-schema-updated")) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else if (typeof types === "string" &&
|
|
65
|
+
types === "graphql-schema-updated") {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch (yamlError) {
|
|
73
|
+
console.warn(`⚠️ YAML parsing error in ${file.name}: ${yamlError.message}`);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.warn(` ⚠️ Error checking ${repo}: ${error.message}`);
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
2
89
|
export const dispatchUpdate = async (options) => {
|
|
3
90
|
try {
|
|
4
91
|
const { schemaUrl, sourceRepo, commit, branch, timestamp, token, orgName, repoFilter = ".*", dryRun = false, } = options;
|
|
@@ -43,7 +130,7 @@ export const dispatchUpdate = async (options) => {
|
|
|
43
130
|
let allRepos;
|
|
44
131
|
if (dryRun && (token === "fake-token" || token.startsWith("fake"))) {
|
|
45
132
|
console.log("DRY RUN: Using simulated repositories");
|
|
46
|
-
allRepos = `${orgName}/
|
|
133
|
+
allRepos = `${orgName}/embrace\n${sourceRepo}\n`;
|
|
47
134
|
}
|
|
48
135
|
else {
|
|
49
136
|
allRepos = await fetchAllRepos();
|
|
@@ -58,17 +145,39 @@ export const dispatchUpdate = async (options) => {
|
|
|
58
145
|
else {
|
|
59
146
|
filteredRepos = allRepos;
|
|
60
147
|
}
|
|
61
|
-
const
|
|
148
|
+
const candidateRepos = filteredRepos
|
|
62
149
|
.split("\n")
|
|
63
150
|
.filter((repo) => repo.trim() && repo !== sourceRepo)
|
|
64
151
|
.filter((repo) => repo.length > 0);
|
|
65
|
-
if (
|
|
66
|
-
console.log("⚠️ No
|
|
152
|
+
if (candidateRepos.length === 0) {
|
|
153
|
+
console.log("⚠️ No candidate repositories found");
|
|
67
154
|
return { success: 0, errors: 0, total: 0 };
|
|
68
155
|
}
|
|
69
|
-
console.log(
|
|
156
|
+
console.log(`🔍 Checking ${candidateRepos.length} repositories for workflow files...`);
|
|
157
|
+
const targetRepos = [];
|
|
158
|
+
const skippedRepos = [];
|
|
159
|
+
for (const repo of candidateRepos) {
|
|
160
|
+
const hasWorkflow = await checkForSchemaWorkflow(repo, token, dryRun);
|
|
161
|
+
if (hasWorkflow) {
|
|
162
|
+
targetRepos.push(repo);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
skippedRepos.push(repo);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
console.log("");
|
|
169
|
+
console.log(`✅ Found ${targetRepos.length} repositories with workflow:`);
|
|
70
170
|
targetRepos.forEach((repo) => console.log(` - ${repo}`));
|
|
171
|
+
if (skippedRepos.length > 0) {
|
|
172
|
+
console.log("");
|
|
173
|
+
console.log(`⏭️ Skipped ${skippedRepos.length} repositories without workflow:`);
|
|
174
|
+
skippedRepos.forEach((repo) => console.log(` - ${repo}`));
|
|
175
|
+
}
|
|
71
176
|
console.log("");
|
|
177
|
+
if (targetRepos.length === 0) {
|
|
178
|
+
console.log("⚠️ No repositories found with graphql-schema-updated workflow");
|
|
179
|
+
return { success: 0, errors: 0, total: 0 };
|
|
180
|
+
}
|
|
72
181
|
if (dryRun) {
|
|
73
182
|
console.log("DRY RUN: Would dispatch to the above repositories");
|
|
74
183
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch-update.js","sourceRoot":"","sources":["../../src/dispatch-update.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dispatch-update.js","sourceRoot":"","sources":["../../src/dispatch-update.js"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-schema.d.ts","sourceRoot":"","sources":["../../src/fetch-schema.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetch-schema.d.ts","sourceRoot":"","sources":["../../src/fetch-schema.js"],"names":[],"mappings":"AAIO;;;kBA+BN"}
|
package/dist/src/fetch-schema.js
CHANGED
|
@@ -1,38 +1,23 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import fse from "fs-extra";
|
|
3
|
-
import { buildClientSchema, getIntrospectionQuery, printSchema } from "graphql";
|
|
4
3
|
import path from "path";
|
|
5
4
|
export const fetchSchema = async ({ url, output }) => {
|
|
6
5
|
try {
|
|
7
6
|
console.log(`🔄 Fetching GraphQL schema from ${url}...`);
|
|
8
|
-
const introspectionQuery = getIntrospectionQuery();
|
|
9
7
|
const response = await fetch(url, {
|
|
10
|
-
method: "
|
|
8
|
+
method: "GET",
|
|
11
9
|
headers: {
|
|
12
|
-
|
|
13
|
-
Accept: "application/json",
|
|
10
|
+
Accept: "application/graphql, text/plain",
|
|
14
11
|
},
|
|
15
|
-
body: JSON.stringify({
|
|
16
|
-
query: introspectionQuery,
|
|
17
|
-
}),
|
|
18
12
|
});
|
|
19
13
|
if (!response.ok) {
|
|
20
14
|
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
21
15
|
}
|
|
22
|
-
const
|
|
23
|
-
if (result.errors) {
|
|
24
|
-
throw new Error(`GraphQL errors: ${result.errors.map((e) => e.message).join(", ")}`);
|
|
25
|
-
}
|
|
26
|
-
if (!result.data) {
|
|
27
|
-
throw new Error("No data returned from introspection query");
|
|
28
|
-
}
|
|
29
|
-
const schema = buildClientSchema(result.data);
|
|
30
|
-
const schemaSDL = printSchema(schema);
|
|
16
|
+
const schemaSDL = await response.text();
|
|
31
17
|
const outputDir = path.dirname(output);
|
|
32
18
|
fse.ensureDirSync(outputDir);
|
|
33
19
|
fs.writeFileSync(output, schemaSDL, "utf8");
|
|
34
20
|
console.log(`✅ Schema successfully saved to ${output}`);
|
|
35
|
-
console.log(`📊 Schema contains ${Object.keys(schema.getTypeMap()).length} types`);
|
|
36
21
|
}
|
|
37
22
|
catch (error) {
|
|
38
23
|
console.error(`❌ Failed to fetch schema: ${error.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-schema.js","sourceRoot":"","sources":["../../src/fetch-schema.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,
|
|
1
|
+
{"version":3,"file":"fetch-schema.js","sourceRoot":"","sources":["../../src/fetch-schema.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;IACnD,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,mCAAmC,GAAG,KAAK,CAAC,CAAC;QAGzD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,MAAM,EAAE,iCAAiC;aAC1C;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACrE,CAAC;QAGD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAGxC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAG7B,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAE5C,OAAO,CAAC,GAAG,CAAC,kCAAkC,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC;AAGF,eAAe,WAAW,CAAC"}
|
package/package.json
CHANGED
package/src/dispatch-update.js
CHANGED
|
@@ -1,4 +1,138 @@
|
|
|
1
1
|
import { execSync } from "child_process";
|
|
2
|
+
import { parse as parseYaml } from "yaml";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Check if a repository has a workflow that listens for graphql-schema-updated events
|
|
6
|
+
* @param {string} repo - Repository full name (org/repo)
|
|
7
|
+
* @param {string} token - GitHub token
|
|
8
|
+
* @param {boolean} dryRun - If true, simulate the check
|
|
9
|
+
* @returns {Promise<boolean>} True if the repo has the workflow
|
|
10
|
+
*/
|
|
11
|
+
const checkForSchemaWorkflow = async (repo, token, dryRun) => {
|
|
12
|
+
// In dry-run mode, simulate some repos having the workflow
|
|
13
|
+
if (dryRun) {
|
|
14
|
+
// Simulate that only the embrace repo has the workflow
|
|
15
|
+
return repo.includes("embrace");
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
// Fetch the .github/workflows directory contents
|
|
20
|
+
const response = await fetch(
|
|
21
|
+
`https://api.github.com/repos/${repo}/contents/.github/workflows`,
|
|
22
|
+
{
|
|
23
|
+
headers: {
|
|
24
|
+
Authorization: `Bearer ${token}`,
|
|
25
|
+
Accept: "application/vnd.github.v3+json",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
// If no workflows directory, skip this repo
|
|
31
|
+
if (response.status === 404) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
console.warn(
|
|
37
|
+
` ⚠️ Could not check workflows for ${repo}: HTTP ${response.status}`,
|
|
38
|
+
);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const files = await response.json();
|
|
43
|
+
|
|
44
|
+
// Check each workflow file for the repository_dispatch trigger
|
|
45
|
+
for (const file of files) {
|
|
46
|
+
if (file.name.endsWith(".yml") || file.name.endsWith(".yaml")) {
|
|
47
|
+
try {
|
|
48
|
+
// Fetch the workflow file content
|
|
49
|
+
const fileResponse = await fetch(file.download_url, {
|
|
50
|
+
headers: {
|
|
51
|
+
Authorization: `Bearer ${token}`,
|
|
52
|
+
Accept: "application/vnd.github.v3.raw",
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
if (!fileResponse.ok) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const content = await fileResponse.text();
|
|
59
|
+
|
|
60
|
+
// Parse YAML and check for repository_dispatch with graphql-schema-updated
|
|
61
|
+
try {
|
|
62
|
+
const workflow = parseYaml(content);
|
|
63
|
+
|
|
64
|
+
// If no 'on' field, skip this workflow
|
|
65
|
+
if (!workflow?.on) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Handle different YAML structures for the 'on' field
|
|
70
|
+
// repository_dispatch can be:
|
|
71
|
+
// 1. on: repository_dispatch (boolean/null)
|
|
72
|
+
// 2. on: [repository_dispatch] (array)
|
|
73
|
+
// 3. on: { repository_dispatch: { types: [...] } } (object)
|
|
74
|
+
const triggers = workflow.on;
|
|
75
|
+
|
|
76
|
+
let hasRepositoryDispatch = false;
|
|
77
|
+
let types = null;
|
|
78
|
+
|
|
79
|
+
if (
|
|
80
|
+
typeof triggers === "string" &&
|
|
81
|
+
triggers === "repository_dispatch"
|
|
82
|
+
) {
|
|
83
|
+
hasRepositoryDispatch = true;
|
|
84
|
+
} else if (
|
|
85
|
+
Array.isArray(triggers) &&
|
|
86
|
+
triggers.includes("repository_dispatch")
|
|
87
|
+
) {
|
|
88
|
+
hasRepositoryDispatch = true;
|
|
89
|
+
} else if (triggers?.repository_dispatch !== undefined) {
|
|
90
|
+
hasRepositoryDispatch = true;
|
|
91
|
+
types = triggers.repository_dispatch?.types;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (!hasRepositoryDispatch) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// If types are specified, verify graphql-schema-updated is included
|
|
99
|
+
if (types !== null && types !== undefined) {
|
|
100
|
+
if (Array.isArray(types)) {
|
|
101
|
+
if (types.includes("graphql-schema-updated")) {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
} else if (
|
|
105
|
+
typeof types === "string" &&
|
|
106
|
+
types === "graphql-schema-updated"
|
|
107
|
+
) {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
// If types are specified but don't include our event, skip this workflow
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// If no types specified, repository_dispatch accepts all event types
|
|
115
|
+
return true;
|
|
116
|
+
} catch (yamlError) {
|
|
117
|
+
// If YAML parsing fails, skip this file
|
|
118
|
+
console.warn(
|
|
119
|
+
`⚠️ YAML parsing error in ${file.name}: ${yamlError.message}`,
|
|
120
|
+
);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
} catch {
|
|
124
|
+
// Skip files we can't read
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return false;
|
|
131
|
+
} catch (error) {
|
|
132
|
+
console.warn(` ⚠️ Error checking ${repo}: ${error.message}`);
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
2
136
|
|
|
3
137
|
/**
|
|
4
138
|
* Dispatch schema update events to repositories
|
|
@@ -93,7 +227,7 @@ export const dispatchUpdate = async (options) => {
|
|
|
93
227
|
let allRepos;
|
|
94
228
|
if (dryRun && (token === "fake-token" || token.startsWith("fake"))) {
|
|
95
229
|
console.log("DRY RUN: Using simulated repositories");
|
|
96
|
-
allRepos = `${orgName}/
|
|
230
|
+
allRepos = `${orgName}/embrace\n${sourceRepo}\n`;
|
|
97
231
|
} else {
|
|
98
232
|
allRepos = await fetchAllRepos();
|
|
99
233
|
}
|
|
@@ -110,20 +244,53 @@ export const dispatchUpdate = async (options) => {
|
|
|
110
244
|
}
|
|
111
245
|
|
|
112
246
|
// Remove empty lines and current repository from the list
|
|
113
|
-
const
|
|
247
|
+
const candidateRepos = filteredRepos
|
|
114
248
|
.split("\n")
|
|
115
249
|
.filter((repo) => repo.trim() && repo !== sourceRepo)
|
|
116
250
|
.filter((repo) => repo.length > 0);
|
|
117
251
|
|
|
118
|
-
if (
|
|
119
|
-
console.log("⚠️ No
|
|
252
|
+
if (candidateRepos.length === 0) {
|
|
253
|
+
console.log("⚠️ No candidate repositories found");
|
|
120
254
|
return { success: 0, errors: 0, total: 0 };
|
|
121
255
|
}
|
|
122
256
|
|
|
123
|
-
console.log(
|
|
257
|
+
console.log(
|
|
258
|
+
`🔍 Checking ${candidateRepos.length} repositories for workflow files...`,
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
// Check each repository for the graphql-schema-updated workflow
|
|
262
|
+
const targetRepos = [];
|
|
263
|
+
const skippedRepos = [];
|
|
264
|
+
|
|
265
|
+
for (const repo of candidateRepos) {
|
|
266
|
+
const hasWorkflow = await checkForSchemaWorkflow(repo, token, dryRun);
|
|
267
|
+
if (hasWorkflow) {
|
|
268
|
+
targetRepos.push(repo);
|
|
269
|
+
} else {
|
|
270
|
+
skippedRepos.push(repo);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
console.log("");
|
|
275
|
+
console.log(`✅ Found ${targetRepos.length} repositories with workflow:`);
|
|
124
276
|
targetRepos.forEach((repo) => console.log(` - ${repo}`));
|
|
277
|
+
|
|
278
|
+
if (skippedRepos.length > 0) {
|
|
279
|
+
console.log("");
|
|
280
|
+
console.log(
|
|
281
|
+
`⏭️ Skipped ${skippedRepos.length} repositories without workflow:`,
|
|
282
|
+
);
|
|
283
|
+
skippedRepos.forEach((repo) => console.log(` - ${repo}`));
|
|
284
|
+
}
|
|
125
285
|
console.log("");
|
|
126
286
|
|
|
287
|
+
if (targetRepos.length === 0) {
|
|
288
|
+
console.log(
|
|
289
|
+
"⚠️ No repositories found with graphql-schema-updated workflow",
|
|
290
|
+
);
|
|
291
|
+
return { success: 0, errors: 0, total: 0 };
|
|
292
|
+
}
|
|
293
|
+
|
|
127
294
|
if (dryRun) {
|
|
128
295
|
console.log("DRY RUN: Would dispatch to the above repositories");
|
|
129
296
|
return {
|
package/src/fetch-schema.js
CHANGED
|
@@ -1,48 +1,25 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import fse from "fs-extra";
|
|
3
|
-
import { buildClientSchema, getIntrospectionQuery, printSchema } from "graphql";
|
|
4
3
|
import path from "path";
|
|
5
4
|
|
|
6
5
|
export const fetchSchema = async ({ url, output }) => {
|
|
7
6
|
try {
|
|
8
7
|
console.log(`🔄 Fetching GraphQL schema from ${url}...`);
|
|
9
8
|
|
|
10
|
-
//
|
|
11
|
-
const introspectionQuery = getIntrospectionQuery();
|
|
12
|
-
|
|
13
|
-
// Fetch schema using introspection
|
|
9
|
+
// Fetch schema SDL directly via GET
|
|
14
10
|
const response = await fetch(url, {
|
|
15
|
-
method: "
|
|
11
|
+
method: "GET",
|
|
16
12
|
headers: {
|
|
17
|
-
|
|
18
|
-
Accept: "application/json",
|
|
13
|
+
Accept: "application/graphql, text/plain",
|
|
19
14
|
},
|
|
20
|
-
body: JSON.stringify({
|
|
21
|
-
query: introspectionQuery,
|
|
22
|
-
}),
|
|
23
15
|
});
|
|
24
16
|
|
|
25
17
|
if (!response.ok) {
|
|
26
18
|
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
27
19
|
}
|
|
28
20
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (result.errors) {
|
|
32
|
-
throw new Error(
|
|
33
|
-
`GraphQL errors: ${result.errors.map((e) => e.message).join(", ")}`,
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (!result.data) {
|
|
38
|
-
throw new Error("No data returned from introspection query");
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Build schema from introspection result
|
|
42
|
-
const schema = buildClientSchema(result.data);
|
|
43
|
-
|
|
44
|
-
// Convert schema to SDL (Schema Definition Language)
|
|
45
|
-
const schemaSDL = printSchema(schema);
|
|
21
|
+
// Read response as text (schema SDL)
|
|
22
|
+
const schemaSDL = await response.text();
|
|
46
23
|
|
|
47
24
|
// Ensure output directory exists
|
|
48
25
|
const outputDir = path.dirname(output);
|
|
@@ -52,9 +29,6 @@ export const fetchSchema = async ({ url, output }) => {
|
|
|
52
29
|
fs.writeFileSync(output, schemaSDL, "utf8");
|
|
53
30
|
|
|
54
31
|
console.log(`✅ Schema successfully saved to ${output}`);
|
|
55
|
-
console.log(
|
|
56
|
-
`📊 Schema contains ${Object.keys(schema.getTypeMap()).length} types`,
|
|
57
|
-
);
|
|
58
32
|
} catch (error) {
|
|
59
33
|
console.error(`❌ Failed to fetch schema: ${error.message}`);
|
|
60
34
|
process.exit(1);
|
|
@@ -4,7 +4,12 @@ name: Validate GraphQL Schema Updates
|
|
|
4
4
|
on:
|
|
5
5
|
repository_dispatch:
|
|
6
6
|
types: [graphql-schema-updated]
|
|
7
|
-
workflow_dispatch:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
inputs:
|
|
9
|
+
schema_url:
|
|
10
|
+
description: "Schema URL to validate against"
|
|
11
|
+
required: false
|
|
12
|
+
default: ""
|
|
8
13
|
|
|
9
14
|
jobs:
|
|
10
15
|
validate-schema:
|
|
@@ -37,16 +42,38 @@ jobs:
|
|
|
37
42
|
role-to-assume: ${{ secrets.AWS_DEPLOY_ROLE_DEV }}
|
|
38
43
|
aws-region: ${{ vars.AWS_REGION }}
|
|
39
44
|
|
|
45
|
+
- name: Determine schema URL
|
|
46
|
+
id: schema-url
|
|
47
|
+
run: |
|
|
48
|
+
if [ "${{ github.event_name }}" = "repository_dispatch" ]; then
|
|
49
|
+
# Use the schema URL from the dispatch event
|
|
50
|
+
SCHEMA_URL="${{ github.event.client_payload.schemaUrl }}"
|
|
51
|
+
echo "📡 Using schema URL from dispatch event: $SCHEMA_URL"
|
|
52
|
+
elif [ -n "${{ github.event.inputs.schema_url }}" ]; then
|
|
53
|
+
# Use the schema URL from workflow_dispatch input
|
|
54
|
+
SCHEMA_URL="${{ github.event.inputs.schema_url }}"
|
|
55
|
+
echo "🔧 Using schema URL from workflow input: $SCHEMA_URL"
|
|
56
|
+
else
|
|
57
|
+
echo "❌ Error: No schema URL provided"
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
echo "url=$SCHEMA_URL" >> $GITHUB_OUTPUT
|
|
61
|
+
|
|
40
62
|
- name: Display schema update context
|
|
41
63
|
run: |
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
64
|
+
if [ "${{ github.event_name }}" = "repository_dispatch" ]; then
|
|
65
|
+
echo "Schema update received from: ${{ github.event.client_payload.sourceRepo }}"
|
|
66
|
+
echo "Schema URL: ${{ github.event.client_payload.schemaUrl }}"
|
|
67
|
+
echo "Source commit: ${{ github.event.client_payload.commit }}"
|
|
68
|
+
echo "Source branch: ${{ github.event.client_payload.branch }}"
|
|
69
|
+
echo "Timestamp: ${{ github.event.client_payload.timestamp }}"
|
|
70
|
+
else
|
|
71
|
+
echo "Event type: ${{ github.event_name }}"
|
|
72
|
+
echo "Schema URL: ${{ steps.schema-url.outputs.url }}"
|
|
73
|
+
fi
|
|
47
74
|
|
|
48
75
|
- name: Fetch updated schema
|
|
49
|
-
run: pnpm exec api-tool fetch --url ${{
|
|
76
|
+
run: pnpm exec api-tool fetch --url ${{ steps.schema-url.outputs.url }} --output new-schema.graphql
|
|
50
77
|
|
|
51
78
|
- name: Validate queries against new schema
|
|
52
79
|
id: validate
|
|
@@ -71,17 +98,18 @@ jobs:
|
|
|
71
98
|
- name: Commit and create PR with issues
|
|
72
99
|
uses: peter-evans/create-pull-request@v6
|
|
73
100
|
with:
|
|
74
|
-
commit-message: "chore(api): GraphQL schema update from
|
|
101
|
+
commit-message: "chore(api): GraphQL schema update${{ github.event_name == 'repository_dispatch' && format(' from {0}', github.event.client_payload.sourceRepo) || '' }}"
|
|
75
102
|
branch: "graphql/schema-update-${{ github.run_id }}"
|
|
76
103
|
title: "GraphQL Schema Update (${{ steps.check-issues.outputs.issue_count }} issues)"
|
|
77
104
|
body: |
|
|
78
105
|
# GraphQL Schema Update Impact Report
|
|
79
106
|
|
|
80
|
-
**Schema Source:**
|
|
81
|
-
**Schema URL:** ${{
|
|
82
|
-
**Source Commit:**
|
|
83
|
-
**Source Branch:**
|
|
84
|
-
**Update Time:**
|
|
107
|
+
${{ github.event_name == 'repository_dispatch' && format('**Schema Source:** {0}', github.event.client_payload.sourceRepo) || '' }}
|
|
108
|
+
**Schema URL:** ${{ steps.schema-url.outputs.url }}
|
|
109
|
+
${{ github.event_name == 'repository_dispatch' && format('**Source Commit:** {0}', github.event.client_payload.commit) || '' }}
|
|
110
|
+
${{ github.event_name == 'repository_dispatch' && format('**Source Branch:** {0}', github.event.client_payload.branch) || '' }}
|
|
111
|
+
${{ github.event_name == 'repository_dispatch' && format('**Update Time:** {0}', github.event.client_payload.timestamp) || '' }}
|
|
112
|
+
**Trigger:** ${{ github.event_name }}
|
|
85
113
|
|
|
86
114
|
---
|
|
87
115
|
## ${{ steps.check-issues.outputs.has_issues == 'true' && 'Detected Issues' || '🎉 No Issues Found' }}
|
|
@@ -93,8 +121,33 @@ jobs:
|
|
|
93
121
|
3. Test your changes thoroughly
|
|
94
122
|
4. Merge this PR once all issues are resolved
|
|
95
123
|
|
|
124
|
+
- name: Display validation results (for manual runs)
|
|
125
|
+
if: github.event_name == 'workflow_dispatch'
|
|
126
|
+
run: |
|
|
127
|
+
echo "## 📊 GraphQL Schema Validation Results" >> $GITHUB_STEP_SUMMARY
|
|
128
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
129
|
+
echo "**Schema URL:** ${{ steps.schema-url.outputs.url }}" >> $GITHUB_STEP_SUMMARY
|
|
130
|
+
echo "**Event:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY
|
|
131
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
132
|
+
|
|
133
|
+
if [ "${{ steps.check-issues.outputs.has_issues }}" = "true" ]; then
|
|
134
|
+
echo "### ❌ Found ${{ steps.check-issues.outputs.issue_count }} issue(s)" >> $GITHUB_STEP_SUMMARY
|
|
135
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
136
|
+
if [ -f GRAPHQL_ISSUES.md ]; then
|
|
137
|
+
cat GRAPHQL_ISSUES.md >> $GITHUB_STEP_SUMMARY
|
|
138
|
+
fi
|
|
139
|
+
else
|
|
140
|
+
echo "### ✅ No compatibility issues found!" >> $GITHUB_STEP_SUMMARY
|
|
141
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
142
|
+
echo "The schema is compatible with all existing GraphQL queries." >> $GITHUB_STEP_SUMMARY
|
|
143
|
+
fi
|
|
144
|
+
|
|
96
145
|
- name: Create success comment
|
|
97
146
|
if: steps.check-issues.outputs.has_issues == 'false'
|
|
98
147
|
run: |
|
|
99
148
|
echo "✅ No GraphQL compatibility issues found!"
|
|
100
|
-
|
|
149
|
+
if [ "${{ github.event_name }}" = "repository_dispatch" ]; then
|
|
150
|
+
echo "Schema from ${{ github.event.client_payload.sourceRepo }} is compatible with existing queries."
|
|
151
|
+
else
|
|
152
|
+
echo "Schema from ${{ steps.schema-url.outputs.url }} is compatible with existing queries."
|
|
153
|
+
fi
|