diff --git a/test/fixtures/projects/a-large-monorepo/package.json b/test/fixtures/projects/a-large-monorepo/package.json new file mode 100644 index 000000000..3d6382fe4 --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/package.json @@ -0,0 +1,12 @@ +{ + "name": "a-large-monorepo", + "version": "1.0.0", + "description": "", + "homepage": "https://github.com/ipfs/aegir#readme", + "scripts": { + "docs": "aegir docs" + }, + "workspaces": [ + "packages/*" + ] +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/a/package.json b/test/fixtures/projects/a-large-monorepo/packages/a/package.json new file mode 100644 index 000000000..e04b8e794 --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/a/package.json @@ -0,0 +1,17 @@ +{ + "name": "a", + "version": "1.0.0", + "description": "", + "homepage": "https://github.com/ipfs/aegir#readme", + "exports": { + ".": { + "import": "./src/index.js" + } + }, + "scripts": { + "test": "echo very test" + }, + "type": "module", + "author": "", + "license": "ISC" +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/a/src/index.js b/test/fixtures/projects/a-large-monorepo/packages/a/src/index.js new file mode 100644 index 000000000..58dc564eb --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/a/src/index.js @@ -0,0 +1,16 @@ +/** + * @typedef {import('./types').ExportedButNotInExports} ExportedButNotInExports + */ + +/** + * @typedef {object} AnExportedInterface + * @property {() => void} AnExportedInterface.aMethod + */ + +export const useHerp = () => { + +} + +export const useDerp = () => { + +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/a/src/types.ts b/test/fixtures/projects/a-large-monorepo/packages/a/src/types.ts new file mode 100644 index 000000000..08c6ad031 --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/a/src/types.ts @@ -0,0 +1,3 @@ +export interface ExportedButNotInExports { + aMethod(): void +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/a/tsconfig.json b/test/fixtures/projects/a-large-monorepo/packages/a/tsconfig.json new file mode 100644 index 000000000..6ddff411a --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/a/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "strict": true, + // project options + "outDir": "dist", + "allowJs": true, + "checkJs": true, + "target": "ES2020", + "module": "ES2020", + "lib": ["ES2021", "ES2021.Promise", "ES2021.String", "ES2020.BigInt", "DOM", "DOM.Iterable"], + "noEmit": false, + "noEmitOnError": true, + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "incremental": true, + "composite": true, + "isolatedModules": true, + "removeComments": false, + "sourceMap": true, + // module resolution + "esModuleInterop": true, + "moduleResolution": "node", + // linter checks + "noImplicitReturns": false, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noUnusedParameters": false, + // advanced + "verbatimModuleSyntax": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "stripInternal": true, + "resolveJsonModule": true + }, + "include": [ + "src" + ] +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/a/typedoc.json b/test/fixtures/projects/a-large-monorepo/packages/a/typedoc.json new file mode 100644 index 000000000..c7d830493 --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/a/typedoc.json @@ -0,0 +1,3 @@ +{ + "entryPoints": ["./src/index.js"] +} \ No newline at end of file diff --git a/test/fixtures/projects/a-large-monorepo/packages/b/package.json b/test/fixtures/projects/a-large-monorepo/packages/b/package.json new file mode 100644 index 000000000..847eaec34 --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/b/package.json @@ -0,0 +1,20 @@ +{ + "name": "b", + "version": "1.0.0", + "description": "", + "homepage": "https://github.com/ipfs/aegir#readme", + "exports": { + ".": { + "import": "./src/index.js" + } + }, + "dependencies": { + "a": "1.0.0" + }, + "scripts": { + "test": "echo very test" + }, + "type": "module", + "author": "", + "license": "ISC" +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/b/src/dir/index.js b/test/fixtures/projects/a-large-monorepo/packages/b/src/dir/index.js new file mode 100644 index 000000000..50c309ccb --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/b/src/dir/index.js @@ -0,0 +1,7 @@ +/** + * @param {string} arg + * @returns {boolean} + */ +export function garply (arg) { + return true +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/b/src/index.js b/test/fixtures/projects/a-large-monorepo/packages/b/src/index.js new file mode 100644 index 000000000..fc34cfdef --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/b/src/index.js @@ -0,0 +1,18 @@ +/** + * @typedef {import('./types.js').ExportedButNotInExports} ExportedButNotInExports + */ + +/** + * @typedef {object} AnExportedInterface + * @property {() => void} AnExportedInterface.aMethod + */ + +export const useHerp = () => { + +} + +export const useDerp = () => { + +} + +export { garply } from './dir/index.js' diff --git a/test/fixtures/projects/a-large-monorepo/packages/b/src/types.ts b/test/fixtures/projects/a-large-monorepo/packages/b/src/types.ts new file mode 100644 index 000000000..08c6ad031 --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/b/src/types.ts @@ -0,0 +1,3 @@ +export interface ExportedButNotInExports { + aMethod(): void +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/b/tsconfig.json b/test/fixtures/projects/a-large-monorepo/packages/b/tsconfig.json new file mode 100644 index 000000000..6ddff411a --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/b/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "strict": true, + // project options + "outDir": "dist", + "allowJs": true, + "checkJs": true, + "target": "ES2020", + "module": "ES2020", + "lib": ["ES2021", "ES2021.Promise", "ES2021.String", "ES2020.BigInt", "DOM", "DOM.Iterable"], + "noEmit": false, + "noEmitOnError": true, + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "incremental": true, + "composite": true, + "isolatedModules": true, + "removeComments": false, + "sourceMap": true, + // module resolution + "esModuleInterop": true, + "moduleResolution": "node", + // linter checks + "noImplicitReturns": false, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noUnusedParameters": false, + // advanced + "verbatimModuleSyntax": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "stripInternal": true, + "resolveJsonModule": true + }, + "include": [ + "src" + ] +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/b/typedoc.json b/test/fixtures/projects/a-large-monorepo/packages/b/typedoc.json new file mode 100644 index 000000000..c7d830493 --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/b/typedoc.json @@ -0,0 +1,3 @@ +{ + "entryPoints": ["./src/index.js"] +} \ No newline at end of file diff --git a/test/fixtures/projects/a-large-monorepo/packages/c/package.json b/test/fixtures/projects/a-large-monorepo/packages/c/package.json new file mode 100644 index 000000000..dd8405e93 --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/c/package.json @@ -0,0 +1,20 @@ +{ + "name": "c", + "version": "1.0.0", + "description": "", + "homepage": "https://github.com/ipfs/aegir#readme", + "exports": { + ".": { + "import": "./src/index.js" + } + }, + "dependencies": { + "a": "1.0.0" + }, + "scripts": { + "test": "echo very test" + }, + "type": "module", + "author": "", + "license": "ISC" +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/c/src/dir/index.js b/test/fixtures/projects/a-large-monorepo/packages/c/src/dir/index.js new file mode 100644 index 000000000..50c309ccb --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/c/src/dir/index.js @@ -0,0 +1,7 @@ +/** + * @param {string} arg + * @returns {boolean} + */ +export function garply (arg) { + return true +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/c/src/index.js b/test/fixtures/projects/a-large-monorepo/packages/c/src/index.js new file mode 100644 index 000000000..fc34cfdef --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/c/src/index.js @@ -0,0 +1,18 @@ +/** + * @typedef {import('./types.js').ExportedButNotInExports} ExportedButNotInExports + */ + +/** + * @typedef {object} AnExportedInterface + * @property {() => void} AnExportedInterface.aMethod + */ + +export const useHerp = () => { + +} + +export const useDerp = () => { + +} + +export { garply } from './dir/index.js' diff --git a/test/fixtures/projects/a-large-monorepo/packages/c/src/types.ts b/test/fixtures/projects/a-large-monorepo/packages/c/src/types.ts new file mode 100644 index 000000000..08c6ad031 --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/c/src/types.ts @@ -0,0 +1,3 @@ +export interface ExportedButNotInExports { + aMethod(): void +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/c/tsconfig.json b/test/fixtures/projects/a-large-monorepo/packages/c/tsconfig.json new file mode 100644 index 000000000..6ddff411a --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/c/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "strict": true, + // project options + "outDir": "dist", + "allowJs": true, + "checkJs": true, + "target": "ES2020", + "module": "ES2020", + "lib": ["ES2021", "ES2021.Promise", "ES2021.String", "ES2020.BigInt", "DOM", "DOM.Iterable"], + "noEmit": false, + "noEmitOnError": true, + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "incremental": true, + "composite": true, + "isolatedModules": true, + "removeComments": false, + "sourceMap": true, + // module resolution + "esModuleInterop": true, + "moduleResolution": "node", + // linter checks + "noImplicitReturns": false, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noUnusedParameters": false, + // advanced + "verbatimModuleSyntax": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "stripInternal": true, + "resolveJsonModule": true + }, + "include": [ + "src" + ] +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/c/typedoc.json b/test/fixtures/projects/a-large-monorepo/packages/c/typedoc.json new file mode 100644 index 000000000..c7d830493 --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/c/typedoc.json @@ -0,0 +1,3 @@ +{ + "entryPoints": ["./src/index.js"] +} \ No newline at end of file diff --git a/test/fixtures/projects/a-large-monorepo/packages/d/package.json b/test/fixtures/projects/a-large-monorepo/packages/d/package.json new file mode 100644 index 000000000..5215c495d --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/d/package.json @@ -0,0 +1,20 @@ +{ + "name": "d", + "version": "1.0.0", + "description": "", + "homepage": "https://github.com/ipfs/aegir#readme", + "exports": { + ".": { + "import": "./src/index.js" + } + }, + "dependencies": { + "c": "1.0.0" + }, + "scripts": { + "test": "echo very test" + }, + "type": "module", + "author": "", + "license": "ISC" +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/d/src/dir/index.js b/test/fixtures/projects/a-large-monorepo/packages/d/src/dir/index.js new file mode 100644 index 000000000..50c309ccb --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/d/src/dir/index.js @@ -0,0 +1,7 @@ +/** + * @param {string} arg + * @returns {boolean} + */ +export function garply (arg) { + return true +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/d/src/index.js b/test/fixtures/projects/a-large-monorepo/packages/d/src/index.js new file mode 100644 index 000000000..fc34cfdef --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/d/src/index.js @@ -0,0 +1,18 @@ +/** + * @typedef {import('./types.js').ExportedButNotInExports} ExportedButNotInExports + */ + +/** + * @typedef {object} AnExportedInterface + * @property {() => void} AnExportedInterface.aMethod + */ + +export const useHerp = () => { + +} + +export const useDerp = () => { + +} + +export { garply } from './dir/index.js' diff --git a/test/fixtures/projects/a-large-monorepo/packages/d/src/types.ts b/test/fixtures/projects/a-large-monorepo/packages/d/src/types.ts new file mode 100644 index 000000000..08c6ad031 --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/d/src/types.ts @@ -0,0 +1,3 @@ +export interface ExportedButNotInExports { + aMethod(): void +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/d/tsconfig.json b/test/fixtures/projects/a-large-monorepo/packages/d/tsconfig.json new file mode 100644 index 000000000..6ddff411a --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/d/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "strict": true, + // project options + "outDir": "dist", + "allowJs": true, + "checkJs": true, + "target": "ES2020", + "module": "ES2020", + "lib": ["ES2021", "ES2021.Promise", "ES2021.String", "ES2020.BigInt", "DOM", "DOM.Iterable"], + "noEmit": false, + "noEmitOnError": true, + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "incremental": true, + "composite": true, + "isolatedModules": true, + "removeComments": false, + "sourceMap": true, + // module resolution + "esModuleInterop": true, + "moduleResolution": "node", + // linter checks + "noImplicitReturns": false, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noUnusedParameters": false, + // advanced + "verbatimModuleSyntax": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "stripInternal": true, + "resolveJsonModule": true + }, + "include": [ + "src" + ] +} diff --git a/test/fixtures/projects/a-large-monorepo/packages/d/typedoc.json b/test/fixtures/projects/a-large-monorepo/packages/d/typedoc.json new file mode 100644 index 000000000..c7d830493 --- /dev/null +++ b/test/fixtures/projects/a-large-monorepo/packages/d/typedoc.json @@ -0,0 +1,3 @@ +{ + "entryPoints": ["./src/index.js"] +} \ No newline at end of file diff --git a/test/run.js b/test/run.js index 1fdcea5a9..355bc1033 100644 --- a/test/run.js +++ b/test/run.js @@ -86,4 +86,35 @@ a-workspace-project: npm run test very test`) }) + + it('should execute commands in dependency order', async function () { + this.timeout(120 * 1000) // slow ci is slow + + /* + This testcase has the following dependencies: + + d -> c + c -> a + b -> a + + This means the test runner should batch the test runs like so: + + [a] + [b, c] + [d] + + */ + const result = await execa(bin, ['run', 'test'], { + cwd: await setUpProject('a-large-monorepo') + }) + + const out = result.stdout + // a finishes before b or c starts + expect(out.indexOf('a: very test')).to.be.lt(out.indexOf('b: npm run test')) + expect(out.indexOf('a: very test')).to.be.lt(out.indexOf('c: npm run test')) + + // b and c finish before d starts + expect(out.indexOf('b: very test')).to.be.lt(out.indexOf('d: npm run test')) + expect(out.indexOf('c: very test')).to.be.lt(out.indexOf('d: npm run test')) + }) })