diff --git a/package-lock.json b/package-lock.json index 96e04f05c..176557123 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3353,6 +3353,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", @@ -24328,6 +24332,7 @@ "license": "MIT", "dependencies": { "@readme/api-core": "file:../core", + "@readme/api-shared": "file:../shared", "chalk": "^5.3.0", "ci-info": "^4.0.0", "commander": "^14.0.0", @@ -24664,6 +24669,7 @@ "version": "7.0.0-beta.14", "license": "MIT", "dependencies": { + "@readme/api-shared": "file:../shared", "@readme/oas-to-har": "^26.0.0", "caseless": "^0.12.0", "datauri": "^4.1.0", @@ -24758,6 +24764,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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": { "name": "@api/test-utils", "version": "7.0.0-beta.14", diff --git a/packages/api/package.json b/packages/api/package.json index ea1c9a5d1..1a9d4f721 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -48,6 +48,7 @@ ], "dependencies": { "@readme/api-core": "file:../core", + "@readme/api-shared": "file:../shared", "chalk": "^5.3.0", "ci-info": "^4.0.0", "commander": "^14.0.0", diff --git a/packages/api/src/bin.ts b/packages/api/src/bin.ts index 679842c18..cd12a9812 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'; // eslint-disable-line readme/no-wildcard-imports 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 2b0c8d288..68cc434aa 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 6c7bf17fd..710562b01 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 aa24b0bc9..81031a0f9 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 08eddf273..2183ea2ee 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 c12bfac15..75617b67a 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": "file:../shared", "caseless": "^0.12.0", "datauri": "^4.1.0", "fetch-har": "^11.0.1", diff --git a/packages/shared/.gitignore b/packages/shared/.gitignore new file mode 100644 index 000000000..ef229ed3d --- /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 000000000..15fe10381 --- /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 000000000..679c6a5b1 --- /dev/null +++ b/packages/shared/package.json @@ -0,0 +1,44 @@ +{ + "name": "@readme/api-shared", + "version": "7.0.0-beta.14", + "description": "Common utilities and helpers shared between monorepo packages.", + "sideEffects": false, + "type": "module", + "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": { + "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/src/index.ts b/packages/shared/src/index.ts new file mode 100644 index 000000000..9c57b3ee6 --- /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 86% rename from packages/api/src/logger.ts rename to packages/shared/src/logger.ts index 128c0f0d1..195a186a5 100644 --- a/packages/api/src/logger.ts +++ b/packages/shared/src/logger.ts @@ -3,7 +3,7 @@ import type { Options as OraOptions } from 'ora'; 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 { diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json new file mode 100644 index 000000000..1ab262c9f --- /dev/null +++ b/packages/shared/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "lib": ["DOM", "ES2023"], + "outDir": "dist/" + }, + "include": ["./src/**/*"] +} diff --git a/packages/shared/tsup.config.ts b/packages/shared/tsup.config.ts new file mode 100644 index 000000000..3b77e4247 --- /dev/null +++ b/packages/shared/tsup.config.ts @@ -0,0 +1,25 @@ +/* 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/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. + 'camelcase', + 'stringify-object', + ], + + silent: !options.watch, +}));