diff --git a/packages/api/src/bin.ts b/packages/api/src/bin.ts index bb66f3df..e45a89d0 100644 --- a/packages/api/src/bin.ts +++ b/packages/api/src/bin.ts @@ -1,6 +1,6 @@ import { Command } from 'commander'; -import commands from './cli/commands'; +import commands from './commands'; import * as pkg from './packageInfo'; (async () => { diff --git a/packages/api/src/cli/codegen/index.ts b/packages/api/src/codegen/index.ts similarity index 100% rename from packages/api/src/cli/codegen/index.ts rename to packages/api/src/codegen/index.ts diff --git a/packages/api/src/cli/codegen/language.ts b/packages/api/src/codegen/language.ts similarity index 96% rename from packages/api/src/cli/codegen/language.ts rename to packages/api/src/codegen/language.ts index 314334ac..8e4061c1 100644 --- a/packages/api/src/cli/codegen/language.ts +++ b/packages/api/src/codegen/language.ts @@ -1,7 +1,7 @@ import type Storage from '../storage'; import type Oas from 'oas'; -import { PACKAGE_NAME, PACKAGE_VERSION } from '../../packageInfo'; +import { PACKAGE_NAME, PACKAGE_VERSION } from '../packageInfo'; export interface InstallerOptions { /** diff --git a/packages/api/src/cli/codegen/languages/typescript.ts b/packages/api/src/codegen/languages/typescript.ts similarity index 100% rename from packages/api/src/cli/codegen/languages/typescript.ts rename to packages/api/src/codegen/languages/typescript.ts diff --git a/packages/api/src/cli/codegen/languages/typescript/util.ts b/packages/api/src/codegen/languages/typescript/util.ts similarity index 100% rename from packages/api/src/cli/codegen/languages/typescript/util.ts rename to packages/api/src/codegen/languages/typescript/util.ts diff --git a/packages/api/src/cli/commands/index.ts b/packages/api/src/commands/index.ts similarity index 100% rename from packages/api/src/cli/commands/index.ts rename to packages/api/src/commands/index.ts diff --git a/packages/api/src/cli/commands/install.ts b/packages/api/src/commands/install.ts similarity index 100% rename from packages/api/src/cli/commands/install.ts rename to packages/api/src/commands/install.ts diff --git a/packages/api/src/cli/fetcher.ts b/packages/api/src/fetcher.ts similarity index 100% rename from packages/api/src/cli/fetcher.ts rename to packages/api/src/fetcher.ts diff --git a/packages/api/src/cli/lib/prompt.ts b/packages/api/src/lib/prompt.ts similarity index 100% rename from packages/api/src/cli/lib/prompt.ts rename to packages/api/src/lib/prompt.ts diff --git a/packages/api/src/cli/logger.ts b/packages/api/src/logger.ts similarity index 100% rename from packages/api/src/cli/logger.ts rename to packages/api/src/logger.ts diff --git a/packages/api/src/cli/storage.ts b/packages/api/src/storage.ts similarity index 99% rename from packages/api/src/cli/storage.ts rename to packages/api/src/storage.ts index d2b11b85..71239a26 100644 --- a/packages/api/src/cli/storage.ts +++ b/packages/api/src/storage.ts @@ -7,9 +7,8 @@ import makeDir from 'make-dir'; import ssri from 'ssri'; import validateNPMPackageName from 'validate-npm-package-name'; -import { PACKAGE_VERSION } from '../packageInfo'; - import Fetcher from './fetcher'; +import { PACKAGE_VERSION } from './packageInfo'; export default class Storage { static dir: string; diff --git a/packages/api/test/__fixtures__/oas.json b/packages/api/test/__fixtures__/oas.json deleted file mode 100644 index c6153ee5..00000000 --- a/packages/api/test/__fixtures__/oas.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "openapi": "3.0.0", - "info": { - "version": "1.0.0", - "title": "Single Path", - "description": "This is a slimmed down single path version of the Petstore definition." - }, - "components": { - "securitySchemes": { - "apiKey": { - "type": "http", - "scheme": "basic" - } - } - }, - "servers": [ - { - "url": "https://httpbin.org" - } - ], - "paths": { - "/pet/:id": { - "put": { - "tags": ["pet"], - "summary": "Update a pet", - "description": "This operation will update a pet in the database.", - "responses": { - "400": { - "description": "Invalid id value" - } - }, - "security": [ - { - "apiKey": [] - } - ] - }, - "get": { - "tags": ["pet"], - "summary": "Find a pet", - "description": "This operation will find a pet in the database.", - "responses": { - "400": { - "description": "Invalid status value" - } - }, - "security": [] - } - } - } -} diff --git a/packages/api/test/cli/codegen/languages/typescript.test.ts b/packages/api/test/codegen/languages/typescript.test.ts similarity index 91% rename from packages/api/test/cli/codegen/languages/typescript.test.ts rename to packages/api/test/codegen/languages/typescript.test.ts index d1c6889b..cebefed4 100644 --- a/packages/api/test/cli/codegen/languages/typescript.test.ts +++ b/packages/api/test/codegen/languages/typescript.test.ts @@ -1,4 +1,4 @@ -import type { TSGeneratorOptions } from '../../../../src/cli/codegen/languages/typescript'; +import type { TSGeneratorOptions } from '../../../src/codegen/languages/typescript'; import { promises as fs } from 'fs'; import path from 'path'; @@ -10,9 +10,9 @@ import Oas from 'oas'; import uniqueTempDir from 'unique-temp-dir'; import { describe, beforeEach, afterEach, it, expect, vi } from 'vitest'; -import TSGenerator from '../../../../src/cli/codegen/languages/typescript'; -import Storage from '../../../../src/cli/storage'; -import * as packageInfo from '../../../../src/packageInfo'; +import TSGenerator from '../../../src/codegen/languages/typescript'; +import * as packageInfo from '../../../src/packageInfo'; +import Storage from '../../../src/storage'; function assertSDKFixture(file: string, fixture: string, opts: TSGeneratorOptions = {}) { return async () => { @@ -23,7 +23,7 @@ function assertSDKFixture(file: string, fixture: string, opts: TSGeneratorOption const actualFiles = await ts.generator(); // Determine if the generated code matches what we've got in our fixture. - const dir = path.resolve(path.join(__dirname, '..', '..', '..', '__fixtures__', 'sdk', fixture)); + const dir = path.resolve(path.join(__dirname, '..', '..', '__fixtures__', 'sdk', fixture)); let expectedFiles: string[]; try { @@ -63,7 +63,7 @@ function assertSDKFixture(file: string, fixture: string, opts: TSGeneratorOption ); // Make sure that we can load the SDK without any TS compilation errors. - const sdk = await import(`../../../__fixtures__/sdk/${fixture}`).then(r => r.default); + const sdk = await import(`../../__fixtures__/sdk/${fixture}`).then(r => r.default); expect(sdk.constructor.name).toBe('SDK'); }; } @@ -172,7 +172,7 @@ describe('typescript', () => { }); it('should be able to make an API request (TS)', async () => { - const sdk = await import('../../../__fixtures__/sdk/simple-ts').then(r => r.default); + const sdk = await import('../../__fixtures__/sdk/simple-ts').then(r => r.default); fetchMock.get('http://petstore.swagger.io/v2/pet/findByStatus?status=available', mockResponse.searchParams); await sdk.findPetsByStatus({ status: ['available'] }).then(({ data, status, headers, res }) => { @@ -184,7 +184,7 @@ describe('typescript', () => { }); it('should be able to make an API request with an `accept` header`', async () => { - const sdk = await import('../../../__fixtures__/sdk/simple-ts').then(r => r.default); + const sdk = await import('../../__fixtures__/sdk/simple-ts').then(r => r.default); fetchMock.get('http://petstore.swagger.io/v2/pet/findByStatus?status=available', mockResponse.headers); await sdk @@ -198,7 +198,7 @@ describe('typescript', () => { }); it('should be able to make an API request (JS + CommonJS)', async () => { - const sdk = await import('../../../__fixtures__/sdk/simple-js-cjs').then(r => r.default); + const sdk = await import('../../__fixtures__/sdk/simple-js-cjs').then(r => r.default); fetchMock.get('http://petstore.swagger.io/v2/pet/findByStatus?status=available', mockResponse.searchParams); await sdk.findPetsByStatus({ status: ['available'] }).then(({ data, status, headers, res }) => { @@ -210,7 +210,7 @@ describe('typescript', () => { }); it('should be able to make an API request (JS + ESM)', async () => { - const sdk = await import('../../../__fixtures__/sdk/simple-js-esm').then(r => r.default); + const sdk = await import('../../__fixtures__/sdk/simple-js-esm').then(r => r.default); fetchMock.get('http://petstore.swagger.io/v2/pet/findByStatus?status=available', mockResponse.searchParams); await sdk.findPetsByStatus({ status: ['available'] }).then(({ data, status, headers, res }) => { diff --git a/packages/api/test/cli/codegen/languages/typescript/smoketest.test.ts b/packages/api/test/codegen/languages/typescript/smoketest.test.ts similarity index 97% rename from packages/api/test/cli/codegen/languages/typescript/smoketest.test.ts rename to packages/api/test/codegen/languages/typescript/smoketest.test.ts index ee9c65be..b06fa000 100644 --- a/packages/api/test/cli/codegen/languages/typescript/smoketest.test.ts +++ b/packages/api/test/codegen/languages/typescript/smoketest.test.ts @@ -20,7 +20,7 @@ import Oas from 'oas'; import OASNormalize from 'oas-normalize'; import { describe, it, expect } from 'vitest'; -import TSGenerator from '../../../../../src/cli/codegen/languages/typescript'; +import TSGenerator from '../../../../src/codegen/languages/typescript'; // These APIs don't have any schemas so they should only be generating an `index.ts`. const APIS_WITHOUT_SCHEMAS = ['poemist.com']; diff --git a/packages/api/test/cli/codegen/languages/typescript/utils.test.ts b/packages/api/test/codegen/languages/typescript/utils.test.ts similarity index 97% rename from packages/api/test/cli/codegen/languages/typescript/utils.test.ts rename to packages/api/test/codegen/languages/typescript/utils.test.ts index 7fe16498..7e1cc579 100644 --- a/packages/api/test/cli/codegen/languages/typescript/utils.test.ts +++ b/packages/api/test/codegen/languages/typescript/utils.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; -import { docblockEscape, generateTypeName, wordWrap } from '../../../../../src/cli/codegen/languages/typescript/util'; +import { docblockEscape, generateTypeName, wordWrap } from '../../../../src/codegen/languages/typescript/util'; describe('ts codegen utils', () => { describe('#docblockEscape', () => { diff --git a/packages/api/test/cli/fetcher.test.ts b/packages/api/test/fetcher.test.ts similarity index 95% rename from packages/api/test/cli/fetcher.test.ts rename to packages/api/test/fetcher.test.ts index 22976622..2317d29c 100644 --- a/packages/api/test/cli/fetcher.test.ts +++ b/packages/api/test/fetcher.test.ts @@ -5,7 +5,7 @@ import loadSpec from '@api/test-utils/load-spec'; import fetchMock from 'fetch-mock'; import { describe, beforeAll, it, expect } from 'vitest'; -import Fetcher from '../../src/cli/fetcher'; +import Fetcher from '../src/fetcher'; let readmeSpec; @@ -200,16 +200,15 @@ describe('fetcher', () => { const fetcher = new Fetcher(require.resolve('@readme/oas-examples/3.0/json/readme.json')); const res = await fetcher.load(); - expect(res.paths['/api-specification'].get.parameters).toBeDereferenced(); + expect(res.paths?.['/api-specification']?.get?.parameters).toBeDereferenced(); }); it('should be able to handle a relative path', async () => { - const fetcher = new Fetcher('../api/test/__fixtures__/oas.json'); + const fetcher = new Fetcher('../test-utils/definitions/simple.json'); await expect(fetcher.load()).resolves.toHaveProperty('info', { version: '1.0.0', - title: 'Single Path', - description: 'This is a slimmed down single path version of the Petstore definition.', + title: 'Swagger Petstore', }); }); @@ -218,7 +217,7 @@ describe('fetcher', () => { const fetcher = new Fetcher(file); const res = await fetcher.load(); - expect(res.paths['/api-specification'].get.parameters).toBeDereferenced(); + expect(res.paths?.['/api-specification']?.get?.parameters).toBeDereferenced(); }); }); }); diff --git a/packages/api/test/cli/storage.test.ts b/packages/api/test/storage.test.ts similarity index 96% rename from packages/api/test/cli/storage.test.ts rename to packages/api/test/storage.test.ts index 9dad3aca..21eb6d00 100644 --- a/packages/api/test/cli/storage.test.ts +++ b/packages/api/test/storage.test.ts @@ -9,8 +9,8 @@ import fetchMock from 'fetch-mock'; import uniqueTempDir from 'unique-temp-dir'; import { describe, beforeAll, beforeEach, afterEach, it, expect } from 'vitest'; -import Storage from '../../src/cli/storage'; -import { PACKAGE_VERSION } from '../../src/packageInfo'; +import { PACKAGE_VERSION } from '../src/packageInfo'; +import Storage from '../src/storage'; let petstoreSimple; @@ -287,7 +287,7 @@ describe('storage', () => { }); it('should be able to handle a relative path', async () => { - const file = '../api/test/__fixtures__/oas.json'; + const file = '../test-utils/definitions/simple.json'; const storage = new Storage(file, 'relative-path'); expect(storage.isInLockfile()).toBe(false); @@ -297,14 +297,13 @@ describe('storage', () => { expect(storage.isInLockfile()).toBe(true); expect(storage.getAPIDefinition().info).toStrictEqual({ version: '1.0.0', - title: 'Single Path', - description: 'This is a slimmed down single path version of the Petstore definition.', + title: 'Swagger Petstore', }); expect(storage.getFromLockfile()).toStrictEqual({ identifier: 'relative-path', source: file, - integrity: 'sha512-Qi5BB9mfzkRqHe0rMvjRmKunNJ21zILF0e4KzYKi2hMw+zLfi2idmmn0lAngdRwqYdGIKTXUWhJNn0i3iDqUUg==', + integrity: 'sha512-Ey83iRY4tY7JCCUI03eqfNb8YsxKlBdLILXcLDBbxZ1a2X/YfTspCTA8mLp6aaG9gRSyNMhI1hmtSlduWZw8RA==', installerVersion: PACKAGE_VERSION, }); }); @@ -337,7 +336,7 @@ describe('storage', () => { }); it('should error if definition is not a valid openapi file', async () => { - await expect(new Storage(require.resolve('../../package.json'), 'invalid').load()).rejects.toThrow( + await expect(new Storage(require.resolve('../package.json'), 'invalid').load()).rejects.toThrow( "Sorry, that doesn't look like a valid OpenAPI definition.", ); });