diff --git a/.changeset/good-knives-juggle.md b/.changeset/good-knives-juggle.md new file mode 100644 index 00000000000..c6256a67e18 --- /dev/null +++ b/.changeset/good-knives-juggle.md @@ -0,0 +1,7 @@ +--- +"@fuel-ts/abi-typegen": patch +"@fuel-ts/versions": patch +"fuels": patch +--- + +fix: typegen reporting the correct versions diff --git a/packages/abi-typegen/src/AbiTypeGen.ts b/packages/abi-typegen/src/AbiTypeGen.ts index dc1e2754dde..2ad06488ff7 100644 --- a/packages/abi-typegen/src/AbiTypeGen.ts +++ b/packages/abi-typegen/src/AbiTypeGen.ts @@ -1,4 +1,5 @@ import { ErrorCode, FuelError } from '@fuel-ts/errors'; +import type { BinaryVersions } from '@fuel-ts/versions'; import { Abi } from './abi/Abi'; import { ProgramTypeEnum } from './types/enums/ProgramTypeEnum'; @@ -17,8 +18,8 @@ export class AbiTypeGen { public readonly binFiles: IFile[]; public readonly storageSlotsFiles: IFile[]; public readonly outputDir: string; - public readonly files: IFile[]; + public readonly versions: BinaryVersions; constructor(params: { abiFiles: IFile[]; @@ -26,14 +27,16 @@ export class AbiTypeGen { storageSlotsFiles: IFile[]; outputDir: string; programType: ProgramTypeEnum; + versions: BinaryVersions; }) { - const { abiFiles, binFiles, outputDir, programType, storageSlotsFiles } = params; + const { abiFiles, binFiles, outputDir, programType, storageSlotsFiles, versions } = params; this.outputDir = outputDir; this.abiFiles = abiFiles; this.binFiles = binFiles; this.storageSlotsFiles = storageSlotsFiles; + this.versions = versions; // Creates a `Abi` for each abi file this.abis = this.abiFiles.map((abiFile) => { @@ -71,16 +74,16 @@ export class AbiTypeGen { } private getAssembledFiles(params: { programType: ProgramTypeEnum }): IFile[] { - const { abis, outputDir } = this; + const { abis, outputDir, versions } = this; const { programType } = params; switch (programType) { case ProgramTypeEnum.CONTRACT: - return assembleContracts({ abis, outputDir }); + return assembleContracts({ abis, outputDir, versions }); case ProgramTypeEnum.SCRIPT: - return assembleScripts({ abis, outputDir }); + return assembleScripts({ abis, outputDir, versions }); case ProgramTypeEnum.PREDICATE: - return assemblePredicates({ abis, outputDir }); + return assemblePredicates({ abis, outputDir, versions }); default: throw new FuelError( ErrorCode.INVALID_INPUT_PARAMETERS, diff --git a/packages/abi-typegen/src/cli.ts b/packages/abi-typegen/src/cli.ts index 2ce115a6d59..0ca30663eb5 100644 --- a/packages/abi-typegen/src/cli.ts +++ b/packages/abi-typegen/src/cli.ts @@ -1,4 +1,4 @@ -import { versions } from '@fuel-ts/versions'; +import { versions as builtinVersion } from '@fuel-ts/versions'; import { Command, Option } from 'commander'; import { runTypegen } from './runTypegen'; @@ -84,7 +84,7 @@ export function run(params: { argv: string[]; programName: string }) { const { argv, programName } = params; program.name(programName); - program.version(versions.FUELS); + program.version(builtinVersion.FUELS); program.usage(`-i ../out/*-abi.json -o ./generated/`); configureCliOptions(program); diff --git a/packages/abi-typegen/src/runTypegen.ts b/packages/abi-typegen/src/runTypegen.ts index f13becd5574..2e42c1c0121 100644 --- a/packages/abi-typegen/src/runTypegen.ts +++ b/packages/abi-typegen/src/runTypegen.ts @@ -1,4 +1,5 @@ import { ErrorCode, FuelError } from '@fuel-ts/errors'; +import { versions as builtinVersions, type BinaryVersions } from '@fuel-ts/versions'; import { readFileSync, writeFileSync } from 'fs'; import { globSync } from 'glob'; import mkdirp from 'mkdirp'; @@ -18,10 +19,12 @@ export interface IGenerateFilesParams { output: string; silent?: boolean; programType: ProgramTypeEnum; + versions?: BinaryVersions; } export function runTypegen(params: IGenerateFilesParams) { const { cwd, inputs, output, silent, programType, filepaths: inputFilepaths } = params; + const versions: BinaryVersions = { FUELS: builtinVersions.FUELS, ...params.versions }; const cwdBasename = basename(cwd); @@ -76,6 +79,7 @@ export function runTypegen(params: IGenerateFilesParams) { binFiles, storageSlotsFiles, programType, + versions, }); /* diff --git a/packages/abi-typegen/src/templates/common/_header.hbs b/packages/abi-typegen/src/templates/common/_header.hbs index 03795282b54..8db1a0f0300 100644 --- a/packages/abi-typegen/src/templates/common/_header.hbs +++ b/packages/abi-typegen/src/templates/common/_header.hbs @@ -7,6 +7,10 @@ /* Fuels version: {{FUELS}} +{{#if FORC}} Forc version: {{FORC}} +{{/if}} +{{#if FUEL_CORE}} Fuel-Core version: {{FUEL_CORE}} +{{/if}} */ diff --git a/packages/abi-typegen/src/templates/common/common.test.ts b/packages/abi-typegen/src/templates/common/common.test.ts index 6209fb706a4..1c7e82dde7f 100644 --- a/packages/abi-typegen/src/templates/common/common.test.ts +++ b/packages/abi-typegen/src/templates/common/common.test.ts @@ -11,7 +11,7 @@ describe('templates/common', () => { const { versions, restore } = mockVersions(); // executing - const rendered = renderCommonTemplate(); + const rendered = renderCommonTemplate({ versions }); // validating restore(); diff --git a/packages/abi-typegen/src/templates/common/common.ts b/packages/abi-typegen/src/templates/common/common.ts index e6fa7400969..b8919a25316 100644 --- a/packages/abi-typegen/src/templates/common/common.ts +++ b/packages/abi-typegen/src/templates/common/common.ts @@ -1,8 +1,11 @@ +import type { BinaryVersions } from '@fuel-ts/versions'; + import { renderHbsTemplate } from '../renderHbsTemplate'; import commonTemplate from './common.hbs'; -export function renderCommonTemplate() { - const text = renderHbsTemplate({ template: commonTemplate }); +export function renderCommonTemplate(params: { versions: BinaryVersions }) { + const { versions } = params; + const text = renderHbsTemplate({ template: commonTemplate, versions }); return text; } diff --git a/packages/abi-typegen/src/templates/common/index.test.ts b/packages/abi-typegen/src/templates/common/index.test.ts index d74f06401ea..9ff52ada033 100644 --- a/packages/abi-typegen/src/templates/common/index.test.ts +++ b/packages/abi-typegen/src/templates/common/index.test.ts @@ -8,12 +8,12 @@ import { renderIndexTemplate } from './index'; describe('templates/index', () => { test('should render index template for contracts', () => { // mocking - const { restore } = mockVersions(); + const { versions, restore } = mockVersions(); // executing const files = [{ path: './Contract.ts' }, { path: './ContractFactory.ts' }]; - const rendered = renderIndexTemplate({ files }); + const rendered = renderIndexTemplate({ files, versions }); // validating restore(); diff --git a/packages/abi-typegen/src/templates/common/index.ts b/packages/abi-typegen/src/templates/common/index.ts index 10fcce9dc89..fea91e23273 100644 --- a/packages/abi-typegen/src/templates/common/index.ts +++ b/packages/abi-typegen/src/templates/common/index.ts @@ -1,15 +1,21 @@ +import type { BinaryVersions } from '@fuel-ts/versions'; + import type { IFile } from '../../types/interfaces/IFile'; import { renderHbsTemplate } from '../renderHbsTemplate'; import indexTemplate from './index.hbs'; -export function renderIndexTemplate(params: { files: Pick[] }) { - const { files } = params; +export function renderIndexTemplate(params: { + files: Pick[]; + versions: BinaryVersions; +}) { + const { files, versions } = params; const members = files.map((f) => f.path.match(/([^/]+)\.ts$/m)?.[1]); const text = renderHbsTemplate({ template: indexTemplate, + versions, data: { members, }, diff --git a/packages/abi-typegen/src/templates/contract/factory.test.ts b/packages/abi-typegen/src/templates/contract/factory.test.ts index 7983ca9ae6b..2be3c26a034 100644 --- a/packages/abi-typegen/src/templates/contract/factory.test.ts +++ b/packages/abi-typegen/src/templates/contract/factory.test.ts @@ -19,7 +19,7 @@ import { renderFactoryTemplate } from './factory'; describe('templates/factory', () => { test('should render factory template', () => { // mocking - const { restore } = mockVersions(); + const { versions, restore } = mockVersions(); // executing const project = getTypegenForcProject(AbiTypegenProjectsEnum.MINIMAL); @@ -36,7 +36,7 @@ describe('templates/factory', () => { programType: ProgramTypeEnum.CONTRACT, }); - let rendered = renderFactoryTemplate({ abi }); + let rendered = renderFactoryTemplate({ abi, versions }); rendered = autoUpdateFixture( join(__dirname, '../../../test/fixtures/templates/contract/factory.hbs'), diff --git a/packages/abi-typegen/src/templates/contract/factory.ts b/packages/abi-typegen/src/templates/contract/factory.ts index 08553d22da0..e0e865bf4cc 100644 --- a/packages/abi-typegen/src/templates/contract/factory.ts +++ b/packages/abi-typegen/src/templates/contract/factory.ts @@ -1,24 +1,27 @@ import { compressBytecode } from '@fuel-ts/utils'; +import type { BinaryVersions } from '@fuel-ts/versions'; import type { Abi } from '../../abi/Abi'; import { renderHbsTemplate } from '../renderHbsTemplate'; import factoryTemplate from './factory.hbs'; -export function renderFactoryTemplate(params: { abi: Abi }) { +export function renderFactoryTemplate(params: { abi: Abi; versions: BinaryVersions }) { + const { versions, abi } = params; const { camelizedName, capitalizedName, rawContents, storageSlotsContents, hexlifiedBinContents: hexlifiedBinString, - } = params.abi; + } = abi; const abiJsonString = JSON.stringify(rawContents, null, 2); const storageSlotsJsonString = storageSlotsContents ?? '[]'; const text = renderHbsTemplate({ template: factoryTemplate, + versions, data: { camelizedName, capitalizedName, diff --git a/packages/abi-typegen/src/templates/contract/main.test.ts b/packages/abi-typegen/src/templates/contract/main.test.ts index ef3dc35ce76..97dc0a70029 100644 --- a/packages/abi-typegen/src/templates/contract/main.test.ts +++ b/packages/abi-typegen/src/templates/contract/main.test.ts @@ -19,7 +19,7 @@ import { renderMainTemplate } from './main'; describe('templates/dts', () => { test('should render main template', () => { // mocking - const { restore } = mockVersions(); + const { versions } = mockVersions(); // executing const project = getTypegenForcProject(AbiTypegenProjectsEnum.FULL); @@ -32,21 +32,18 @@ describe('templates/dts', () => { programType: ProgramTypeEnum.CONTRACT, }); - let rendered = renderMainTemplate({ abi }); + let rendered = renderMainTemplate({ abi, versions }); rendered = autoUpdateFixture( join(__dirname, '../../../test/fixtures/templates/contract/main.hbs'), rendered ); - // validating - restore(); - expect(rendered).toEqual(expectedMainFullTemplate); }); test('should render main template with configurable', () => { - const { restore } = mockVersions(); + const { versions } = mockVersions(); const project = getTypegenForcProject(AbiTypegenProjectsEnum.MINIMAL_WITH_CONFIGURABLE); @@ -59,19 +56,18 @@ describe('templates/dts', () => { programType: ProgramTypeEnum.CONTRACT, }); - let rendered = renderMainTemplate({ abi }); + let rendered = renderMainTemplate({ abi, versions }); rendered = autoUpdateFixture( join(__dirname, '../../../test/fixtures/templates/contract-with-configurable/main.hbs'), rendered ); - restore(); - expect(rendered).toEqual(expectedMainMinimalConfigurableTemplate); }); test('should render main template w/ custom common types', () => { + const { versions } = mockVersions(); const project = getTypegenForcProject(AbiTypegenProjectsEnum.VECTOR_SIMPLE); const { abiContents: rawContents } = project; @@ -82,12 +78,13 @@ describe('templates/dts', () => { programType: ProgramTypeEnum.CONTRACT, }); - const rendered = renderMainTemplate({ abi }); + const rendered = renderMainTemplate({ abi, versions }); expect(rendered).toMatch(/^import type.+from ".\/common";$/m); }); test('should render dts cross-referencing for identical structs', () => { + const { versions } = mockVersions(); const project = getTypegenForcProject(AbiTypegenProjectsEnum.STRUCT_SIMPLE); const { abiContents: rawContents } = project; @@ -98,12 +95,13 @@ describe('templates/dts', () => { programType: ProgramTypeEnum.CONTRACT, }); - const rendered = renderMainTemplate({ abi }); + const rendered = renderMainTemplate({ abi, versions }); expect(rendered).toMatch(/export type StructBOutput = StructBInput;$/m); }); test('should render dts cross-referencing for identical enums', () => { + const { versions } = mockVersions(); const project = getTypegenForcProject(AbiTypegenProjectsEnum.ENUM_SIMPLE); const { abiContents: rawContents } = project; @@ -114,12 +112,13 @@ describe('templates/dts', () => { programType: ProgramTypeEnum.CONTRACT, }); - const rendered = renderMainTemplate({ abi }); + const rendered = renderMainTemplate({ abi, versions }); expect(rendered).toMatch(/export type MyEnumOutput = MyEnumInput;$/m); }); test('should not render same value for native identical enums', () => { + const { versions } = mockVersions(); const project = getTypegenForcProject(AbiTypegenProjectsEnum.ENUM_SIMPLE_NATIVE); const { abiContents: rawContents } = project; @@ -130,7 +129,7 @@ describe('templates/dts', () => { programType: ProgramTypeEnum.CONTRACT, }); - const rendered = renderMainTemplate({ abi }); + const rendered = renderMainTemplate({ abi, versions }); expect(rendered).toMatch( /export enum MyEnumOutput { Checked = 'Checked', Pending = 'Pending' };$/m diff --git a/packages/abi-typegen/src/templates/contract/main.ts b/packages/abi-typegen/src/templates/contract/main.ts index 8c9d90b05a6..759f3624f78 100644 --- a/packages/abi-typegen/src/templates/contract/main.ts +++ b/packages/abi-typegen/src/templates/contract/main.ts @@ -1,3 +1,5 @@ +import type { BinaryVersions } from '@fuel-ts/versions'; + import type { Abi } from '../../abi/Abi'; import { renderHbsTemplate } from '../renderHbsTemplate'; import { formatEnums } from '../utils/formatEnums'; @@ -6,9 +8,9 @@ import { formatStructs } from '../utils/formatStructs'; import mainTemplate from './main.hbs'; -export function renderMainTemplate(params: { abi: Abi }) { - const { camelizedName, capitalizedName, types, functions, commonTypesInUse, configurables } = - params.abi; +export function renderMainTemplate(params: { abi: Abi; versions: BinaryVersions }) { + const { versions, abi } = params; + const { camelizedName, capitalizedName, types, functions, commonTypesInUse, configurables } = abi; /* First we format all attributes @@ -42,6 +44,7 @@ export function renderMainTemplate(params: { abi: Abi }) { */ const text = renderHbsTemplate({ template: mainTemplate, + versions, data: { camelizedName, capitalizedName, diff --git a/packages/abi-typegen/src/templates/predicate/main.test.ts b/packages/abi-typegen/src/templates/predicate/main.test.ts index f545c655e58..874deea449c 100644 --- a/packages/abi-typegen/src/templates/predicate/main.test.ts +++ b/packages/abi-typegen/src/templates/predicate/main.test.ts @@ -26,7 +26,7 @@ describe('main.ts', () => { test('should render main template', () => { vi.spyOn(utilsMod, 'compressBytecode').mockReturnValueOnce('0x-bytecode-here'); - const { restore } = mockVersions(); + const { versions, restore } = mockVersions(); const project = getTypegenForcProject(AbiTypegenProjectsEnum.PREDICATE); @@ -40,7 +40,7 @@ describe('main.ts', () => { programType: ProgramTypeEnum.PREDICATE, }); - let rendered = renderMainTemplate({ abi }); + let rendered = renderMainTemplate({ abi, versions }); rendered = autoUpdateFixture( join(__dirname, '../../../test/fixtures/templates/predicate/main.hbs'), @@ -55,7 +55,7 @@ describe('main.ts', () => { test('should render main template with configurable', () => { vi.spyOn(utilsMod, 'compressBytecode').mockReturnValueOnce('0x-bytecode-here'); - const { restore } = mockVersions(); + const { versions, restore } = mockVersions(); const project = getTypegenForcProject(AbiTypegenProjectsEnum.PREDICATE_WITH_CONFIGURABLE); @@ -69,7 +69,7 @@ describe('main.ts', () => { programType: ProgramTypeEnum.PREDICATE, }); - let rendered = renderMainTemplate({ abi }); + let rendered = renderMainTemplate({ abi, versions }); rendered = autoUpdateFixture( join(__dirname, '../../../test/fixtures/templates/predicate-with-configurable/main.hbs'), @@ -82,7 +82,7 @@ describe('main.ts', () => { }); test('should throw for invalid Predicate ABI', async () => { - const { restore } = mockVersions(); + const { versions, restore } = mockVersions(); const project = getTypegenForcProject(AbiTypegenProjectsEnum.PREDICATE); const rawContents = project.abiContents; @@ -101,7 +101,7 @@ describe('main.ts', () => { }); const { error } = await safeExec(() => { - renderMainTemplate({ abi }); + renderMainTemplate({ abi, versions }); }); expect(error?.message).toMatch(/ABI doesn't have a 'main\(\)' method/); diff --git a/packages/abi-typegen/src/templates/predicate/main.ts b/packages/abi-typegen/src/templates/predicate/main.ts index 1861cbab8af..a2c928ecf94 100644 --- a/packages/abi-typegen/src/templates/predicate/main.ts +++ b/packages/abi-typegen/src/templates/predicate/main.ts @@ -1,5 +1,6 @@ import { ErrorCode, FuelError } from '@fuel-ts/errors'; import { compressBytecode } from '@fuel-ts/utils'; +import type { BinaryVersions } from '@fuel-ts/versions'; import type { Abi } from '../../abi/Abi'; import { renderHbsTemplate } from '../renderHbsTemplate'; @@ -9,8 +10,8 @@ import { formatStructs } from '../utils/formatStructs'; import mainTemplate from './main.hbs'; -export function renderMainTemplate(params: { abi: Abi }) { - const { abi } = params; +export function renderMainTemplate(params: { abi: Abi; versions: BinaryVersions }) { + const { abi, versions } = params; const { types, configurables } = abi; @@ -40,6 +41,7 @@ export function renderMainTemplate(params: { abi: Abi }) { const text = renderHbsTemplate({ template: mainTemplate, + versions, data: { inputs, output, diff --git a/packages/abi-typegen/src/templates/renderHbsTemplate.test.ts b/packages/abi-typegen/src/templates/renderHbsTemplate.test.ts index ce7f1d70beb..d10c6213ee6 100644 --- a/packages/abi-typegen/src/templates/renderHbsTemplate.test.ts +++ b/packages/abi-typegen/src/templates/renderHbsTemplate.test.ts @@ -13,7 +13,7 @@ describe('renderHbsTemplate.ts', () => { // executing const template = `{{header}}\nHello, {{project}}!`; const data = { project: 'Fuel' }; - const rendered = renderHbsTemplate({ template, data }); + const rendered = renderHbsTemplate({ template, data, versions }); // validating restore(); diff --git a/packages/abi-typegen/src/templates/renderHbsTemplate.ts b/packages/abi-typegen/src/templates/renderHbsTemplate.ts index 3738df617fb..9added055d0 100644 --- a/packages/abi-typegen/src/templates/renderHbsTemplate.ts +++ b/packages/abi-typegen/src/templates/renderHbsTemplate.ts @@ -1,4 +1,4 @@ -import { versions } from '@fuel-ts/versions'; +import type { BinaryVersions } from '@fuel-ts/versions'; import Handlebars from 'handlebars'; import headerTemplate from './common/_header.hbs'; @@ -7,8 +7,12 @@ import headerTemplate from './common/_header.hbs'; Renders the given template w/ the given data, while injecting common header for disabling lint rules and annotating Fuel component's versions. */ -export function renderHbsTemplate(params: { template: string; data?: Record }) { - const { data, template } = params; +export function renderHbsTemplate(params: { + template: string; + versions: BinaryVersions; + data?: Record; +}) { + const { data, template, versions } = params; const options = { strict: true, diff --git a/packages/abi-typegen/src/templates/script/main.test.ts b/packages/abi-typegen/src/templates/script/main.test.ts index 4ef110104b8..e71cd45095c 100644 --- a/packages/abi-typegen/src/templates/script/main.test.ts +++ b/packages/abi-typegen/src/templates/script/main.test.ts @@ -26,7 +26,7 @@ describe('main.ts', () => { test('should render main template', () => { vi.spyOn(utilsMod, 'compressBytecode').mockReturnValueOnce('0x-bytecode-here'); - const { restore } = mockVersions(); + const { versions, restore } = mockVersions(); const project = getTypegenForcProject(AbiTypegenProjectsEnum.SCRIPT); const rawContents = project.abiContents; @@ -39,7 +39,7 @@ describe('main.ts', () => { programType: ProgramTypeEnum.SCRIPT, }); - let rendered = renderMainTemplate({ abi }); + let rendered = renderMainTemplate({ abi, versions }); rendered = autoUpdateFixture( join(__dirname, '../../../test/fixtures/templates/script/main.hbs'), @@ -54,7 +54,7 @@ describe('main.ts', () => { test('should render main template with configurables', () => { vi.spyOn(utilsMod, 'compressBytecode').mockReturnValueOnce('0x-bytecode-here'); - const { restore } = mockVersions(); + const { versions, restore } = mockVersions(); const project = getTypegenForcProject(AbiTypegenProjectsEnum.SCRIPT_WITH_CONFIGURABLE); const rawContents = project.abiContents; @@ -67,7 +67,7 @@ describe('main.ts', () => { programType: ProgramTypeEnum.SCRIPT, }); - let rendered = renderMainTemplate({ abi }); + let rendered = renderMainTemplate({ abi, versions }); rendered = autoUpdateFixture( join(__dirname, '../../../test/fixtures/templates/script-with-configurable/main.hbs'), @@ -80,7 +80,7 @@ describe('main.ts', () => { }); test('should throw for invalid Script ABI', async () => { - const { restore } = mockVersions(); + const { versions, restore } = mockVersions(); const project = getTypegenForcProject(AbiTypegenProjectsEnum.SCRIPT); const rawContents = project.abiContents; @@ -99,7 +99,7 @@ describe('main.ts', () => { }); const { error } = await safeExec(() => { - renderMainTemplate({ abi }); + renderMainTemplate({ abi, versions }); }); restore(); diff --git a/packages/abi-typegen/src/templates/script/main.ts b/packages/abi-typegen/src/templates/script/main.ts index b3ef77de1ee..36b76d2ce74 100644 --- a/packages/abi-typegen/src/templates/script/main.ts +++ b/packages/abi-typegen/src/templates/script/main.ts @@ -1,5 +1,6 @@ import { ErrorCode, FuelError } from '@fuel-ts/errors'; import { compressBytecode } from '@fuel-ts/utils'; +import type { BinaryVersions } from '@fuel-ts/versions'; import type { Abi } from '../../abi/Abi'; import { renderHbsTemplate } from '../renderHbsTemplate'; @@ -9,8 +10,8 @@ import { formatStructs } from '../utils/formatStructs'; import mainTemplate from './main.hbs'; -export function renderMainTemplate(params: { abi: Abi }) { - const { abi } = params; +export function renderMainTemplate(params: { abi: Abi; versions: BinaryVersions }) { + const { abi, versions } = params; const { types, configurables } = abi; @@ -40,6 +41,7 @@ export function renderMainTemplate(params: { abi: Abi }) { const text = renderHbsTemplate({ template: mainTemplate, + versions, data: { inputs, output, diff --git a/packages/abi-typegen/src/utils/assembleContracts.test.ts b/packages/abi-typegen/src/utils/assembleContracts.test.ts index 8cf5649e3aa..f6bc37448cb 100644 --- a/packages/abi-typegen/src/utils/assembleContracts.test.ts +++ b/packages/abi-typegen/src/utils/assembleContracts.test.ts @@ -1,4 +1,5 @@ import { getNewAbiTypegen } from '../../test/utils/getNewAbiTypegen'; +import { mockVersions } from '../../test/utils/mockVersions'; import * as renderCommonTemplateMod from '../templates/common/common'; import * as renderIndexTemplateMod from '../templates/common/index'; import * as renderMainTemplateMod from '../templates/contract/main'; @@ -33,6 +34,7 @@ describe('assembleContracts.ts', () => { } test('should assemble all files from Contract ABI ', () => { + const { versions } = mockVersions(); const { typegen: { abis, outputDir }, } = getNewAbiTypegen({ @@ -42,7 +44,7 @@ describe('assembleContracts.ts', () => { const { renderCommonTemplate, renderFactoryTemplate, renderIndexTemplate } = mockAllDeps(); - const files = assembleContracts({ abis, outputDir }); + const files = assembleContracts({ abis, outputDir, versions }); expect(files.length).toEqual(5); // 2x main, 2x factory, 1x index @@ -52,6 +54,7 @@ describe('assembleContracts.ts', () => { }); test('should assemble all files from Contract ABI, including `common` file', () => { + const { versions } = mockVersions(); const { typegen: { abis, outputDir }, } = getNewAbiTypegen({ @@ -61,7 +64,7 @@ describe('assembleContracts.ts', () => { const { renderCommonTemplate, renderFactoryTemplate, renderIndexTemplate } = mockAllDeps(); - const files = assembleContracts({ abis, outputDir }); + const files = assembleContracts({ abis, outputDir, versions }); expect(files.length).toEqual(6); // 2x main, 2x factory, 1x index, 1x common diff --git a/packages/abi-typegen/src/utils/assembleContracts.ts b/packages/abi-typegen/src/utils/assembleContracts.ts index 09f4f90a43f..0b1c2dc817e 100644 --- a/packages/abi-typegen/src/utils/assembleContracts.ts +++ b/packages/abi-typegen/src/utils/assembleContracts.ts @@ -1,3 +1,4 @@ +import type { BinaryVersions } from '@fuel-ts/versions'; import { join } from 'path'; import type { Abi } from '../abi/Abi'; @@ -12,8 +13,12 @@ import { renderMainTemplate } from '../templates/contract/main'; * an array of `IFile` with them all. For here on, * the only thing missing is to write them to disk. */ -export function assembleContracts(params: { abis: Abi[]; outputDir: string }) { - const { abis, outputDir } = params; +export function assembleContracts(params: { + abis: Abi[]; + outputDir: string; + versions: BinaryVersions; +}) { + const { abis, outputDir, versions } = params; const files: IFile[] = []; const usesCommonTypes = abis.find((a) => a.commonTypesInUse.length > 0); @@ -26,12 +31,12 @@ export function assembleContracts(params: { abis: Abi[]; outputDir: string }) { const main: IFile = { path: mainFilepath, - contents: renderMainTemplate({ abi }), + contents: renderMainTemplate({ abi, versions }), }; const factory: IFile = { path: factoryFilepath, - contents: renderFactoryTemplate({ abi }), + contents: renderFactoryTemplate({ abi, versions }), }; files.push(main); @@ -41,7 +46,7 @@ export function assembleContracts(params: { abis: Abi[]; outputDir: string }) { // Includes index file const indexFile: IFile = { path: `${outputDir}/index.ts`, - contents: renderIndexTemplate({ files }), + contents: renderIndexTemplate({ files, versions }), }; files.push(indexFile); @@ -51,7 +56,7 @@ export function assembleContracts(params: { abis: Abi[]; outputDir: string }) { const commonsFilepath = join(outputDir, 'common.d.ts'); const file: IFile = { path: commonsFilepath, - contents: renderCommonTemplate(), + contents: renderCommonTemplate({ versions }), }; files.push(file); } diff --git a/packages/abi-typegen/src/utils/assemblePredicates.test.ts b/packages/abi-typegen/src/utils/assemblePredicates.test.ts index b908ce6d466..2311154dd9c 100644 --- a/packages/abi-typegen/src/utils/assemblePredicates.test.ts +++ b/packages/abi-typegen/src/utils/assemblePredicates.test.ts @@ -1,4 +1,5 @@ import { getNewAbiTypegen } from '../../test/utils/getNewAbiTypegen'; +import { mockVersions } from '../../test/utils/mockVersions'; import * as renderCommonTemplateMod from '../templates/common/common'; import * as renderIndexTemplateMod from '../templates/common/index'; import * as renderMainTemplateMod from '../templates/predicate/main'; @@ -39,6 +40,7 @@ describe('assemblePredicates.ts', () => { }); test('should assemble all files from Predicate ABI ', () => { + const { versions } = mockVersions(); const { renderCommonTemplate, renderMainTemplate, renderIndexTemplate } = mockAllDeps(); const { @@ -52,7 +54,7 @@ describe('assemblePredicates.ts', () => { vi.resetAllMocks(); - const files = assemblePredicates({ abis, outputDir }); + const files = assemblePredicates({ abis, outputDir, versions }); expect(files.length).toEqual(3); // 2x factories, 1x index @@ -62,6 +64,7 @@ describe('assemblePredicates.ts', () => { }); test('should assemble all files from Predicate ABI, including `common` file', () => { + const { versions } = mockVersions(); const { renderCommonTemplate, renderMainTemplate, renderIndexTemplate } = mockAllDeps(); const { @@ -75,7 +78,7 @@ describe('assemblePredicates.ts', () => { vi.resetAllMocks(); - const files = assemblePredicates({ abis, outputDir }); + const files = assemblePredicates({ abis, outputDir, versions }); expect(files.length).toEqual(4); // 2x factories, 1x index, 1x common diff --git a/packages/abi-typegen/src/utils/assemblePredicates.ts b/packages/abi-typegen/src/utils/assemblePredicates.ts index e6669b9d490..9cee7c55cfd 100644 --- a/packages/abi-typegen/src/utils/assemblePredicates.ts +++ b/packages/abi-typegen/src/utils/assemblePredicates.ts @@ -1,3 +1,4 @@ +import type { BinaryVersions } from '@fuel-ts/versions'; import { join } from 'path'; import type { Abi } from '../abi/Abi'; @@ -11,8 +12,12 @@ import { renderMainTemplate } from '../templates/predicate/main'; * an array of `IFile` with them all. For here on, * the only thing missing is to write them to disk. */ -export function assemblePredicates(params: { abis: Abi[]; outputDir: string }) { - const { abis, outputDir } = params; +export function assemblePredicates(params: { + abis: Abi[]; + outputDir: string; + versions: BinaryVersions; +}) { + const { abis, outputDir, versions } = params; const files: IFile[] = []; const usesCommonTypes = abis.find((a) => a.commonTypesInUse.length > 0); @@ -24,7 +29,7 @@ export function assemblePredicates(params: { abis: Abi[]; outputDir: string }) { const factory: IFile = { path: factoryFilepath, - contents: renderMainTemplate({ abi }), + contents: renderMainTemplate({ abi, versions }), }; files.push(factory); @@ -33,7 +38,7 @@ export function assemblePredicates(params: { abis: Abi[]; outputDir: string }) { // Includes index file const indexFile: IFile = { path: `${outputDir}/index.ts`, - contents: renderIndexTemplate({ files }), + contents: renderIndexTemplate({ files, versions }), }; files.push(indexFile); @@ -43,7 +48,7 @@ export function assemblePredicates(params: { abis: Abi[]; outputDir: string }) { const commonsFilepath = join(outputDir, 'common.d.ts'); const file: IFile = { path: commonsFilepath, - contents: renderCommonTemplate(), + contents: renderCommonTemplate({ versions }), }; files.push(file); } diff --git a/packages/abi-typegen/src/utils/assembleScripts.test.ts b/packages/abi-typegen/src/utils/assembleScripts.test.ts index 7ccfcd5ca5e..76bcc8bf410 100644 --- a/packages/abi-typegen/src/utils/assembleScripts.test.ts +++ b/packages/abi-typegen/src/utils/assembleScripts.test.ts @@ -1,4 +1,5 @@ import { getNewAbiTypegen } from '../../test/utils/getNewAbiTypegen'; +import { mockVersions } from '../../test/utils/mockVersions'; import * as renderCommonTemplateMod from '../templates/common/common'; import * as renderIndexTemplateMod from '../templates/common/index'; import * as renderMainTemplateMod from '../templates/script/main'; @@ -39,6 +40,7 @@ describe('assembleScripts.ts', () => { }); test('should assemble all files from Script ABI ', () => { + const { versions } = mockVersions(); const { renderCommonTemplate, renderMainTemplate, renderIndexTemplate } = mockAllDeps(); const { @@ -52,7 +54,7 @@ describe('assembleScripts.ts', () => { vi.resetAllMocks(); - const files = assembleScripts({ abis, outputDir }); + const files = assembleScripts({ abis, outputDir, versions }); expect(files.length).toEqual(3); // 2x factories, 1x index @@ -62,6 +64,7 @@ describe('assembleScripts.ts', () => { }); test('should assemble all files from Script ABI, including `common` file', () => { + const { versions } = mockVersions(); const { renderCommonTemplate, renderMainTemplate, renderIndexTemplate } = mockAllDeps(); const { @@ -75,7 +78,7 @@ describe('assembleScripts.ts', () => { vi.resetAllMocks(); - const files = assembleScripts({ abis, outputDir }); + const files = assembleScripts({ abis, outputDir, versions }); expect(files.length).toEqual(4); // 2x factories, 1x index, 1x common diff --git a/packages/abi-typegen/src/utils/assembleScripts.ts b/packages/abi-typegen/src/utils/assembleScripts.ts index e2468ef38a5..8e94be22014 100644 --- a/packages/abi-typegen/src/utils/assembleScripts.ts +++ b/packages/abi-typegen/src/utils/assembleScripts.ts @@ -1,3 +1,4 @@ +import type { BinaryVersions } from '@fuel-ts/versions'; import { join } from 'path'; import type { Abi } from '../abi/Abi'; @@ -11,8 +12,12 @@ import { renderMainTemplate } from '../templates/script/main'; * an array of `IFile` with them all. For here on, * the only thing missing is to write them to disk. */ -export function assembleScripts(params: { abis: Abi[]; outputDir: string }) { - const { abis, outputDir } = params; +export function assembleScripts(params: { + abis: Abi[]; + outputDir: string; + versions: BinaryVersions; +}) { + const { abis, outputDir, versions } = params; const files: IFile[] = []; const usesCommonTypes = abis.find((a) => a.commonTypesInUse.length > 0); @@ -24,7 +29,7 @@ export function assembleScripts(params: { abis: Abi[]; outputDir: string }) { const factory: IFile = { path: factoryFilepath, - contents: renderMainTemplate({ abi }), + contents: renderMainTemplate({ abi, versions }), }; files.push(factory); @@ -33,7 +38,7 @@ export function assembleScripts(params: { abis: Abi[]; outputDir: string }) { // Includes index file const indexFile: IFile = { path: `${outputDir}/index.ts`, - contents: renderIndexTemplate({ files }), + contents: renderIndexTemplate({ files, versions }), }; files.push(indexFile); @@ -43,7 +48,7 @@ export function assembleScripts(params: { abis: Abi[]; outputDir: string }) { const commonsFilepath = join(outputDir, 'common.d.ts'); const file: IFile = { path: commonsFilepath, - contents: renderCommonTemplate(), + contents: renderCommonTemplate({ versions }), }; files.push(file); } diff --git a/packages/abi-typegen/test/utils/getNewAbiTypegen.ts b/packages/abi-typegen/test/utils/getNewAbiTypegen.ts index fcaa23cebbf..360cc6bcb2b 100644 --- a/packages/abi-typegen/test/utils/getNewAbiTypegen.ts +++ b/packages/abi-typegen/test/utils/getNewAbiTypegen.ts @@ -2,6 +2,8 @@ import type { IFile, JsonAbiType, JsonAbiConfigurable } from '../../src/index'; import { AbiTypeGen } from '../../src/index'; import { ProgramTypeEnum } from '../../src/types/enums/ProgramTypeEnum'; +import { DEFAULT_MOCK_VERSIONS } from './mockVersions'; + export function getNewAbiTypegen( params: { programType?: ProgramTypeEnum; @@ -123,12 +125,15 @@ export function getNewAbiTypegen( const outputDir = './contracts'; + const versions = DEFAULT_MOCK_VERSIONS; + const typegen = new AbiTypeGen({ abiFiles, binFiles: includeBinFiles ? binFiles : [], storageSlotsFiles, outputDir, programType, + versions, }); return { typegen }; diff --git a/packages/abi-typegen/test/utils/mockVersions.ts b/packages/abi-typegen/test/utils/mockVersions.ts index f0ec62cac13..4a6e28794eb 100644 --- a/packages/abi-typegen/test/utils/mockVersions.ts +++ b/packages/abi-typegen/test/utils/mockVersions.ts @@ -1,17 +1,17 @@ import * as versionsMod from '@fuel-ts/versions'; -export function mockVersions( - values: { - FUELS: string; - FORC: string; - FUEL_CORE: string; - } = { - FUELS: '11.11.11', - FORC: '22.22.22', - FUEL_CORE: '33.33.33', - } -) { - const mock = vi.spyOn(versionsMod, 'versions', 'get').mockReturnValue(values); +export const DEFAULT_MOCK_VERSIONS: versionsMod.Versions = { + FUELS: '11.11.11', + FORC: '22.22.22', + FUEL_CORE: '33.33.33', +}; + +export function mockVersions(values: versionsMod.BinaryVersions = DEFAULT_MOCK_VERSIONS) { + const mock = vi.spyOn(versionsMod, 'versions', 'get').mockReturnValue({ + FUELS: values.FUELS, + FORC: values.FORC ?? '0.0.0', + FUEL_CORE: values.FUEL_CORE ?? '0.0.0', + }); return { versions: values, diff --git a/packages/fuels/src/cli/commands/build/generateTypes.ts b/packages/fuels/src/cli/commands/build/generateTypes.ts index ffb0e0b571a..7b260d687e2 100644 --- a/packages/fuels/src/cli/commands/build/generateTypes.ts +++ b/packages/fuels/src/cli/commands/build/generateTypes.ts @@ -1,5 +1,6 @@ import { ProgramTypeEnum } from '@fuel-ts/abi-typegen'; import { runTypegen } from '@fuel-ts/abi-typegen/runTypegen'; +import { getBinaryVersions } from '@fuel-ts/versions/cli'; import { writeFileSync, mkdirSync } from 'fs'; import { join } from 'path'; @@ -17,6 +18,7 @@ async function generateTypesForProgramType( const filepaths = await getABIPaths(paths, config); const pluralizedDirName = `${String(programType).toLocaleLowerCase()}s`; + const versions = getBinaryVersions(config); runTypegen({ programType, @@ -24,6 +26,7 @@ async function generateTypesForProgramType( filepaths, output: join(config.output, pluralizedDirName), silent: !loggingConfig.isDebugEnabled, + versions, }); return pluralizedDirName; diff --git a/packages/versions/src/cli.ts b/packages/versions/src/cli.ts index f15697b1bb5..5834ad11b5c 100644 --- a/packages/versions/src/cli.ts +++ b/packages/versions/src/cli.ts @@ -9,6 +9,7 @@ import { getSystemVersions } from './lib/getSystemVersions'; export * from './lib/compareSystemVersions'; export * from './lib/fuelUpLink'; +export * from './lib/getBinaryVersions'; export * from './lib/getSystemVersions'; export * from './lib/getBuiltinVersions'; diff --git a/packages/versions/src/index.ts b/packages/versions/src/index.ts index 4c14514fe13..8b918f41f73 100644 --- a/packages/versions/src/index.ts +++ b/packages/versions/src/index.ts @@ -39,4 +39,5 @@ import { getBuiltinVersions } from './lib/getBuiltinVersions'; export const versions = getBuiltinVersions(); +export * from './lib/types'; export * from './lib/checkFuelCoreVersionCompatibility'; diff --git a/packages/versions/src/lib/getBinaryVersions.test.ts b/packages/versions/src/lib/getBinaryVersions.test.ts new file mode 100644 index 00000000000..e81c2fb6842 --- /dev/null +++ b/packages/versions/src/lib/getBinaryVersions.test.ts @@ -0,0 +1,73 @@ +import { getBinaryVersions } from './getBinaryVersions'; +import * as getBuiltinVersionsMod from './getBuiltinVersions'; +import * as getSystemVersionsMod from './getSystemVersions'; +import type { getSystemVersions } from './getSystemVersions'; +import type { Versions } from './types'; + +type SystemVersions = Pick< + ReturnType, + 'systemForcVersion' | 'systemFuelCoreVersion' +>; + +const mockAll = (params: SystemVersions) => { + const { systemForcVersion, systemFuelCoreVersion } = params; + + const expectedVersions = { + FUELS: '11.22.33', + FORC: systemForcVersion, + FUEL_CORE: systemFuelCoreVersion, + }; + + const buildInVersions = { FUELS: expectedVersions.FUELS } as Versions; + vi.spyOn(getBuiltinVersionsMod, 'getBuiltinVersions').mockReturnValue(buildInVersions); + + const getSystemVersions = vi.spyOn(getSystemVersionsMod, 'getSystemVersions').mockReturnValue({ + systemForcVersion, + systemFuelCoreVersion, + error: null, + systemForcPath: 'forc', + systemFuelCorePath: 'fuel-core', + }); + + return { + expectedVersions, + getSystemVersions, + }; +}; + +/** + * @group node + */ +describe('getBinaryVersions', () => { + it('should return the versions of the binaries', () => { + const { expectedVersions, getSystemVersions } = mockAll({ + systemForcVersion: '1.1.1', + systemFuelCoreVersion: '2.2.2', + }); + + const versions = getBinaryVersions(); + + expect(getSystemVersions).toHaveBeenCalledTimes(1); + expect(versions).toEqual({ + FUELS: expectedVersions.FUELS, + FORC: '1.1.1', + FUEL_CORE: '2.2.2', + }); + }); + + it('should return undefined when unable to get system versions', () => { + const { expectedVersions, getSystemVersions } = mockAll({ + systemForcVersion: null, + systemFuelCoreVersion: null, + }); + + const versions = getBinaryVersions(); + + expect(getSystemVersions).toHaveBeenCalledTimes(1); + expect(versions).toEqual({ + FUELS: expectedVersions.FUELS, + FORC: undefined, + FUEL_CORE: undefined, + }); + }); +}); diff --git a/packages/versions/src/lib/getBinaryVersions.ts b/packages/versions/src/lib/getBinaryVersions.ts new file mode 100644 index 00000000000..142c1eca520 --- /dev/null +++ b/packages/versions/src/lib/getBinaryVersions.ts @@ -0,0 +1,16 @@ +import { getBuiltinVersions } from './getBuiltinVersions'; +import { getSystemVersions } from './getSystemVersions'; +import type { BinaryVersions } from './types'; + +export const getBinaryVersions = ( + params: { forcPath?: string; fuelCorePath?: string } = {} +): BinaryVersions => { + const { FUELS } = getBuiltinVersions(); + const { systemForcVersion, systemFuelCoreVersion } = getSystemVersions(params); + + return { + FUELS, + FORC: systemForcVersion ?? undefined, + FUEL_CORE: systemFuelCoreVersion ?? undefined, + }; +}; diff --git a/packages/versions/src/lib/getBuiltinVersions.ts b/packages/versions/src/lib/getBuiltinVersions.ts index 7c0c1d94102..5d04af3769b 100644 --- a/packages/versions/src/lib/getBuiltinVersions.ts +++ b/packages/versions/src/lib/getBuiltinVersions.ts @@ -1,4 +1,6 @@ -export function getBuiltinVersions() { +import type { Versions } from './types'; + +export function getBuiltinVersions(): Versions { return { FORC: '0.62.0', FUEL_CORE: '0.31.0', diff --git a/packages/versions/src/lib/types.ts b/packages/versions/src/lib/types.ts new file mode 100644 index 00000000000..fa3f0a527a9 --- /dev/null +++ b/packages/versions/src/lib/types.ts @@ -0,0 +1,11 @@ +export interface Versions { + FUELS: string; + FORC: string; + FUEL_CORE: string; +} + +export interface BinaryVersions { + FUELS: string; + FORC?: string; + FUEL_CORE?: string; +}