diff --git a/.eslintrc.json b/.eslintrc.json index ef6c9f4c..f335b6e3 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -93,9 +93,10 @@ } }, { - "files": ["./src/static/helpers/slasHelper.ts"], + "files": ["./src/static/helpers/slasHelper.ts", "./src/static/helpers/types.ts"], "rules": { - "max-lines": "off" + "max-lines": "off", + "camelcase": "off" } } ], diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e6156ade..49efa438 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,8 +9,7 @@ jobs: linux-tests: strategy: matrix: - # TODO: remove older versions of node - node: [12, 14, 16, 18, 20, 22] + node: [20, 22] fail-fast: false runs-on: ubuntu-latest steps: diff --git a/.gitignore b/.gitignore index fc7f9a64..f644e1f0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ # build files /src/lib src/react-app-env.d.ts +openapitools.json # dependencies /node_modules diff --git a/apis/shopper-context-oas/shopper-context-oas-v1-bundled.yaml b/apis/shopper-context-oas/shopper-context-oas-v1-bundled.yaml index af139922..27d90fef 100644 --- a/apis/shopper-context-oas/shopper-context-oas-v1-bundled.yaml +++ b/apis/shopper-context-oas/shopper-context-oas-v1-bundled.yaml @@ -8,6 +8,7 @@ servers: variables: shortCode: default: shortCode +x-sdk-classname: ShopperContexts paths: /organizations/{organizationId}/shopper-context/{usid}: get: @@ -538,5 +539,3 @@ components: regionCode: '12345' latitude: 10.11 longitude: 198.34 -x-sdk-classname: - classname: ShopperContexts diff --git a/scripts/generate-oas.ts b/scripts/generate-oas.ts index 26e87fe3..5bfba7f0 100644 --- a/scripts/generate-oas.ts +++ b/scripts/generate-oas.ts @@ -32,7 +32,9 @@ const VERSION_TEMPLATE_LOCATION = path.join( ); function kebabToCamelCase(str: string): string { - return str.replace(/-([a-z])/g, (match, letter: string) => letter.toUpperCase()); + return str.replace(/-([a-z])/g, (match, letter: string) => + letter.toUpperCase() + ); } export function resolveApiName(name: string): string { @@ -43,6 +45,9 @@ export function resolveApiName(name: string): string { if (name === 'Shopper Seo OAS') { return 'ShopperSEO'; } + if (name === 'Shopper Context OAS') { + return 'ShopperContexts'; + } return name.replace(/\s+/g, '').replace('OAS', ''); } diff --git a/src/static/helpers/slasHelper.test.ts b/src/static/helpers/slasHelper.test.ts index 54d0eeae..cc98d52e 100644 --- a/src/static/helpers/slasHelper.test.ts +++ b/src/static/helpers/slasHelper.test.ts @@ -233,10 +233,13 @@ describe('Authorize user', () => { // There should be no code_challenge for private client const expectedReqOptions = { + accessToken: "access_token", client_id: 'client_id', channel_id: 'site_id', + dnt: "false", hint: 'hint', redirect_uri: 'redirect_uri', + refreshToken: 'refresh_token', response_type: 'code', usid: 'usid', }; @@ -381,7 +384,7 @@ describe('Guest user flow', () => { expect(accessToken).toBe(expectedTokenResponse); }); - test('throw warning for invalid params', async () => { + test('throws warning for invalid params', async () => { // Spy on console.warn const consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(); @@ -415,7 +418,7 @@ describe('Guest user flow', () => { // Assert the warning was logged expect(consoleWarnSpy).toHaveBeenCalledWith( - expect.stringContaining('Invalid Parameter for authorizeCustomer: hello') + expect.stringContaining('Found unknown parameter for authorizeCustomer: hello, adding as query parameter anyway') ); expect(getAccessTokenMock).toBeCalledWith(expectedTokenBody); @@ -424,7 +427,6 @@ describe('Guest user flow', () => { // Restore the original console.warn consoleWarnSpy.mockRestore(); }); - test('can pass custom params on public guest', async () => { const expectedTokenBody = { body: { diff --git a/src/static/helpers/slasHelper.ts b/src/static/helpers/slasHelper.ts index a5bf813d..a6cf61f7 100644 --- a/src/static/helpers/slasHelper.ts +++ b/src/static/helpers/slasHelper.ts @@ -13,8 +13,8 @@ import { ShopperLogin, ShopperLoginPathParameters, ShopperLoginQueryParameters, - TokenResponse, -} from '../../lib/shopperLogin'; +} from '../../lib/shopperLogin/apis'; +import {TokenResponse} from '../../lib/shopperLogin/models'; import ResponseError from '../responseError'; import TemplateURL from '../templateUrl'; import { diff --git a/src/test/parameters.test.ts b/src/test/parameters.test.ts index 2e21ba94..93bb87fa 100644 --- a/src/test/parameters.test.ts +++ b/src/test/parameters.test.ts @@ -26,9 +26,7 @@ describe('Parameters', () => { ); it('has a list of parameter keys (and the required ones)', () => { - // eslint-disable-next-line expect(ShopperSearch.paramKeys?.productSearch).toBeDefined(); - // eslint-disable-next-line expect(ShopperSearch.paramKeys?.productSearchRequired).toBeDefined(); }); diff --git a/src/test/requests.test.ts b/src/test/requests.test.ts index f7905385..a52ba085 100644 --- a/src/test/requests.test.ts +++ b/src/test/requests.test.ts @@ -8,9 +8,14 @@ import nock from 'nock'; import {BaseUriParameters} from 'lib/helpers'; import { ShopperLoginPathParameters, - ShopperLoginQueryParameters + ShopperLoginQueryParameters, } from '../lib/shopperLogin'; -import {ClientConfig, ClientConfigInit, ShopperLogin, ShopperBaskets} from '../lib'; +import { + ClientConfig, + ClientConfigInit, + ShopperLogin, + ShopperBaskets, +} from '../lib'; const config: ClientConfigInit< ShopperLoginPathParameters & diff --git a/templates/index.ts.hbs b/templates/index.ts.hbs index 13318772..9c4ed383 100644 --- a/templates/index.ts.hbs +++ b/templates/index.ts.hbs @@ -1,6 +1,6 @@ {{#each children}} export { {{apiName}} } from "./{{directoryName}}"; -import type * as {{apiName}}Types from "./{{directoryName}}"; +import { {{apiName}}Types } from "./{{directoryName}}"; export type { {{apiName}}Types }; {{/each}} export type { ClientConfigInit } from "./clientConfig"; diff --git a/templatesOas/apis.mustache b/templatesOas/apis.mustache index 86ba7cf4..bf8aa7ec 100644 --- a/templatesOas/apis.mustache +++ b/templatesOas/apis.mustache @@ -122,7 +122,7 @@ export type {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camel * * */ -export class {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}> { +export class {{#vendorExtensions}}{{#x-sdk-classname}}{{{ . }}}{{/x-sdk-classname}}{{^x-sdk-classname}}{{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}{{/x-sdk-classname}}{{/vendorExtensions}}{{^vendorExtensions}}{{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}{{/vendorExtensions}}> { // baseUri is not required on ClientConfig, but we know that we provide one in the class constructor public clientConfig: ClientConfig & { baseUri: string }; diff --git a/templatesOas/index.mustache b/templatesOas/index.mustache index 6d58e87d..10549e69 100644 --- a/templatesOas/index.mustache +++ b/templatesOas/index.mustache @@ -8,13 +8,13 @@ export * from './apis/index{{importFileExtension}}'; export * from './models/index{{importFileExtension}}'; {{/models.0}} -import type * as ApiTypes from './apis/index' -import type * as ModelTypes from './models/index' +import type * as {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}ApiTypes from './apis/index' +import type * as {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}ModelTypes from './models/index' -export namespace {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}Types { +export namespace {{#apiInfo}}{{#apis.0}}{{#vendorExtensions}}{{#x-sdk-classname}}{{{ . }}}{{/x-sdk-classname}}{{^x-sdk-classname}}{{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}{{/x-sdk-classname}}{{/vendorExtensions}}{{^vendorExtensions}}{{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}{{/vendorExtensions}}{{/apis.0}}{{/apiInfo}}Types { // API types - export type {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}PathParameters = ApiTypes.{{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}PathParameters - export type {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}QueryParameters = ApiTypes.{{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}QueryParameters + export type {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}PathParameters = {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}ApiTypes.{{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}PathParameters + export type {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}QueryParameters = {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}ApiTypes.{{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}QueryParameters {{#apiInfo}} {{#apis}} {{#operations}} @@ -22,12 +22,12 @@ export namespace {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda. {{#allParams}} {{#isEnum}} {{^stringEnums}} - export type {{operationIdCamelCase}}{{enumName}} = ApiTypes.{{operationIdCamelCase}}{{enumName}} + export type {{operationIdCamelCase}}{{enumName}} = {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}ApiTypes.{{operationIdCamelCase}}{{enumName}} {{/stringEnums}} {{/isEnum}} {{/allParams}} - export type {{nickname}}QueryParameters = ApiTypes.{{nickname}}QueryParameters - export type {{nickname}}PathParameters = ApiTypes.{{nickname}}PathParameters + export type {{nickname}}QueryParameters = {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}ApiTypes.{{nickname}}QueryParameters + export type {{nickname}}PathParameters = {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}ApiTypes.{{nickname}}PathParameters {{/operation}} {{/operations}} {{/apis}} @@ -36,11 +36,11 @@ export namespace {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda. // Model types {{#models}} {{#model}} - export type {{classname}} = ModelTypes.{{classname}} + export type {{classname}} = {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}ModelTypes.{{classname}} {{#hasEnums}} {{#vars}} {{#isEnum}} - export type {{classname}}{{enumName}} = ModelTypes.{{classname}}{{enumName}} + export type {{classname}}{{enumName}} = {{#lambda.titlecase}}{{#lambda.camelcase}}{{appName}}{{/lambda.camelcase}}{{/lambda.titlecase}}ModelTypes.{{classname}}{{enumName}} {{/isEnum}} {{/vars}} {{/hasEnums}} diff --git a/templatesOas/modelEnumInterfaces.mustache b/templatesOas/modelEnumInterfaces.mustache index bc78822a..f3ca58b4 100644 --- a/templatesOas/modelEnumInterfaces.mustache +++ b/templatesOas/modelEnumInterfaces.mustache @@ -1,4 +1,3 @@ -{{! *** Default Implementation from Open API generator }} {{#stringEnums}} /** * {{#lambda.indented_star_1}}{{{unescapedDescription}}}{{/lambda.indented_star_1}} @@ -20,17 +19,13 @@ export enum {{classname}} { /** * {{#lambda.indented_star_1}}{{{unescapedDescription}}}{{/lambda.indented_star_1}} */ -export const {{classname}} = { +export type {{classname}} = {{#allowableValues}} {{#enumVars}} {{#enumDescription}} - /** - * {{enumDescription}} - */ + // {{enumDescription}} {{/enumDescription}} - {{{name}}}: {{{value}}}{{^-last}},{{/-last}} + {{{value}}}{{^-last}}|{{/-last}}{{#-last}};{{/-last}} {{/enumVars}} {{/allowableValues}} -} as const; -export type {{classname}} = typeof {{classname}}[keyof typeof {{classname}}]; {{/stringEnums}} diff --git a/templatesOas/modelGenericInterfaces.mustache b/templatesOas/modelGenericInterfaces.mustache index 83f108ef..009acb80 100644 --- a/templatesOas/modelGenericInterfaces.mustache +++ b/templatesOas/modelGenericInterfaces.mustache @@ -25,14 +25,12 @@ export enum {{classname}}{{enumName}} { {{/allowableValues}} } {{/stringEnums}}{{^stringEnums}} -export const {{classname}}{{enumName}} = { +export type {{classname}}{{enumName}} = {{#allowableValues}} {{#enumVars}} - {{{name}}}: {{{value}}}{{^-last}},{{/-last}} + {{{value}}}{{^-last}}|{{/-last}}{{#-last}};{{/-last}} {{/enumVars}} {{/allowableValues}} -} as const; -export type {{classname}}{{enumName}} = typeof {{classname}}{{enumName}}[keyof typeof {{classname}}{{enumName}}]; {{/stringEnums}} {{/isEnum}} {{/vars}}