Skip to content

Commit

Permalink
Merge pull request #108 from DataDog/yoann/new-internal-plugins
Browse files Browse the repository at this point in the history
[refactor] Better integrate new internal plugins
  • Loading branch information
yoannmoinet authored Nov 18, 2024
2 parents 36acb24 + b9472da commit b7f0408
Show file tree
Hide file tree
Showing 33 changed files with 836 additions and 550 deletions.
18 changes: 17 additions & 1 deletion .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,26 @@

# Plugin owners

# Build Report
packages/plugins/build-report @yoannmoinet
packages/tests/src/plugins/build-report @yoannmoinet

# Bundler Report
packages/plugins/bundler-report @yoannmoinet
packages/tests/src/plugins/bundler-report @yoannmoinet

# Git
packages/plugins/git @yoannmoinet
packages/tests/src/plugins/git @yoannmoinet

# Injection
packages/plugins/injection @yoannmoinet
packages/tests/src/plugins/injection @yoannmoinet

# Telemetry
packages/plugins/telemetry @DataDog/frontend-devx @yoannmoinet
packages/tests/src/plugins/telemetry @DataDog/frontend-devx @yoannmoinet

# Rum
packages/plugins/rum @DataDog/rum @yoannmoinet
packages/tests/src/plugins/rum @DataDog/rum @yoannmoinet
packages/tests/src/plugins/rum @DataDog/rum @yoannmoinet
18 changes: 2 additions & 16 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,6 @@ jobs:
- run: yarn install
- run: yarn test

check-integrity:
name: Check integrity of our files
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
- name: Install node
uses: actions/setup-node@v4
with:
node-version: '18.19.0'
- run: yarn install
- run: yarn cli integrity
- run: git diff --exit-code && git diff --cached --exit-code || (echo "Please run 'yarn cli integrity' and commit the result." && exit 1)

lint:
name: Linting
runs-on: ubuntu-latest
Expand All @@ -50,5 +36,5 @@ jobs:
- run: yarn install
- run: yarn build:all
- run: yarn typecheck:all
- run: yarn format
- run: git diff --exit-code && git diff --cached --exit-code || (echo "Please run 'yarn format' and commit the result." && exit 1)
- run: yarn cli integrity
- run: git diff --exit-code && git diff --cached --exit-code || (echo "Please run 'yarn cli integrity' and commit the result." && exit 1)
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ datadogWebpackPlugin({
tags?: string[];
timestamp?: number;
filters?: ((metric: Metric) => Metric | null)[];
}
};
}
```
<!-- #full-configuration -->
Expand Down
12 changes: 1 addition & 11 deletions packages/core/src/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import fs from 'fs';
import path from 'path';
import type { RequestInit } from 'undici-types';

import type { GlobalContext, RequestOpts } from './types';
import type { RequestOpts } from './types';

// Format a duration 0h 0m 0s 0ms
export const formatDuration = (duration: number) => {
Expand Down Expand Up @@ -125,16 +125,6 @@ export const truncateString = (
// Is the file coming from the injection plugin?
export const isInjectionFile = (filename: string) => filename.includes(INJECTED_FILE);

// Is the given plugin name is from our internal plugins?
export const isInternalPlugin = (pluginName: string, context: GlobalContext) => {
for (const internalPluginName of context.pluginNames) {
if (pluginName.includes(internalPluginName)) {
return true;
}
}
return false;
};

// Replacing fs-extra with local helpers.
// Delete folders recursively.
export const rm = async (dir: string) => {
Expand Down
124 changes: 122 additions & 2 deletions packages/factory/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,125 @@
# Factory
# Factory <!-- #omit in toc -->

This is used to aggregate all the plugins and expose them to the bundler.

We use [unplugin](https://unplugin.unjs.io/) to support many different bundlers.
> [!NOTE]
> We use [unplugin](https://unplugin.unjs.io/) to support many different bundlers.
<!-- This is auto generated with yarn cli integrity -->

<!-- #toc -->
- [Internal Plugins](#internal-plugins)
- [Build Report](#build-report)
- [Bundler Report](#bundler-report)
- [Git](#git)
- [Injection](#injection)
- [Global Context](#global-context)
<!-- #toc -->

## Internal Plugins

These are the plugins that are used internally by the factory.
Most of the time they will interact via the global context.

<!-- #internal-plugins-list -->
### Build Report

> This will populate `context.build` with a bunch of data coming from the build.
<kbd>[📝 Full documentation ➡️](/packages/plugins/build-report#readme)</kbd>

### Bundler Report

> A very basic report on the currently used bundler.<br/>
> It is useful to unify some configurations.
<kbd>[📝 Full documentation ➡️](/packages/plugins/bundler-report#readme)</kbd>

### Git

> Adds repository data to the global context from the `buildStart` hook.
<kbd>[📝 Full documentation ➡️](/packages/plugins/git#readme)</kbd>

### Injection

> This is used to prepend some code to the produced bundle.<br/>
> Particularly useful if you want to share some global context, or to automatically inject some SDK.
<kbd>[📝 Full documentation ➡️](/packages/plugins/injection#readme)</kbd>
<!-- #internal-plugins-list -->

## Global Context

A global, shared context within the build plugins ecosystem.<br/>
It is passed to your plugin's initialization, and **is mutated during the build process**.

```typescript
type GlobalContext = {
// Mirror of the user's config.
auth?: {
apiKey?: string;
};
// More details on the currently running bundler.
bundler: {
name: string;
fullName: string; // Including its variant.
outDir: string; // Output directory
// Added in `buildStart`.
rawConfig?: any;
variant: string; // Major version of the bundler (webpack 4, webpack 5), empty string otherwise.
};
// Added in `writeBundle`.
build: {
errors: string[];
warnings: string[];
// The list of entries used in the build.
entries ? : {
filepath: string;
inputs: Input[],
name: string;
outputs: Output[]
size: number;
type: string,
} [];
// The list of inputs used in the build.
inputs ? : {
filepath: string;
dependencies: Input[];
dependents: Input[]
name: string;
size: number;
type: string,
} [];
// The list of outputs generated by the build.
outputs ? : {
filepath: string;
name: string;
size: number;
type: string,
// Sourcemaps will use Outputs as their Inputs.
inputs: (Input | Output)[]
} [];
start?: number;
end?: number;
duration?: number;
writeDuration?: number;
};
cwd: string;
// Added in `buildStart`.
git?: {
hash: string;
remote: string;
trackedFilesMatcher: [TrackedFilesMatcher](/packages/plugins/git/trackedFilesMatcher.ts);
};
inject: (item: { type: 'file' | 'code'; value: string; fallback?: @self }) => void;
start: number;
version: string;
}
```
> [!NOTE]
> Some parts of the context are only available after certain hooks:
> - `context.bundler.rawConfig` is added in the `buildStart` hook.
> - `context.build.*` is populated in the `writeBundle` hook.
> - `context.git.*` is populated in the `buildStart` hook.
1 change: 0 additions & 1 deletion packages/factory/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
"@dd/core": "workspace:*",
"@dd/internal-build-report-plugin": "workspace:*",
"@dd/internal-bundler-report-plugin": "workspace:*",
"@dd/internal-context-plugin": "workspace:*",
"@dd/internal-git-plugin": "workspace:*",
"@dd/internal-injection-plugin": "workspace:*",
"@dd/rum-plugin": "workspace:*",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,12 @@ export const getContext = ({

return context;
};

export const validateOptions = (options: Options = {}): Options => {
return {
auth: {},
disableGit: false,
logLevel: 'warn',
...options,
};
};
48 changes: 25 additions & 23 deletions packages/factory/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,13 @@
// This product includes software developed at Datadog (https://www.datadoghq.com/).
// Copyright 2019-Present Datadog, Inc.

// This file is partially generated.
// Anything between #imports-injection-marker, #types-export-injection-marker, #helpers-injection-marker and #configs-injection-marker
// This file is mostly generated.
// Anything between
// - #imports-injection-marker
// - #types-export-injection-marker
// - #internal-plugins-injection-marker
// - #helpers-injection-marker
// - #configs-injection-marker
// will be updated using the 'yarn cli integrity' command.

import type {
Expand All @@ -14,27 +19,27 @@ import type {
PluginOptions,
ToInjectItem,
} from '@dd/core/types';
import { getInternalPlugins } from '@dd/factory/internalPlugins';
// eslint-disable-next-line arca/newline-after-import-section
import { getContext } from '@dd/internal-context-plugin';
import type { UnpluginContextMeta, UnpluginInstance, UnpluginOptions } from 'unplugin';
import { createUnplugin } from 'unplugin';

/* eslint-disable arca/import-ordering */
import { getContext, validateOptions } from './helpers';

/* eslint-disable arca/import-ordering, arca/newline-after-import-section */
// #imports-injection-marker
import type { OptionsWithRum } from '@dd/rum-plugin/types';
import * as rum from '@dd/rum-plugin';
import type { OptionsWithTelemetry } from '@dd/telemetry-plugin/types';
import * as telemetry from '@dd/telemetry-plugin';
import { getBuildReportPlugins } from '@dd/internal-build-report-plugin';
import { getBundlerReportPlugins } from '@dd/internal-bundler-report-plugin';
import { getGitPlugins } from '@dd/internal-git-plugin';
import { getInjectionPlugins } from '@dd/internal-injection-plugin';
// #imports-injection-marker
/* eslint-enable arca/import-ordering */
import type { UnpluginContextMeta, UnpluginInstance, UnpluginOptions } from 'unplugin';
import { createUnplugin } from 'unplugin';

/* eslint-disable arca/import-ordering */
// #types-export-injection-marker
export type { types as RumTypes } from '@dd/rum-plugin';
export type { types as TelemetryTypes } from '@dd/telemetry-plugin';
// #types-export-injection-marker
/* eslint-enable arca/import-ordering */
/* eslint-enable arca/import-ordering, arca/newline-after-import-section */

export const helpers = {
// Each product should have a unique entry.
Expand All @@ -43,15 +48,6 @@ export const helpers = {
// #helpers-injection-marker
};

const validateOptions = (options: Options = {}): Options => {
return {
auth: {},
disableGit: false,
logLevel: 'warn',
...options,
};
};

const HOST_NAME = 'datadog-build-plugins';

export const buildPluginFactory = ({
Expand Down Expand Up @@ -83,10 +79,15 @@ export const buildPluginFactory = ({
context.pluginNames.push(HOST_NAME);

// List of plugins to be returned.
// We keep UnpluginOptions for the custom plugins.
// We keep the UnpluginOptions type for the custom plugins.
const plugins: (PluginOptions | UnpluginOptions)[] = [
// Prefill with our internal plugins.
...getInternalPlugins(options, bundler, context, injections),
// #internal-plugins-injection-marker
...getBuildReportPlugins(options, context),
...getBundlerReportPlugins(context),
...getGitPlugins(options, context),
...getInjectionPlugins(bundler, options, context, injections),
// #internal-plugins-injection-marker
];

// Add custom, on the fly plugins, if any.
Expand All @@ -105,6 +106,7 @@ export const buildPluginFactory = ({
}
// #configs-injection-marker

// List all our plugins in the context.
context.pluginNames.push(...plugins.map((plugin) => plugin.name));

return plugins;
Expand Down
23 changes: 0 additions & 23 deletions packages/factory/src/internalPlugins.ts

This file was deleted.

22 changes: 12 additions & 10 deletions packages/plugins/build-report/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,17 @@ import { getWebpackPlugin } from './webpack';

const PLUGIN_NAME = 'datadog-build-report-plugin';

export const getBuildReportPlugin = (opts: Options, context: GlobalContext): PluginOptions => {
export const getBuildReportPlugins = (opts: Options, context: GlobalContext): PluginOptions[] => {
const log = getLogger(opts.logLevel, PLUGIN_NAME);
return {
name: PLUGIN_NAME,
enforce: 'post',
esbuild: getEsbuildPlugin(context, log),
webpack: getWebpackPlugin(context, PLUGIN_NAME, log),
// Vite and Rollup have the same API.
vite: getRollupPlugin(context, log),
rollup: getRollupPlugin(context, log),
};
return [
{
name: PLUGIN_NAME,
enforce: 'post',
esbuild: getEsbuildPlugin(context, log),
webpack: getWebpackPlugin(context, PLUGIN_NAME, log),
// Vite and Rollup have the same API.
vite: getRollupPlugin(context, log),
rollup: getRollupPlugin(context, log),
},
];
};
Loading

0 comments on commit b7f0408

Please sign in to comment.