diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/.DS_Store differ diff --git a/demo/package.json b/demo/package.json new file mode 100644 index 0000000..9c005b0 --- /dev/null +++ b/demo/package.json @@ -0,0 +1,19 @@ +{ + "name": "@contractual/demo", + "private": true, + "version": "0.0.0", + "license": "UNLICENSED", + "main": "dist/index.js", + "scripts": { + "test": "playwright test --config=playwright.config.ts" + }, + "dependencies": { + "@contractual/client": "workspace:*", + "@contractual/fixtures": "workspace:*", + "@contractual/test": "workspace:*", + "@playwright/test": "^1.49.1" + }, + "engines": { + "node": ">=18.12.0" + } +} diff --git a/demo/playwright.config.ts b/demo/playwright.config.ts new file mode 100644 index 0000000..0da8ce9 --- /dev/null +++ b/demo/playwright.config.ts @@ -0,0 +1,18 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; + +const config: PlaywrightTestConfig = { + name: 'demo-api', + testDir: __dirname, + testMatch: '*.e2e.test.ts', + workers: 1, + retries: 0, + use: { + baseURL: 'https://dash.readme.com/api/v1', + extraHTTPHeaders: { + 'Content-Type': 'application/json', + Authorization: `Basic ${btoa('rdme_xn8s9h2390f02a267ff4123685499bbbf93db28092eb3fd3da3b817fa2d0b82a1ced11')}:`, + }, + }, +}; + +export default config; diff --git a/demo/readme-api.e2e.test.ts b/demo/readme-api.e2e.test.ts new file mode 100644 index 0000000..4a39224 --- /dev/null +++ b/demo/readme-api.e2e.test.ts @@ -0,0 +1,27 @@ +import { test } from '@contractual/test'; +import { expect } from '@playwright/test'; + +// let createdVersionId: string; + +test('create version', async ({ operation }) => { + await operation('basic version 1.2.0 from 1.0.0', async ({ response }) => { + expect(response.status).toBe(400); + }); +}); + +// test('create version', async ({ operation }) => { +// const response = await operation('rc version with something else'); +// +// expect(response.status).toBe(400); +// // expect(response.body._id).toBeDefined(); +// +// // createdVersionId = response.body._id; +// }); + +test('delete version', async ({ operation }) => { + const response = await operation(() => ({ + params: { versionId: createdVersionId }, + })); + + expect(response.body._id).toBeDefined(); +}); diff --git a/demo/reporter.ts b/demo/reporter.ts new file mode 100644 index 0000000..52ad890 --- /dev/null +++ b/demo/reporter.ts @@ -0,0 +1,32 @@ +import type { + Reporter, + TestCase, + TestResult, + FullResult, + FullConfig, + Suite, +} from '@playwright/test/reporter'; + +class ContractualReporter implements Reporter { + constructor(options: { customOption?: string } = {}) { + console.log(`my-awesome-reporter setup with customOption set to ${options.customOption}`); + } + + onBegin(config: FullConfig, suite: Suite) { + console.log(`Starting the run with ${suite.allTests().length} tests`); + } + + onTestBegin(test: TestCase) { + console.log(`Starting test ${test.title}`); + } + + onTestEnd(test: TestCase, result: TestResult) { + console.log(`Finished test ${test.title}: ${result.status}`); + } + + onEnd(result: FullResult) { + console.log(`Finished the run: ${result.status}`); + } +} + +export default ContractualReporter; diff --git a/packages/cli/package.json b/packages/cli/package.json index c038455..5317ea6 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -52,6 +52,9 @@ "@contractual/generators.fixtures": "workspace:*", "commander": "^12.1.0" }, + "devDependencies": { + "@contractual/fixtures": "workspace:*" + }, "publishConfig": { "access": "public", "provenance": true diff --git a/packages/fixtures/.eslintrc b/packages/fixtures/.eslintrc new file mode 100644 index 0000000..5e998f8 --- /dev/null +++ b/packages/fixtures/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "../../.eslintrc" +} diff --git a/packages/fixtures/.gitignore b/packages/fixtures/.gitignore new file mode 100644 index 0000000..8cd8152 --- /dev/null +++ b/packages/fixtures/.gitignore @@ -0,0 +1 @@ +!fixtures/* \ No newline at end of file diff --git a/packages/fixtures/config/fixtures.json b/packages/fixtures/config/fixtures.json new file mode 100644 index 0000000..c0343f5 --- /dev/null +++ b/packages/fixtures/config/fixtures.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "_version": "0.0.0", + "compilerOptions": { + "outDir": "../output", + "sourceMap": false, + "module": "esnext", + "target": "esnext", + "lib": ["esnext"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": false + } +} \ No newline at end of file diff --git a/packages/fixtures/config/output/create-version.fixtures.js b/packages/fixtures/config/output/create-version.fixtures.js new file mode 100644 index 0000000..37ea21c --- /dev/null +++ b/packages/fixtures/config/output/create-version.fixtures.js @@ -0,0 +1,24 @@ +import { registerFixtures } from '@contractual/fixtures'; +export default registerFixtures('create version', { + 'basic version': () => ({ + body: { + version: 'string', + codename: 'string', + from: 'string', + is_stable: true, + is_beta: true, + is_hidden: true, + is_deprecated: true, + }, + }), + 'rc version': ({ extend }) => { + return extend({ + 'with something else': () => ({ + body: { + version: 'string', + from: 'string', + }, + }), + }); + }, +}); diff --git a/packages/fixtures/config/output/delete-version.fixtures.js b/packages/fixtures/config/output/delete-version.fixtures.js new file mode 100644 index 0000000..6eea1db --- /dev/null +++ b/packages/fixtures/config/output/delete-version.fixtures.js @@ -0,0 +1,13 @@ +import { registerFixtures } from '@contractual/fixtures'; +export default registerFixtures('delete version', { + 'basic delete': () => ({ + params: { + versionId: 'string', + } + }), + 'complex': () => ({ + params: { + versionId: 'string', + } + }), +}); diff --git a/packages/fixtures/fixtures/index.ts b/packages/fixtures/fixtures/index.ts new file mode 100644 index 0000000..b63b2b3 --- /dev/null +++ b/packages/fixtures/fixtures/index.ts @@ -0,0 +1 @@ +export const Fixtures = {} as unknown; diff --git a/packages/fixtures/index.ts b/packages/fixtures/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/fixtures/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/fixtures/jest.config.ts b/packages/fixtures/jest.config.ts new file mode 100644 index 0000000..38d6310 --- /dev/null +++ b/packages/fixtures/jest.config.ts @@ -0,0 +1,12 @@ +import type { Config } from 'jest'; +import baseConfig from '../../jest.base.config'; + +const config: Config = { + ...baseConfig(process.env.COVERAGE_DIR), + id: 'fixtures', + displayName: 'fixtures', + collectCoverageFrom: ['src/**/*.ts', 'test/**/*.ts'], + coveragePathIgnorePatterns: ['index.ts', 'types.ts'], +}; + +export default config; diff --git a/packages/fixtures/output/create-version.fixtures.js b/packages/fixtures/output/create-version.fixtures.js new file mode 100644 index 0000000..37ea21c --- /dev/null +++ b/packages/fixtures/output/create-version.fixtures.js @@ -0,0 +1,24 @@ +import { registerFixtures } from '@contractual/fixtures'; +export default registerFixtures('create version', { + 'basic version': () => ({ + body: { + version: 'string', + codename: 'string', + from: 'string', + is_stable: true, + is_beta: true, + is_hidden: true, + is_deprecated: true, + }, + }), + 'rc version': ({ extend }) => { + return extend({ + 'with something else': () => ({ + body: { + version: 'string', + from: 'string', + }, + }), + }); + }, +}); diff --git a/packages/fixtures/output/delete-version.fixtures.js b/packages/fixtures/output/delete-version.fixtures.js new file mode 100644 index 0000000..6eea1db --- /dev/null +++ b/packages/fixtures/output/delete-version.fixtures.js @@ -0,0 +1,13 @@ +import { registerFixtures } from '@contractual/fixtures'; +export default registerFixtures('delete version', { + 'basic delete': () => ({ + params: { + versionId: 'string', + } + }), + 'complex': () => ({ + params: { + versionId: 'string', + } + }), +}); diff --git a/packages/fixtures/package.json b/packages/fixtures/package.json new file mode 100644 index 0000000..c0ab1a8 --- /dev/null +++ b/packages/fixtures/package.json @@ -0,0 +1,64 @@ +{ + "name": "@contractual/fixtures", + "private": false, + "version": "0.0.0", + "license": "Apache-2.0", + "type": "module", + "module": "dist/index.js", + "main": "dist/index.js", + "exports": { + ".": { + "import": "./dist/src/index.js", + "require": "./dist/src/index.js" + }, + "./config": { + "import": "./config/fixtures.json", + "require": "./config/fixtures.json" + }, + "./fixtures": { + "import": "./dist/fixtures/index.js", + "require": "./dist/fixtures/index.js" + } + }, + "repository": { + "type": "git", + "url": "https://github.com/contractual-dev/contractual.git", + "directory": "packages/fixtures" + }, + "homepage": "https://contractual.dev", + "bugs": { + "url": "https://github.com/contractual-dev/contractual/issues" + }, + "contributors": [ + { + "name": "Omer Morad", + "email": "omer.moradd@gmail.com" + } + ], + "engines": { + "node": ">=18.12.0" + }, + "scripts": { + "prebuild": "pnpm rimraf dist", + "build": "pnpm tsc -p tsconfig.build.json", + "tester": "jest --coverage --verbose", + "lint": "pnpm eslint '{src,test}/**/*.ts'" + }, + "files": [ + "generator", + "config", + "dist", + "README.md" + ], + "dependencies": { + "@contractual/client": "workspace:*", + "@contractual/types.fixtures": "workspace:*" + }, + "devDependencies": { + "typescript": "~5.7.2" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/fixtures/src/index.ts b/packages/fixtures/src/index.ts new file mode 100644 index 0000000..29c00b6 --- /dev/null +++ b/packages/fixtures/src/index.ts @@ -0,0 +1 @@ +export * from './regsiter-fixtures.js'; diff --git a/packages/fixtures/src/regsiter-fixtures.ts b/packages/fixtures/src/regsiter-fixtures.ts new file mode 100644 index 0000000..d8c2bbc --- /dev/null +++ b/packages/fixtures/src/regsiter-fixtures.ts @@ -0,0 +1,63 @@ +import type { ApiClientInput, ApiOperationToClientMethod } from '@contractual/contract'; +import type { ApiOperations } from '@contractual/contract/contract'; +import type { + FixtureCallback, + FixturesBuilder, + GeneratedFixtures, +} from '@contractual/types.fixtures'; + +export type RegisterFixturesReturnType = { + operation: TOperation; + fixtures: GeneratedFixtures; +}; + +export function registerFixtures( + operation: TOperation, + fixturesBuilder: FixturesBuilder +): RegisterFixturesReturnType { + const processFixture = ( + callback: FixtureCallback, + baseKey: string + ): GeneratedFixtures => { + // Define a flag to detect if `extend` was called + let extendCalled = false; + + const fixture = callback({ + extend: (extensions: FixturesBuilder) => { + // Mark that `extend` was called + extendCalled = true; + + // Recursively process nested fixtures with updated keys + return Object.entries>(extensions).reduce( + (acc: GeneratedFixtures, [key, nestedCallback]) => { + const nestedKey = `${baseKey} ${key}`; + const nestedResult = processFixture(nestedCallback, nestedKey); + + // Merge nested results without wrapping + return { ...acc, ...nestedResult }; + }, + {} as GeneratedFixtures + ) as ApiClientInput>; + }, + }); + + // If `extend` was called, do NOT include the baseKey itself + if (extendCalled) { + return fixture as GeneratedFixtures; + } + + // If no `extend` was called, return the baseKey fixture directly + return { [baseKey]: fixture }; + }; + + // Process all top-level fixtures + const fixtures = Object.entries(fixturesBuilder).reduce>( + (result, [key, callback]) => ({ + ...result, + ...processFixture(callback, key), // Add processed fixtures + }), + {} as GeneratedFixtures + ); + + return { operation, fixtures }; +} diff --git a/packages/fixtures/test/__snapshots__/register-fixtures.test.ts.snap b/packages/fixtures/test/__snapshots__/register-fixtures.test.ts.snap new file mode 100644 index 0000000..e857d28 --- /dev/null +++ b/packages/fixtures/test/__snapshots__/register-fixtures.test.ts.snap @@ -0,0 +1,26 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Register Fixtures Unit Spec should return the correct snapshot 1`] = ` +{ + "fixtures": { + "basic version": { + "body": { + "codename": "string", + "from": "string", + "is_beta": true, + "is_deprecated": true, + "is_hidden": true, + "is_stable": true, + "version": "string", + }, + }, + "rc version with something else": { + "body": { + "from": "string", + "version": "string", + }, + }, + }, + "operation": "create version", +} +`; diff --git a/packages/fixtures/test/register-fixtures.test.ts b/packages/fixtures/test/register-fixtures.test.ts new file mode 100644 index 0000000..79f0dbd --- /dev/null +++ b/packages/fixtures/test/register-fixtures.test.ts @@ -0,0 +1,40 @@ +import type { RegisterFixturesReturnType } from '../src'; +import { registerFixtures } from '../src'; + +describe('Register Fixtures Unit Spec', () => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + let result: RegisterFixturesReturnType<'create version'>; + + beforeAll(() => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + result = registerFixtures('create version', { + 'basic version': () => ({ + body: { + version: 'string', + codename: 'string', + from: 'string', + is_stable: true, + is_beta: true, + is_hidden: true, + is_deprecated: true, + }, + }), + 'rc version': ({ extend }) => { + return extend({ + 'with something else': () => ({ + body: { + version: 'string', + from: 'string', + }, + }), + }); + }, + }); + }); + + it('should return the correct snapshot', () => { + expect(result).toMatchSnapshot(); + }); +}); diff --git a/packages/fixtures/tsconfig.build.json b/packages/fixtures/tsconfig.build.json new file mode 100644 index 0000000..f6f4805 --- /dev/null +++ b/packages/fixtures/tsconfig.build.json @@ -0,0 +1,19 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "baseUrl": ".", + "rootDir": "src", + "outDir": "dist", + "skipLibCheck": true + }, + "exclude": [ + "dist", + "fixtures", + "output", + "index.ts", + "node_modules", + "test", + "**/*.spec.ts", + "jest.config.ts" + ] +} \ No newline at end of file diff --git a/packages/fixtures/tsconfig.json b/packages/fixtures/tsconfig.json new file mode 100644 index 0000000..7460ef4 --- /dev/null +++ b/packages/fixtures/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../tsconfig.json" +} \ No newline at end of file diff --git a/packages/generators/contract/package.json b/packages/generators/contract/package.json index 5afb5b4..f853c37 100644 --- a/packages/generators/contract/package.json +++ b/packages/generators/contract/package.json @@ -56,7 +56,7 @@ "@babel/core": "^7.26.0", "@babel/generator": "^7.26.3", "@babel/preset-typescript": "^7.26.0", - "@contractual/contract": "workspace:*", + "@contractual/client": "workspace:*", "handlebars": "^4.7.8", "openapi-types": "^12.1.3", "openapi-zod-client": "^1.18.2", diff --git a/packages/generators/fixtures/.eslintrc b/packages/generators/fixtures/.eslintrc new file mode 100644 index 0000000..3280263 --- /dev/null +++ b/packages/generators/fixtures/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "../../../.eslintrc" +} \ No newline at end of file diff --git a/packages/generators/fixtures/fixtures/index.ts b/packages/generators/fixtures/fixtures/index.ts new file mode 100644 index 0000000..d8bb9f3 --- /dev/null +++ b/packages/generators/fixtures/fixtures/index.ts @@ -0,0 +1 @@ +export const Fixtures = {} as const; \ No newline at end of file diff --git a/packages/generators/fixtures/index.ts b/packages/generators/fixtures/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/generators/fixtures/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/generators/fixtures/jest.config.ts b/packages/generators/fixtures/jest.config.ts new file mode 100644 index 0000000..ae5c3af --- /dev/null +++ b/packages/generators/fixtures/jest.config.ts @@ -0,0 +1,15 @@ +import type { Config } from 'jest'; +import baseConfig from '../../../jest.base.config'; + +const config: Config = { + ...baseConfig(process.env.COVERAGE_DIR), + id: 'generators.fixtures', + displayName: 'generators.fixtures', + collectCoverageFrom: ['src/**/*.ts', 'test/**/*.ts'], + coveragePathIgnorePatterns: [ + 'index.ts', + 'types.ts', + ], +}; + +export default config; diff --git a/packages/generators/fixtures/package.json b/packages/generators/fixtures/package.json new file mode 100644 index 0000000..9d758c4 --- /dev/null +++ b/packages/generators/fixtures/package.json @@ -0,0 +1,70 @@ +{ + "name": "@contractual/generators.fixtures", + "private": true, + "version": "0.0.0", + "license": "Apache-2.0", + "type": "module", + "module": "dist/index.js", + "main": "dist/index.js", + "repository": { + "type": "git", + "url": "https://github.com/contractual-dev/contractual.git", + "directory": "packages/generators/fixtures" + }, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js" + } + }, + "homepage": "https://contractual.dev", + "bugs": { + "url": "https://github.com/contractual-dev/contractual/issues" + }, + "contributors": [ + { + "name": "Omer Morad", + "email": "omer.moradd@gmail.com" + } + ], + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/contractual-dev" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/contractual-dev" + } + ], + "engines": { + "node": ">=18.12.0" + }, + "scripts": { + "prebuild": "pnpm rimraf dist", + "build": "pnpm tsc -p tsconfig.build.json", + "build:watch": "pnpm tsc -p tsconfig.build.json --watch", + "tester": "jest --coverage --verbose", + "lint": "pnpm eslint '{src,test}/**/*.ts'" + }, + "files": [ + "dist", + "README.md" + ], + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/generator": "^7.26.3", + "@babel/preset-typescript": "^7.26.0", + "@contractual/fixtures": "workspace:*", + "typescript": ">=5.x" + }, + "peerDependencies": { + }, + "publishConfig": { + "access": "public", + "provenance": true + }, + "devDependencies": { + "typescript": "~5.7.2" + } +} diff --git a/packages/generators/fixtures/src/generator.ts b/packages/generators/fixtures/src/generator.ts new file mode 100644 index 0000000..3271f27 --- /dev/null +++ b/packages/generators/fixtures/src/generator.ts @@ -0,0 +1,84 @@ +import { transformSync } from '@babel/core'; +import type { RegisterFixturesReturnType } from '@contractual/fixtures'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; +import { createProgram, parseJsonConfigFileContent, readConfigFile, sys } from 'typescript'; + +export interface GenerateFixturesOptions { + path: string; + output?: string; +} + +export async function generateFixtures({ output, path: fixturesPath }: GenerateFixturesOptions) { + const resolvedTsconfigPath = path.resolve(fixturesPath, 'tsconfig.fixtures.json'); + + if (!fs.existsSync(resolvedTsconfigPath)) { + throw new Error(`specified tsconfig.json path does not exist: ${resolvedTsconfigPath}`); + } + + // Parse and compile using TypeScript + const configFileContent = readConfigFile(resolvedTsconfigPath, sys.readFile); + + if (configFileContent.error) { + throw new Error(`Error reading tsconfig.json: ${configFileContent.error.messageText}`); + } + + const config = parseJsonConfigFileContent( + configFileContent.config, + sys, + path.dirname(resolvedTsconfigPath) + ); + + createProgram(config.fileNames, config.options).emit(); + + // Define input and output directories + const readFrom = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..', 'output'); + + if (!fs.existsSync(readFrom)) { + fs.mkdirSync(readFrom); + } + + const writeTo = + (output && path.resolve(output)) || + path.resolve(path.dirname(new URL(import.meta.url).pathname), '..', 'fixtures'); + + if (!output && !fs.existsSync(writeTo)) { + fs.mkdirSync(writeTo); + } + + const imports = fs.readdirSync(readFrom).map(async (file) => { + const filePath = path.join(readFrom, file); + return import(filePath).then((module) => module.default); + }); + + const result = await Promise.all(imports).then((fixturesModules) => + fixturesModules.reduce>( + (acc, fixtures) => ({ ...acc, [fixtures.operation]: fixtures.fixtures }), + {} as RegisterFixturesReturnType + ) + ); + + const tsFilePath = path.join(writeTo, 'index.ts'); + const tsContent = `export const Fixtures = ${JSON.stringify(result)};\n`; + + fs.writeFileSync(tsFilePath, tsContent, { encoding: 'utf-8' }); + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + // eslint-disable-next-line import/no-extraneous-dependencies + const preset = await import('@babel/preset-typescript'); + + const { code } = transformSync(tsContent, { + presets: [preset.default], + filename: tsFilePath, + sourceMaps: false, + })!; + + fs.writeFileSync(tsFilePath, code!.slice(0, -1) + ' as const;', { encoding: 'utf-8' }); + + // fs.readdirSync(readFrom).forEach((file) => { + // fs.unlinkSync(path.join(readFrom, file)); + // }); + // + // fs.unlinkSync(path.resolve(writeTo, 'index.ts')); +} diff --git a/packages/generators/fixtures/src/index.ts b/packages/generators/fixtures/src/index.ts new file mode 100644 index 0000000..9f33372 --- /dev/null +++ b/packages/generators/fixtures/src/index.ts @@ -0,0 +1 @@ +export * from './generator.js'; diff --git a/packages/generators/fixtures/tsconfig.build.json b/packages/generators/fixtures/tsconfig.build.json new file mode 100644 index 0000000..48fa869 --- /dev/null +++ b/packages/generators/fixtures/tsconfig.build.json @@ -0,0 +1,18 @@ +{ + "extends": "../../../tsconfig.build.json", + "compilerOptions": { + "rootDir": "src", + "baseUrl": ".", + "outDir": "dist", + "skipLibCheck": true + }, + "exclude": [ + "fixtures", + "dist", + "index.ts", + "node_modules", + "test", + "**/*.spec.ts", + "jest.config.ts" + ] +} \ No newline at end of file diff --git a/packages/generators/fixtures/tsconfig.json b/packages/generators/fixtures/tsconfig.json new file mode 100644 index 0000000..b027bb4 --- /dev/null +++ b/packages/generators/fixtures/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../../tsconfig.json" +} \ No newline at end of file diff --git a/packages/providers/playwright/.eslintrc b/packages/providers/playwright/.eslintrc new file mode 100644 index 0000000..f1ca71a --- /dev/null +++ b/packages/providers/playwright/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "../../.eslintrc" +} \ No newline at end of file diff --git a/packages/providers/playwright/index.ts b/packages/providers/playwright/index.ts new file mode 100644 index 0000000..4df73b3 --- /dev/null +++ b/packages/providers/playwright/index.ts @@ -0,0 +1 @@ +export * from './src/index.js'; diff --git a/packages/providers/playwright/jest.config.ts b/packages/providers/playwright/jest.config.ts new file mode 100644 index 0000000..6b7ebaf --- /dev/null +++ b/packages/providers/playwright/jest.config.ts @@ -0,0 +1,18 @@ +import type { Config } from 'jest'; +import baseConfig from '../../../jest.base.config.js'; + +const config: Config = { + ...baseConfig(process.env.COVERAGE_DIR), + id: 'core', + displayName: 'core', + collectCoverageFrom: ['src/**/*.ts', '__test__/**/*.ts'], + coveragePathIgnorePatterns: [ + 'index.ts', + 'invalid-adapter.ts', + 'test-adapter.ts', + 'testbed.ts', + 'types.ts', + ], +}; + +export default config; diff --git a/packages/providers/playwright/package.json b/packages/providers/playwright/package.json new file mode 100644 index 0000000..decf99d --- /dev/null +++ b/packages/providers/playwright/package.json @@ -0,0 +1,56 @@ +{ + "name": "@contractual/test", + "private": false, + "version": "0.0.0", + "license": "Apache-2.0", + "type": "module", + "module": "dist/index.js", + "repository": { + "type": "git", + "url": "https://github.com/contractual-dev/contractual.git", + "directory": "packages/test" + }, + "homepage": "https://contractual.dev", + "bugs": { + "url": "https://github.com/contractual-dev/contractual/issues" + }, + "contributors": [ + { + "name": "Omer Morad", + "email": "omer.moradd@gmail.com" + } + ], + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/contractual-dev" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/contractual-dev" + } + ], + "engines": { + "node": ">=18.12.0" + }, + "scripts": { + "prebuild": "pnpm rimraf dist", + "build": "pnpm tsc -p tsconfig.build.json", + "tester": "jest --coverage --verbose", + "lint": "pnpm eslint '{src,test}/**/*.ts'" + }, + "files": [ + "dist", + "README.md" + ], + "dependencies": { + "@contractual/client": "workspace:*", + "@contractual/fixtures": "workspace:*", + "@contractual/types.test": "workspace:*", + "@playwright/test": "^1.49.1" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/providers/playwright/src/index.ts b/packages/providers/playwright/src/index.ts new file mode 100644 index 0000000..8d611ba --- /dev/null +++ b/packages/providers/playwright/src/index.ts @@ -0,0 +1,60 @@ +import type { ApiContract } from '@contractual/contract/contract/index.js'; +import { type ApiClient, type ApiClientInput, getApiClient } from '@contractual/contract'; +import { ApiOperations } from '@contractual/contract/contract/index.js'; +import { Fixtures } from '@contractual/fixtures/fixtures/index.js'; +import type { TestFunctionParams } from '@contractual/types.test'; +import { test as playwrightTest } from '@playwright/test'; +import type { ClientArgs, InitClientReturn } from '@ts-rest/core'; + +const testFixture = playwrightTest.extend<{ client: ApiClient }>({ + client: async ({ baseURL, extraHTTPHeaders }, use) => { + await use( + getApiClient({ + baseUrl: baseURL || 'http://localhost:3000', + baseHeaders: extraHTTPHeaders, + }) + ); + }, +}); + +export function test( + operation: TOperation, + fn: (fixtures: TestFunctionParams) => Promise +) { + // Create the operation function + const operationFn = ( + clientMethod: (typeof ApiOperations)[TOperation], + client: InitClientReturn + ) => + Object.assign( + (fixture: TFixture) => { + const resolvedFixture = (Fixtures as Record)[operation][fixture]; + + return ( + client[clientMethod] as ( + args: ApiClientInput + ) => ReturnType + )(resolvedFixture as ApiClientInput); + }, + (cb?: () => ApiClientInput) => { + if (!cb) { + throw new Error('Callback function is required for operation'); + } + + return ( + client[clientMethod] as ( + args: ApiClientInput + ) => ReturnType + )(cb()); + } + ); + + // Extend Playwright's test runner + return testFixture(operation, async ({ client }) => { + // Resolve the client method + const clientMethod = ApiOperations[operation]; + + // Call the user-defined function with resolved fixtures and test info + await fn({ operation: operationFn(clientMethod, client) }); + }); +} diff --git a/packages/providers/playwright/tsconfig.build.json b/packages/providers/playwright/tsconfig.build.json new file mode 100644 index 0000000..aee34d4 --- /dev/null +++ b/packages/providers/playwright/tsconfig.build.json @@ -0,0 +1,18 @@ +{ + "extends": "../../../tsconfig.build.json", + "compilerOptions": { + "rootDir": "src", + "baseUrl": "./", + "outDir": "dist", + "skipLibCheck": true + }, + "exclude": [ + "dist", + "index.ts", + "../contract/index.ts", + "node_modules", + "__test__", + "**/*.spec.ts", + "jest.config.ts" + ] +} \ No newline at end of file diff --git a/packages/providers/playwright/tsconfig.json b/packages/providers/playwright/tsconfig.json new file mode 100644 index 0000000..b027bb4 --- /dev/null +++ b/packages/providers/playwright/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../../tsconfig.json" +} \ No newline at end of file diff --git a/packages/test/tsconfig.json b/packages/test/tsconfig.json new file mode 100644 index 0000000..111d0ae --- /dev/null +++ b/packages/test/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src/**/*.ts", "test/**/*.ts"] +} \ No newline at end of file diff --git a/packages/types/fixtures/.eslintrc b/packages/types/fixtures/.eslintrc new file mode 100644 index 0000000..3280263 --- /dev/null +++ b/packages/types/fixtures/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "../../../.eslintrc" +} \ No newline at end of file diff --git a/packages/types/fixtures/index.d.ts b/packages/types/fixtures/index.d.ts new file mode 100644 index 0000000..0abdad8 --- /dev/null +++ b/packages/types/fixtures/index.d.ts @@ -0,0 +1,8 @@ +import type { ApiClientInput, ApiOperationToClientMethod } from '@contractual/contract'; +import type { ApiOperations } from '@contractual/contract/contract'; +export type FixturesBuilder = Record>; +export type FixtureCallback = (params: { + extend: ExtendFunction; +}) => ApiClientInput>; +export type ExtendFunction = (fixtures: FixturesBuilder) => ApiClientInput>; +export type GeneratedFixtures = Record>>; diff --git a/packages/types/fixtures/index.ts b/packages/types/fixtures/index.ts new file mode 100644 index 0000000..468d823 --- /dev/null +++ b/packages/types/fixtures/index.ts @@ -0,0 +1,20 @@ +import type { ApiClientInput, ApiOperationToClientMethod } from '@contractual/contract'; +import type { ApiOperations } from '@contractual/contract/contract'; + +export type FixturesBuilder = Record< + string, + FixtureCallback +>; + +export type FixtureCallback = (params: { + extend: ExtendFunction; +}) => ApiClientInput>; + +export type ExtendFunction = ( + fixtures: FixturesBuilder +) => ApiClientInput>; + +export type GeneratedFixtures = Record< + string, + ApiClientInput> +>; diff --git a/packages/types/fixtures/package.json b/packages/types/fixtures/package.json new file mode 100644 index 0000000..b1ecbe4 --- /dev/null +++ b/packages/types/fixtures/package.json @@ -0,0 +1,39 @@ +{ + "name": "@contractual/types.fixtures", + "private": false, + "version": "0.0.0", + "license": "Apache-2.0", + "type": "module", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/contractual-dev/contractual.git", + "directory": "packages/types/fixtures" + }, + "bugs": { + "url": "https://github.com/contractual-dev/contractual/issues" + }, + "homepage": "https://contractual.dev", + "contributors": [ + { + "name": "Omer Morad", + "email": "omer.moradd@gmail.com" + } + ], + "scripts": { + "prebuild": "pnpm rimraf dist", + "build": "pnpm tsc -p tsconfig.build.json", + "tester": "jest --passWithNoTests", + "lint": "pnpm eslint 'index.ts'" + }, + "dependencies": { + "@contractual/client": "workspace:*" + }, + "files": [ + "index.d.ts" + ], + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/types/fixtures/tsconfig.build.json b/packages/types/fixtures/tsconfig.build.json new file mode 100644 index 0000000..1164775 --- /dev/null +++ b/packages/types/fixtures/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "../../../tsconfig.build.json", + "compilerOptions": { + "emitDeclarationOnly": true, + "rootDir": ".", + "outDir": ".", + "baseUrl": "." + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/packages/types/fixtures/tsconfig.json b/packages/types/fixtures/tsconfig.json new file mode 100644 index 0000000..b027bb4 --- /dev/null +++ b/packages/types/fixtures/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../../tsconfig.json" +} \ No newline at end of file diff --git a/packages/types/test/.eslintrc b/packages/types/test/.eslintrc new file mode 100644 index 0000000..3280263 --- /dev/null +++ b/packages/types/test/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "../../../.eslintrc" +} \ No newline at end of file diff --git a/packages/types/test/index.ts b/packages/types/test/index.ts new file mode 100644 index 0000000..8420b10 --- /dev/null +++ b/packages/types/test/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/types/test/package.json b/packages/types/test/package.json new file mode 100644 index 0000000..db5279b --- /dev/null +++ b/packages/types/test/package.json @@ -0,0 +1,45 @@ +{ + "name": "@contractual/types.test", + "private": false, + "version": "0.0.0", + "license": "Apache-2.0", + "type": "module", + "module": "dist/index.js", + "repository": { + "type": "git", + "url": "https://github.com/contractual-dev/contractual.git", + "directory": "packages/types/test" + }, + "homepage": "https://contractual.dev", + "bugs": { + "url": "https://github.com/contractual-dev/contractual/issues" + }, + "contributors": [ + { + "name": "Omer Morad", + "email": "omer.moradd@gmail.com" + } + ], + "dependencies": { + "@contractual/client": "workspace:*", + "@contractual/types.fixtures": "workspace:*" + }, + "engines": { + "node": ">=18.12.0" + }, + "scripts": { + "prebuild": "pnpm rimraf dist", + "build": "pnpm tsc -p tsconfig.build.json", + "tester": "jest --passWithNoTests", + "lint": "pnpm eslint '{src,test}/**/*.ts'" + }, + "files": [ + "dist", + "README.md", + "typings.d.ts" + ], + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/types/test/src/index.ts b/packages/types/test/src/index.ts new file mode 100644 index 0000000..dfc76e7 --- /dev/null +++ b/packages/types/test/src/index.ts @@ -0,0 +1,23 @@ +import type { ApiClient, ApiClientInput, ApiOperationToClientMethod } from '@contractual/contract'; +import type { Fixtures } from '@contractual/fixtures/fixtures'; +import type { ApiOperations } from '@contractual/contract/contract'; + +export interface TestFunctionParams { + operation( + fixture: TFixture + ): ReturnType]>; + + operation( + cb: () => ApiClientInput> + ): ReturnType]>; + + operation( + fixture: TFixture, + cb: () => ApiClientInput> + ): ReturnType]>; + + operation( + fixture?: TFixture, + cb?: () => ApiClientInput> + ): ReturnType]>; +} diff --git a/packages/types/test/tsconfig.build.json b/packages/types/test/tsconfig.build.json new file mode 100644 index 0000000..940eb7f --- /dev/null +++ b/packages/types/test/tsconfig.build.json @@ -0,0 +1,17 @@ +{ + "extends": "../../../tsconfig.build.json", + "compilerOptions": { + "rootDir": "src", + "baseUrl": "./", + "outDir": "dist", + "target": "esnext" + }, + "exclude": [ + "typings.d.ts", + "index.ts", + "node_modules", + "__test__", + "**/*.spec.ts", + "jest.config.ts" + ] +} \ No newline at end of file diff --git a/packages/types/test/tsconfig.json b/packages/types/test/tsconfig.json new file mode 100644 index 0000000..b027bb4 --- /dev/null +++ b/packages/types/test/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../../tsconfig.json" +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 97adc2c..63ec33d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -95,15 +95,15 @@ importers: demo: dependencies: - '@contractual/contract': + '@contractual/client': specifier: workspace:* - version: link:../packages/contract + version: link:../packages/client '@contractual/fixtures': specifier: workspace:* version: link:../packages/fixtures - '@contractual/providers.playwright': + '@contractual/test': specifier: workspace:* - version: link:../packages/providers/playwright + version: link:../packages/test '@playwright/test': specifier: ^1.49.1 version: 1.49.1 @@ -112,7 +112,7 @@ importers: dependencies: '@contractual/generators.client': specifier: workspace:* - version: link:../generators/contract + version: link:../generators/client '@contractual/generators.fixtures': specifier: workspace:* version: link:../generators/fixtures @@ -124,7 +124,7 @@ importers: specifier: workspace:* version: link:../fixtures - packages/contract: + packages/client: dependencies: '@ts-rest/core': specifier: ^3.51.0 @@ -138,9 +138,9 @@ importers: packages/fixtures: dependencies: - '@contractual/contract': + '@contractual/client': specifier: workspace:* - version: link:../contract + version: link:../client '@contractual/types.fixtures': specifier: workspace:* version: link:../types/fixtures @@ -149,7 +149,7 @@ importers: specifier: ~5.7.2 version: 5.7.3 - packages/generators/contract: + packages/generators/client: dependencies: '@apidevtools/swagger-parser': specifier: ^10.1.0 @@ -163,9 +163,9 @@ importers: '@babel/preset-typescript': specifier: ^7.26.0 version: 7.26.0(@babel/core@7.26.0) - '@contractual/contract': + '@contractual/client': specifier: workspace:* - version: link:../../contract + version: link:../../client handlebars: specifier: ^4.7.8 version: 4.7.8 @@ -201,7 +201,7 @@ importers: specifier: '>=5.x' version: 5.7.3 - packages/generators/spec: + packages/generators/openapi: dependencies: '@typespec/compiler': specifier: ^0.63.0 @@ -224,16 +224,7 @@ importers: openapi-diff: specifier: ^0.23.7 version: 0.23.7(openapi-types@12.1.3) - semver: - specifier: ^7.6.3 - version: 7.6.3 - yaml: - specifier: ^2.7.0 - version: 2.7.0 devDependencies: - inquirer: - specifier: ^12.3.2 - version: 12.3.2(@types/node@22.10.7) openapi-types: specifier: ^12.1.3 version: 12.1.3 @@ -241,32 +232,32 @@ importers: specifier: ~5.7.2 version: 5.7.3 - packages/providers/playwright: + packages/test: dependencies: - '@contractual/contract': + '@contractual/client': specifier: workspace:* - version: link:../../contract + version: link:../client '@contractual/fixtures': specifier: workspace:* - version: link:../../fixtures + version: link:../fixtures '@contractual/types.test': specifier: workspace:* - version: link:../../types/test + version: link:../types/test '@playwright/test': specifier: ^1.49.1 version: 1.49.1 packages/types/fixtures: dependencies: - '@contractual/contract': + '@contractual/client': specifier: workspace:* - version: link:../../contract + version: link:../../client packages/types/test: dependencies: - '@contractual/contract': + '@contractual/client': specifier: workspace:* - version: link:../../contract + version: link:../../client '@contractual/types.fixtures': specifier: workspace:* version: link:../fixtures @@ -573,86 +564,6 @@ packages: resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} - '@inquirer/checkbox@4.0.6': - resolution: {integrity: sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - - '@inquirer/confirm@5.1.3': - resolution: {integrity: sha512-fuF9laMmHoOgWapF9h9hv6opA5WvmGFHsTYGCmuFxcghIhEhb3dN0CdQR4BUMqa2H506NCj8cGX4jwMsE4t6dA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - - '@inquirer/core@10.1.4': - resolution: {integrity: sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w==} - engines: {node: '>=18'} - - '@inquirer/editor@4.2.3': - resolution: {integrity: sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - - '@inquirer/expand@4.0.6': - resolution: {integrity: sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - - '@inquirer/figures@1.0.9': - resolution: {integrity: sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==} - engines: {node: '>=18'} - - '@inquirer/input@4.1.3': - resolution: {integrity: sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - - '@inquirer/number@3.0.6': - resolution: {integrity: sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - - '@inquirer/password@4.0.6': - resolution: {integrity: sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - - '@inquirer/prompts@7.2.3': - resolution: {integrity: sha512-hzfnm3uOoDySDXfDNOm9usOuYIaQvTgKp/13l1uJoe6UNY+Zpcn2RYt0jXz3yA+yemGHvDOxVzqWl3S5sQq53Q==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - - '@inquirer/rawlist@4.0.6': - resolution: {integrity: sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - - '@inquirer/search@3.0.6': - resolution: {integrity: sha512-eFZ2hiAq0bZcFPuFFBmZEtXU1EarHLigE+ENCtpO+37NHCl4+Yokq1P/d09kUblObaikwfo97w+0FtG/EXl5Ng==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - - '@inquirer/select@4.0.6': - resolution: {integrity: sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - - '@inquirer/type@3.0.2': - resolution: {integrity: sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1669,10 +1580,6 @@ packages: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} - cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -2728,12 +2635,6 @@ packages: resolution: {integrity: sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - inquirer@12.3.2: - resolution: {integrity: sha512-YjQCIcDd3yyDuQrbII0FBtm/ZqNoWtvaC71yeCnd5Vbg4EgzsAGaemzfpzmqfvIZEp2roSwuZZKdM0C65hA43g==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - inquirer@8.2.6: resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} @@ -3550,10 +3451,6 @@ packages: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} - nanoid@3.3.8: resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -4252,10 +4149,6 @@ packages: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} - run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -5053,10 +4946,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yoctocolors-cjs@2.1.2: - resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} - engines: {node: '>=18'} - z-schema@5.0.5: resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} engines: {node: '>=8.0.0'} @@ -5444,112 +5333,6 @@ snapshots: '@hutson/parse-repository-url@3.0.2': {} - '@inquirer/checkbox@4.0.6(@types/node@22.10.7)': - dependencies: - '@inquirer/core': 10.1.4(@types/node@22.10.7) - '@inquirer/figures': 1.0.9 - '@inquirer/type': 3.0.2(@types/node@22.10.7) - '@types/node': 22.10.7 - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.2 - - '@inquirer/confirm@5.1.3(@types/node@22.10.7)': - dependencies: - '@inquirer/core': 10.1.4(@types/node@22.10.7) - '@inquirer/type': 3.0.2(@types/node@22.10.7) - '@types/node': 22.10.7 - - '@inquirer/core@10.1.4(@types/node@22.10.7)': - dependencies: - '@inquirer/figures': 1.0.9 - '@inquirer/type': 3.0.2(@types/node@22.10.7) - ansi-escapes: 4.3.2 - cli-width: 4.1.0 - mute-stream: 2.0.0 - signal-exit: 4.1.0 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.2 - transitivePeerDependencies: - - '@types/node' - - '@inquirer/editor@4.2.3(@types/node@22.10.7)': - dependencies: - '@inquirer/core': 10.1.4(@types/node@22.10.7) - '@inquirer/type': 3.0.2(@types/node@22.10.7) - '@types/node': 22.10.7 - external-editor: 3.1.0 - - '@inquirer/expand@4.0.6(@types/node@22.10.7)': - dependencies: - '@inquirer/core': 10.1.4(@types/node@22.10.7) - '@inquirer/type': 3.0.2(@types/node@22.10.7) - '@types/node': 22.10.7 - yoctocolors-cjs: 2.1.2 - - '@inquirer/figures@1.0.9': {} - - '@inquirer/input@4.1.3(@types/node@22.10.7)': - dependencies: - '@inquirer/core': 10.1.4(@types/node@22.10.7) - '@inquirer/type': 3.0.2(@types/node@22.10.7) - '@types/node': 22.10.7 - - '@inquirer/number@3.0.6(@types/node@22.10.7)': - dependencies: - '@inquirer/core': 10.1.4(@types/node@22.10.7) - '@inquirer/type': 3.0.2(@types/node@22.10.7) - '@types/node': 22.10.7 - - '@inquirer/password@4.0.6(@types/node@22.10.7)': - dependencies: - '@inquirer/core': 10.1.4(@types/node@22.10.7) - '@inquirer/type': 3.0.2(@types/node@22.10.7) - '@types/node': 22.10.7 - ansi-escapes: 4.3.2 - - '@inquirer/prompts@7.2.3(@types/node@22.10.7)': - dependencies: - '@inquirer/checkbox': 4.0.6(@types/node@22.10.7) - '@inquirer/confirm': 5.1.3(@types/node@22.10.7) - '@inquirer/editor': 4.2.3(@types/node@22.10.7) - '@inquirer/expand': 4.0.6(@types/node@22.10.7) - '@inquirer/input': 4.1.3(@types/node@22.10.7) - '@inquirer/number': 3.0.6(@types/node@22.10.7) - '@inquirer/password': 4.0.6(@types/node@22.10.7) - '@inquirer/rawlist': 4.0.6(@types/node@22.10.7) - '@inquirer/search': 3.0.6(@types/node@22.10.7) - '@inquirer/select': 4.0.6(@types/node@22.10.7) - '@types/node': 22.10.7 - - '@inquirer/rawlist@4.0.6(@types/node@22.10.7)': - dependencies: - '@inquirer/core': 10.1.4(@types/node@22.10.7) - '@inquirer/type': 3.0.2(@types/node@22.10.7) - '@types/node': 22.10.7 - yoctocolors-cjs: 2.1.2 - - '@inquirer/search@3.0.6(@types/node@22.10.7)': - dependencies: - '@inquirer/core': 10.1.4(@types/node@22.10.7) - '@inquirer/figures': 1.0.9 - '@inquirer/type': 3.0.2(@types/node@22.10.7) - '@types/node': 22.10.7 - yoctocolors-cjs: 2.1.2 - - '@inquirer/select@4.0.6(@types/node@22.10.7)': - dependencies: - '@inquirer/core': 10.1.4(@types/node@22.10.7) - '@inquirer/figures': 1.0.9 - '@inquirer/type': 3.0.2(@types/node@22.10.7) - '@types/node': 22.10.7 - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.2 - - '@inquirer/type@3.0.2(@types/node@22.10.7)': - dependencies: - '@types/node': 22.10.7 - '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -5757,7 +5540,7 @@ snapshots: '@lerna/child-process@7.4.2': dependencies: - chalk: 4.1.2 + chalk: 4.1.0 execa: 5.0.0 strong-log-transformer: 2.1.0 @@ -6863,8 +6646,6 @@ snapshots: cli-width@3.0.0: {} - cli-width@4.1.0: {} - cliui@7.0.4: dependencies: string-width: 4.2.3 @@ -8068,17 +7849,6 @@ snapshots: validate-npm-package-license: 3.0.4 validate-npm-package-name: 5.0.0 - inquirer@12.3.2(@types/node@22.10.7): - dependencies: - '@inquirer/core': 10.1.4(@types/node@22.10.7) - '@inquirer/prompts': 7.2.3(@types/node@22.10.7) - '@inquirer/type': 3.0.2(@types/node@22.10.7) - '@types/node': 22.10.7 - ansi-escapes: 4.3.2 - mute-stream: 2.0.0 - run-async: 3.0.0 - rxjs: 7.8.1 - inquirer@8.2.6: dependencies: ansi-escapes: 4.3.2 @@ -8424,7 +8194,7 @@ snapshots: jest-diff@29.7.0: dependencies: - chalk: 4.1.2 + chalk: 4.1.0 diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 @@ -9062,7 +8832,7 @@ snapshots: redent: 3.0.0 trim-newlines: 3.0.1 type-fest: 0.18.1 - yargs-parser: 20.2.9 + yargs-parser: 20.2.4 merge-stream@2.0.0: {} @@ -9212,8 +8982,6 @@ snapshots: mute-stream@1.0.0: {} - mute-stream@2.0.0: {} - nanoid@3.3.8: {} natural-compare@1.4.0: {} @@ -9370,7 +9138,7 @@ snapshots: '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.6 axios: 1.7.9 - chalk: 4.1.2 + chalk: 4.1.0 cli-cursor: 3.1.0 cli-spinners: 2.6.1 cliui: 8.0.1 @@ -9991,8 +9759,6 @@ snapshots: run-async@2.4.1: {} - run-async@3.0.0: {} - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -10809,7 +10575,7 @@ snapshots: require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 - yargs-parser: 20.2.9 + yargs-parser: 20.2.4 yargs@17.7.2: dependencies: @@ -10825,8 +10591,6 @@ snapshots: yocto-queue@0.1.0: {} - yoctocolors-cjs@2.1.2: {} - z-schema@5.0.5: dependencies: lodash.get: 4.4.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ea4dae4..8b3b033 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,6 @@ -packages: - - "packages/*" - - "demo" - - "packages/generators/*" - - "packages/providers/*" - - "packages/types/*" + packages: + - "packages/*" + - "demo" + - "packages/generators/*" + - "packages/types/*" + - "packages/*" \ No newline at end of file