diff --git a/package.json b/package.json index 23e8daa..df3d58f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@xentom/cli", - "version": "0.0.15", + "version": "0.0.16", "type": "module", "scripts": { "format": "prettier --check .", diff --git a/src/commands/publish/index.ts b/src/commands/publish/index.ts index 8113426..046893a 100644 --- a/src/commands/publish/index.ts +++ b/src/commands/publish/index.ts @@ -1,7 +1,7 @@ import { createCommand } from '@/commands/utils'; import { env } from '@/env'; import { createRequestHeaders } from '@/lib/trpc'; -import { createZipInMemory } from '@/lib/zip'; +import { createZipInMemory, type File } from '@/lib/zip'; import { ActionError, actionErrorHandler } from '@/utils/action'; import { getIntegrationMetadata } from '@/utils/metadata'; import { cmd } from '@/utils/output'; @@ -9,6 +9,7 @@ import ora from 'ora'; import { cyan, red } from 'yoctocolors'; import { ZodError } from 'zod'; import { IntegrationMetadata } from '@xentom/integration/schema'; +import { getNextVersion, setVersion } from './version'; export function createPublishCommand() { return createCommand() @@ -78,19 +79,17 @@ export async function publish(options: PublishOptions) { ); } - const previousVersion = metadata.version; if (options.increment) { - metadata = await incrementVersion(metadata); + metadata.version = await getNextVersion(metadata.version); } try { await upload(await pack(metadata), options.tag); - } catch (error) { - // Revert the version back to the previous one if the upload fails + if (options.increment) { - metadata = await setVersion(metadata, previousVersion); + await setVersion(metadata.version); } - + } catch (error) { if (options.ignoreDuplicates) { if ( error instanceof ActionError && @@ -117,35 +116,22 @@ export async function publish(options: PublishOptions) { ); } -async function incrementVersion(metadata: IntegrationMetadata) { - const version = metadata.version.split('.'); - version[version.length - 1] = String(Number(version[version.length - 1]) + 1); - return await setVersion(metadata, version.join('.')); -} - -async function setVersion(metadata: IntegrationMetadata, version: string) { - const copy = { ...metadata }; - copy.version = version; - await Bun.write('./integration.json', JSON.stringify(copy, null, 2)); - return copy; -} - async function pack(metadata: IntegrationMetadata) { - const files = [ - './integration.json', - './CHANGELOG.md', - './LICENSE.txt', - './README.md', - './dist/browser.js', - './dist/browser.css', - './dist/declarations.json', - './dist/definition.json', - './dist/server.js', - './dist/index.d.ts', + const files: File[] = [ + { path: './integration.json', content: JSON.stringify(metadata, null, 2) }, + { path: './CHANGELOG.md' }, + { path: './LICENSE.txt' }, + { path: './README.md' }, + { path: './dist/browser.js' }, + { path: './dist/browser.css' }, + { path: './dist/declarations.json' }, + { path: './dist/definition.json' }, + { path: './dist/server.js' }, + { path: './dist/index.d.ts' }, ]; if (metadata.logo) { - files.push(metadata.logo); + files.push({ path: metadata.logo }); } return await createZipInMemory(files); diff --git a/src/commands/publish/version.ts b/src/commands/publish/version.ts new file mode 100644 index 0000000..8ee89ab --- /dev/null +++ b/src/commands/publish/version.ts @@ -0,0 +1,33 @@ +import { ActionError } from '@/utils/action'; + +export async function getNextVersion(version: string) { + const parts = version.split('.'); + parts[parts.length - 1] = String(Number(parts[parts.length - 1]) + 1); + return parts.join('.'); +} + +export async function setVersion(version: string) { + const file = await getVersionSource(); + file.content.version = version; + await Bun.write(file.source, JSON.stringify(file.content, null, 2)); +} + +async function getVersionSource() { + const metadata = await Bun.file('./integration.json').json(); + if (metadata.version) { + return { + source: 'integration.json', + content: metadata as { version: string }, + }; + } + + const packageJson = await Bun.file('./package.json').json(); + if (packageJson.version) { + return { + source: 'package.json', + content: packageJson as { version: string }, + }; + } + + throw new ActionError('No version found in integration.json or package.json'); +} diff --git a/src/lib/zip/index.ts b/src/lib/zip/index.ts index 6d759a8..8ee718f 100644 --- a/src/lib/zip/index.ts +++ b/src/lib/zip/index.ts @@ -3,7 +3,12 @@ import * as path from 'node:path'; import { PassThrough } from 'node:stream'; import archiver from 'archiver'; -export function createZipInMemory(files: string[]): Promise { +export interface File { + path: string; + content?: string; +} + +export function createZipInMemory(files: File[]): Promise { return new Promise((resolve, reject) => { const archive = archiver('zip', { zlib: { level: 9 }, @@ -19,10 +24,10 @@ export function createZipInMemory(files: string[]): Promise { archive.pipe(passthrough); files.forEach((file) => { - const prefix = path.normalize(path.dirname(file)); + const prefix = path.normalize(path.dirname(file.path)); try { - archive.append(fs.createReadStream(file), { - name: path.basename(file), + archive.append(file.content ?? fs.createReadStream(file.path), { + name: path.basename(file.path), prefix: prefix === '.' ? undefined : prefix, }); } catch {}