From 18f30157f696e10fc9db489e58ba69eeace98aba Mon Sep 17 00:00:00 2001 From: Andrii Andreiev <129078694+AndriiAndreiev@users.noreply.github.com> Date: Mon, 19 May 2025 15:16:28 +0300 Subject: [PATCH 1/3] refactor: extract logger from api package to shared --- package-lock.json | 13 ++++++++++ packages/api/package.json | 1 + packages/api/src/bin.ts | 2 +- .../src/codegen/languages/typescript/index.ts | 2 +- packages/api/src/commands/install.ts | 2 +- packages/api/src/commands/list.ts | 2 +- packages/api/src/commands/uninstall.ts | 2 +- packages/core/package.json | 1 + packages/core/src/index.ts | 1 + packages/shared/.gitignore | 3 +++ packages/shared/.npmignore | 6 +++++ packages/shared/package.json | 15 ++++++++++++ packages/shared/src/index.ts | 3 +++ packages/{api => shared}/src/logger.ts | 4 +++- packages/shared/tsconfig.json | 8 +++++++ packages/shared/tsup.config.ts | 24 +++++++++++++++++++ 16 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 packages/shared/.gitignore create mode 100644 packages/shared/.npmignore create mode 100644 packages/shared/package.json create mode 100644 packages/shared/src/index.ts rename packages/{api => shared}/src/logger.ts (93%) create mode 100644 packages/shared/tsconfig.json create mode 100644 packages/shared/tsup.config.ts diff --git a/package-lock.json b/package-lock.json index d436988a..4e4a07a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3149,6 +3149,10 @@ "resolved": "packages/core", "link": true }, + "node_modules/@readme/api-shared": { + "resolved": "packages/shared", + "link": true + }, "node_modules/@readme/better-ajv-errors": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/@readme/better-ajv-errors/-/better-ajv-errors-2.3.2.tgz", @@ -23507,6 +23511,7 @@ "license": "MIT", "dependencies": { "@readme/api-core": "file:../core", + "@readme/api-shared": "*", "chalk": "^5.3.0", "ci-info": "^4.0.0", "commander": "^13.0.0", @@ -23843,6 +23848,7 @@ "version": "7.0.0-beta.14", "license": "MIT", "dependencies": { + "@readme/api-shared": "*", "@readme/oas-to-har": "^26.0.0", "caseless": "^0.12.0", "datauri": "^4.1.0", @@ -23937,6 +23943,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/shared": { + "version": "1.0.0", + "dependencies": { + "chalk": "^5.3.0", + "ora": "^8.0.1" + } + }, "packages/test-utils": { "name": "@api/test-utils", "version": "7.0.0-beta.14", diff --git a/packages/api/package.json b/packages/api/package.json index 9dae9448..2a6ebccf 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -48,6 +48,7 @@ ], "dependencies": { "@readme/api-core": "file:../core", + "@readme/api-shared": "*", "chalk": "^5.3.0", "ci-info": "^4.0.0", "commander": "^13.0.0", diff --git a/packages/api/src/bin.ts b/packages/api/src/bin.ts index deba3b83..d70266f5 100644 --- a/packages/api/src/bin.ts +++ b/packages/api/src/bin.ts @@ -1,8 +1,8 @@ +import { logger } from '@readme/api-shared'; import { Command } from 'commander'; import updateNotifier from 'update-notifier'; import commands from './commands/index.js'; -import logger from './logger.js'; import * as pkg from './packageInfo.js'; updateNotifier({ pkg: { name: pkg.PACKAGE_NAME, version: pkg.PACKAGE_VERSION } }).notify(); diff --git a/packages/api/src/codegen/languages/typescript/index.ts b/packages/api/src/codegen/languages/typescript/index.ts index 2b0c8d28..68cc434a 100644 --- a/packages/api/src/codegen/languages/typescript/index.ts +++ b/packages/api/src/codegen/languages/typescript/index.ts @@ -20,6 +20,7 @@ import type { JsonObject, PackageJson, TsConfigJson } from 'type-fest'; import path from 'node:path'; import corePkg from '@readme/api-core/package.json' with { type: 'json' }; +import { logger } from '@readme/api-shared'; import { execa } from 'execa'; import { getLicense } from 'license'; import { setWith } from 'lodash-es'; @@ -28,7 +29,6 @@ import semver from 'semver'; import { IndentationText, Project, QuoteKind, ScriptTarget, VariableDeclarationKind } from 'ts-morph'; import { buildCodeSnippetForOperation, getSuggestedOperation } from '../../../lib/suggestedOperations.js'; -import logger from '../../../logger.js'; import { PACKAGE_VERSION } from '../../../packageInfo.js'; import Storage from '../../../storage.js'; import CodeGenerator from '../../codegenerator.js'; diff --git a/packages/api/src/commands/install.ts b/packages/api/src/commands/install.ts index 6c7bf17f..710562b0 100644 --- a/packages/api/src/commands/install.ts +++ b/packages/api/src/commands/install.ts @@ -1,5 +1,6 @@ import type { SupportedLanguage } from '../codegen/factory.js'; +import { logger, oraOptions } from '@readme/api-shared'; import chalk from 'chalk'; import { Command, Option } from 'commander'; import { createEmphasize, common } from 'emphasize'; @@ -11,7 +12,6 @@ import uslug from 'uslug'; import { SupportedLanguages, codegenFactory } from '../codegen/factory.js'; import Fetcher from '../fetcher.js'; import promptTerminal from '../lib/prompt.js'; -import logger, { oraOptions } from '../logger.js'; import Storage from '../storage.js'; const { highlight } = createEmphasize(common); diff --git a/packages/api/src/commands/list.ts b/packages/api/src/commands/list.ts index aa24b0bc..81031a0f 100644 --- a/packages/api/src/commands/list.ts +++ b/packages/api/src/commands/list.ts @@ -1,8 +1,8 @@ +import { logger } from '@readme/api-shared'; import chalk from 'chalk'; import { Command } from 'commander'; import { SupportedLanguages } from '../codegen/factory.js'; -import logger from '../logger.js'; import Storage from '../storage.js'; const cmd = new Command(); diff --git a/packages/api/src/commands/uninstall.ts b/packages/api/src/commands/uninstall.ts index 08eddf27..2183ea2e 100644 --- a/packages/api/src/commands/uninstall.ts +++ b/packages/api/src/commands/uninstall.ts @@ -1,12 +1,12 @@ import path from 'node:path'; +import { logger, oraOptions } from '@readme/api-shared'; import chalk from 'chalk'; import { Command, Option } from 'commander'; import ora from 'ora'; import { SupportedLanguages, uninstallerFactory } from '../codegen/factory.js'; import promptTerminal from '../lib/prompt.js'; -import logger, { oraOptions } from '../logger.js'; import Storage from '../storage.js'; interface Options { diff --git a/packages/core/package.json b/packages/core/package.json index c12bfac1..ca4874f5 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -50,6 +50,7 @@ }, "dependencies": { "@readme/oas-to-har": "^26.0.0", + "@readme/api-shared": "*", "caseless": "^0.12.0", "datauri": "^4.1.0", "fetch-har": "^11.0.1", diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index dbf6ac6b..048a7a95 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -4,6 +4,7 @@ import type { Har } from 'har-format'; import type { Operation } from 'oas/operation'; import type { HttpMethods, OASDocument } from 'oas/types'; +import { logger } from '@readme/api-shared'; import oasToHar from '@readme/oas-to-har'; import fetchHar from 'fetch-har'; import Oas from 'oas'; diff --git a/packages/shared/.gitignore b/packages/shared/.gitignore new file mode 100644 index 00000000..ef229ed3 --- /dev/null +++ b/packages/shared/.gitignore @@ -0,0 +1,3 @@ +coverage/ +dist/ +node_modules/ diff --git a/packages/shared/.npmignore b/packages/shared/.npmignore new file mode 100644 index 00000000..15fe1038 --- /dev/null +++ b/packages/shared/.npmignore @@ -0,0 +1,6 @@ +coverage/ +test/ +.eslint* +.gitignore +.prettier* +vitest.* diff --git a/packages/shared/package.json b/packages/shared/package.json new file mode 100644 index 00000000..e133d028 --- /dev/null +++ b/packages/shared/package.json @@ -0,0 +1,15 @@ +{ + "name": "@readme/api-shared", + "version": "1.0.0", + "description": "Common utilities and helpers shared between monorepo packages.", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc" + }, + "dependencies": { + "ora": "^8.0.1", + "chalk": "^5.3.0" + } +} diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts new file mode 100644 index 00000000..dca11dfe --- /dev/null +++ b/packages/shared/src/index.ts @@ -0,0 +1,3 @@ +import logger, { oraOptions } from './logger.js'; + +export { logger, oraOptions }; diff --git a/packages/api/src/logger.ts b/packages/shared/src/logger.ts similarity index 93% rename from packages/api/src/logger.ts rename to packages/shared/src/logger.ts index 128c0f0d..5a08128a 100644 --- a/packages/api/src/logger.ts +++ b/packages/shared/src/logger.ts @@ -1,7 +1,9 @@ /* eslint-disable no-console */ import type { Options as OraOptions } from 'ora'; -import chalk from 'chalk'; +import chalk from 'chalk' + + export default function logger(log: string, error?: boolean) { if (error) { diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json new file mode 100644 index 00000000..ac844c7e --- /dev/null +++ b/packages/shared/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ES2023"], + "outDir": "dist/" + }, + "include": ["./src/**/*"] +} diff --git a/packages/shared/tsup.config.ts b/packages/shared/tsup.config.ts new file mode 100644 index 00000000..ac904e72 --- /dev/null +++ b/packages/shared/tsup.config.ts @@ -0,0 +1,24 @@ +/* eslint-disable import/no-extraneous-dependencies, node/no-extraneous-import */ +import type { Options } from 'tsup'; + +import { defineConfig } from 'tsup'; + +// eslint-disable-next-line import/no-relative-packages +import config from '../../tsup.config.js'; + +export default defineConfig((options: Options) => ({ + ...options, + ...config, + + entry: ['src/errors/fetchError.ts', 'src/lib/index.ts', 'src/index.ts', 'src/types.ts'], + + noExternal: [ + // These dependencies are ESM-only but because we're building for ESM **and** CJS we can't + // treat them as external dependencies as CJS libraries can't load ESM code that uses `export`. + // `noExternal` will instead treeshake these dependencies down and include them in our compiled + // dists. + 'get-stream', + ], + + silent: !options.watch, +})); From 010cb109303f410a46159c1c10b223344bde9b1d Mon Sep 17 00:00:00 2001 From: Andrii Andreiev <129078694+AndriiAndreiev@users.noreply.github.com> Date: Mon, 19 May 2025 15:30:02 +0300 Subject: [PATCH 2/3] fix: linting issues --- packages/core/src/index.ts | 1 - packages/shared/src/index.ts | 2 +- packages/shared/src/logger.ts | 6 ++---- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 048a7a95..dbf6ac6b 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -4,7 +4,6 @@ import type { Har } from 'har-format'; import type { Operation } from 'oas/operation'; import type { HttpMethods, OASDocument } from 'oas/types'; -import { logger } from '@readme/api-shared'; import oasToHar from '@readme/oas-to-har'; import fetchHar from 'fetch-har'; import Oas from 'oas'; diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index dca11dfe..9c57b3ee 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,3 +1,3 @@ -import logger, { oraOptions } from './logger.js'; +import { logger, oraOptions } from './logger.js'; export { logger, oraOptions }; diff --git a/packages/shared/src/logger.ts b/packages/shared/src/logger.ts index 5a08128a..195a186a 100644 --- a/packages/shared/src/logger.ts +++ b/packages/shared/src/logger.ts @@ -1,11 +1,9 @@ /* eslint-disable no-console */ import type { Options as OraOptions } from 'ora'; -import chalk from 'chalk' +import chalk from 'chalk'; - - -export default function logger(log: string, error?: boolean) { +export function logger(log: string, error?: boolean) { if (error) { console.error(chalk.red(log)); } else { From eade1f78d9e2f58b1462855f380a27a6e37595b9 Mon Sep 17 00:00:00 2001 From: Andrii Andreiev <129078694+AndriiAndreiev@users.noreply.github.com> Date: Mon, 19 May 2025 16:39:49 +0300 Subject: [PATCH 3/3] fix: attw issues (package.json) --- package-lock.json | 12 +++++++++-- packages/api/package.json | 2 +- packages/core/package.json | 2 +- packages/shared/package.json | 37 ++++++++++++++++++++++++++++++---- packages/shared/tsconfig.json | 2 +- packages/shared/tsup.config.ts | 5 +++-- 6 files changed, 49 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4e4a07a6..1aa5c0e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23511,7 +23511,7 @@ "license": "MIT", "dependencies": { "@readme/api-core": "file:../core", - "@readme/api-shared": "*", + "@readme/api-shared": "file:../shared", "chalk": "^5.3.0", "ci-info": "^4.0.0", "commander": "^13.0.0", @@ -23848,7 +23848,7 @@ "version": "7.0.0-beta.14", "license": "MIT", "dependencies": { - "@readme/api-shared": "*", + "@readme/api-shared": "file:../shared", "@readme/oas-to-har": "^26.0.0", "caseless": "^0.12.0", "datauri": "^4.1.0", @@ -23944,10 +23944,18 @@ } }, "packages/shared": { + "name": "@readme/api-shared", "version": "1.0.0", + "license": "MIT", "dependencies": { "chalk": "^5.3.0", "ora": "^8.0.1" + }, + "devDependencies": { + "typescript": "^5.8.2" + }, + "engines": { + "node": ">=20.10.0" } }, "packages/test-utils": { diff --git a/packages/api/package.json b/packages/api/package.json index 2a6ebccf..2bfee483 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -48,7 +48,7 @@ ], "dependencies": { "@readme/api-core": "file:../core", - "@readme/api-shared": "*", + "@readme/api-shared": "file:../shared", "chalk": "^5.3.0", "ci-info": "^4.0.0", "commander": "^13.0.0", diff --git a/packages/core/package.json b/packages/core/package.json index ca4874f5..75617b67 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -50,7 +50,7 @@ }, "dependencies": { "@readme/oas-to-har": "^26.0.0", - "@readme/api-shared": "*", + "@readme/api-shared": "file:../shared", "caseless": "^0.12.0", "datauri": "^4.1.0", "fetch-har": "^11.0.1", diff --git a/packages/shared/package.json b/packages/shared/package.json index e133d028..679c6a5b 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,15 +1,44 @@ { "name": "@readme/api-shared", - "version": "1.0.0", + "version": "7.0.0-beta.14", "description": "Common utilities and helpers shared between monorepo packages.", + "sideEffects": false, "type": "module", - "main": "dist/index.js", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.js" + }, + "./package.json": "./package.json" + }, + "main": "dist/index.cjs", + "module": "dist/index.js", "types": "dist/index.d.ts", "scripts": { - "build": "tsc" + "attw": "attw --pack --format ascii --profile node16", + "build": "tsup", + "prebuild": "rm -rf dist/", + "prepack": "npm run build" + }, + "repository": { + "type": "git", + "url": "https://github.com/readmeio/api.git", + "directory": "packages/httpsnippet-client-api" + }, + "bugs": { + "url": "https://github.com/readmeio/api/issues" + }, + "author": "Andrii Andreiev ", + "license": "MIT", + "engines": { + "node": ">=20.10.0" }, "dependencies": { "ora": "^8.0.1", "chalk": "^5.3.0" - } + }, + "devDependencies": { + "typescript": "^5.8.2" + }, + "prettier": "@readme/eslint-config/prettier" } diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json index ac844c7e..1ab262c9 100644 --- a/packages/shared/tsconfig.json +++ b/packages/shared/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "lib": ["DOM", "DOM.Iterable", "ES2023"], + "lib": ["DOM", "ES2023"], "outDir": "dist/" }, "include": ["./src/**/*"] diff --git a/packages/shared/tsup.config.ts b/packages/shared/tsup.config.ts index ac904e72..3b77e424 100644 --- a/packages/shared/tsup.config.ts +++ b/packages/shared/tsup.config.ts @@ -10,14 +10,15 @@ export default defineConfig((options: Options) => ({ ...options, ...config, - entry: ['src/errors/fetchError.ts', 'src/lib/index.ts', 'src/index.ts', 'src/types.ts'], + entry: ['src/index.ts'], noExternal: [ // These dependencies are ESM-only but because we're building for ESM **and** CJS we can't // treat them as external dependencies as CJS libraries can't load ESM code that uses `export`. // `noExternal` will instead treeshake these dependencies down and include them in our compiled // dists. - 'get-stream', + 'camelcase', + 'stringify-object', ], silent: !options.watch,