Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .eslintrc.js → .eslintrc.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,13 @@ module.exports = {
"plugin:import/warnings",
"plugin:import/typescript",
],
settings: {
"import/resolver": {
typescript: {
alwaysTryTypes: true,
},
},
},
rules: {
"import/order": "error",
"import/namespace": "off",
Expand Down
20 changes: 17 additions & 3 deletions cli.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
#!/usr/bin/env node

import "reflect-metadata";
import * as yargs from "yargs";
import { log } from "./lib/util/logging";
import { createRequire } from "module";
import yargs from "yargs";
import { log } from "./lib/util/logging.js";
import * as extractXmsExamples from "./lib/commands/extract-xmsexamples.js";
import * as generateExamples from "./lib/commands/generate-examples.js";
import * as trafficConverter from "./lib/commands/traffic-converter.js";
import * as validateExample from "./lib/commands/validate-example.js";
import * as validateSpec from "./lib/commands/validate-spec.js";
import * as validateTraffic from "./lib/commands/validate-traffic.js";

const require = createRequire(import.meta.url);

const defaultLogDir = log.directory;

Expand All @@ -11,7 +20,12 @@ const packageVersion = require("../package.json").version;
// eslint-disable-next-line no-unused-expressions
yargs
.version(packageVersion)
.commandDir("lib/commands")
.command(extractXmsExamples)
.command(generateExamples)
.command(trafficConverter)
.command(validateExample)
.command(validateSpec)
.command(validateTraffic)
.strict()
.option("h", { alias: "help" })
.option("l", {
Expand Down
2 changes: 1 addition & 1 deletion eng/scripts/testNetwork.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import * as oav from "../../index";
import * as oav from "../../index.js";
//import * as fs from "fs"
//import * as path from "path"

Expand Down
65 changes: 38 additions & 27 deletions index.ts
Original file line number Diff line number Diff line change
@@ -1,82 +1,93 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
import "reflect-metadata";
import * as C from "./lib/util/constants";
import * as C from "./lib/util/constants.js";

// Easy to use methods from validate.ts
export {
validateSpec,
validateExamples,
validateTraffic as validateTrafficAgainstSpec,
} from "./lib/validate";
} from "./lib/validate.js";

export { BaseValidationError } from "./lib/util/baseValidationError";
export { Severity } from "./lib/util/severity";
export { ModelValidationError } from "./lib/util/modelValidationError";
export { ValidationResultSource } from "./lib/util/validationResultSource";
export {
export type { BaseValidationError } from "./lib/util/baseValidationError.js";
export { Severity } from "./lib/util/severity.js";
export type { ModelValidationError } from "./lib/util/modelValidationError.js";
export { ValidationResultSource } from "./lib/util/validationResultSource.js";
export { errorCodeToErrorMetadata } from "./lib/util/validationError.js";
export type {
NodeError,
ValidationErrorMetadata,
errorCodeToErrorMetadata,
ValidationResult,
ErrorCode,
ExtendedErrorCode,
WrapperErrorCode,
RuntimeErrorCode,
RuntimeException,
} from "./lib/util/validationError";
} from "./lib/util/validationError.js";

export { getResourceType, getProvider } from "./lib/util/utils";
export { getResourceType, getProvider } from "./lib/util/utils.js";

// Classes
export {
LiveValidator,
LiveValidatorLoggingTypes,
legacyParseValidationRequest as parseValidationRequest,
} from "./lib/liveValidation/liveValidator.js";
export type {
RequestResponsePair,
LiveValidationIssue,
LiveValidatorOptions,
RequestResponseLiveValidationResult,
LiveValidationResult,
ValidateOptions,
LiveValidatorLoggingTypes,
legacyParseValidationRequest as parseValidationRequest,
} from "./lib/liveValidation/liveValidator";
export {
} from "./lib/liveValidation/liveValidator.js";
export type {
LiveRequest,
LiveResponse,
ValidationRequest,
} from "./lib/liveValidation/operationValidator";
} from "./lib/liveValidation/operationValidator.js";

export {
export type {
ScenarioDefinition,
Scenario,
Step,
StepArmTemplate,
StepRestCall,
} from "./lib/apiScenario/apiScenarioTypes";
} from "./lib/apiScenario/apiScenarioTypes.js";

export { FileLoaderOption, FileLoader } from "./lib/swagger/fileLoader";
export { FileLoader } from "./lib/swagger/fileLoader.js";
export type { FileLoaderOption } from "./lib/swagger/fileLoader.js";

export { SwaggerLoaderOption, SwaggerLoader } from "./lib/swagger/swaggerLoader";
export { SwaggerLoader } from "./lib/swagger/swaggerLoader.js";
export type { SwaggerLoaderOption } from "./lib/swagger/swaggerLoader.js";

export { SuppressionLoaderOption, SuppressionLoader } from "./lib/swagger/suppressionLoader";
export { SuppressionLoader } from "./lib/swagger/suppressionLoader.js";
export type { SuppressionLoaderOption } from "./lib/swagger/suppressionLoader.js";

export { JsonLoader, JsonLoaderOption, JsonLoaderRefError } from "./lib/swagger/jsonLoader";
export { JsonLoader, JsonLoaderRefError } from "./lib/swagger/jsonLoader.js";
export type { JsonLoaderOption } from "./lib/swagger/jsonLoader.js";

export {
SwaggerExampleErrorDetail,
SwaggerExampleValidator,
NewModelValidator,
} from "./lib/swaggerValidator/modelValidator.js";
export type {
SwaggerExampleErrorDetail,
ExampleValidationOption,
} from "./lib/swaggerValidator/modelValidator";
} from "./lib/swaggerValidator/modelValidator.js";

export {
SemanticErrorDetail,
SwaggerSemanticValidator,
SemanticValidationOption,
SemanticValidator,
} from "./lib/swaggerValidator/semanticValidator";
} from "./lib/swaggerValidator/semanticValidator.js";
export type {
SemanticErrorDetail,
SemanticValidationOption,
} from "./lib/swaggerValidator/semanticValidator.js";

export { TrafficValidationIssue, TrafficValidator } from "./lib/swaggerValidator/trafficValidator";
export { TrafficValidator } from "./lib/swaggerValidator/trafficValidator.js";
export type { TrafficValidationIssue } from "./lib/swaggerValidator/trafficValidator.js";

// Constants
export const Constants = C;
20 changes: 11 additions & 9 deletions jest.config.js → jest.config.cjs
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
// @ts-check

/** @type {jest.InitialOptions} */
/** @type {import('jest').Config} */
module.exports = {
extensionsToTreatAsEsm: [".ts"],
transform: {
"^.+\\.tsx?$": "ts-jest",
"^.+\\.tsx?$": ["ts-jest", {
useESM: true,
tsconfig: "tsconfig.json",
}],
},
testEnvironment: "node",
moduleFileExtensions: ["ts", "js", "json", "node"],
moduleNameMapper: {},
moduleNameMapper: {
"^(\\.{1,2}/.*)\\.js$": "$1",
},
collectCoverage: true,
collectCoverageFrom: ["./lib/**/*.ts", "!**/node_modules/**"],
coverageReporters: ["json", "lcov", "cobertura", "text", "html", "clover"],
Expand All @@ -16,12 +22,8 @@ module.exports = {
"/\\.autopull/",
"/utilities.helpers.ts"
],
globals: {
"ts-jest": {
tsconfig: "tsconfig.json",
},
},
setupFilesAfterEnv: ["<rootDir>/jest.setup-file.js"],
setupFilesAfterEnv: ["<rootDir>/jest.setup-file.cjs"],
testMatch: ["**/test/**/*.ts", "!**/test/**/*.d.ts", "!**/test/sample.ts"],
testTimeout: 999999,
verbose: true,
};
File renamed without changes.
2 changes: 1 addition & 1 deletion lib/apiScenario/apiScenarioTypes.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Operation, SwaggerExample } from "../swagger/swaggerTypes";
import { Operation, SwaggerExample } from "../swagger/swaggerTypes.js";

//#region Common

Expand Down
15 changes: 8 additions & 7 deletions lib/apiScenario/bodyTransformer.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { inject, injectable } from "inversify";
import { cloneDeep } from "lodash";
import * as jp from "json-pointer";
import { TYPES } from "../inversifyUtils";
import { Schema } from "../swagger/swaggerTypes";
import { SchemaValidator } from "../swaggerValidator/schemaValidator";
import { jsonPathToPointer } from "../util/jsonUtils";
import { jsonPatchApply } from "./diffUtils";
import lodash from "lodash";
const { cloneDeep } = lodash;
import jp from "json-pointer";
import { TYPES } from "../inversifyTypes.js";
import { Schema } from "../swagger/swaggerTypes.js";
import { type SchemaValidator } from "../swaggerValidator/schemaValidator.js";
import { jsonPathToPointer } from "../util/jsonUtils.js";
import { jsonPatchApply } from "./diffUtils.js";

@injectable()
export class BodyTransformer {
Expand Down
11 changes: 6 additions & 5 deletions lib/apiScenario/diffUtils.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { default as stableStringify } from "fast-json-stable-stringify";
import * as jsonPointer from "json-pointer";
import stableStringify from "fast-json-stable-stringify";
import jsonPointer from "json-pointer";
import { cloneDeep } from "@azure-tools/openapi-tools-common";
import { SequenceMatcher } from "difflib";
import difflib from "difflib";
const { SequenceMatcher } = difflib;
import {
JsonPatchOp,
JsonPatchOpAdd,
Expand All @@ -10,7 +11,7 @@ import {
JsonPatchOpRemove,
JsonPatchOpReplace,
JsonPatchOpTest,
} from "./apiScenarioTypes";
} from "./apiScenarioTypes.js";

interface PatchContext {
root: any;
Expand Down Expand Up @@ -291,7 +292,7 @@ const calcArrayDiff = (
const calcArrayDiffWithIndex = (
from: any[],
to: any[]
): ReturnType<SequenceMatcher<any>["getOpcodes"]> | undefined => {
): ReturnType<InstanceType<typeof SequenceMatcher<any>>["getOpcodes"]> | undefined => {
const fromKeys = new Array(from.length);
const toKeys = new Array(to.length);
let hasKey = false;
Expand Down
8 changes: 4 additions & 4 deletions lib/apiScenario/schemaSearcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT

import { Schema } from "../swagger/swaggerTypes";
import { JsonLoader, isRefLike } from "../swagger/jsonLoader";
import { logger } from "./logger";
import { getObjValueFromPointer } from "./diffUtils";
import { Schema } from "../swagger/swaggerTypes.js";
import { JsonLoader, isRefLike } from "../swagger/jsonLoader.js";
import { logger } from "./logger.js";
import { getObjValueFromPointer } from "./diffUtils.js";

export class SchemaSearcher {
public static findSchemaByJsonPointer(
Expand Down
16 changes: 8 additions & 8 deletions lib/armValidator/roundTripValidator.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { getJsonPatchDiff } from "../apiScenario/diffUtils";
import { RequestResponsePair, LiveValidationIssue } from "../liveValidation/liveValidator";
import { OperationContext } from "../liveValidation/operationValidator";
import { roundTripValidationErrors } from "../util/errorDefinitions";
import * as utils from "../util/utils";
import { Parameter, Operation } from "../swagger/swaggerTypes";
import { JsonLoader } from "../swagger/jsonLoader";
import { SchemaSearcher } from "../apiScenario/schemaSearcher";
import { getJsonPatchDiff } from "../apiScenario/diffUtils.js";
import { RequestResponsePair, LiveValidationIssue } from "../liveValidation/liveValidator.js";
import { OperationContext } from "../liveValidation/operationValidator.js";
import { roundTripValidationErrors } from "../util/errorDefinitions.js";
import * as utils from "../util/utils.js";
import { Parameter, Operation } from "../swagger/swaggerTypes.js";
import { JsonLoader } from "../swagger/jsonLoader.js";
import { SchemaSearcher } from "../apiScenario/schemaSearcher.js";

const allowed = true;
const notAllowed = false;
Expand Down
2 changes: 1 addition & 1 deletion lib/cliSuppressExceptions.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.

import { log } from "./util/logging";
import { log } from "./util/logging.js";

export const cliSuppressExceptions = async (f: () => Promise<number>): Promise<void> => {
try {
Expand Down
12 changes: 6 additions & 6 deletions lib/commands/extract-xmsexamples.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@

/* eslint-disable id-blacklist */

import * as yargs from "yargs";
import type { Arguments, CommandBuilder } from "yargs";

import { cliSuppressExceptions } from "../cliSuppressExceptions";
import { log } from "../util/logging";
import * as validate from "../validate";
import { cliSuppressExceptions } from "../cliSuppressExceptions.js";
import { log } from "../util/logging.js";
import * as validate from "../validate.js";

export const command = "extract-xmsexamples <spec-path> <recordings>";

export const describe =
"Extracts the x-ms-examples for a given swagger from the .NET session recordings and saves " +
"them in a file.";

export const builder: yargs.CommandBuilder = {
export const builder: CommandBuilder = {
d: {
alias: "outDir",
describe:
Expand All @@ -31,7 +31,7 @@ export const builder: yargs.CommandBuilder = {
},
};

export async function handler(argv: yargs.Arguments): Promise<void> {
export async function handler(argv: Arguments): Promise<void> {
await cliSuppressExceptions(async () => {
log.debug(argv.toString());
const specPath = argv.specPath;
Expand Down
12 changes: 6 additions & 6 deletions lib/commands/generate-examples.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@

/* eslint-disable id-blacklist */

import * as yargs from "yargs";
import type { Arguments, CommandBuilder } from "yargs";

import { cliSuppressExceptions } from "../cliSuppressExceptions";
import { log } from "../util/logging";
import { cliSuppressExceptions } from "../cliSuppressExceptions.js";
import { log } from "../util/logging.js";

import * as validate from "../validate";
import * as validate from "../validate.js";
export const command = "generate-examples [spec-path]";

export const describe = "Generate swagger examples from real payload records.";

export const builder: yargs.CommandBuilder = {
export const builder: CommandBuilder = {
o: {
alias: "operationIds",
describe: "string of operation ids split by comma.",
Expand Down Expand Up @@ -48,7 +48,7 @@ export const builder: yargs.CommandBuilder = {
},
};

export async function handler(argv: yargs.Arguments): Promise<void> {
export async function handler(argv: Arguments): Promise<void> {
await cliSuppressExceptions(async () => {
log.debug(argv.toString());
const specPath = argv.specPath;
Expand Down
Loading
Loading