tldraw/lazy.config.ts
alex 0bd6410d9f
avoid lazy race conditions (#1364)
We had a few issues with lazy race conditions failing CI. This came from
scripts configured to invoke lazy again, rather than through expressing
dependencies between scripts.

This diff reconfigures lazy to articulate these sorts of things as
dependencies instead of through self-invocation. Instead of having lots
of separate `build-package`, `build-docs`, etc commands, we now just
have a build command with package overrides to express more specific
options

### Change Type
- [x] `internal` — Any other changes that don't affect the published
package (will not publish a new version)

### Release Notes
[internal only]
2023-05-12 15:41:40 +00:00

133 lines
3.5 KiB
TypeScript

import { LazyConfig } from 'lazyrepo'
export function generateSharedScripts(bublic: '<rootDir>' | '<rootDir>/bublic') {
return {
build: {
baseCommand: 'exit 0',
runsAfter: { prebuild: {}, 'refresh-assets': {} },
workspaceOverrides: {
'{bublic/,}apps/docs': { runsAfter: { 'docs-content': {} } },
'{bublic/,}apps/vscode/*': { runsAfter: { 'refresh-assets': {} } },
'{bublic/,}packages/*': {
runsAfter: { 'build-api': { in: 'self-only' }, prebuild: { in: 'self-only' } },
cache: {
inputs: ['api/**/*', 'src/**/*'],
},
},
},
},
dev: {
execution: 'independent',
runsAfter: { 'refresh-assets': {} },
cache: 'none',
workspaceOverrides: {
'{bublic/,}apps/docs': { runsAfter: { 'docs-content': { in: 'self-only' } } },
'{bublic/,}apps/vscode/*': { runsAfter: { build: { in: 'self-only' } } },
'{bublic/,}apps/webdriver': {
runsAfter: { 'refresh-assets': {}, prebuild: {} },
cache: 'none',
},
},
},
test: {
baseCommand: 'yarn run -T jest',
runsAfter: { 'refresh-assets': {} },
},
'test-coverage': {
baseCommand: 'yarn run -T jest --coverage',
runsAfter: { 'refresh-assets': {} },
},
lint: {
execution: 'independent',
runsAfter: { 'build-types': {} },
cache: {
inputs: {
exclude: ['**/*.tsbuildinfo'],
},
},
},
'pack-tarball': {
parallel: false,
},
'refresh-assets': {
execution: 'top-level',
baseCommand: `tsx ${bublic}/scripts/refresh-assets.ts`,
cache: {
inputs: ['package.json', `${bublic}/scripts/refresh-assets.ts`, `${bublic}/assets/**/*`],
},
},
'build-types': {
execution: 'top-level',
baseCommand: `tsx ${bublic}/scripts/typecheck.ts`,
cache: {
inputs: {
include: ['<allWorkspaceDirs>/**/*.{ts,tsx}', '<allWorkspaceDirs>/tsconfig.json'],
exclude: ['<allWorkspaceDirs>/dist*/**/*', '<allWorkspaceDirs>/api/**/*'],
},
outputs: ['<allWorkspaceDirs>/*.tsbuildinfo', '<allWorkspaceDirs>/.tsbuild/**/*'],
},
runsAfter: {
'refresh-assets': {},
'maybe-clean-tsbuildinfo': {},
},
},
'build-api': {
execution: 'independent',
cache: {
inputs: ['.tsbuild/**/*.d.ts', 'tsconfig.json'],
outputs: ['api/**/*'],
},
runsAfter: {
'build-types': {
// Because build-types is top level, if usesOutput were set to true every
// build-api task would depend on all the .tsbuild files in the whole
// repo. So we set this to false and configure it to use only the
// local .tsbuild files
usesOutput: false,
},
},
},
'docs-content': {
runsAfter: { 'build-api': {} },
cache: {
inputs: [
'content/**',
'scripts/**',
`${bublic}/packages/*/api/api.json`,
`${bublic}/packages/*/package.json`,
],
},
},
'api-check': {
execution: 'top-level',
baseCommand: `tsx ${bublic}/scripts/api-check.ts`,
runsAfter: { 'build-api': {} },
cache: {
inputs: [`${bublic}/packages/*/api/public.d.ts`],
},
},
} satisfies LazyConfig['scripts']
}
const config = {
baseCacheConfig: {
include: [
'<rootDir>/{,bublic/}package.json',
'<rootDir>/{,bublic/}public-yarn.lock',
'<rootDir>/{,bublic/}lazy.config.ts',
'<rootDir>/{,bublic/}config/**/*',
'<rootDir>/{,bublic/}scripts/**/*',
],
exclude: [
'<allWorkspaceDirs>/coverage/**/*',
'<allWorkspaceDirs>/dist*/**/*',
'**/*.tsbuildinfo',
'<rootDir>/{,bublic/}apps/docs/content/gen/**/*',
],
},
scripts: {
...generateSharedScripts('<rootDir>'),
},
} satisfies LazyConfig
export default config