Skip to content

Commit

Permalink
(fix): write mock definition (#3730)
Browse files Browse the repository at this point in the history
(fix): write proper mock definition
  • Loading branch information
dsinghvi authored May 30, 2024
1 parent 8071e87 commit 4815967
Show file tree
Hide file tree
Showing 7 changed files with 101 additions and 12 deletions.
2 changes: 2 additions & 0 deletions .pnp.cjs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export async function generateWorkspace({
});
} else {
await runRemoteGenerationForAPIWorkspace({
projectConfig,
organization,
workspace,
context,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
"decompress": "^4.2.1",
"form-data": "4.0.0",
"image-size": "^1.1.1",
"js-yaml": "^4.1.0",
"lodash-es": "^4.17.21",
"mime-types": "^2.1.35",
"tar": "^6.2.1",
Expand All @@ -57,6 +58,7 @@
"devDependencies": {
"@types/decompress": "^4.2.7",
"@types/jest": "^29.0.3",
"@types/js-yaml": "^4.0.8",
"@types/lodash-es": "^4.17.12",
"@types/mime-types": "^2.1.4",
"@types/node": "^18.7.18",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,34 @@
import { FernToken } from "@fern-api/auth";
import { generatorsYml } from "@fern-api/configuration";
import {
DEFINITION_DIRECTORY,
fernConfigJson,
FERN_DIRECTORY,
generatorsYml,
PROJECT_CONFIG_FILENAME,
ROOT_API_FILENAME
} from "@fern-api/configuration";
import { createFiddleService, getFiddleOrigin } from "@fern-api/core";
import { AbsoluteFilePath, stringifyLargeObject } from "@fern-api/fs-utils";
import { AbsoluteFilePath, dirname, join, RelativeFilePath, stringifyLargeObject } from "@fern-api/fs-utils";
import {
migrateIntermediateRepresentationForGenerator,
migrateIntermediateRepresentationToVersionForGenerator
} from "@fern-api/ir-migrations";
import { IntermediateRepresentation } from "@fern-api/ir-sdk";
import { TaskContext } from "@fern-api/task-context";
import { APIWorkspace } from "@fern-api/workspace-loader";
import { FernDefinition, FernWorkspace } from "@fern-api/workspace-loader";
import { FernFiddle } from "@fern-fern/fiddle-sdk";
import { Fetcher } from "@fern-fern/fiddle-sdk/core";
import axios, { AxiosError } from "axios";
import FormData from "form-data";
import { readFile } from "fs/promises";
import path from "path";
import { mkdir, readFile, writeFile } from "fs/promises";
import yaml from "js-yaml";
import tar from "tar";
import tmp from "tmp-promise";
import urlJoin from "url-join";
import { substituteEnvVariables } from "./substituteEnvVariables";

export async function createAndStartJob({
projectConfig,
workspace,
organization,
intermediateRepresentation,
Expand All @@ -33,7 +41,8 @@ export async function createAndStartJob({
irVersionOverride,
absolutePathToPreview
}: {
workspace: APIWorkspace;
projectConfig: fernConfigJson.ProjectConfig;
workspace: FernWorkspace;
organization: string;
intermediateRepresentation: IntermediateRepresentation;
generatorInvocation: generatorsYml.GeneratorInvocation;
Expand All @@ -46,6 +55,7 @@ export async function createAndStartJob({
absolutePathToPreview: AbsoluteFilePath | undefined;
}): Promise<FernFiddle.remoteGen.CreateJobResponse> {
const job = await createJob({
projectConfig,
workspace,
organization,
generatorInvocation,
Expand All @@ -61,6 +71,7 @@ export async function createAndStartJob({
}

async function createJob({
projectConfig,
workspace,
organization,
generatorInvocation,
Expand All @@ -71,7 +82,8 @@ async function createJob({
whitelabel,
absolutePathToPreview
}: {
workspace: APIWorkspace;
projectConfig: fernConfigJson.ProjectConfig;
workspace: FernWorkspace;
organization: string;
generatorInvocation: generatorsYml.GeneratorInvocation;
version: string | undefined;
Expand Down Expand Up @@ -99,9 +111,37 @@ async function createJob({
if (generatorInvocation.outputMode.type.startsWith("github")) {
try {
const tmpDir = await tmp.dir();
const tarPath = path.join(tmpDir.path, "definition.tgz");
context.logger.debug(`Compressing definition at ${tmpDir.path}`);
await tar.create({ file: tarPath, cwd: workspace.absoluteFilepath }, ["."]);

const absolutePathToTmpDir = AbsoluteFilePath.of(tmpDir.path);
context.logger.debug(`Writing mock fern definition to ${absolutePathToTmpDir}`);

const absolutePathToTmpFernDirectory = join(absolutePathToTmpDir, RelativeFilePath.of(FERN_DIRECTORY));
const absolutePathToTmpDefinitionDirectory = join(
absolutePathToTmpFernDirectory,
RelativeFilePath.of(DEFINITION_DIRECTORY)
);
await mkdir(absolutePathToTmpDefinitionDirectory, { recursive: true });

// write api.yml
const absolutePathToApiYml = join(
absolutePathToTmpDefinitionDirectory,
RelativeFilePath.of(ROOT_API_FILENAME)
);
await writeFile(absolutePathToApiYml, yaml.dump(workspace.definition.rootApiFile.contents));
// write definition
await writeFernDefinition({
absolutePathToDefinitionDirectory: absolutePathToTmpDefinitionDirectory,
definition: workspace.definition
});
// write fern.config.json
const absolutePathToFernConfigJson = join(
absolutePathToTmpFernDirectory,
RelativeFilePath.of(PROJECT_CONFIG_FILENAME)
);
await writeFile(absolutePathToFernConfigJson, JSON.stringify(projectConfig.rawConfig, undefined, 2));

const tarPath = join(absolutePathToTmpDir, RelativeFilePath.of("definition.tgz"));
await tar.create({ file: tarPath, cwd: absolutePathToTmpFernDirectory }, ["."]);

// Upload definition to S3
context.logger.debug("Getting upload URL for Fern definition.");
Expand Down Expand Up @@ -204,6 +244,42 @@ async function createJob({
return createResponse.body;
}

async function writeFernDefinition({
absolutePathToDefinitionDirectory,
definition
}: {
absolutePathToDefinitionDirectory: AbsoluteFilePath;
definition: FernDefinition;
}): Promise<void> {
// write *.yml
for (const [relativePath, definitionFile] of Object.entries(definition.namedDefinitionFiles)) {
const absolutePathToDefinitionFile = join(absolutePathToDefinitionDirectory, RelativeFilePath.of(relativePath));
await mkdir(dirname(absolutePathToDefinitionFile), { recursive: true });
await writeFile(absolutePathToDefinitionFile, yaml.dump(definitionFile.contents));
}
// write __package__.yml
for (const [relativePath, packageMarker] of Object.entries(definition.packageMarkers)) {
if (packageMarker.contents.export == null) {
const absolutePathToPackageMarker = join(
absolutePathToDefinitionDirectory,
RelativeFilePath.of(relativePath)
);
await mkdir(dirname(absolutePathToPackageMarker), { recursive: true });
await writeFile(absolutePathToPackageMarker, yaml.dump(packageMarker.contents));
}
}
// write imported definitions
for (const [relativePath, importedDefinition] of Object.entries(definition.importedDefinitions)) {
await writeFernDefinition({
absolutePathToDefinitionDirectory: join(
absolutePathToDefinitionDirectory,
RelativeFilePath.of(relativePath)
),
definition: importedDefinition
});
}
}

async function startJob({
intermediateRepresentation,
generatorInvocation,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { FernToken } from "@fern-api/auth";
import { generatorsYml } from "@fern-api/configuration";
import { fernConfigJson, generatorsYml } from "@fern-api/configuration";
import { AbsoluteFilePath } from "@fern-api/fs-utils";
import { TaskContext } from "@fern-api/task-context";
import { FernWorkspace } from "@fern-api/workspace-loader";
Expand All @@ -12,6 +12,7 @@ export interface RemoteGenerationForAPIWorkspaceResponse {
}

export async function runRemoteGenerationForAPIWorkspace({
projectConfig,
organization,
workspace,
context,
Expand All @@ -22,6 +23,7 @@ export async function runRemoteGenerationForAPIWorkspace({
whitelabel,
absolutePathToPreview
}: {
projectConfig: fernConfigJson.ProjectConfig;
organization: string;
workspace: FernWorkspace;
context: TaskContext;
Expand All @@ -44,6 +46,7 @@ export async function runRemoteGenerationForAPIWorkspace({
...generatorGroup.generators.map((generatorInvocation) =>
context.runInteractiveTask({ name: generatorInvocation.name }, async (interactiveTaskContext) => {
const remoteTaskHandlerResponse = await runRemoteGenerationForGenerator({
projectConfig,
organization,
workspace,
interactiveTaskContext,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { FernToken } from "@fern-api/auth";
import { Audiences, generatorsYml } from "@fern-api/configuration";
import { Audiences, fernConfigJson, generatorsYml } from "@fern-api/configuration";
import { AbsoluteFilePath } from "@fern-api/fs-utils";
import { generateIntermediateRepresentation } from "@fern-api/ir-generator";
import { InteractiveTaskContext } from "@fern-api/task-context";
Expand All @@ -10,6 +10,7 @@ import { pollJobAndReportStatus } from "./pollJobAndReportStatus";
import { RemoteTaskHandler } from "./RemoteTaskHandler";

export async function runRemoteGenerationForGenerator({
projectConfig,
organization,
workspace,
interactiveTaskContext,
Expand All @@ -22,6 +23,7 @@ export async function runRemoteGenerationForGenerator({
irVersionOverride,
absolutePathToPreview
}: {
projectConfig: fernConfigJson.ProjectConfig;
organization: string;
workspace: FernWorkspace;
interactiveTaskContext: InteractiveTaskContext;
Expand All @@ -43,6 +45,7 @@ export async function runRemoteGenerationForGenerator({
});

const job = await createAndStartJob({
projectConfig,
workspace,
organization,
generatorInvocation,
Expand Down
2 changes: 2 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4367,6 +4367,7 @@ __metadata:
"@fern-fern/fiddle-sdk": ^0.0.552
"@types/decompress": ^4.2.7
"@types/jest": ^29.0.3
"@types/js-yaml": ^4.0.8
"@types/lodash-es": ^4.17.12
"@types/mime-types": ^2.1.4
"@types/node": ^18.7.18
Expand All @@ -4380,6 +4381,7 @@ __metadata:
form-data: 4.0.0
image-size: ^1.1.1
jest: ^29.7.0
js-yaml: ^4.1.0
lodash-es: ^4.17.21
mime-types: ^2.1.35
organize-imports-cli: ^0.10.0
Expand Down

0 comments on commit 4815967

Please sign in to comment.