From 620e7ecc45e392a86a0179e3a52dd65de94ce7e3 Mon Sep 17 00:00:00 2001 From: Patrick McElhaney Date: Sat, 10 Feb 2024 12:40:18 -0500 Subject: [PATCH 1/7] add a method to repository to find the path to the nearest _.context.ts file --- src/typescript-generator/repository.js | 24 ++++++++++++++++++++ test/typescript-generator/repository.test.js | 23 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/typescript-generator/repository.js b/src/typescript-generator/repository.js index a351b709..c695ef8d 100644 --- a/src/typescript-generator/repository.js +++ b/src/typescript-generator/repository.js @@ -112,4 +112,28 @@ export class Repository { await this.copyCoreFiles(destination); } + + findContextPath(destination, path) { + return nodePath.relative( + nodePath.join(destination, nodePath.dirname(path)), + this.nearestContextFile(destination, path), + ); + } + + nearestContextFile(destination, path) { + const directory = nodePath.dirname(path).replace("path-types", "paths"); + + const candidate = nodePath.join(destination, directory, "_.context.ts"); + + if (directory.length <= 1) { + // No _context.ts was found so import the one that should be in the root + return nodePath.join(destination, "paths", "_.context.ts"); + } + + if (existsSync(candidate)) { + return candidate; + } + + return this.nearestContextFile(destination, nodePath.join(path, "..")); + } } diff --git a/test/typescript-generator/repository.test.js b/test/typescript-generator/repository.test.js index 23da7614..d3c400a6 100644 --- a/test/typescript-generator/repository.test.js +++ b/test/typescript-generator/repository.test.js @@ -1,3 +1,5 @@ +import { usingTemporaryFiles } from "using-temporary-files"; + import { Repository } from "../../src/typescript-generator/repository.js"; describe("a Repository", () => { @@ -11,4 +13,25 @@ describe("a Repository", () => { expect(a).not.toBe(b); expect(a2).toBe(a); }); + + it.each([ + ["./path-types/x.ts", "../paths/_.context.ts"], + ["./path-types/a/x.ts", "../../paths/_.context.ts"], + ["./path-types/a/b/x.ts", "../../../paths/a/b/_.context.ts"], + ["./path-types/a/b/c/x.ts", "../../../../paths/a/b/_.context.ts"], + ])( + "finds the relative location of the most relevant _.context.ts file (%s => %s)", + async (importingFilePath, relativePathToNearestContext) => { + await usingTemporaryFiles(async ({ add, path }) => { + const repository = new Repository(path(".")); + + await add("./paths/_.context.ts", "export class Context"); + await add("./paths/a/b/_.context.ts", "export class Context"); + + expect(repository.findContextPath(path("."), importingFilePath)).toBe( + relativePathToNearestContext, + ); + }); + }, + ); }); From e48d8312b5f839de61aacd3bfff18c6889794f29 Mon Sep 17 00:00:00 2001 From: Patrick McElhaney Date: Sat, 10 Feb 2024 13:44:35 -0500 Subject: [PATCH 2/7] calculate the path to _.context.ts file --- .../context-file-token.js | 1 + .../operation-type-coder.js | 7 +- src/typescript-generator/repository.js | 9 +- .../__snapshots__/generate.test.ts.snap | 1460 ++--------------- .../operation-type-coder.test.js.snap | 12 +- 5 files changed, 182 insertions(+), 1307 deletions(-) create mode 100644 src/typescript-generator/context-file-token.js diff --git a/src/typescript-generator/context-file-token.js b/src/typescript-generator/context-file-token.js new file mode 100644 index 00000000..fbcbf665 --- /dev/null +++ b/src/typescript-generator/context-file-token.js @@ -0,0 +1 @@ +export const CONTEXT_FILE_TOKEN = "@@CONTEXT_FILE_TOKEN@@"; diff --git a/src/typescript-generator/operation-type-coder.js b/src/typescript-generator/operation-type-coder.js index 586ada0f..0b1b54b4 100644 --- a/src/typescript-generator/operation-type-coder.js +++ b/src/typescript-generator/operation-type-coder.js @@ -1,7 +1,7 @@ import nodePath from "node:path"; import { Coder } from "./coder.js"; -import { ContextTypeCoder } from "./context-type-coder.js"; +import { CONTEXT_FILE_TOKEN } from "./context-file-token.js"; import { ParametersTypeCoder } from "./parameters-type-coder.js"; import { ResponseTypeCoder } from "./response-type-coder.js"; import { SchemaTypeCoder } from "./schema-type-coder.js"; @@ -68,8 +68,9 @@ export class OperationTypeCoder extends Coder { } write(script) { - const contextTypeImportName = script.importType( - new ContextTypeCoder(this.requirement), + const contextTypeImportName = script.importExternalType( + "Context", + CONTEXT_FILE_TOKEN, ); const parameters = this.requirement.get("parameters"); diff --git a/src/typescript-generator/repository.js b/src/typescript-generator/repository.js index c695ef8d..f0e23b0f 100644 --- a/src/typescript-generator/repository.js +++ b/src/typescript-generator/repository.js @@ -6,6 +6,7 @@ import { fileURLToPath } from "node:url"; import createDebug from "debug"; import { ensureDirectoryExists } from "../util/ensure-directory-exists.js"; +import { CONTEXT_FILE_TOKEN } from "./context-file-token.js"; import { Script } from "./script.js"; const debug = createDebug("counterfact:server:repository"); @@ -103,7 +104,13 @@ export class Repository { } debug("about to write", fullPath); - await fs.writeFile(fullPath, contents); + await fs.writeFile( + fullPath, + contents.replaceAll( + CONTEXT_FILE_TOKEN, + this.findContextPath(destination, path), + ), + ); debug("did write", fullPath); }, ); diff --git a/test/typescript-generator/__snapshots__/generate.test.ts.snap b/test/typescript-generator/__snapshots__/generate.test.ts.snap index 6701e5c2..57a299a8 100644 --- a/test/typescript-generator/__snapshots__/generate.test.ts.snap +++ b/test/typescript-generator/__snapshots__/generate.test.ts.snap @@ -47,7 +47,6 @@ Map { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1pet/post@[object Object]:true" => "HTTP_POST", "OperationTypeCoder@./petstore.yaml#/paths/~1pet/put@[object Object]:true" => "HTTP_PUT", - "ContextTypeCoder@paths/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Pet.ts:true:false" => "Pet", }, "exports": Map { @@ -139,45 +138,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export class Context {};", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Pet" => { "isDefault": false, "isType": true, @@ -291,7 +261,6 @@ Map { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1pet/post@[object Object]:true" => "HTTP_POST", "OperationTypeCoder@./petstore.yaml#/paths/~1pet/put@[object Object]:true" => "HTTP_PUT", - "ContextTypeCoder@paths/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Pet.ts:true:false" => "Pet", }, "exports": Map { @@ -383,45 +352,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export class Context {};", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Pet" => { "isDefault": false, "isType": true, @@ -539,7 +479,6 @@ Map { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1pet/post@[object Object]:true" => "HTTP_POST", "OperationTypeCoder@./petstore.yaml#/paths/~1pet/put@[object Object]:true" => "HTTP_PUT", - "ContextTypeCoder@paths/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Pet.ts:true:false" => "Pet", }, "exports": Map { @@ -631,45 +570,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export class Context {};", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Pet" => { "isDefault": false, "isType": true, @@ -803,7 +713,6 @@ Map { "script": Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1findByStatus/get@[object Object]:true" => "HTTP_GET", - "ContextTypeCoder@paths/pet/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Pet.ts:true:false" => "Pet", }, "exports": Map { @@ -846,45 +755,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/pet/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Pet" => { "isDefault": false, "isType": true, @@ -1001,7 +881,6 @@ Map { "path-types/pet/findByStatus.types.ts" => Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1findByStatus/get@[object Object]:true" => "HTTP_GET", - "ContextTypeCoder@paths/pet/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Pet.ts:true:false" => "Pet", }, "exports": Map { @@ -1044,45 +923,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/pet/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Pet" => { "isDefault": false, "isType": true, @@ -1216,7 +1066,6 @@ Map { "script": Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1findByTags/get@[object Object]:true" => "HTTP_GET", - "ContextTypeCoder@paths/pet/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Pet.ts:true:false" => "Pet", }, "exports": Map { @@ -1259,45 +1108,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/pet/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Pet" => { "isDefault": false, "isType": true, @@ -1414,7 +1234,6 @@ Map { "path-types/pet/findByTags.types.ts" => Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1findByTags/get@[object Object]:true" => "HTTP_GET", - "ContextTypeCoder@paths/pet/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Pet.ts:true:false" => "Pet", }, "exports": Map { @@ -1457,45 +1276,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/pet/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Pet" => { "isDefault": false, "isType": true, @@ -1661,7 +1451,6 @@ Map { "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1{petId}/get@[object Object]:true" => "HTTP_GET", "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1{petId}/post@[object Object]:true" => "HTTP_POST", "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1{petId}/delete@[object Object]:true" => "HTTP_DELETE", - "ContextTypeCoder@paths/pet/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Pet.ts:true:false" => "Pet", }, "exports": Map { @@ -1746,45 +1535,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/pet/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Pet" => { "isDefault": false, "isType": true, @@ -1899,7 +1659,6 @@ Map { "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1{petId}/get@[object Object]:true" => "HTTP_GET", "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1{petId}/post@[object Object]:true" => "HTTP_POST", "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1{petId}/delete@[object Object]:true" => "HTTP_DELETE", - "ContextTypeCoder@paths/pet/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Pet.ts:true:false" => "Pet", }, "exports": Map { @@ -1984,45 +1743,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/pet/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Pet" => { "isDefault": false, "isType": true, @@ -2137,7 +1867,6 @@ Map { "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1{petId}/get@[object Object]:true" => "HTTP_GET", "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1{petId}/post@[object Object]:true" => "HTTP_POST", "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1{petId}/delete@[object Object]:true" => "HTTP_DELETE", - "ContextTypeCoder@paths/pet/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Pet.ts:true:false" => "Pet", }, "exports": Map { @@ -2222,45 +1951,16 @@ Map { }, }, "externalImport": Map { - "ResponseBuilderFactory" => { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, + "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/pet/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Pet" => { "isDefault": false, "isType": true, @@ -2379,7 +2079,6 @@ Map { "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1{petId}/get@[object Object]:true" => "HTTP_GET", "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1{petId}/post@[object Object]:true" => "HTTP_POST", "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1{petId}/delete@[object Object]:true" => "HTTP_DELETE", - "ContextTypeCoder@paths/pet/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Pet.ts:true:false" => "Pet", }, "exports": Map { @@ -2464,45 +2163,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/pet/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Pet" => { "isDefault": false, "isType": true, @@ -2636,7 +2306,6 @@ Map { "script": Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1{petId}~1uploadImage/post@[object Object]:true" => "HTTP_POST", - "ContextTypeCoder@paths/pet/{petId}/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/ApiResponse.ts:true:false" => "ApiResponse", }, "exports": Map { @@ -2666,45 +2335,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/pet/{petId}/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "ApiResponse" => { "isDefault": false, "isType": true, @@ -2756,7 +2396,6 @@ Map { "path-types/pet/{petId}/uploadImage.types.ts" => Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1pet~1{petId}~1uploadImage/post@[object Object]:true" => "HTTP_POST", - "ContextTypeCoder@paths/pet/{petId}/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/ApiResponse.ts:true:false" => "ApiResponse", }, "exports": Map { @@ -2786,45 +2425,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/pet/{petId}/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "ApiResponse" => { "isDefault": false, "isType": true, @@ -2893,7 +2503,6 @@ Map { "script": Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1store~1inventory/get@[object Object]:true" => "HTTP_GET", - "ContextTypeCoder@paths/store/_.context.ts:true:false" => "Context", }, "exports": Map { "HTTP_GET" => { @@ -2922,46 +2531,16 @@ Map { }, }, "externalImport": Map { - "ResponseBuilderFactory" => { + "Context" => { "isType": true, - "modulePath": "../../types.d.ts", + "modulePath": "@@CONTEXT_FILE_TOKEN@@", }, - }, - "imports": Map { - "Context" => { - "isDefault": false, + "ResponseBuilderFactory" => { "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/store/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, + "modulePath": "../../types.d.ts", }, }, + "imports": Map {}, "path": "path-types/store/inventory.types.ts", "repository": Repository { "scripts": [Circular], @@ -2981,7 +2560,6 @@ Map { "path-types/store/inventory.types.ts" => Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1store~1inventory/get@[object Object]:true" => "HTTP_GET", - "ContextTypeCoder@paths/store/_.context.ts:true:false" => "Context", }, "exports": Map { "HTTP_GET" => { @@ -3010,46 +2588,16 @@ Map { }, }, "externalImport": Map { - "ResponseBuilderFactory" => { + "Context" => { "isType": true, - "modulePath": "../../types.d.ts", + "modulePath": "@@CONTEXT_FILE_TOKEN@@", }, - }, - "imports": Map { - "Context" => { - "isDefault": false, + "ResponseBuilderFactory" => { "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/store/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, + "modulePath": "../../types.d.ts", }, }, + "imports": Map {}, "path": "path-types/store/inventory.types.ts", "repository": Repository { "scripts": [Circular], @@ -3086,7 +2634,6 @@ Map { "script": Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1store~1order/post@[object Object]:true" => "HTTP_POST", - "ContextTypeCoder@paths/store/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Order.ts:true:false" => "Order", }, "exports": Map { @@ -3122,45 +2669,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/store/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Order" => { "isDefault": false, "isType": true, @@ -3212,7 +2730,6 @@ Map { "path-types/store/order.types.ts" => Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1store~1order/post@[object Object]:true" => "HTTP_POST", - "ContextTypeCoder@paths/store/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Order.ts:true:false" => "Order", }, "exports": Map { @@ -3248,45 +2765,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/store/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Order" => { "isDefault": false, "isType": true, @@ -3371,7 +2859,6 @@ Map { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1store~1order~1{orderId}/get@[object Object]:true" => "HTTP_GET", "OperationTypeCoder@./petstore.yaml#/paths/~1store~1order~1{orderId}/delete@[object Object]:true" => "HTTP_DELETE", - "ContextTypeCoder@paths/store/order/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Order.ts:true:false" => "Order", }, "exports": Map { @@ -3444,69 +2931,40 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../../types.d.ts", }, }, "imports": Map { - "Context" => { + "Order" => { "isDefault": false, "isType": true, - "name": "Context", + "name": "Order", "script": Script { "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", + "SchemaTypeCoder@undefined@[object Object]:true" => "Order", }, "exports": Map { - "Context" => { + "Order" => { "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, + "code": "{"id"?: number,"petId"?: number,"quantity"?: number,"shipDate"?: string,"status"?: "placed" | "approved" | "delivered","complete"?: boolean}", "done": true, - "id": "ContextTypeCoder", + "id": "SchemaTypeCoder@undefined", "isDefault": false, "isType": true, - "name": "Context", + "name": "Order", "promise": Promise {}, "typeDeclaration": "", }, }, "externalImport": Map {}, "imports": Map {}, - "path": "paths/store/order/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, - "Order" => { - "isDefault": false, - "isType": true, - "name": "Order", - "script": Script { - "cache": Map { - "SchemaTypeCoder@undefined@[object Object]:true" => "Order", - }, - "exports": Map { - "Order" => { - "beforeExport": "", - "code": "{"id"?: number,"petId"?: number,"quantity"?: number,"shipDate"?: string,"status"?: "placed" | "approved" | "delivered","complete"?: boolean}", - "done": true, - "id": "SchemaTypeCoder@undefined", - "isDefault": false, - "isType": true, - "name": "Order", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "components/Order.ts", + "path": "components/Order.ts", "repository": Repository { "scripts": [Circular], "writeFiles": [Function], @@ -3531,7 +2989,6 @@ Map { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1store~1order~1{orderId}/get@[object Object]:true" => "HTTP_GET", "OperationTypeCoder@./petstore.yaml#/paths/~1store~1order~1{orderId}/delete@[object Object]:true" => "HTTP_DELETE", - "ContextTypeCoder@paths/store/order/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Order.ts:true:false" => "Order", }, "exports": Map { @@ -3604,45 +3061,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/store/order/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Order" => { "isDefault": false, "isType": true, @@ -3695,7 +3123,6 @@ Map { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1store~1order~1{orderId}/get@[object Object]:true" => "HTTP_GET", "OperationTypeCoder@./petstore.yaml#/paths/~1store~1order~1{orderId}/delete@[object Object]:true" => "HTTP_DELETE", - "ContextTypeCoder@paths/store/order/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/Order.ts:true:false" => "Order", }, "exports": Map { @@ -3768,45 +3195,16 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../../types.d.ts", }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/store/order/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "Order" => { "isDefault": false, "isType": true, @@ -3875,7 +3273,6 @@ Map { "script": Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1user/post@[object Object]:true" => "HTTP_POST", - "ContextTypeCoder@paths/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/User.ts:true:false" => "User", }, "exports": Map { @@ -3912,6 +3309,10 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../types.d.ts", @@ -3922,39 +3323,6 @@ Map { }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export class Context {};", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "User" => { "isDefault": false, "isType": true, @@ -4006,7 +3374,6 @@ Map { "path-types/user.types.ts" => Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1user/post@[object Object]:true" => "HTTP_POST", - "ContextTypeCoder@paths/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/User.ts:true:false" => "User", }, "exports": Map { @@ -4043,6 +3410,10 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../types.d.ts", @@ -4053,39 +3424,6 @@ Map { }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export class Context {};", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "User" => { "isDefault": false, "isType": true, @@ -4154,7 +3492,6 @@ Map { "script": Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1user~1createWithList/post@[object Object]:true" => "HTTP_POST", - "ContextTypeCoder@paths/user/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/User.ts:true:false" => "User", }, "exports": Map { @@ -4197,6 +3534,10 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", @@ -4207,39 +3548,6 @@ Map { }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/user/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "User" => { "isDefault": false, "isType": true, @@ -4291,7 +3599,6 @@ Map { "path-types/user/createWithList.types.ts" => Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1user~1createWithList/post@[object Object]:true" => "HTTP_POST", - "ContextTypeCoder@paths/user/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/User.ts:true:false" => "User", }, "exports": Map { @@ -4334,6 +3641,10 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", @@ -4344,39 +3655,6 @@ Map { }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/user/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "User" => { "isDefault": false, "isType": true, @@ -4445,7 +3723,6 @@ Map { "script": Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1user~1login/get@[object Object]:true" => "HTTP_GET", - "ContextTypeCoder@paths/user/_.context.ts:true:false" => "Context", }, "exports": Map { "HTTP_GET" => { @@ -4490,46 +3767,16 @@ Map { }, }, "externalImport": Map { - "ResponseBuilderFactory" => { + "Context" => { "isType": true, - "modulePath": "../../types.d.ts", + "modulePath": "@@CONTEXT_FILE_TOKEN@@", }, - }, - "imports": Map { - "Context" => { - "isDefault": false, + "ResponseBuilderFactory" => { "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/user/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, + "modulePath": "../../types.d.ts", }, }, + "imports": Map {}, "path": "path-types/user/login.types.ts", "repository": Repository { "scripts": [Circular], @@ -4549,7 +3796,6 @@ Map { "path-types/user/login.types.ts" => Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1user~1login/get@[object Object]:true" => "HTTP_GET", - "ContextTypeCoder@paths/user/_.context.ts:true:false" => "Context", }, "exports": Map { "HTTP_GET" => { @@ -4594,66 +3840,36 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", }, }, - "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/user/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, - }, - "path": "path-types/user/login.types.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - "paths/user/logout.ts" => Script { - "cache": Map { - "OperationCoder@./petstore.yaml#/paths/~1user~1logout/get@[object Object]:false" => "GET", - "OperationTypeCoder@./petstore.yaml#/paths/~1user~1logout/get@path-types/user/logout.types.ts:true:false" => "HTTP_GET", - }, - "exports": Map { - "GET" => { - "beforeExport": "", - "code": "($) => { - return $.response[200]; - }", - "done": true, - "id": "OperationCoder@./petstore.yaml#/paths/~1user~1logout/get", + "imports": Map {}, + "path": "path-types/user/login.types.ts", + "repository": Repository { + "scripts": [Circular], + "writeFiles": [Function], + }, + "typeCache": Map {}, + }, + "paths/user/logout.ts" => Script { + "cache": Map { + "OperationCoder@./petstore.yaml#/paths/~1user~1logout/get@[object Object]:false" => "GET", + "OperationTypeCoder@./petstore.yaml#/paths/~1user~1logout/get@path-types/user/logout.types.ts:true:false" => "HTTP_GET", + }, + "exports": Map { + "GET" => { + "beforeExport": "", + "code": "($) => { + return $.response[200]; + }", + "done": true, + "id": "OperationCoder@./petstore.yaml#/paths/~1user~1logout/get", "isDefault": false, "isType": false, "name": "GET", @@ -4670,7 +3886,6 @@ Map { "script": Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1user~1logout/get@[object Object]:true" => "HTTP_GET", - "ContextTypeCoder@paths/user/_.context.ts:true:false" => "Context", }, "exports": Map { "HTTP_GET" => { @@ -4693,6 +3908,10 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", @@ -4702,41 +3921,7 @@ Map { "modulePath": "../../types.d.ts", }, }, - "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/user/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, - }, + "imports": Map {}, "path": "path-types/user/logout.types.ts", "repository": Repository { "scripts": [Circular], @@ -4756,7 +3941,6 @@ Map { "path-types/user/logout.types.ts" => Script { "cache": Map { "OperationTypeCoder@./petstore.yaml#/paths/~1user~1logout/get@[object Object]:true" => "HTTP_GET", - "ContextTypeCoder@paths/user/_.context.ts:true:false" => "Context", }, "exports": Map { "HTTP_GET" => { @@ -4779,6 +3963,10 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", @@ -4788,41 +3976,7 @@ Map { "modulePath": "../../types.d.ts", }, }, - "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/user/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, - }, + "imports": Map {}, "path": "path-types/user/logout.types.ts", "repository": Repository { "scripts": [Circular], @@ -4891,7 +4045,6 @@ Map { "OperationTypeCoder@./petstore.yaml#/paths/~1user~1{username}/get@[object Object]:true" => "HTTP_GET", "OperationTypeCoder@./petstore.yaml#/paths/~1user~1{username}/put@[object Object]:true" => "HTTP_PUT", "OperationTypeCoder@./petstore.yaml#/paths/~1user~1{username}/delete@[object Object]:true" => "HTTP_DELETE", - "ContextTypeCoder@paths/user/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/User.ts:true:false" => "User", }, "exports": Map { @@ -4982,6 +4135,10 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", @@ -4992,39 +4149,6 @@ Map { }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/user/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "User" => { "isDefault": false, "isType": true, @@ -5074,7 +4198,6 @@ Map { "OperationTypeCoder@./petstore.yaml#/paths/~1user~1{username}/get@[object Object]:true" => "HTTP_GET", "OperationTypeCoder@./petstore.yaml#/paths/~1user~1{username}/put@[object Object]:true" => "HTTP_PUT", "OperationTypeCoder@./petstore.yaml#/paths/~1user~1{username}/delete@[object Object]:true" => "HTTP_DELETE", - "ContextTypeCoder@paths/user/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/User.ts:true:false" => "User", }, "exports": Map { @@ -5165,6 +4288,10 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", @@ -5175,39 +4302,6 @@ Map { }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/user/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "User" => { "isDefault": false, "isType": true, @@ -5257,7 +4351,6 @@ Map { "OperationTypeCoder@./petstore.yaml#/paths/~1user~1{username}/get@[object Object]:true" => "HTTP_GET", "OperationTypeCoder@./petstore.yaml#/paths/~1user~1{username}/put@[object Object]:true" => "HTTP_PUT", "OperationTypeCoder@./petstore.yaml#/paths/~1user~1{username}/delete@[object Object]:true" => "HTTP_DELETE", - "ContextTypeCoder@paths/user/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/User.ts:true:false" => "User", }, "exports": Map { @@ -5348,6 +4441,10 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", @@ -5358,39 +4455,6 @@ Map { }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/user/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "User" => { "isDefault": false, "isType": true, @@ -5444,7 +4508,6 @@ Map { "OperationTypeCoder@./petstore.yaml#/paths/~1user~1{username}/get@[object Object]:true" => "HTTP_GET", "OperationTypeCoder@./petstore.yaml#/paths/~1user~1{username}/put@[object Object]:true" => "HTTP_PUT", "OperationTypeCoder@./petstore.yaml#/paths/~1user~1{username}/delete@[object Object]:true" => "HTTP_DELETE", - "ContextTypeCoder@paths/user/_.context.ts:true:false" => "Context", "SchemaTypeCoder@undefined@components/User.ts:true:false" => "User", }, "exports": Map { @@ -5535,6 +4598,10 @@ Map { }, }, "externalImport": Map { + "Context" => { + "isType": true, + "modulePath": "@@CONTEXT_FILE_TOKEN@@", + }, "ResponseBuilderFactory" => { "isType": true, "modulePath": "../../types.d.ts", @@ -5545,39 +4612,6 @@ Map { }, }, "imports": Map { - "Context" => { - "isDefault": false, - "isType": true, - "name": "Context", - "script": Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/user/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - }, "User" => { "isDefault": false, "isType": true, @@ -5617,34 +4651,6 @@ Map { }, "typeCache": Map {}, }, - "paths/_.context.ts" => Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export class Context {};", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, "components/Pet.ts" => Script { "cache": Map { "SchemaTypeCoder@undefined@[object Object]:true" => "Pet", @@ -5736,62 +4742,6 @@ Map { }, "typeCache": Map {}, }, - "paths/pet/_.context.ts" => Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/pet/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, - "paths/pet/{petId}/_.context.ts" => Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/pet/{petId}/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, "components/ApiResponse.ts" => Script { "cache": Map { "SchemaTypeCoder@undefined@[object Object]:true" => "ApiResponse", @@ -5818,34 +4768,6 @@ Map { }, "typeCache": Map {}, }, - "paths/store/_.context.ts" => Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/store/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, "components/Order.ts" => Script { "cache": Map { "SchemaTypeCoder@undefined@[object Object]:true" => "Order", @@ -5872,34 +4794,6 @@ Map { }, "typeCache": Map {}, }, - "paths/store/order/_.context.ts" => Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/store/order/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, "components/User.ts" => Script { "cache": Map { "SchemaTypeCoder@undefined@[object Object]:true" => "User", @@ -5926,34 +4820,6 @@ Map { }, "typeCache": Map {}, }, - "paths/user/_.context.ts" => Script { - "cache": Map { - "ContextTypeCoder@[object Object]:true" => "Context", - }, - "exports": Map { - "Context" => { - "beforeExport": "", - "code": { - "raw": "export { Context } from "../_.context.js"", - }, - "done": true, - "id": "ContextTypeCoder", - "isDefault": false, - "isType": true, - "name": "Context", - "promise": Promise {}, - "typeDeclaration": "", - }, - }, - "externalImport": Map {}, - "imports": Map {}, - "path": "paths/user/_.context.ts", - "repository": Repository { - "scripts": [Circular], - "writeFiles": [Function], - }, - "typeCache": Map {}, - }, "components/Category.ts" => Script { "cache": Map { "SchemaTypeCoder@undefined@[object Object]:true" => "Category", diff --git a/test/typescript-generator/__snapshots__/operation-type-coder.test.js.snap b/test/typescript-generator/__snapshots__/operation-type-coder.test.js.snap index 53865abd..d033e4b3 100644 --- a/test/typescript-generator/__snapshots__/operation-type-coder.test.js.snap +++ b/test/typescript-generator/__snapshots__/operation-type-coder.test.js.snap @@ -13,7 +13,7 @@ exports[`an OperationTypeCoder falls back to root level produces (OpenAPI 2) 1`] path: never; header: never; body: undefined; - context: Type; + context: ExternalType; response: ResponseBuilderFactory<{ [statusCode in HttpStatusCode]: { headers: {}; @@ -49,7 +49,7 @@ exports[`an OperationTypeCoder generates a complex post operation (OpenAPI 2 wit path: { id?: string }; header: { name?: string }; body: Type; - context: Type; + context: ExternalType; response: ResponseBuilderFactory<{ 200: { headers: {}; @@ -111,7 +111,7 @@ exports[`an OperationTypeCoder generates a complex post operation (OpenAPI 2) 1` path: { id?: string }; header: { name?: string }; body: Type; - context: Type; + context: ExternalType; response: ResponseBuilderFactory<{ 200: { headers: {}; @@ -173,7 +173,7 @@ exports[`an OperationTypeCoder generates a complex post operation 1`] = ` path: { id?: string }; header: { name?: string }; body: Type; - context: Type; + context: ExternalType; response: ResponseBuilderFactory<{ 200: { headers: {}; @@ -235,7 +235,7 @@ exports[`an OperationTypeCoder generates a simple get operation (OpenAPI 2) 1`] path: never; header: never; body: undefined; - context: Type; + context: ExternalType; response: ResponseBuilderFactory<{ [statusCode in HttpStatusCode]: { headers: {}; @@ -271,7 +271,7 @@ exports[`an OperationTypeCoder generates a simple get operation 1`] = ` path: never; header: never; body: undefined; - context: Type; + context: ExternalType; response: ResponseBuilderFactory<{ [statusCode in HttpStatusCode]: { headers: {}; From 0f081d87cbec44779a7e545ecb91676d605539e0 Mon Sep 17 00:00:00 2001 From: Patrick McElhaney Date: Sat, 10 Feb 2024 14:10:31 -0500 Subject: [PATCH 3/7] create the root _.context.ts file if it does not exist --- src/typescript-generator/repository.js | 28 ++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/typescript-generator/repository.js b/src/typescript-generator/repository.js index f0e23b0f..0f11c1ae 100644 --- a/src/typescript-generator/repository.js +++ b/src/typescript-generator/repository.js @@ -118,6 +118,34 @@ export class Repository { await Promise.all(writeFiles); await this.copyCoreFiles(destination); + + await this.createDefaultContextFile(destination); + } + + async createDefaultContextFile(destination) { + const contextFilePath = nodePath.join(destination, "paths", "_.context.ts"); + + if (existsSync(contextFilePath)) { + return; + } + + await fs.writeFile( + contextFilePath, + `/** +* This is the default context for Counterfact. +* +* It defines the context object in the REPL +* and the $.context object in the code. +* +* Add properties and methods to suit your needs. +* +* See https://counterfact.dev/docs/usage.html#working-with-state-the-codecontextcode-object-and-codecontexttscode +*/ +export class Context { + +} +`, + ); } findContextPath(destination, path) { From ec16da3c1035db6849af75d0eeef459f0feffc39 Mon Sep 17 00:00:00 2001 From: Patrick McElhaney Date: Sat, 10 Feb 2024 14:12:28 -0500 Subject: [PATCH 4/7] remove obsolete ContextCoder and ContextTypeCodeer --- src/typescript-generator/context-coder.js | 48 ----------- .../context-type-coder.js | 44 ---------- .../context-coder.test.js | 83 ------------------- .../context-type-coder.test.js | 63 -------------- 4 files changed, 238 deletions(-) delete mode 100644 src/typescript-generator/context-coder.js delete mode 100644 src/typescript-generator/context-type-coder.js delete mode 100644 test/typescript-generator/context-coder.test.js delete mode 100644 test/typescript-generator/context-type-coder.test.js diff --git a/src/typescript-generator/context-coder.js b/src/typescript-generator/context-coder.js deleted file mode 100644 index 4b037719..00000000 --- a/src/typescript-generator/context-coder.js +++ /dev/null @@ -1,48 +0,0 @@ -import nodePath from "node:path"; - -import { Coder } from "./coder.js"; - -export class ContextCoder extends Coder { - pathString() { - return this.requirement.url - .split("/") - .at(-2) - .replaceAll("~1", "/") - .replaceAll("~0", "~"); - } - - get id() { - return "ContextCoder"; - } - - names() { - return super.names("Context"); - } - - beforeExport(path) { - return `/** -* This is the default context for Counterfact. -* Change the code to suit your needs. -*/ -class Context { - // delete this line to make the class type safe - [key: string]: any; - - // A helper when you accessing the context object via the REPL. You can delete it if you like. - [Symbol.for('nodejs.util.inspect.custom')](depth, options, inspect) { - return inspect(this, { ...options, customInspect: false }) + "\\n\\n ^ This is the default context object. You can edit its definition at ${path}"; - } -} -`; - } - - write() { - return "new Context()"; - } - - modulePath() { - return nodePath - .join("paths", nodePath.dirname(this.pathString()), "$.context.ts") - .replaceAll("\\", "/"); - } -} diff --git a/src/typescript-generator/context-type-coder.js b/src/typescript-generator/context-type-coder.js deleted file mode 100644 index 5dea803e..00000000 --- a/src/typescript-generator/context-type-coder.js +++ /dev/null @@ -1,44 +0,0 @@ -import nodePath from "node:path"; - -import { Coder } from "./coder.js"; - -export class ContextTypeCoder extends Coder { - constructor(requirement, isRoot) { - super(requirement); - this.isRoot = isRoot; - } - - pathString() { - return this.requirement.url - .split("/") - .at(-2) - .replaceAll("~1", "/") - .replaceAll("~0", "~"); - } - - get id() { - return "ContextTypeCoder"; - } - - names() { - return super.names("Context"); - } - - write(script) { - if (script.path === "paths/_.context.ts") { - return { - raw: "export class Context {};", - }; - } - - return { - raw: 'export { Context } from "../_.context.js"', - }; - } - - modulePath() { - return nodePath - .join("paths", nodePath.dirname(this.pathString()), "_.context.ts") - .replaceAll("\\", "/"); - } -} diff --git a/test/typescript-generator/context-coder.test.js b/test/typescript-generator/context-coder.test.js deleted file mode 100644 index cd80b114..00000000 --- a/test/typescript-generator/context-coder.test.js +++ /dev/null @@ -1,83 +0,0 @@ -import prettier from "prettier"; - -import { ContextCoder } from "../../src/typescript-generator/context-coder.js"; -import { Requirement } from "../../src/typescript-generator/requirement.js"; - -function format(code) { - return prettier.format(code, { parser: "typescript" }); -} - -const dummyScript = { - import() { - return "schema"; - }, - - importDefault() { - return "default"; - }, - - importExternalType() { - return "ExternalType"; - }, - - importType() { - return "Type"; - }, - - path: ".", - - repository: { - get() { - return { - exportDefault() { - return "noop"; - }, - }; - }, - }, -}; - -describe("a ContextCoder", () => { - it("generates a list of potential names", () => { - const coder = new ContextCoder({ url: "#/components/schemas/Person" }); - - const [one, two, three] = coder.names(); - - expect([one, two, three]).toStrictEqual([ - "Context", - "Context2", - "Context3", - ]); - }); - - it("when asked to delegate an inline requirement, returns itself", async () => { - const coder = new ContextCoder(new Requirement({ type: "string" })); - - await expect(coder.delegate()).resolves.toBe(coder); - }); - - it("has a static ID", () => { - const coder = new ContextCoder({ url: "#/paths/hello/get" }); - - expect(coder.id).toBe("ContextCoder"); - }); - - it("returns the context object if this is the root directory", async () => { - const coder = new ContextCoder(new Requirement({}, "#/paths/hello")); - - const rootContextScript = { - ...dummyScript, - path: "paths/$.context.ts", - }; - - await expect(format(coder.write(rootContextScript))).resolves.toBe( - await format("new Context()"), - ); - }); - - it("writes out the Context class", () => { - const coder = new ContextCoder(new Requirement({}, "#/paths/hello")); - - expect(coder.beforeExport(dummyScript)).toContain("class Context {"); - }); -}); diff --git a/test/typescript-generator/context-type-coder.test.js b/test/typescript-generator/context-type-coder.test.js deleted file mode 100644 index 5dc1ebae..00000000 --- a/test/typescript-generator/context-type-coder.test.js +++ /dev/null @@ -1,63 +0,0 @@ -import prettier from "prettier"; - -import { ContextTypeCoder } from "../../src/typescript-generator/context-type-coder.js"; -import { Requirement } from "../../src/typescript-generator/requirement.js"; - -function format(code) { - return prettier.format(code, { parser: "typescript" }); -} - -const dummyScript = { - import() { - return "schema"; - }, - - importDefault() { - return "default"; - }, - - importExternalType() { - return "ExternalType"; - }, - - importType() { - return "Type"; - }, - - path: ".", - - repository: { - get() { - return { - exportDefault() { - return "noop"; - }, - }; - }, - }, -}; - -describe("a ContextTypeCoder", () => { - it("extends the Context from the parent directory", async () => { - const coder = new ContextTypeCoder( - new Requirement({}, "#/paths/hello/get"), - ); - - await expect(format(coder.write(dummyScript).raw)).resolves.toBe( - await format('export { Context } from "../_.context.js";'), - ); - }); - - it("defines the Context class in the root", async () => { - const coder = new ContextTypeCoder(new Requirement({}, "#/paths")); - - const dummyScriptWithRootPath = { - ...dummyScript, - path: "paths/_.context.ts", - }; - - await expect( - format(coder.write(dummyScriptWithRootPath).raw), - ).resolves.toBe(await format("export class Context {};")); - }); -}); From e36b938ea3582912e388f10473956601af8c138f Mon Sep 17 00:00:00 2001 From: Patrick McElhaney Date: Sat, 10 Feb 2024 14:38:27 -0500 Subject: [PATCH 5/7] unit tests for creating root _.context.ts file --- src/typescript-generator/repository.js | 2 ++ test/typescript-generator/repository.test.js | 31 +++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/typescript-generator/repository.js b/src/typescript-generator/repository.js index 0f11c1ae..73b043f9 100644 --- a/src/typescript-generator/repository.js +++ b/src/typescript-generator/repository.js @@ -129,6 +129,8 @@ export class Repository { return; } + await ensureDirectoryExists(contextFilePath); + await fs.writeFile( contextFilePath, `/** diff --git a/test/typescript-generator/repository.test.js b/test/typescript-generator/repository.test.js index d3c400a6..956b9ce7 100644 --- a/test/typescript-generator/repository.test.js +++ b/test/typescript-generator/repository.test.js @@ -23,7 +23,7 @@ describe("a Repository", () => { "finds the relative location of the most relevant _.context.ts file (%s => %s)", async (importingFilePath, relativePathToNearestContext) => { await usingTemporaryFiles(async ({ add, path }) => { - const repository = new Repository(path(".")); + const repository = new Repository(); await add("./paths/_.context.ts", "export class Context"); await add("./paths/a/b/_.context.ts", "export class Context"); @@ -34,4 +34,33 @@ describe("a Repository", () => { }); }, ); + + it("creates the root _.context.ts file", async () => { + await usingTemporaryFiles(async ({ path, read }) => { + const repository = new Repository(); + + await repository.writeFiles(path(".")); + + await expect(read("./paths/_.context.ts")).resolves.toContain( + "export class Context", + ); + }); + }); + + it("does not overwrite an existing _.context.ts file", async () => { + await usingTemporaryFiles(async ({ add, path, read }) => { + const repository = new Repository(); + + await add( + "./paths/_.context.ts", + "export class Context { /* do not overwrite me */ }", + ); + + await repository.writeFiles(path(".")); + + await expect(read("./paths/_.context.ts")).resolves.toContain( + "do not overwrite me", + ); + }); + }); }); From 317fbaa9aef134f4b3f600a07c5c3add707a0b20 Mon Sep 17 00:00:00 2001 From: Patrick McElhaney Date: Sat, 10 Feb 2024 14:54:39 -0500 Subject: [PATCH 6/7] changeset for fixing _.context.ts --- .changeset/spicy-mice-smell.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .changeset/spicy-mice-smell.md diff --git a/.changeset/spicy-mice-smell.md b/.changeset/spicy-mice-smell.md new file mode 100644 index 00000000..8bfdb113 --- /dev/null +++ b/.changeset/spicy-mice-smell.md @@ -0,0 +1,8 @@ +--- +"counterfact": patch +--- + +Fixed and simplified the way `\_.context.ts` files work. + +- it's no longer necessary to have a `_.context.ts` file in every directory, only the ones where you want to establish a new context +- removed the need for `export type ContextType` From b0c56d5bcc06eaac721707099bec6986ac57f192 Mon Sep 17 00:00:00 2001 From: Patrick McElhaney Date: Sat, 10 Feb 2024 15:11:22 -0500 Subject: [PATCH 7/7] fix unit test so that it works on Windows --- test/typescript-generator/repository.test.js | 22 ++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/test/typescript-generator/repository.test.js b/test/typescript-generator/repository.test.js index 956b9ce7..b122e57b 100644 --- a/test/typescript-generator/repository.test.js +++ b/test/typescript-generator/repository.test.js @@ -1,7 +1,15 @@ +import { sep } from "node:path"; + import { usingTemporaryFiles } from "using-temporary-files"; import { Repository } from "../../src/typescript-generator/repository.js"; +function osPaths(testCases) { + return testCases.map((testCase) => + testCase.map((path) => path.replaceAll("/", sep)), + ); +} + describe("a Repository", () => { it("creates a new Script or returns an existing one", () => { const repository = new Repository("/base/path"); @@ -14,12 +22,14 @@ describe("a Repository", () => { expect(a2).toBe(a); }); - it.each([ - ["./path-types/x.ts", "../paths/_.context.ts"], - ["./path-types/a/x.ts", "../../paths/_.context.ts"], - ["./path-types/a/b/x.ts", "../../../paths/a/b/_.context.ts"], - ["./path-types/a/b/c/x.ts", "../../../../paths/a/b/_.context.ts"], - ])( + it.each( + osPaths([ + ["./path-types/x.ts", "../paths/_.context.ts"], + ["./path-types/a/x.ts", "../../paths/_.context.ts"], + ["./path-types/a/b/x.ts", "../../../paths/a/b/_.context.ts"], + ["./path-types/a/b/c/x.ts", "../../../../paths/a/b/_.context.ts"], + ]), + )( "finds the relative location of the most relevant _.context.ts file (%s => %s)", async (importingFilePath, relativePathToNearestContext) => { await usingTemporaryFiles(async ({ add, path }) => {