diff --git a/.pnp.cjs b/.pnp.cjs index d5c1fec32d5..3b5d17c9da3 100644 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -55,6 +55,18 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "name": "@fern-api/fern-ruby-sdk",\ "reference": "workspace:generators/ruby/sdk"\ },\ + {\ + "name": "@fern-api/rust-codegen",\ + "reference": "workspace:generators/rust/codegen"\ + },\ + {\ + "name": "@fern-api/swift-codegen",\ + "reference": "workspace:generators/swift/codegen"\ + },\ + {\ + "name": "@fern-api/LANGUAGE_NAME-codegen",\ + "reference": "workspace:generators/template/codegen"\ + },\ {\ "name": "@fern-typescript/express-generator-cli",\ "reference": "workspace:generators/typescript/express/cli"\ @@ -371,6 +383,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "enableTopLevelFallback": true,\ "ignorePatternData": "(^(?:\\\\.yarn\\\\/sdks(?:\\\\/(?!\\\\.{1,2}(?:\\\\/|$))(?:(?:(?!(?:^|\\\\/)\\\\.{1,2}(?:\\\\/|$)).)*?)|$))$)",\ "fallbackExclusionList": [\ + ["@fern-api/LANGUAGE_NAME-codegen", ["workspace:generators/template/codegen"]],\ ["@fern-api/auth", ["workspace:packages/cli/auth"]],\ ["@fern-api/browser-playground", ["workspace:generators/typescript/playground/browser"]],\ ["@fern-api/cli", ["workspace:packages/cli/cli"]],\ @@ -412,9 +425,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@fern-api/remote-workspace-runner", ["workspace:packages/cli/generation/remote-generation/remote-workspace-runner"]],\ ["@fern-api/ruby-codegen", ["workspace:generators/ruby/codegen"]],\ ["@fern-api/ruby-generator-cli", ["workspace:generators/ruby/cli"]],\ + ["@fern-api/rust-codegen", ["workspace:generators/rust/codegen"]],\ ["@fern-api/scripts", ["workspace:packages/scripts"]],\ ["@fern-api/seed-cli", ["workspace:packages/seed"]],\ ["@fern-api/semver-utils", ["workspace:packages/cli/semver-utils"]],\ + ["@fern-api/swift-codegen", ["workspace:generators/swift/codegen"]],\ ["@fern-api/task-context", ["workspace:packages/cli/task-context"]],\ ["@fern-api/validator", ["workspace:packages/cli/yaml/validator"]],\ ["@fern-api/workspace-loader", ["workspace:packages/cli/workspace-loader"]],\ @@ -6348,6 +6363,31 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@fern-api/LANGUAGE_NAME-codegen", [\ + ["workspace:generators/template/codegen", {\ + "packageLocation": "./generators/template/codegen/",\ + "packageDependencies": [\ + ["@fern-api/LANGUAGE_NAME-codegen", "workspace:generators/template/codegen"],\ + ["@fern-api/core-utils", "workspace:packages/commons/core-utils"],\ + ["@fern-api/fs-utils", "workspace:packages/commons/fs-utils"],\ + ["@fern-api/generator-commons", "workspace:generators/commons"],\ + ["@fern-api/logging-execa", "workspace:packages/commons/logging-execa"],\ + ["@fern-fern/ir-sdk", "npm:32.0.0"],\ + ["@types/jest", "npm:29.0.3"],\ + ["@types/lodash-es", "npm:4.17.12"],\ + ["@types/node", "npm:18.7.18"],\ + ["depcheck", "npm:1.4.6"],\ + ["eslint", "npm:8.56.0"],\ + ["jest", "virtual:816fb67d993b0978271f762d4ccbec7209ef2546c234ca6e241662d44336c8e32c1c3c07189cfe14b67974a4840e1ed140408a7403bf9deb68c1953445072efe#npm:29.7.0"],\ + ["lodash-es", "npm:4.17.21"],\ + ["organize-imports-cli", "npm:0.10.0"],\ + ["ts-node", "virtual:f8e21c9fa0a798b21a87ac455600e39198fef65848556a3a2cd5c956b0460181f9e618173dcff6d9d4fb96fb870055dfe1a3ec3db5db0700e71c0184e4711659#npm:10.9.2"],\ + ["typescript", "patch:typescript@npm%3A4.6.4#~builtin::version=4.6.4&hash=5d3a66"],\ + ["zod", "npm:3.22.4"]\ + ],\ + "linkType": "SOFT"\ + }]\ + ]],\ ["@fern-api/auth", [\ ["workspace:packages/cli/auth", {\ "packageLocation": "./packages/cli/auth/",\ @@ -7579,6 +7619,31 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "SOFT"\ }]\ ]],\ + ["@fern-api/rust-codegen", [\ + ["workspace:generators/rust/codegen", {\ + "packageLocation": "./generators/rust/codegen/",\ + "packageDependencies": [\ + ["@fern-api/rust-codegen", "workspace:generators/rust/codegen"],\ + ["@fern-api/core-utils", "workspace:packages/commons/core-utils"],\ + ["@fern-api/fs-utils", "workspace:packages/commons/fs-utils"],\ + ["@fern-api/generator-commons", "workspace:generators/commons"],\ + ["@fern-api/logging-execa", "workspace:packages/commons/logging-execa"],\ + ["@fern-fern/ir-sdk", "npm:32.0.0"],\ + ["@types/jest", "npm:29.0.3"],\ + ["@types/lodash-es", "npm:4.17.12"],\ + ["@types/node", "npm:18.7.18"],\ + ["depcheck", "npm:1.4.6"],\ + ["eslint", "npm:8.56.0"],\ + ["jest", "virtual:816fb67d993b0978271f762d4ccbec7209ef2546c234ca6e241662d44336c8e32c1c3c07189cfe14b67974a4840e1ed140408a7403bf9deb68c1953445072efe#npm:29.7.0"],\ + ["lodash-es", "npm:4.17.21"],\ + ["organize-imports-cli", "npm:0.10.0"],\ + ["ts-node", "virtual:f8e21c9fa0a798b21a87ac455600e39198fef65848556a3a2cd5c956b0460181f9e618173dcff6d9d4fb96fb870055dfe1a3ec3db5db0700e71c0184e4711659#npm:10.9.2"],\ + ["typescript", "patch:typescript@npm%3A4.6.4#~builtin::version=4.6.4&hash=5d3a66"],\ + ["zod", "npm:3.22.4"]\ + ],\ + "linkType": "SOFT"\ + }]\ + ]],\ ["@fern-api/scripts", [\ ["workspace:packages/scripts", {\ "packageLocation": "./packages/scripts/",\ @@ -7670,6 +7735,31 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "SOFT"\ }]\ ]],\ + ["@fern-api/swift-codegen", [\ + ["workspace:generators/swift/codegen", {\ + "packageLocation": "./generators/swift/codegen/",\ + "packageDependencies": [\ + ["@fern-api/swift-codegen", "workspace:generators/swift/codegen"],\ + ["@fern-api/core-utils", "workspace:packages/commons/core-utils"],\ + ["@fern-api/fs-utils", "workspace:packages/commons/fs-utils"],\ + ["@fern-api/generator-commons", "workspace:generators/commons"],\ + ["@fern-api/logging-execa", "workspace:packages/commons/logging-execa"],\ + ["@fern-fern/ir-sdk", "npm:32.0.0"],\ + ["@types/jest", "npm:29.0.3"],\ + ["@types/lodash-es", "npm:4.17.12"],\ + ["@types/node", "npm:18.7.18"],\ + ["depcheck", "npm:1.4.6"],\ + ["eslint", "npm:8.56.0"],\ + ["jest", "virtual:816fb67d993b0978271f762d4ccbec7209ef2546c234ca6e241662d44336c8e32c1c3c07189cfe14b67974a4840e1ed140408a7403bf9deb68c1953445072efe#npm:29.7.0"],\ + ["lodash-es", "npm:4.17.21"],\ + ["organize-imports-cli", "npm:0.10.0"],\ + ["ts-node", "virtual:f8e21c9fa0a798b21a87ac455600e39198fef65848556a3a2cd5c956b0460181f9e618173dcff6d9d4fb96fb870055dfe1a3ec3db5db0700e71c0184e4711659#npm:10.9.2"],\ + ["typescript", "patch:typescript@npm%3A4.6.4#~builtin::version=4.6.4&hash=5d3a66"],\ + ["zod", "npm:3.22.4"]\ + ],\ + "linkType": "SOFT"\ + }]\ + ]],\ ["@fern-api/task-context", [\ ["workspace:packages/cli/task-context", {\ "packageLocation": "./packages/cli/task-context/",\ diff --git a/generators/commons/src/AstNode.ts b/generators/commons/src/AstNode.ts new file mode 100644 index 00000000000..06dad9e30ee --- /dev/null +++ b/generators/commons/src/AstNode.ts @@ -0,0 +1,25 @@ +import { Writer } from "./Writer"; + +export abstract class AstNode { + + private indentSize: number; + + constructor(indentSize: number) { + this.indentSize = indentSize; + } + + /** + * Every AST node knows how to write itself to a string. + */ + public abstract write(writer: Writer): void; + + /** + * Writes the node to a string. + */ + public toString(): string { + const writer = new Writer(this.indentSize); + this.write(writer); + return writer.toString(); + } + +} diff --git a/generators/commons/src/Writer.ts b/generators/commons/src/Writer.ts new file mode 100644 index 00000000000..aa466004d6b --- /dev/null +++ b/generators/commons/src/Writer.ts @@ -0,0 +1,64 @@ +import { AstNode } from "./AstNode"; + +export declare namespace Writer { + interface Args { + tabSize?: number; + } +} + +export class Writer { + + private buffer: string; + private indentLevel: number; + private hasWrittenAnything: boolean; + private indentSize: number; + + constructor(indentSize: number) { + this.buffer = ""; + this.indentLevel = 0; + this.hasWrittenAnything = false; + this.indentSize = indentSize; + } + + public write(text: string): void { + + if (this.hasWrittenAnything) { + this.buffer += "\n"; + } + + const indent = this.getIndentString(this.indentSize); + const indentedText = indent + text.replace(/\n/g, `\n${indent}`); + + this.buffer += indentedText; + + this.hasWrittenAnything = true; + + } + + public newLine(): void { + this.buffer += "\n"; + } + + public openIndent(): void { + this.indentLevel++; + } + + public closeIndent(): void { + if (this.indentLevel > 0) { + this.indentLevel--; + } + } + + public writeNode(node: AstNode): void { + node.write(this); + } + + public toString(): string { + return this.buffer; + } + + private getIndentString(tabSize: number): string { + return " ".repeat(this.indentLevel * tabSize); + } + +} \ No newline at end of file diff --git a/generators/commons/src/index.ts b/generators/commons/src/index.ts index 9fb6ab6beee..846a88cadc5 100644 --- a/generators/commons/src/index.ts +++ b/generators/commons/src/index.ts @@ -1,7 +1,9 @@ +export * from "./AbstractGeneratorCli"; +export * from "./AbstractGeneratorContext"; +export * from "./AstNode"; export * from "./BaseGeneratorConfig"; export * from "./ConfigUtilities"; -export * from "./AbstractGeneratorContext"; -export * from "./PersistedProject"; export * from "./GeneratorNotificationService"; export * from "./parseGeneratorConfig"; -export * from "./AbstractGeneratorCli"; +export * from "./PersistedProject"; +export * from "./Writer"; diff --git a/generators/commons/tsconfig.json b/generators/commons/tsconfig.json index 5d331c2fe89..15e205394c8 100644 --- a/generators/commons/tsconfig.json +++ b/generators/commons/tsconfig.json @@ -1,11 +1,25 @@ { "extends": "../../shared/tsconfig.shared.json", - "compilerOptions": { "composite": true, "outDir": "lib", "rootDir": "src" }, - "include": ["./src/**/*"], + "compilerOptions": { + "composite": true, + "outDir": "lib", + "rootDir": "src" + }, + "include": [ + "./src/**/*" + ], "references": [ - { "path": "../../packages/cli/logger" }, - { "path": "../../packages/commons/core-utils" }, - { "path": "../../packages/commons/fs-utils" }, - { "path": "../../packages/commons/logging-execa" } + { + "path": "../../packages/cli/logger" + }, + { + "path": "../../packages/commons/core-utils" + }, + { + "path": "../../packages/commons/fs-utils" + }, + { + "path": "../../packages/commons/logging-execa" + } ] -} +} \ No newline at end of file diff --git a/generators/template/codegen/.prettierrc.cjs b/generators/template/codegen/.prettierrc.cjs new file mode 100644 index 00000000000..a5a9662f7fd --- /dev/null +++ b/generators/template/codegen/.prettierrc.cjs @@ -0,0 +1 @@ +module.exports = require("fern/.prettierrc"); diff --git a/generators/template/codegen/jest.config.ts b/generators/template/codegen/jest.config.ts new file mode 100644 index 00000000000..ea7ca64600d --- /dev/null +++ b/generators/template/codegen/jest.config.ts @@ -0,0 +1 @@ +export { default } from "../../../shared/jest.config.shared"; diff --git a/generators/template/codegen/package.json b/generators/template/codegen/package.json new file mode 100644 index 00000000000..44892fd9b8e --- /dev/null +++ b/generators/template/codegen/package.json @@ -0,0 +1,48 @@ +{ + "name": "@fern-api/LANGUAGE_NAME-codegen", + "version": "0.0.0", + "repository": { + "type": "git", + "url": "https://github.com/fern-api/fern.git", + "directory": "generators/LANGUAGE_NAME/codegen" + }, + "files": [ + "lib" + ], + "type": "module", + "source": "src/index.ts", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "sideEffects": false, + "scripts": { + "clean": "rm -rf ./lib && tsc --build --clean", + "compile": "tsc --build", + "test": "yarn compile && jest --passWithNoTests", + "lint:eslint": "eslint --max-warnings 0 . --ignore-path=../../../.eslintignore", + "lint:eslint:fix": "yarn lint:eslint --fix", + "format": "prettier --write --ignore-unknown --ignore-path ../../../shared/.prettierignore \"**\"", + "format:check": "prettier --check --ignore-unknown --ignore-path ../../../shared/.prettierignore \"**\"", + "organize-imports": "organize-imports-cli tsconfig.json", + "depcheck": "depcheck" + }, + "dependencies": { + "@fern-api/core-utils": "workspace:*", + "@fern-api/fs-utils": "workspace:*", + "@fern-api/generator-commons": "workspace:*", + "@fern-api/logging-execa": "workspace:*", + "@fern-fern/ir-sdk": "^32", + "lodash-es": "^4.17.21", + "ts-node": "^10.9.2", + "zod": "^3.22.3" + }, + "devDependencies": { + "@types/jest": "^29.0.3", + "@types/lodash-es": "^4.17.12", + "@types/node": "^18.7.18", + "depcheck": "^1.4.6", + "eslint": "^8.56.0", + "jest": "^29.7.0", + "organize-imports-cli": "^0.10.0", + "typescript": "4.6.4" + } +} diff --git a/generators/template/codegen/src/ast/Class.ts b/generators/template/codegen/src/ast/Class.ts new file mode 100644 index 00000000000..82f0dfa7336 --- /dev/null +++ b/generators/template/codegen/src/ast/Class.ts @@ -0,0 +1,44 @@ +import { AstNode, Writer } from "@fern-api/generator-commons"; +import Lang, { Func } from "../lang"; + +export declare namespace Class { + interface Args { + name: string, + functions: Func[] + } +} + +export class Class extends AstNode { + + public readonly name: string; + public readonly functions: Func[]; + + constructor({ + name, + functions, + }: Class.Args) { + super(Lang.indentSize); + this.name = name; + this.functions = functions; + } + + public write(writer: Writer): void { + + writer.write(`class ${this.name} {`); + + writer.newLine(); + + writer.openIndent(); + + this.functions.forEach(func => { + writer.writeNode(func); + writer.newLine(); + }); + + writer.closeIndent(); + + writer.write("}"); + + + } +} diff --git a/generators/template/codegen/src/ast/File.ts b/generators/template/codegen/src/ast/File.ts new file mode 100644 index 00000000000..07d5bf8307a --- /dev/null +++ b/generators/template/codegen/src/ast/File.ts @@ -0,0 +1,36 @@ +import { AstNode, Writer } from "@fern-api/generator-commons"; +import Lang, { Class } from "../lang"; + +export declare namespace File { + interface Args { + name: string, + class: Class + } +} + +export class File extends AstNode { + + public readonly name: string; + public readonly class: Class; + + constructor({ + name, + class: classInstance, + }: File.Args) { + super(Lang.indentSize); + this.name = name; + this.class = classInstance; + } + + public write(writer: Writer): void { + + writer.write(`// 🌿 ${this.name}`); + + writer.newLine(); + + writer.writeNode(this.class); + + writer.newLine(); + + } +} diff --git a/generators/template/codegen/src/ast/Func.ts b/generators/template/codegen/src/ast/Func.ts new file mode 100644 index 00000000000..180807c0c67 --- /dev/null +++ b/generators/template/codegen/src/ast/Func.ts @@ -0,0 +1,32 @@ +import { AstNode, Writer } from "@fern-api/generator-commons"; +import Lang from "../lang"; + +export declare namespace Func { + interface Args { + name: string + } +} + +export class Func extends AstNode { + + public readonly name: string; + + constructor({ + name, + }: Func.Args) { + super(Lang.indentSize); + this.name = name; + } + + public write(writer: Writer): void { + + writer.write(`function ${this.name}() {`); + + writer.openIndent(); + writer.write("print(\"Hey there! 🌱\")"); + writer.closeIndent(); + + writer.write("}"); + + } +} diff --git a/generators/template/codegen/src/ast/__test__/Lang.test.ts b/generators/template/codegen/src/ast/__test__/Lang.test.ts new file mode 100644 index 00000000000..75307776d11 --- /dev/null +++ b/generators/template/codegen/src/ast/__test__/Lang.test.ts @@ -0,0 +1,48 @@ +import Lang from "../../lang"; + +const FULL_LANGUAGE_NAME = Lang; + +describe("FULL_LANGUAGE_NAME Language", () => { + + // TODO: 👋 Add your other language tests here + + // Note: You can change the language's indentation size with FULL_LANGUAGE_NAME.indentSize + + it("makes function", () => { + const output = FULL_LANGUAGE_NAME.makeFunction({ + name: "doSomething", + }); + // eslint-disable-next-line no-console + console.log(output.toString()); + }); + + it("makes class", () => { + const output = FULL_LANGUAGE_NAME.makeClass({ + name: "Example", + functions: [ + FULL_LANGUAGE_NAME.makeFunction({ + name: "doSomething", + }), + ] + }); + // eslint-disable-next-line no-console + console.log(output.toString()); + }); + + it("makes file", () => { + const output = FULL_LANGUAGE_NAME.makeFile({ + name: "FernExample.LANGUAGE_NAME", + class: FULL_LANGUAGE_NAME.makeClass({ + name: "Example", + functions: [ + FULL_LANGUAGE_NAME.makeFunction({ + name: "doSomething", + }), + ] + }), + }); + // eslint-disable-next-line no-console + console.log(output.toString()); + }); + +}); diff --git a/generators/template/codegen/src/ast/index.ts b/generators/template/codegen/src/ast/index.ts new file mode 100644 index 00000000000..998274cff37 --- /dev/null +++ b/generators/template/codegen/src/ast/index.ts @@ -0,0 +1,5 @@ +export { Class } from "./Class"; +export { File } from "./File"; +export { Func } from "./Func"; + +// TODO: 👋 Add your other imports here \ No newline at end of file diff --git a/generators/template/codegen/src/index.ts b/generators/template/codegen/src/index.ts new file mode 100644 index 00000000000..84418d2abcc --- /dev/null +++ b/generators/template/codegen/src/index.ts @@ -0,0 +1 @@ +export * as LANGUAGE_NAME from "./lang"; diff --git a/generators/template/codegen/src/lang.ts b/generators/template/codegen/src/lang.ts new file mode 100644 index 00000000000..55361293294 --- /dev/null +++ b/generators/template/codegen/src/lang.ts @@ -0,0 +1,28 @@ +/* eslint-disable @typescript-eslint/no-extraneous-class */ +import * as Ast from "./ast"; +export * from "./ast"; + +export default class Lang { + + static indentSize = 4; + + // Breakdown the language functionality here. + // Checkout CSharp or Swift for more inspiration + // public static makeField(args: Ast.NAME.Args): Ast.NAME { + // return new Ast.NAME(args); + // } + + public static makeFunction(args: Ast.Func.Args): Ast.Func { + return new Ast.Func(args); + } + + public static makeClass(args: Ast.Class.Args): Ast.Class { + return new Ast.Class(args); + } + + public static makeFile(args: Ast.File.Args): Ast.File { + return new Ast.File(args); + } + +} + diff --git a/generators/template/codegen/tsconfig.json b/generators/template/codegen/tsconfig.json new file mode 100644 index 00000000000..21b5ee4f096 --- /dev/null +++ b/generators/template/codegen/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../shared/tsconfig.shared.json", + "compilerOptions": { + "composite": true, + "outDir": "lib", + "rootDir": "src" + }, + "include": [ + "./src/**/*" + ], + "references": [ + { + "path": "../../../packages/commons/core-utils" + }, + { + "path": "../../../packages/commons/fs-utils" + }, + { + "path": "../../../packages/commons/logging-execa" + }, + { + "path": "../../commons" + } + ] +} \ No newline at end of file diff --git a/scripts/create-generator.sh b/scripts/create-generator.sh new file mode 100644 index 00000000000..c7e09c25de8 --- /dev/null +++ b/scripts/create-generator.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +# Change to the root directory of the project +cd "$(dirname "$0")/.." || { echo "Failed to change to root directory"; exit 1; } + +# Prompt user for a name +read -p "Enter the language name (e.g. 'Swift', 'Rust', etc): " new_name +echo "🌿 Setting up a new generator for $new_name!" + +# Store the original name for later use +original_name="$new_name" + +# Convert new_name to lowercase and replace spaces/dashes with underscores +new_name=$(echo "$new_name" | tr '[:upper:]' '[:lower:]' | tr ' ' '_' | tr '-' '_') + +# Define paths +template_dir="generators/template" +new_dir="generators/$new_name" + +# Check if the template directory exists +if [ ! -d "$template_dir" ]; then + echo "Template directory 'generators/template' not found. Please make sure it exists." + exit 1 +fi + +# Check if the new directory already exists +if [ -d "$new_dir" ]; then + echo "Directory '$new_name' already exists. Please choose a different name." + exit 1 +fi + +# Copy template directory to a new directory with the user-provided name +cp -r "$template_dir" "$new_dir" + +# Function to recursively replace "FULL_LANGUAGE_NAME" in all files +replace_full_language_name() { + original_name="$1" + find "$new_dir" -type f -exec sed -i '' -e "s/FULL_LANGUAGE_NAME/$original_name/g" {} + +} + +# Call the function to replace "FULL_LANGUAGE_NAME" in all files within the new directory +replace_full_language_name "$original_name" + +# Function to recursively replace "LANGUAGE_NAME" in all files +replace_language_name() { + find "$1" -type f -exec sed -i '' -e "s/LANGUAGE_NAME/$new_name/g" {} + +} + +# Call the function to replace "LANGUAGE_NAME" in all files within the new directory +replace_language_name "$new_dir" + +echo "Directory '$new_name' created successfully at '$new_dir'" +cd "$new_dir/codegen" + +echo "🌿 Install typescript dependencies" +yarn install + +echo "🌿 Running sample tests" +yarn test + +echo "🌿 New language generator created for $new_name!" +echo "Start building it at: $new_dir" \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 28b1f39aa04..102cfe885da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3312,6 +3312,29 @@ __metadata: languageName: node linkType: hard +"@fern-api/LANGUAGE_NAME-codegen@workspace:generators/template/codegen": + version: 0.0.0-use.local + resolution: "@fern-api/LANGUAGE_NAME-codegen@workspace:generators/template/codegen" + dependencies: + "@fern-api/core-utils": "workspace:*" + "@fern-api/fs-utils": "workspace:*" + "@fern-api/generator-commons": "workspace:*" + "@fern-api/logging-execa": "workspace:*" + "@fern-fern/ir-sdk": ^32 + "@types/jest": ^29.0.3 + "@types/lodash-es": ^4.17.12 + "@types/node": ^18.7.18 + depcheck: ^1.4.6 + eslint: ^8.56.0 + jest: ^29.7.0 + lodash-es: ^4.17.21 + organize-imports-cli: ^0.10.0 + ts-node: ^10.9.2 + typescript: 4.6.4 + zod: ^3.22.3 + languageName: unknown + linkType: soft + "@fern-api/auth@workspace:*, @fern-api/auth@workspace:packages/cli/auth": version: 0.0.0-use.local resolution: "@fern-api/auth@workspace:packages/cli/auth" @@ -4476,6 +4499,29 @@ __metadata: languageName: unknown linkType: soft +"@fern-api/rust-codegen@workspace:generators/rust/codegen": + version: 0.0.0-use.local + resolution: "@fern-api/rust-codegen@workspace:generators/rust/codegen" + dependencies: + "@fern-api/core-utils": "workspace:*" + "@fern-api/fs-utils": "workspace:*" + "@fern-api/generator-commons": "workspace:*" + "@fern-api/logging-execa": "workspace:*" + "@fern-fern/ir-sdk": ^32 + "@types/jest": ^29.0.3 + "@types/lodash-es": ^4.17.12 + "@types/node": ^18.7.18 + depcheck: ^1.4.6 + eslint: ^8.56.0 + jest: ^29.7.0 + lodash-es: ^4.17.21 + organize-imports-cli: ^0.10.0 + ts-node: ^10.9.2 + typescript: 4.6.4 + zod: ^3.22.3 + languageName: unknown + linkType: soft + "@fern-api/scripts@workspace:packages/scripts": version: 0.0.0-use.local resolution: "@fern-api/scripts@workspace:packages/scripts" @@ -4565,6 +4611,29 @@ __metadata: languageName: unknown linkType: soft +"@fern-api/swift-codegen@workspace:generators/swift/codegen": + version: 0.0.0-use.local + resolution: "@fern-api/swift-codegen@workspace:generators/swift/codegen" + dependencies: + "@fern-api/core-utils": "workspace:*" + "@fern-api/fs-utils": "workspace:*" + "@fern-api/generator-commons": "workspace:*" + "@fern-api/logging-execa": "workspace:*" + "@fern-fern/ir-sdk": ^32 + "@types/jest": ^29.0.3 + "@types/lodash-es": ^4.17.12 + "@types/node": ^18.7.18 + depcheck: ^1.4.6 + eslint: ^8.56.0 + jest: ^29.7.0 + lodash-es: ^4.17.21 + organize-imports-cli: ^0.10.0 + ts-node: ^10.9.2 + typescript: 4.6.4 + zod: ^3.22.3 + languageName: unknown + linkType: soft + "@fern-api/task-context@workspace:*, @fern-api/task-context@workspace:packages/cli/task-context": version: 0.0.0-use.local resolution: "@fern-api/task-context@workspace:packages/cli/task-context"