@embrace-ai/infra-api-schema-sync 1.0.10 → 1.0.11

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 CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.0.11](https://github.com/Embrace-AI/infra-api-schema-sync/compare/v1.0.10...v1.0.11) (2026-05-01)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * skip dangling symlinks in validate findFiles walk ([#124](https://github.com/Embrace-AI/infra-api-schema-sync/issues/124)) ([f89c24d](https://github.com/Embrace-AI/infra-api-schema-sync/commit/f89c24deb97c7c364b39c628d8f7f22ae9a22f6d))
9
+
3
10
  ## [1.0.10](https://github.com/Embrace-AI/infra-api-schema-sync/compare/v1.0.9...v1.0.10) (2026-04-21)
4
11
 
5
12
 
@@ -3,5 +3,6 @@ export function validateSchema({ schema, queries, output }: {
3
3
  queries: any;
4
4
  output: any;
5
5
  }): Promise<void>;
6
+ export function findFiles(pattern: any): any[];
6
7
  export default validateSchema;
7
8
  //# sourceMappingURL=validate-schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-schema.d.ts","sourceRoot":"","sources":["../../src/validate-schema.js"],"names":[],"mappings":"AAMO;;;;kBAwGN"}
1
+ {"version":3,"file":"validate-schema.d.ts","sourceRoot":"","sources":["../../src/validate-schema.js"],"names":[],"mappings":"AAMO;;;;kBAwGN;AAEM,+CA0DN"}
@@ -80,7 +80,7 @@ export const validateSchema = async ({ schema, queries, output }) => {
80
80
  process.exit(1);
81
81
  }
82
82
  };
83
- const findFiles = (pattern) => {
83
+ export const findFiles = (pattern) => {
84
84
  if (fs.existsSync(pattern) && fs.statSync(pattern).isFile()) {
85
85
  return [pattern];
86
86
  }
@@ -89,10 +89,24 @@ const findFiles = (pattern) => {
89
89
  const dir = pattern.includes("/") ? path.dirname(pattern) : ".";
90
90
  const searchDir = fs.existsSync(dir) ? dir : ".";
91
91
  const searchDirectory = (dirPath, recursive = false) => {
92
- const entries = fs.readdirSync(dirPath);
92
+ let entries;
93
+ try {
94
+ entries = fs.readdirSync(dirPath);
95
+ }
96
+ catch (err) {
97
+ console.info(`ℹ️ Skipping unreadable directory ${dirPath}: ${err.message}`);
98
+ return;
99
+ }
93
100
  for (const entry of entries) {
94
101
  const fullPath = path.join(dirPath, entry);
95
- const stat = fs.statSync(fullPath);
102
+ let stat;
103
+ try {
104
+ stat = fs.statSync(fullPath);
105
+ }
106
+ catch (err) {
107
+ console.info(`ℹ️ Skipping ${fullPath}: ${err.message}`);
108
+ continue;
109
+ }
96
110
  if (stat.isDirectory() && recursive) {
97
111
  searchDirectory(fullPath, true);
98
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validate-schema.js","sourceRoot":"","sources":["../../src/validate-schema.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate-schema.js","sourceRoot":"","sources":["../../src/validate-schema.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validate-schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-schema.test.d.ts","sourceRoot":"","sources":["../../src/validate-schema.test.js"],"names":[],"mappings":""}
@@ -0,0 +1,63 @@
1
+ import fs from "fs";
2
+ import os from "os";
3
+ import path from "path";
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
+ import { findFiles } from "./validate-schema.js";
6
+ describe("findFiles", () => {
7
+ let tmpDir;
8
+ let originalCwd;
9
+ beforeEach(() => {
10
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "validate-schema-test-"));
11
+ originalCwd = process.cwd();
12
+ process.chdir(tmpDir);
13
+ });
14
+ afterEach(() => {
15
+ process.chdir(originalCwd);
16
+ fs.rmSync(tmpDir, { recursive: true, force: true });
17
+ });
18
+ it("returns matching .graphql files in the tree", () => {
19
+ fs.mkdirSync("src/a", { recursive: true });
20
+ fs.writeFileSync("src/a/query.graphql", "{ hello }");
21
+ fs.writeFileSync("src/other.graphql", "{ world }");
22
+ fs.writeFileSync("src/a/skip.txt", "ignored");
23
+ const files = findFiles("src/**/*.graphql").sort();
24
+ expect(files).toEqual([
25
+ path.join("src", "a", "query.graphql"),
26
+ path.join("src", "other.graphql"),
27
+ ].sort());
28
+ });
29
+ it("skips dangling symlinks instead of crashing", () => {
30
+ fs.mkdirSync("src/pkg", { recursive: true });
31
+ fs.writeFileSync("src/pkg/query.graphql", "{ hello }");
32
+ fs.symlinkSync("does-not-exist", "src/pkg/dangling");
33
+ expect(() => findFiles("src/**/*.graphql")).not.toThrow();
34
+ const files = findFiles("src/**/*.graphql");
35
+ expect(files).toContain(path.join("src", "pkg", "query.graphql"));
36
+ });
37
+ it("skips unreadable directories instead of crashing", () => {
38
+ fs.mkdirSync("src/ok", { recursive: true });
39
+ fs.writeFileSync("src/ok/query.graphql", "{ hello }");
40
+ fs.mkdirSync("src/blocked", { recursive: true });
41
+ const blockedPath = path.join("src", "blocked");
42
+ const originalReaddirSync = fs.readdirSync;
43
+ const readdirSpy = vi
44
+ .spyOn(fs, "readdirSync")
45
+ .mockImplementation((dirPath, options) => {
46
+ if (dirPath === blockedPath) {
47
+ const err = new Error("EACCES: permission denied");
48
+ err.code = "EACCES";
49
+ throw err;
50
+ }
51
+ return originalReaddirSync(dirPath, options);
52
+ });
53
+ try {
54
+ expect(() => findFiles("src/**/*.graphql")).not.toThrow();
55
+ const files = findFiles("src/**/*.graphql");
56
+ expect(files).toContain(path.join("src", "ok", "query.graphql"));
57
+ }
58
+ finally {
59
+ readdirSpy.mockRestore();
60
+ }
61
+ });
62
+ });
63
+ //# sourceMappingURL=validate-schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-schema.test.js","sourceRoot":"","sources":["../../src/validate-schema.test.js"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embrace-ai/infra-api-schema-sync",
3
- "version": "1.0.10",
3
+ "version": "1.0.11",
4
4
  "bin": {
5
5
  "api-tool": "./dist/src/index.js"
6
6
  },
@@ -33,23 +33,23 @@
33
33
  "yaml": "^2.8.0"
34
34
  },
35
35
  "devDependencies": {
36
- "@eslint/compat": "2.0.4",
36
+ "@eslint/compat": "2.0.5",
37
37
  "@graphql-inspector/core": "7.1.2",
38
38
  "@trivago/prettier-plugin-sort-imports": "6.0.2",
39
39
  "@tsconfig/node22": "22.0.5",
40
40
  "@types/node": "24.12.2",
41
- "@typescript-eslint/eslint-plugin": "8.58.0",
42
- "@typescript-eslint/parser": "8.58.0",
43
- "@vitest/coverage-v8": "4.1.3",
41
+ "@typescript-eslint/eslint-plugin": "8.58.2",
42
+ "@typescript-eslint/parser": "8.58.2",
43
+ "@vitest/coverage-v8": "4.1.4",
44
44
  "eslint": "9.39.4",
45
45
  "eslint-config-prettier": "10.1.8",
46
46
  "eslint-plugin-prefer-arrow": "1.2.3",
47
47
  "eslint-plugin-prettier": "5.5.5",
48
48
  "eslint-plugin-unused-imports": "4.4.1",
49
- "prettier": "3.8.1",
49
+ "prettier": "3.8.3",
50
50
  "ts-pattern": "5.9.0",
51
- "typescript": "6.0.2",
52
- "vitest": "4.1.3"
51
+ "typescript": "6.0.3",
52
+ "vitest": "4.1.4"
53
53
  },
54
54
  "scripts": {
55
55
  "clean": "rm -rf dist",
@@ -110,7 +110,7 @@ export const validateSchema = async ({ schema, queries, output }) => {
110
110
  }
111
111
  };
112
112
 
113
- const findFiles = (pattern) => {
113
+ export const findFiles = (pattern) => {
114
114
  // Simple glob-like pattern matching for GraphQL files
115
115
  // This handles basic patterns like "*.graphql", "**/*.graphql", etc.
116
116
 
@@ -128,11 +128,27 @@ const findFiles = (pattern) => {
128
128
  const searchDir = fs.existsSync(dir) ? dir : ".";
129
129
 
130
130
  const searchDirectory = (dirPath, recursive = false) => {
131
- const entries = fs.readdirSync(dirPath);
131
+ let entries;
132
+ try {
133
+ entries = fs.readdirSync(dirPath);
134
+ } catch (err) {
135
+ console.info(
136
+ `ℹ️ Skipping unreadable directory ${dirPath}: ${err.message}`,
137
+ );
138
+ return;
139
+ }
132
140
 
133
141
  for (const entry of entries) {
134
142
  const fullPath = path.join(dirPath, entry);
135
- const stat = fs.statSync(fullPath);
143
+ let stat;
144
+ try {
145
+ // statSync follows symlinks, so dangling links throw ENOENT —
146
+ // skip them rather than aborting the whole walk.
147
+ stat = fs.statSync(fullPath);
148
+ } catch (err) {
149
+ console.info(`ℹ️ Skipping ${fullPath}: ${err.message}`);
150
+ continue;
151
+ }
136
152
 
137
153
  if (stat.isDirectory() && recursive) {
138
154
  searchDirectory(fullPath, true);
@@ -0,0 +1,78 @@
1
+ import fs from "fs";
2
+ import os from "os";
3
+ import path from "path";
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
+
6
+ import { findFiles } from "./validate-schema.js";
7
+
8
+ describe("findFiles", () => {
9
+ let tmpDir;
10
+ let originalCwd;
11
+
12
+ beforeEach(() => {
13
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "validate-schema-test-"));
14
+ originalCwd = process.cwd();
15
+ process.chdir(tmpDir);
16
+ });
17
+
18
+ afterEach(() => {
19
+ process.chdir(originalCwd);
20
+ fs.rmSync(tmpDir, { recursive: true, force: true });
21
+ });
22
+
23
+ it("returns matching .graphql files in the tree", () => {
24
+ fs.mkdirSync("src/a", { recursive: true });
25
+ fs.writeFileSync("src/a/query.graphql", "{ hello }");
26
+ fs.writeFileSync("src/other.graphql", "{ world }");
27
+ fs.writeFileSync("src/a/skip.txt", "ignored");
28
+
29
+ const files = findFiles("src/**/*.graphql").sort();
30
+
31
+ expect(files).toEqual(
32
+ [
33
+ path.join("src", "a", "query.graphql"),
34
+ path.join("src", "other.graphql"),
35
+ ].sort(),
36
+ );
37
+ });
38
+
39
+ it("skips dangling symlinks instead of crashing", () => {
40
+ // Repro: packages with a tracked symlink to a gitignored codegen output
41
+ // dir leave a dangling symlink in fresh CI checkouts. The walk must not
42
+ // abort when it hits one.
43
+ fs.mkdirSync("src/pkg", { recursive: true });
44
+ fs.writeFileSync("src/pkg/query.graphql", "{ hello }");
45
+ fs.symlinkSync("does-not-exist", "src/pkg/dangling");
46
+
47
+ expect(() => findFiles("src/**/*.graphql")).not.toThrow();
48
+ const files = findFiles("src/**/*.graphql");
49
+ expect(files).toContain(path.join("src", "pkg", "query.graphql"));
50
+ });
51
+
52
+ it("skips unreadable directories instead of crashing", () => {
53
+ fs.mkdirSync("src/ok", { recursive: true });
54
+ fs.writeFileSync("src/ok/query.graphql", "{ hello }");
55
+ fs.mkdirSync("src/blocked", { recursive: true });
56
+
57
+ const blockedPath = path.join("src", "blocked");
58
+ const originalReaddirSync = fs.readdirSync;
59
+ const readdirSpy = vi
60
+ .spyOn(fs, "readdirSync")
61
+ .mockImplementation((dirPath, options) => {
62
+ if (dirPath === blockedPath) {
63
+ const err = new Error("EACCES: permission denied");
64
+ err.code = "EACCES";
65
+ throw err;
66
+ }
67
+ return originalReaddirSync(dirPath, options);
68
+ });
69
+
70
+ try {
71
+ expect(() => findFiles("src/**/*.graphql")).not.toThrow();
72
+ const files = findFiles("src/**/*.graphql");
73
+ expect(files).toContain(path.join("src", "ok", "query.graphql"));
74
+ } finally {
75
+ readdirSpy.mockRestore();
76
+ }
77
+ });
78
+ });