@checkdigit/eslint-athena-plugin 1.0.0-PR.2-026e → 1.0.0-PR.2-e574

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.
@@ -1,9 +1,9 @@
1
1
  // src/openapi/service-schema-generator.ts
2
2
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { strict as assert } from "node:assert";
3
4
  import debug from "debug";
4
5
  import { buildApiSchemaFromYaml } from "./generate-schema.mjs";
5
6
  var log = debug("eslint-athena-plugin:athena:service-schema-generator");
6
- var ORGANIZATIONS = ["checkdigit"];
7
7
  var SWAGGER_SCHEMA_DEREF_FILENAME = "swagger.schema.deref.json";
8
8
  function errorMessageFromError(error) {
9
9
  return error instanceof Error ? error.message : String(error);
@@ -98,28 +98,45 @@ function findServiceInProject(serviceName) {
98
98
  return findServiceLocally(".", org, serviceName);
99
99
  }
100
100
  function findServiceInNodeModules(serviceName) {
101
- for (const org of ORGANIZATIONS) {
102
- const serviceFolder = `node_modules/@${org}/${serviceName}`;
101
+ const projectPackageJson = JSON.parse(
102
+ readFileSync("./package.json", "utf-8")
103
+ );
104
+ const allDependencies = {
105
+ ...projectPackageJson.dependencies,
106
+ ...projectPackageJson.devDependencies,
107
+ ...projectPackageJson.peerDependencies,
108
+ ...projectPackageJson.optionalDependencies
109
+ };
110
+ const matchingPackages = [
111
+ ...new Set(
112
+ Object.keys(allDependencies).filter((packageName) => {
113
+ const match = /^@(?<org>[^/]+)\/(?<name>.+)$/u.exec(packageName);
114
+ return match?.groups?.["name"] === serviceName;
115
+ })
116
+ )
117
+ ];
118
+ for (const scopedPackageName of matchingPackages) {
119
+ const serviceFolder = `node_modules/${scopedPackageName}`;
120
+ const org = scopedPackageName.slice(1).split("/")[0];
121
+ assert.ok(org !== void 0, "organization must be defined");
103
122
  if (!existsSync(serviceFolder)) {
104
- log(
105
- `[schema-generator] not found in node_modules: @${org}/${serviceName}`
106
- );
123
+ log(`[schema-generator] not found in node_modules: ${scopedPackageName}`);
107
124
  continue;
108
125
  }
109
126
  try {
110
127
  log(
111
- `[schema-generator] found in node_modules: @${org}/${serviceName}, reading swagger files`
128
+ `[schema-generator] found in node_modules: ${scopedPackageName}, reading swagger files`
112
129
  );
113
130
  const source = findServiceLocally(serviceFolder, org, serviceName);
114
131
  if (source !== void 0) {
115
132
  return source;
116
133
  }
117
134
  log(
118
- `[schema-generator] no swagger schema inside node_modules/@${org}/${serviceName}`
135
+ `[schema-generator] no swagger schema inside node_modules/${scopedPackageName}`
119
136
  );
120
137
  } catch (error) {
121
138
  log(
122
- `[schema-generator] error reading node_modules/@${org}/${serviceName}: ${errorMessageFromError(error)}`
139
+ `[schema-generator] error reading node_modules/${scopedPackageName}: ${errorMessageFromError(error)}`
123
140
  );
124
141
  }
125
142
  }
@@ -173,4 +190,4 @@ function generateSchemasForService(serviceName, outputDir) {
173
190
  export {
174
191
  generateSchemasForService
175
192
  };
176
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL29wZW5hcGkvc2VydmljZS1zY2hlbWEtZ2VuZXJhdG9yLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLFNBQVMsWUFBWSxXQUFXLGNBQWMscUJBQXFCO0FBRW5FLE9BQU8sV0FBVztBQUVsQixTQUEwQiw4QkFBOEI7QUFFeEQsSUFBTSxNQUFNLE1BQU0sc0RBQXNEO0FBRXhFLElBQU0sZ0JBQWdCLENBQUMsWUFBWTtBQUNuQyxJQUFNLGdDQUFnQztBQUV0QyxTQUFTLHNCQUFzQixPQUF3QjtBQUNyRCxTQUFPLGlCQUFpQixRQUFRLE1BQU0sVUFBVSxPQUFPLEtBQUs7QUFDOUQ7QUFhQSxTQUFTLGdCQUFnQixTQUFpQztBQUN4RCxRQUFNLGNBQWMsUUFBUSxlQUFlLENBQUM7QUFFNUMsV0FBUyxXQUNQLE9BQ0EsWUFBeUIsb0JBQUksSUFBWSxHQUNoQztBQUNULFFBQUksVUFBVSxRQUFRLE9BQU8sVUFBVSxVQUFVO0FBQy9DLGFBQU87QUFBQSxJQUNUO0FBQ0EsUUFBSSxNQUFNLFFBQVEsS0FBSyxHQUFHO0FBQ3hCLGFBQU8sTUFBTSxJQUFJLENBQUMsU0FBUyxXQUFXLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDeEQ7QUFDQSxVQUFNLE1BQU07QUFDWixRQUFJLE9BQU8sSUFBSSxNQUFNLE1BQU0sVUFBVTtBQUNuQyxZQUFNLFVBQVUsa0NBQWtDLEtBQUssSUFBSSxNQUFNLENBQUMsR0FDOUQsU0FBUyxNQUFNO0FBQ25CLFVBQUksWUFBWSxVQUFhLENBQUMsVUFBVSxJQUFJLE9BQU8sR0FBRztBQUNwRCxlQUFPO0FBQUEsVUFDTCxZQUFZLE9BQU87QUFBQSxVQUNuQixvQkFBSSxJQUFZLENBQUMsR0FBRyxXQUFXLE9BQU8sQ0FBQztBQUFBLFFBQ3pDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFDQSxXQUFPLE9BQU87QUFBQSxNQUNaLE9BQU8sUUFBUSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLE1BQU07QUFB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
193
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL29wZW5hcGkvc2VydmljZS1zY2hlbWEtZ2VuZXJhdG9yLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLFNBQVMsWUFBWSxXQUFXLGNBQWMscUJBQXFCO0FBQ25FLFNBQVMsVUFBVSxjQUFjO0FBRWpDLE9BQU8sV0FBVztBQUVsQixTQUEwQiw4QkFBOEI7QUFFeEQsSUFBTSxNQUFNLE1BQU0sc0RBQXNEO0FBRXhFLElBQU0sZ0NBQWdDO0FBRXRDLFNBQVMsc0JBQXNCLE9BQXdCO0FBQ3JELFNBQU8saUJBQWlCLFFBQVEsTUFBTSxVQUFVLE9BQU8sS0FBSztBQUM5RDtBQWFBLFNBQVMsZ0JBQWdCLFNBQWlDO0FBQ3hELFFBQU0sY0FBYyxRQUFRLGVBQWUsQ0FBQztBQUU1QyxXQUFTLFdBQ1AsT0FDQSxZQUF5QixvQkFBSSxJQUFZLEdBQ2hDO0FBQ1QsUUFBSSxVQUFVLFFBQVEsT0FBTyxVQUFVLFVBQVU7QUFDL0MsYUFBTztBQUFBLElBQ1Q7QUFDQSxRQUFJLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFDeEIsYUFBTyxNQUFNLElBQUksQ0FBQyxTQUFTLFdBQVcsTUFBTSxTQUFTLENBQUM7QUFBQSxJQUN4RDtBQUNBLFVBQU0sTUFBTTtBQUNaLFFBQUksT0FBTyxJQUFJLE1BQU0sTUFBTSxVQUFVO0FBQ25DLFlBQU0sVUFBVSxrQ0FBa0MsS0FBSyxJQUFJLE1BQU0sQ0FBQyxHQUM5RCxTQUFTLE1BQU07QUFDbkIsVUFBSSxZQUFZLFVBQWEsQ0FBQyxVQUFVLElBQUksT0FBTyxHQUFHO0FBQ3BELGVBQU87QUFBQSxVQUNMLFlBQVksT0FBTztBQUFBLFVBQ25CLG9CQUFJLElBQVksQ0FBQyxHQUFHLFdBQVcsT0FBTyxDQUFDO0FBQUEsUUFDekM7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUNBLFdBQU8sT0FBTztBQUFBLE1BQ1osT0FBTyxRQUFRLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTTtBQUFBLFFBQ3RD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
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@checkdigit/eslint-athena-plugin","version":"1.0.0-PR.2-026e","private":false,"description":"Check Digit eslint plugins to enforce best practices for projects using Athena SQL.","keywords":["eslint","athena"],"homepage":"https://github.com/checkdigit/eslint-athena-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-athena-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-athena-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-mjs","!src/**/test/**","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/test/**","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-mjs/**/test/**","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 .","lint:fix":"eslint --max-warnings 0 --fix .","peggy":"for file in ./src/peggy/*.peggy; do peggy \"$file\" --format es --output \"${file%.peggy}-peggy.ts\"; done","peggy-watch":"for file in ./src/peggy/*.peggy; do peggy \"$file\" --format=es --watch --output=\"${file%.peggy}-peggy.ts\"; done","prepare":"","prepublishOnly":"npm run build:dist-types && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --ignore-path .prettierignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --ignore-path .prettierignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@apidevtools/json-schema-ref-parser":"^15.4.0","@typescript-eslint/type-utils":"^8.61.1","@typescript-eslint/utils":"^8.61.1","ajv":"^8.20.0","debug":"^4.4.3","glob":"^13.0.6","http-status-codes":"^2.3.0","js-yaml":"^4.2.0","json-pointer":"^0.6.2","jsonpath-plus":"^10.4.0","ts-api-utils":"^2.5.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^8.0.0","@checkdigit/typescript-config":"10.0.0","@eslint/js":"^9.37.0","@types/debug":"^4.1.13","@types/eslint":"^9.6.1","@types/eslint-config-prettier":"^6.11.3","@types/js-yaml":"^4.0.9","@types/json-pointer":"^1.0.34","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/rule-tester":"^8.61.1","eslint":"^9.37.0","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.5","eslint-plugin-eslint-plugin":"^6.4.0","eslint-plugin-import":"^2.32.0","eslint-plugin-no-only-tests":"^3.4.0","eslint-plugin-no-secrets":"^2.3.3","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"^1.0.4","openapi-types":"^12.1.3","peggy":"^4.2.0","rimraf":"^6.1.3","typescript-eslint":"^8.61.1"},"peerDependencies":{"eslint":">=9 <10"},"engines":{"node":">=24.14.1"},"service":{"api":{"root":"src","endpoints":["api/v1","api/v2"]}}}
1
+ {"name":"@checkdigit/eslint-athena-plugin","version":"1.0.0-PR.2-e574","private":false,"description":"Check Digit eslint plugins to enforce best practices for projects using Athena SQL.","keywords":["eslint","athena"],"homepage":"https://github.com/checkdigit/eslint-athena-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-athena-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-athena-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-mjs","!src/**/test/**","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/test/**","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-mjs/**/test/**","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 .","lint:fix":"eslint --max-warnings 0 --fix .","peggy":"for file in ./src/peggy/*.peggy; do peggy \"$file\" --format es --output \"${file%.peggy}-peggy.ts\"; done","peggy-watch":"for file in ./src/peggy/*.peggy; do peggy \"$file\" --format=es --watch --output=\"${file%.peggy}-peggy.ts\"; done","prepare":"","prepublishOnly":"npm run build:dist-types && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --ignore-path .prettierignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --ignore-path .prettierignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@apidevtools/json-schema-ref-parser":"^15.4.0","@typescript-eslint/type-utils":"^8.61.1","@typescript-eslint/utils":"^8.61.1","ajv":"^8.20.0","debug":"^4.4.3","glob":"^13.0.6","http-status-codes":"^2.3.0","js-yaml":"^4.2.0","json-pointer":"^0.6.2","jsonpath-plus":"^10.4.0","ts-api-utils":"^2.5.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^8.0.0","@checkdigit/typescript-config":"10.0.0","@eslint/js":"^9.37.0","@types/debug":"^4.1.13","@types/eslint":"^9.6.1","@types/eslint-config-prettier":"^6.11.3","@types/js-yaml":"^4.0.9","@types/json-pointer":"^1.0.34","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/rule-tester":"^8.61.1","eslint":"^9.37.0","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.5","eslint-plugin-eslint-plugin":"^6.4.0","eslint-plugin-import":"^2.32.0","eslint-plugin-no-only-tests":"^3.4.0","eslint-plugin-no-secrets":"^2.3.3","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"^1.0.4","openapi-types":"^12.1.3","peggy":"^4.2.0","rimraf":"^6.1.3","typescript-eslint":"^8.61.1"},"peerDependencies":{"eslint":">=9 <10"},"engines":{"node":">=24.14.1"},"service":{"api":{"root":"src","endpoints":["api/v1","api/v2"]}}}
@@ -1,6 +1,7 @@
1
1
  // openapi/service-schema-generator.ts
2
2
 
3
3
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
+ import { strict as assert } from 'node:assert';
4
5
 
5
6
  import debug from 'debug';
6
7
 
@@ -8,7 +9,6 @@ import { type ApiSchemas, buildApiSchemaFromYaml } from './generate-schema.ts';
8
9
 
9
10
  const log = debug('eslint-athena-plugin:athena:service-schema-generator');
10
11
 
11
- const ORGANIZATIONS = ['checkdigit'] as const;
12
12
  const SWAGGER_SCHEMA_DEREF_FILENAME = 'swagger.schema.deref.json';
13
13
 
14
14
  function errorMessageFromError(error: unknown): string {
@@ -157,28 +157,53 @@ function findServiceInProject(serviceName: string): ServiceSource | undefined {
157
157
  function findServiceInNodeModules(
158
158
  serviceName: string,
159
159
  ): ServiceSource | undefined {
160
- for (const org of ORGANIZATIONS) {
161
- const serviceFolder = `node_modules/@${org}/${serviceName}`;
160
+ const projectPackageJson = JSON.parse(
161
+ readFileSync('./package.json', 'utf-8'),
162
+ ) as {
163
+ dependencies?: Record<string, string>;
164
+ devDependencies?: Record<string, string>;
165
+ peerDependencies?: Record<string, string>;
166
+ optionalDependencies?: Record<string, string>;
167
+ };
168
+
169
+ const allDependencies = {
170
+ ...projectPackageJson.dependencies,
171
+ ...projectPackageJson.devDependencies,
172
+ ...projectPackageJson.peerDependencies,
173
+ ...projectPackageJson.optionalDependencies,
174
+ };
175
+
176
+ const matchingPackages = [
177
+ ...new Set(
178
+ Object.keys(allDependencies).filter((packageName) => {
179
+ const match = /^@(?<org>[^/]+)\/(?<name>.+)$/u.exec(packageName);
180
+ return match?.groups?.['name'] === serviceName;
181
+ }),
182
+ ),
183
+ ];
184
+
185
+ for (const scopedPackageName of matchingPackages) {
186
+ const serviceFolder = `node_modules/${scopedPackageName}`;
187
+ const org = scopedPackageName.slice(1).split('/')[0];
188
+ assert.ok(org !== undefined, 'organization must be defined');
162
189
  if (!existsSync(serviceFolder)) {
163
- log(
164
- `[schema-generator] not found in node_modules: @${org}/${serviceName}`,
165
- );
190
+ log(`[schema-generator] not found in node_modules: ${scopedPackageName}`);
166
191
  continue;
167
192
  }
168
193
  try {
169
194
  log(
170
- `[schema-generator] found in node_modules: @${org}/${serviceName}, reading swagger files`,
195
+ `[schema-generator] found in node_modules: ${scopedPackageName}, reading swagger files`,
171
196
  );
172
197
  const source = findServiceLocally(serviceFolder, org, serviceName);
173
198
  if (source !== undefined) {
174
199
  return source;
175
200
  }
176
201
  log(
177
- `[schema-generator] no swagger schema inside node_modules/@${org}/${serviceName}`,
202
+ `[schema-generator] no swagger schema inside node_modules/${scopedPackageName}`,
178
203
  );
179
204
  } catch (error) {
180
205
  log(
181
- `[schema-generator] error reading node_modules/@${org}/${serviceName}: ${errorMessageFromError(error)}`,
206
+ `[schema-generator] error reading node_modules/${scopedPackageName}: ${errorMessageFromError(error)}`,
182
207
  );
183
208
  }
184
209
  }