FluidFramework/fluidBuild.config.cjs

555 строки
19 KiB
JavaScript

/*!
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
* Licensed under the MIT License.
*/
// Enable TypeScript type-checking for this file.
// See https://www.typescriptlang.org/docs/handbook/intro-to-js-ts.html#ts-check
// @ts-check
const tscDependsOn = ["^tsc", "^api", "build:genver", "ts2esm"];
/**
* The settings in this file configure the Fluid build tools, such as fluid-build and flub. Some settings apply to the
* whole repo, while others apply only to the client release group.
*
* See https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/build-tools/src/common/fluidTaskDefinitions.ts
* for details on the task and dependency definition format.
*
* @type {import("@fluidframework/build-tools").IFluidBuildConfig}
*/
module.exports = {
tasks: {
"ci:build": {
dependsOn: [
"compile",
"lint",
"ci:build:api-reports",
"ci:build:docs",
"build:manifest",
"build:readme",
],
script: false,
},
"full": {
dependsOn: ["build", "webpack"],
script: false,
},
"build": {
dependsOn: [
"compile",
"lint",
"build:api-reports",
"build:docs",
"build:manifest",
"build:readme",
],
script: false,
},
"compile": {
dependsOn: ["commonjs", "build:esnext", "api", "build:test", "build:copy"],
script: false,
},
"commonjs": {
dependsOn: ["tsc", "build:test"],
script: false,
},
"lint": {
dependsOn: [
"check:format",
"eslint",
"good-fences",
"depcruise",
"check:exports",
"check:release-tags",
],
script: false,
},
"checks": {
dependsOn: ["check:format"],
script: false,
},
"checks:fix": {
dependsOn: [],
script: false,
},
"build:copy": [],
"build:genver": [],
"typetests:gen": ["^tsc", "build:genver"], // we may reexport type from dependent packages, needs to build them first.
"ts2esm": [],
"tsc": tscDependsOn,
"build:esnext": [...tscDependsOn, "^build:esnext"],
// Generic build:test script should be replaced by :esm or :cjs specific versions.
// "tsc" would be nice to eliminate from here, but plenty of packages still focus
// on CommonJS.
"build:test": ["typetests:gen", "tsc", "api-extractor:commonjs", "api-extractor:esnext"],
"build:test:cjs": ["typetests:gen", "tsc", "api-extractor:commonjs"],
"build:test:esm": ["typetests:gen", "build:esnext", "api-extractor:esnext"],
"api": {
dependsOn: ["api-extractor:commonjs", "api-extractor:esnext", "typetests:gen"],
// dependsOn: ["api-extractor:commonjs", "api-extractor:esnext"],
script: false,
},
"api-extractor:commonjs": ["tsc"],
"api-extractor:esnext": {
dependsOn: ["build:esnext"],
script: true,
},
// build:api-reports may be handled in one step with build:docs when a
// package only uses api-extractor supported exports, which is a single
// export/entrypoint. For packages with /legacy exports, we need to
// generate reports from legacy entrypoint as well as the "current" one.
// The "current" entrypoint should be the broadest of "public.d.ts",
// "beta.d.ts", and "alpha.d.ts".
"build:api-reports:current": ["api-extractor:esnext"],
"build:api-reports:legacy": ["api-extractor:esnext"],
"ci:build:api-reports:current": ["api-extractor:esnext"],
"ci:build:api-reports:legacy": ["api-extractor:esnext"],
// With most packages in client building ESM first, there is ideally just "build:esnext" dependency.
// The package's local 'api-extractor.json' may use the entrypoint from either CJS or ESM,
// therefore we need to require both before running api-extractor.
"build:docs": ["tsc", "build:esnext"],
"ci:build:docs": ["tsc", "build:esnext"],
"build:readme": {
dependsOn: ["build:manifest"],
script: true,
},
"build:manifest": {
dependsOn: ["tsc"],
script: true,
},
"depcruise": [],
"check:exports": ["api"],
// The package's local 'api-extractor-lint.json' may use the entrypoint from either CJS or ESM,
// therefore we need to require both before running api-extractor.
"check:release-tags": ["tsc", "build:esnext"],
"check:are-the-types-wrong": ["build"],
"check:format": {
dependencies: [],
script: true,
},
"format": {
dependencies: [],
script: true,
},
"check:biome": [],
"check:prettier": [],
// ADO #7297: Review why the direct dependency on 'build:esm:test' is necessary.
// Should 'compile' be enough? compile -> build:test -> build:test:esm
"eslint": ["compile", "build:test:esm"],
"good-fences": [],
"format:biome": [],
"format:prettier": [],
"prettier": [],
"prettier:fix": [],
"webpack": ["^tsc", "^build:esnext"],
"webpack:profile": ["^tsc", "^build:esnext"],
"clean": {
before: ["*"],
},
// alias for back compat
"build:full": {
dependsOn: ["full"],
script: false,
},
"build:compile": {
dependsOn: ["compile"],
script: false,
},
"build:commonjs": {
dependsOn: ["commonjs"],
script: false,
},
},
// This defines the layout of the repo for fluid-build. It applies to the whole repo.
repoPackages: {
// Release groups
"client": {
directory: "",
ignoredDirs: [],
defaultInterdependencyRange: "workspace:~",
},
"build-tools": {
directory: "build-tools",
defaultInterdependencyRange: "workspace:~",
},
"server": {
directory: "server/routerlicious",
defaultInterdependencyRange: "workspace:~",
},
"gitrest": {
directory: "server/gitrest",
defaultInterdependencyRange: "^",
},
"historian": {
directory: "server/historian",
defaultInterdependencyRange: "^",
},
// Independent packages
"build": "common/build",
"common-utils": "common/lib/common-utils",
"protocol-def": "common/lib/protocol-definitions",
// Tools
"tools": [
"tools/api-markdown-documenter",
"tools/benchmark",
"tools/getkeys",
"tools/test-tools",
],
},
// `flub check policy` config. It applies to the whole repo.
policy: {
// Entries here are COMPLETELY ignored by the policy checker. Instead of adding entries here, consider adding
// entries to the handlerExclusions list below to ignore a particular.
exclusions: [
// The paths below are for fluidframework.com layouts and code and are not subject to policy.
"docs/layouts/",
"docs/themes/thxvscode/assets/",
"docs/themes/thxvscode/layouts/",
"docs/themes/thxvscode/static/assets/",
// This file is a test file.
"tools/markdown-magic/test/package.json",
// Source to output package.json files - not real packages
// These should only be files that are not in an pnpm workspace.
"common/build/build-common/src/cjs/package.json",
"common/build/build-common/src/esm/package.json",
"packages/common/client-utils/src/cjs/package.json",
],
// Exclusion per handler
handlerExclusions: {
"extraneous-lockfiles": [
"tools/telemetry-generator/package-lock.json", // Workaround to allow version 2 while we move it to pnpm
],
"fluid-build-tasks-eslint": [
// eslint doesn't really depend on build. Doing so just slows down a package build.
"^packages/test/snapshots/package.json",
"^packages/test/test-utils/package.json",
// TODO: AB#7630 uses lint only ts projects for coverage which don't have representative tsc scripts
"^packages/tools/fluid-runner/package.json",
],
"fluid-build-tasks-tsc": [
// This can be removed once the client release group is using build-tools 0.39.0+.
// See https://github.com/microsoft/FluidFramework/pull/21238
"^packages/test/test-end-to-end-tests/package.json",
],
"html-copyright-file-header": [
// Tests generate HTML "snapshot" artifacts
"tools/api-markdown-documenter/src/test/snapshots/.*",
],
"js-ts-copyright-file-header": [
// These files all require a node shebang at the top of the file.
"azure/packages/azure-local-service/src/index.ts",
"experimental/PropertyDDS/packages/property-query/test/get_config.js",
"server/routerlicious/packages/tinylicious/src/index.ts",
// Type test files can be excluded since they're generated and known to have the correct header.
// This can be removed once the whole repo uses build-tools v0.35.0+.
/.*\/validate.*\.generated\.ts/,
],
"no-js-file-extensions": [
// PropertyDDS uses .js files which should be renamed eventually.
"experimental/PropertyDDS/.*",
"build-tools/packages/build-cli/bin/dev.js",
"build-tools/packages/build-cli/bin/run.js",
"build-tools/packages/build-cli/test/helpers/init.js",
"build-tools/packages/readme-command/bin/dev.js",
"build-tools/packages/readme-command/bin/run.js",
"build-tools/packages/version-tools/bin/dev.js",
"build-tools/packages/version-tools/bin/run.js",
"common/build/build-common/gen_version.js",
"common/build/eslint-config-fluid/.*",
"common/lib/common-utils/jest-puppeteer.config.js",
"common/lib/common-utils/jest.config.js",
"common/build/eslint-plugin-fluid/.*",
"docs/api-markdown-documenter/.*",
"docs/api/fallback/index.js",
"docs/build-redirects.js",
"docs/download-apis.js",
"docs/static/js/add-code-copy-button.js",
"examples/data-objects/monaco/loaders/blobUrl.js",
"examples/data-objects/monaco/loaders/compile.js",
"examples/service-clients/odsp-client/shared-tree-demo/tailwind.config.js",
"packages/test/mocha-test-setup/mocharc-common.js",
"packages/test/test-service-load/scripts/usePrereleaseDeps.js",
"packages/tools/devtools/devtools-browser-extension/test-setup.js",
"scripts/report-parser.js",
"tools/changelog-generator-wrapper/src/getDependencyReleaseLine.js",
"tools/changelog-generator-wrapper/src/getReleaseLine.js",
"tools/changelog-generator-wrapper/src/index.js",
"tools/getkeys/index.js",
],
"npm-package-metadata-and-sorting": [
// The root package.json is not checked temporarily due to AB#8640
"^package.json",
],
"package-lockfiles-npm-version": [
"tools/telemetry-generator/package-lock.json", // Workaround to allow version 2 while we move it to pnpm
],
"npm-package-json-prettier": [
// This rule is temporarily disabled for all projects while we update the repo to use different formatting
".*",
],
"npm-package-json-scripts-args": [
// server/routerlicious and server/routerlicious/packages/routerlicious use
// linux only scripts that would require extra logic to validate properly.
// Ideally no packages would use OS specific scripts.
"^server/routerlicious/package.json",
"^server/routerlicious/packages/routerlicious/package.json",
],
"npm-package-json-script-clean": [
// eslint-config-fluid's build step generate printed configs that are checked in. No need to clean
"common/build/eslint-config-fluid/package.json",
// markdown-magic's build step update the README.md file that are checked in. No need to clean.
"tools/markdown-magic/package.json",
],
"npm-package-json-script-mocha-config": [
// these don't use mocha config for reporters yet.
"^server/",
"^build-tools/",
"^common/lib/common-utils/package.json",
],
"npm-package-json-test-scripts": [
"common/build/eslint-config-fluid/package.json",
"packages/test/mocha-test-setup/package.json",
"examples/apps/attributable-map/package.json",
],
"npm-package-json-test-scripts-split": [
"server/",
"tools/",
"package.json",
"packages/test/test-service-load/package.json",
"packages/tools/devtools/devtools-browser-extension/package.json",
"packages/tools/devtools/devtools-view/package.json",
],
"npm-package-exports-apis-linted": [
// Rollout suppressions - enable only after tools are updated to support policy
// as new build-tools will have the concurrently fluid-build support it uses.
"^common/",
// Packages that violate the API linting rules
// ae-missing-release-tags, ae-incompatible-release-tags
"^examples/data-objects/table-document/",
// AB#8147: ./test/EditLog export should be ./internal/... or tagged for support
"^experimental/dds/tree/",
// Packages with APIs that don't need strict API linting
"^build-tools/",
"^common/build/",
"^experimental/PropertyDDS/",
"^tools/api-markdown-documenter/",
],
// This handler will be rolled out slowly, so excluding most packages here while we roll it out.
"npm-package-exports-field": [
// We deliberately improperly import from deep in the package tree while we migrate everything into other
// packages. This is temporary and can be fixed once the build-tools/build-cli pigration is complete.
"^azure/",
"^build-tools/packages/build-tools/package.json",
"^common/",
"^examples/",
"^experimental/",
"^packages/",
"^server/",
"^tools/",
],
"npm-package-json-clean-script": [
"server/gitrest/package.json",
"server/historian/package.json",
// getKeys has a fake tsconfig.json to make ./eslintrc.cjs work, but we don't need clean script
"tools/getkeys/package.json",
// this package has a irregular build pattern, so our clean script rule doesn't apply.
"tools/markdown-magic/package.json",
],
"npm-strange-package-name": [
"server/gitrest/package.json",
"server/historian/package.json",
"package.json",
],
"npm-package-readmes": [
"server/gitrest/package.json",
"server/historian/package.json",
"package.json",
],
"npm-package-folder-name": [
"server/gitrest/package.json",
"server/historian/package.json",
"package.json",
],
"npm-package-json-script-dep": ["^build-tools/"],
"npm-public-package-requirements": [
// Test packages published only for the purpose of running tests in CI.
"^azure/packages/test/",
"^packages/service-clients/end-to-end-tests/",
"^packages/test/test-app-insights-logger/",
"^packages/test/test-service-load/",
"^packages/test/test-end-to-end-tests/",
// JS packages, which do not use api-extractor
"^common/build/",
// PropertyDDS packages, which are not production
"^experimental/PropertyDDS/",
// Tools packages that are not library packages
"^azure/packages/azure-local-service/",
"^packages/tools/fetch-tool/",
"^tools/test-tools/",
// TODO: add api-extractor infra and remove these overrides
"^build-tools/packages/",
"^tools/bundle-size-tools/",
"^server/historian/",
"^server/gitrest/",
"^server/routerlicious/",
"^examples/data-objects/table-document/",
"^experimental/framework/data-objects/",
"^tools/telemetry-generator/",
"^packages/tools/webpack-fluid-loader/",
],
},
packageNames: {
// The allowed package scopes for the repo.
allowedScopes: [
"@fluidframework",
"@fluid-example",
"@fluid-experimental",
"@fluid-internal",
"@fluid-private",
"@fluid-tools",
],
// These packages are known unscoped packages.
unscopedPackages: ["fluid-framework", "fluidframework-docs", "tinylicious"],
mustPublish: {
// These packages will always be published to npm. This is called the "public" feed.
npm: [
"@fluidframework",
"fluid-framework",
"@fluid-internal/client-utils",
"@fluid-internal/mocha-test-setup",
"@fluid-internal/test-driver-definitions",
"tinylicious",
],
// A list of packages published to our internal-build feed. Note that packages published
// to npm will also be published to this feed. This should be a minimal set required for legacy compat of
// internal partners or internal CI requirements.
internalFeed: [
// TODO: We may not need to publish test packages to the internal feed, remove these exceptions if possible.
"@fluid-internal/test-app-insights-logger",
"@fluid-internal/test-service-load",
// Most examples should be private, but table-document needs to publish internally for legacy compat
"@fluid-example/table-document",
],
},
mayPublish: {
// These packages may be published to npm in some cases. Policy doesn't enforce this.
npm: ["@fluid-experimental", "@fluid-tools"],
// These packages may be published to the internal-build feed in some cases. Policy doesn't enforce this.
internalFeed: ["@fluid-internal", "@fluid-private"],
},
},
dependencies: {
// use by npm-package-json-script-dep policy
// A list of script commands and the package that contains the command
commandPackages: [
["api-extractor", "@microsoft/api-extractor"],
["attw", "@arethetypeswrong/cli"],
["biome", "@biomejs/biome"],
["c8", "c8"],
["concurrently", "concurrently"],
["copyfiles", "copyfiles"],
["cross-env", "cross-env"],
["depcruise", "dependency-cruiser"],
["eslint", "eslint"],
["flub", "@fluid-tools/build-cli"],
["fluid-build", "@fluidframework/build-tools"],
["gf", "good-fences"],
["mocha", "mocha"],
["nyc", "nyc"],
["oclif", "oclif"],
["prettier", "prettier"],
["renamer", "renamer"],
["rimraf", "rimraf"],
["tinylicious", "tinylicious"],
["ts2esm", "ts2esm"],
["tsc", "typescript"],
["webpack", "webpack"],
],
},
// These packages are independently versioned and released, but we use pnpm workspaces in single packages to work
// around nested pnpm workspace behavior. These packages are not checked for the preinstall script that standard
// pnpm workspaces should have.
pnpmSinglePackageWorkspace: [
"@fluid-private/changelog-generator-wrapper",
"@fluid-tools/api-markdown-documenter",
"@fluid-tools/benchmark",
"@fluid-tools/markdown-magic",
"@fluid-tools/telemetry-generator",
"@fluidframework/build-common",
"@fluidframework/common-utils",
"@fluidframework/eslint-config-fluid",
"@fluid-internal/eslint-plugin-fluid",
"@fluidframework/protocol-definitions",
"@fluidframework/test-tools",
"fluidframework-docs",
],
fluidBuildTasks: {
tsc: {
ignoreDevDependencies: ["@fluid-example/webpack-fluid-loader"],
ignoreTasks: [
// Outside of normal build and packages/dd/matrix version includes tsc
"bench:profile",
],
},
},
// Requirements applied to all `public` packages.
publicPackageRequirements: {
// The following scripts combined with npm-package-exports-apis-linted policy are all currently required
// to ensure api-extractor is run correctly in local builds and pipelines.
requiredScripts: [
// TODO: Add as a requirement once all packages have been updated to produce dual esm/commonjs builds
// {
// name: "api",
// body: "fluid-build . --task api",
// },
{
name: "build:docs",
body: "api-extractor run --local",
},
{
name: "ci:build:docs",
body: "api-extractor run",
},
],
// All of our public packages should be using api-extractor
requiredDevDependencies: ["@microsoft/api-extractor"],
},
},
assertTagging: {
enabledPaths: [
/^common\/lib\/common-utils/i,
/^experimental/i,
/^packages/i,
/^server\/routerlicious\/packages\/protocol-base/i,
],
assertionFunctions: {
assert: 1,
},
},
// This defines the branch release types for type tests. It applies only to the client release group. Settings for
// other release groups is in their root fluid-build config.
branchReleaseTypes: {
"main": "minor",
"lts": "minor",
"release/**": "patch",
"next": "major",
},
};