@datadog/build-plugin
Advanced tools
Comparing version 1.0.1 to 1.0.2
@@ -7,14 +7,6 @@ "use strict"; | ||
const modules_1 = require("../../esbuild/modules"); | ||
const mockMetaFile = { | ||
inputs: { | ||
module1: { | ||
bytes: 1, | ||
imports: [], | ||
}, | ||
}, | ||
outputs: {}, | ||
}; | ||
const testHelpers_1 = require("../helpers/testHelpers"); | ||
describe('esbuild modules', () => { | ||
test('It should add module size to the results', () => { | ||
const results = modules_1.getModulesResults(mockMetaFile, ''); | ||
const results = modules_1.getModulesResults(testHelpers_1.mockLocalOptions, testHelpers_1.mockMetaFile); | ||
for (const module of Object.values(results)) { | ||
@@ -21,0 +13,0 @@ expect(module.size).toBeDefined(); |
@@ -18,3 +18,3 @@ "use strict"; | ||
const { getModuleName } = require('../helpers'); | ||
expect(getModuleName(mockModule, undefined, compilationMock)).toBe('moduleName'); | ||
expect(getModuleName(mockModule, compilationMock)).toBe('moduleName'); | ||
}); | ||
@@ -30,3 +30,3 @@ test('It should use the moduleGraphAPI with webpack5', () => { | ||
const { getModuleName } = require('../helpers'); | ||
expect(getModuleName(mockModule, undefined, compilationMock)).toBe('moduleName2'); | ||
expect(getModuleName(mockModule, compilationMock)).toBe('moduleName2'); | ||
}); | ||
@@ -33,0 +33,0 @@ test('It should return the size of a module', () => { |
@@ -1,2 +0,3 @@ | ||
import { BundlerStats, Stats, Report, Compilation, Compiler } from '../../types'; | ||
import { BundlerStats, Stats, Report, Compilation, Compiler, LocalOptions } from '../../types'; | ||
import { Metafile } from 'esbuild'; | ||
export declare const mockStats: Stats; | ||
@@ -7,1 +8,3 @@ export declare const mockBundler: BundlerStats; | ||
export declare const mockCompiler: Compiler; | ||
export declare const mockMetaFile: Metafile; | ||
export declare const mockLocalOptions: LocalOptions; |
@@ -70,1 +70,14 @@ "use strict"; | ||
}; | ||
exports.mockMetaFile = { | ||
inputs: { | ||
module1: { | ||
bytes: 1, | ||
imports: [], | ||
}, | ||
}, | ||
outputs: {}, | ||
}; | ||
exports.mockLocalOptions = { | ||
datadog: {}, | ||
context: '', | ||
}; |
@@ -6,4 +6,5 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const modules_1 = require("../../webpack/modules"); | ||
const testHelpers_1 = require("../helpers/testHelpers"); | ||
describe('Modules', () => { | ||
const { Modules } = require('../../webpack/modules'); | ||
// Webpack5 is actually throwing an error when using this property. | ||
@@ -18,14 +19,26 @@ const getThrowingDependency = (dep) => { | ||
}; | ||
const getMockedModule = (opts) => (Object.assign({ name: 'Name', size: 1, loaders: [], chunks: [], _chunks: new Set(), dependencies: [], userRequest: '' }, opts)); | ||
const getMockedChunk = (opts) => ({ | ||
id: 'id', | ||
size: 0, | ||
modules: [{}], | ||
files: ['file'], | ||
names: ['name'], | ||
parents: (opts && opts.names) || ['parent'], | ||
}); | ||
const mockedModules = [ | ||
{ | ||
getMockedModule({ | ||
name: 'moduleWebpack4', | ||
size: 50, | ||
_chunks: new Set([{ name: 'chunk1' }, { name: 'chunk2' }]), | ||
_chunks: new Set([ | ||
getMockedChunk({ names: ['chunk1'] }), | ||
getMockedChunk({ names: ['chunk2'] }), | ||
]), | ||
dependencies: [ | ||
{ name: 'dep1', module: { name: 'dep1' }, size: 1 }, | ||
{ name: 'dep2', size: 2 }, | ||
{ name: 'dep3', module: { name: 'dep3' }, size: 3 }, | ||
{ module: getMockedModule({ name: 'dep1', size: 1 }) }, | ||
{ module: getMockedModule({ name: 'dep2', size: 2 }) }, | ||
{ module: getMockedModule({ name: 'dep3', size: 3 }) }, | ||
], | ||
}, | ||
{ | ||
}), | ||
getMockedModule({ | ||
name: 'moduleWebpack5', | ||
@@ -38,11 +51,14 @@ size: () => 50, | ||
], | ||
}, | ||
{ name: 'dep1', size: () => 1, dependencies: [] }, | ||
{ name: 'dep2', size: () => 2, dependencies: [] }, | ||
{ name: 'dep3', size: () => 3, dependencies: [] }, | ||
}), | ||
getMockedModule({ name: 'dep1', size: () => 1 }), | ||
getMockedModule({ name: 'dep2', size: () => 2 }), | ||
getMockedModule({ name: 'dep3', size: () => 3 }), | ||
]; | ||
const mockCompilation = { | ||
options: { context: '' }, | ||
moduleGraph: { | ||
getIssuer: () => getMockedModule(), | ||
issuer: getMockedModule(), | ||
getModule(dep) { | ||
return mockedModules[0].dependencies.find((d) => d.name === dep.name && d.module); | ||
return mockedModules[0].dependencies.find((d) => d.module.name === dep.name && d.module).module; | ||
}, | ||
@@ -55,5 +71,10 @@ }, | ||
}, | ||
hooks: { | ||
buildModule: { tap: () => { } }, | ||
succeedModule: { tap: () => { } }, | ||
afterOptimizeTree: { tap: () => { } }, | ||
}, | ||
}; | ||
const modules = new Modules(); | ||
modules.afterOptimizeTree({}, mockedModules, '/', mockCompilation); | ||
const modules = new modules_1.Modules(testHelpers_1.mockLocalOptions); | ||
modules.afterOptimizeTree({}, mockedModules, mockCompilation); | ||
test('It should filter modules the same with Webpack 5 and 4', () => { | ||
@@ -60,0 +81,0 @@ const modulesWebpack4 = modules.storedModules['moduleWebpack4'].dependencies; |
@@ -35,3 +35,3 @@ "use strict"; | ||
const metaFile = result.metafile; | ||
const moduleResults = modules_1.getModulesResults(metaFile, this.options.context); | ||
const moduleResults = modules_1.getModulesResults(this.options, metaFile); | ||
this.addContext({ | ||
@@ -38,0 +38,0 @@ start: startBuild, |
import { Metafile } from 'esbuild'; | ||
import { LocalModule } from '../types'; | ||
export declare const getModulesResults: (esbuildMeta?: Metafile | undefined, context?: string | undefined) => { | ||
export declare const getModulesResults: (options: Pick<import("../types").Options, "output" | "disabled" | "datadog" | "context">, esbuildMeta?: Metafile | undefined) => { | ||
[key: string]: LocalModule; | ||
}; |
@@ -15,4 +15,5 @@ "use strict"; | ||
}); | ||
exports.getModulesResults = (esbuildMeta, context) => { | ||
if (!esbuildMeta || !context) { | ||
exports.getModulesResults = (options, esbuildMeta) => { | ||
const context = options.context; | ||
if (!esbuildMeta) { | ||
return {}; | ||
@@ -19,0 +20,0 @@ } |
@@ -7,4 +7,5 @@ import { Module, Compilation, Context } from './types'; | ||
export declare const getDisplayName: (name: string, context?: string | undefined) => string; | ||
export declare const formatModuleName: (name: string, context: string) => string; | ||
export declare const getModuleName: (module: Module, context: string, compilation: Compilation) => string; | ||
export declare const formatModuleName: (name: string, context?: string | undefined) => string; | ||
export declare const getModulePath: (module: Module, compilation: Compilation) => string; | ||
export declare const getModuleName: (module: Module, compilation: Compilation, context?: string | undefined) => string; | ||
export declare const getModuleSize: (module: Module) => number; | ||
@@ -11,0 +12,0 @@ export declare const formatLoaderName: (loader: string) => string; |
@@ -35,22 +35,26 @@ "use strict"; | ||
.replace(exports.formatContext(context), './'); | ||
exports.getModulePath = (module, compilation) => { | ||
var _a; | ||
let path = module.userRequest; | ||
if (!path) { | ||
let issuer; | ||
if (compilation.moduleGraph && typeof compilation.moduleGraph.getIssuer === 'function') { | ||
issuer = compilation.moduleGraph.getIssuer(module); | ||
} | ||
else { | ||
issuer = module.issuer; | ||
} | ||
path = issuer === null || issuer === void 0 ? void 0 : issuer.userRequest; | ||
if (!path) { | ||
// eslint-disable-next-line no-underscore-dangle | ||
path = (_a = module._identifier) === null || _a === void 0 ? void 0 : _a.split('!').pop(); | ||
} | ||
} | ||
return path || 'unknown'; | ||
}; | ||
// Find the module name and format it the same way as webpack. | ||
exports.getModuleName = (module, context, compilation) => { | ||
exports.getModuleName = (module, compilation, context) => { | ||
let name = module.name || module.userRequest; | ||
let issuer; | ||
if (compilation.moduleGraph && typeof compilation.moduleGraph.getIssuer === 'function') { | ||
issuer = compilation.moduleGraph.getIssuer(module); | ||
} | ||
else { | ||
issuer = module.issuer; | ||
} | ||
if (!name) { | ||
try { | ||
name = issuer | ||
? issuer.userRequest | ||
: // eslint-disable-next-line no-underscore-dangle | ||
module._identifier; | ||
} | ||
catch (e) { | ||
/* We'll fallback at the end */ | ||
} | ||
name = exports.getModulePath(module, compilation); | ||
} | ||
@@ -57,0 +61,0 @@ return exports.formatModuleName(name || 'no-name', context); |
@@ -23,5 +23,5 @@ "use strict"; | ||
const helpers_2 = require("../../helpers"); | ||
const getOptionsDD = (opts = { apiKey: '' }) => ({ | ||
const getOptionsDD = (opts = {}) => ({ | ||
timestamp: Math.floor((opts.timestamp || Date.now()) / 1000), | ||
apiKey: opts.apiKey, | ||
apiKey: opts.apiKey || '', | ||
tags: opts.tags || [], | ||
@@ -28,0 +28,0 @@ endPoint: opts.endPoint || 'app.datadoghq.com', |
@@ -15,7 +15,7 @@ import { HooksContext } from '../../types'; | ||
export declare type Filter = (metric: Metric) => Metric | null; | ||
export interface OptionsInput { | ||
apiKey: string; | ||
tags?: string[]; | ||
export interface DatadogOptions { | ||
apiKey?: string; | ||
endPoint?: string; | ||
prefix?: string; | ||
tags?: string[]; | ||
timestamp?: number; | ||
@@ -22,0 +22,0 @@ filters?: Filter[]; |
@@ -37,3 +37,3 @@ "use strict"; | ||
files.dependencies = opts.dependencies || false; | ||
files.bundler = opts.bundlerStats || false; | ||
files.bundler = opts.bundler || false; | ||
files.metrics = opts.metrics || false; | ||
@@ -40,0 +40,0 @@ } |
import { Metafile, Message, BuildOptions } from 'esbuild'; | ||
import { MetricToSend } from './hooks/datadog/types'; | ||
import { MetricToSend, DatadogOptions } from './hooks/datadog/types'; | ||
export declare type HOOKS = 'output'; | ||
@@ -35,9 +35,2 @@ export declare type WRAPPED_HOOKS = 'preoutput' | 'output' | 'postoutput'; | ||
} | ||
export interface Options { | ||
disabled?: boolean; | ||
output?: boolean | string; | ||
hooks?: string[]; | ||
datadog?: any; | ||
context?: string; | ||
} | ||
export declare type OutputOptions = boolean | string | { | ||
@@ -47,11 +40,13 @@ destination: string; | ||
dependencies?: boolean; | ||
bundlerStats?: boolean; | ||
bundler?: boolean; | ||
metrics?: boolean; | ||
}; | ||
export interface LocalOptions { | ||
export interface Options { | ||
disabled?: boolean; | ||
output?: OutputOptions; | ||
hooks?: string[]; | ||
datadog?: DatadogOptions; | ||
context?: string; | ||
datadog: any; | ||
} | ||
export declare type LocalOptions = Pick<Options, 'disabled' | 'output' | 'datadog' | 'context'>; | ||
export interface Compilation { | ||
@@ -222,3 +217,3 @@ options: { | ||
name: string; | ||
userRequest?: string; | ||
userRequest: string; | ||
issuer?: { | ||
@@ -231,3 +226,3 @@ userRequest: string; | ||
moduleGraph?: ModuleGraph; | ||
size: () => number | number; | ||
size: (() => number) | number; | ||
loaders: { | ||
@@ -237,5 +232,3 @@ loader: string; | ||
chunks: string[]; | ||
_chunks: Set<{ | ||
name: string; | ||
}>; | ||
_chunks: Set<Chunk>; | ||
dependencies: Dependency[]; | ||
@@ -242,0 +235,0 @@ } |
@@ -27,5 +27,5 @@ "use strict"; | ||
const HOOK_OPTIONS = { name: PLUGIN_NAME }; | ||
const modules = new modules_1.Modules(); | ||
const tapables = new tapables_1.Tapables(); | ||
const loaders = new loaders_1.Loaders(); | ||
const modules = new modules_1.Modules(this.options); | ||
const tapables = new tapables_1.Tapables(this.options); | ||
const loaders = new loaders_1.Loaders(this.options); | ||
tapables.throughHooks(compiler); | ||
@@ -36,9 +36,9 @@ compiler.hooks.thisCompilation.tap(HOOK_OPTIONS, (compilation) => { | ||
compilation.hooks.buildModule.tap(HOOK_OPTIONS, (module) => { | ||
loaders.buildModule(module, this.options.context, compilation); | ||
loaders.buildModule(module, compilation); | ||
}); | ||
compilation.hooks.succeedModule.tap(HOOK_OPTIONS, (module) => { | ||
loaders.succeedModule(module, this.options.context, compilation); | ||
loaders.succeedModule(module, compilation); | ||
}); | ||
compilation.hooks.afterOptimizeTree.tap(HOOK_OPTIONS, (chunks, mods) => { | ||
modules.afterOptimizeTree(chunks, mods, this.options.context, compilation); | ||
modules.afterOptimizeTree(chunks, mods, compilation); | ||
}); | ||
@@ -45,0 +45,0 @@ }); |
@@ -1,3 +0,5 @@ | ||
import { Module, Event, Compilation, TimingsMap } from '../types'; | ||
import { Module, Event, Compilation, TimingsMap, LocalOptions } from '../types'; | ||
export declare class Loaders { | ||
constructor(options: LocalOptions); | ||
options: LocalOptions; | ||
started: { | ||
@@ -7,4 +9,4 @@ [key: string]: Event; | ||
finished: Event[]; | ||
buildModule(module: Module, context: string, compilation: Compilation): void; | ||
succeedModule(module: Module, context: string, compilation: Compilation): void; | ||
buildModule(module: Module, compilation: Compilation): void; | ||
succeedModule(module: Module, compilation: Compilation): void; | ||
getResults(): { | ||
@@ -11,0 +13,0 @@ modules: TimingsMap; |
@@ -9,8 +9,10 @@ "use strict"; | ||
class Loaders { | ||
constructor() { | ||
constructor(options) { | ||
this.started = {}; | ||
this.finished = []; | ||
this.options = options; | ||
} | ||
buildModule(module, context, compilation) { | ||
const moduleName = helpers_1.getModuleName(module, context, compilation); | ||
buildModule(module, compilation) { | ||
const context = this.options.context; | ||
const moduleName = helpers_1.getModuleName(module, compilation, context); | ||
const loaders = helpers_1.getLoaderNames(module); | ||
@@ -32,4 +34,5 @@ if (!loaders.length) { | ||
} | ||
succeedModule(module, context, compilation) { | ||
const moduleName = helpers_1.getModuleName(module, context, compilation); | ||
succeedModule(module, compilation) { | ||
const context = this.options.context; | ||
const moduleName = helpers_1.getModuleName(module, compilation, context); | ||
// Get the event for this module. | ||
@@ -36,0 +39,0 @@ const event = this.started[moduleName]; |
@@ -1,3 +0,5 @@ | ||
import { Module, LocalModule, ModulesResult, Compilation } from '../types'; | ||
import { Module, LocalModule, ModulesResult, Compilation, Dependency, LocalOptions } from '../types'; | ||
export declare class Modules { | ||
constructor(options: LocalOptions); | ||
options: LocalOptions; | ||
storedModules: { | ||
@@ -9,4 +11,7 @@ [key: string]: LocalModule; | ||
}; | ||
afterOptimizeTree(chunks: any, modules: Module[], context: string, compilation: Compilation): void; | ||
getModule(dep: Dependency, compilation: Compilation): Module | undefined; | ||
getChunks(module: Module, compilation: Compilation): Set<any>; | ||
getLocalModule(name: string, module: Module, compilation: Compilation, opts?: Partial<LocalModule>): LocalModule; | ||
afterOptimizeTree(chunks: any, modules: Module[], compilation: Compilation): void; | ||
getResults(): ModulesResult; | ||
} |
@@ -8,25 +8,31 @@ "use strict"; | ||
class Modules { | ||
constructor() { | ||
constructor(options) { | ||
this.storedModules = {}; | ||
this.storedDependents = {}; | ||
this.options = options; | ||
} | ||
afterOptimizeTree(chunks, modules, context, compilation) { | ||
// In Webpack 5, using dep.module throws an error. | ||
// It's advised to use ModuleGraph API instead (not available in previous versions). | ||
getModule(dep, compilation) { | ||
var _a; | ||
try { | ||
return dep.module; | ||
} | ||
catch (e) { | ||
return (_a = compilation.moduleGraph) === null || _a === void 0 ? void 0 : _a.getModule(dep); | ||
} | ||
} | ||
getChunks(module, compilation) { | ||
var _a; | ||
return module._chunks || ((_a = compilation.chunkGraph) === null || _a === void 0 ? void 0 : _a.getModuleChunks(module)); | ||
} | ||
getLocalModule(name, module, compilation, opts) { | ||
const localModule = Object.assign({ name: helpers_1.getDisplayName(name), size: helpers_1.getModuleSize(module), chunkNames: Array.from(this.getChunks(module, compilation)).map((c) => c.name), dependencies: [], dependents: [] }, opts); | ||
return localModule; | ||
} | ||
afterOptimizeTree(chunks, modules, compilation) { | ||
const context = this.options.context; | ||
const moduleMap = {}; | ||
// In Webpack 5, using dep.module throws an error. | ||
// It's advised to use ModuleGraph API instead (not available in previous versions). | ||
const getModule = (dep) => { | ||
var _a; | ||
try { | ||
return dep.module; | ||
} | ||
catch (e) { | ||
return (_a = compilation.moduleGraph) === null || _a === void 0 ? void 0 : _a.getModule(dep); | ||
} | ||
}; | ||
const getChunks = (module) => { | ||
var _a; | ||
return module._chunks || ((_a = compilation.chunkGraph) === null || _a === void 0 ? void 0 : _a.getModuleChunks(module)); | ||
}; | ||
for (const module of modules) { | ||
const moduleName = helpers_1.getModuleName(module, context, compilation); | ||
const moduleName = helpers_1.getModuleName(module, compilation, context); | ||
moduleMap[moduleName] = module; | ||
@@ -37,4 +43,4 @@ let dependencies = module.dependencies | ||
// RequireHeaderDependency, ConstDepependency, ... | ||
.filter(getModule) | ||
.map((dep) => helpers_1.getModuleName(getModule(dep), context, compilation)); | ||
.filter((dep) => this.getModule(dep, compilation)) | ||
.map((dep) => helpers_1.getModuleName(this.getModule(dep, compilation), compilation, context)); | ||
// If we've already encounter this module, merge its dependencies. | ||
@@ -46,9 +52,5 @@ if (this.storedModules[moduleName]) { | ||
dependencies = [...new Set(dependencies)]; | ||
this.storedModules[moduleName] = { | ||
name: helpers_1.getDisplayName(moduleName), | ||
size: helpers_1.getModuleSize(module), | ||
chunkNames: Array.from(getChunks(module)).map((c) => c.name), | ||
this.storedModules[moduleName] = this.getLocalModule(moduleName, module, compilation, { | ||
dependencies, | ||
dependents: [], | ||
}; | ||
}); | ||
// Update the dependents store once we have all dependencies | ||
@@ -66,9 +68,3 @@ for (const dep of dependencies) { | ||
if (!this.storedModules[storedDepName]) { | ||
this.storedModules[storedDepName] = { | ||
name: storedDepName, | ||
size: helpers_1.getModuleSize(moduleMap[storedDepName]), | ||
chunkNames: Array.from(getChunks(moduleMap[storedDepName])).map((c) => c.name), | ||
dependencies: [], | ||
dependents: [], | ||
}; | ||
this.storedModules[storedDepName] = this.getLocalModule(storedDepName, moduleMap[storedDepName], compilation); | ||
} | ||
@@ -75,0 +71,0 @@ // Assign dependents. |
@@ -1,3 +0,5 @@ | ||
import { MonitoredTaps, Tapable, Hooks, TimingsMap, Context, TAP_TYPES, TapablesResult, TapPromise, TapAsync, Tap, Hook } from '../types'; | ||
import { MonitoredTaps, Tapable, Hooks, TimingsMap, Context, TAP_TYPES, TapablesResult, TapPromise, TapAsync, Tap, Hook, LocalOptions } from '../types'; | ||
export declare class Tapables { | ||
constructor(options: LocalOptions); | ||
options: LocalOptions; | ||
monitoredTaps: MonitoredTaps; | ||
@@ -4,0 +6,0 @@ tapables: Tapable[]; |
@@ -15,3 +15,3 @@ "use strict"; | ||
class Tapables { | ||
constructor() { | ||
constructor(options) { | ||
this.monitoredTaps = {}; | ||
@@ -21,2 +21,3 @@ this.tapables = []; | ||
this.timings = new Map(); | ||
this.options = options; | ||
} | ||
@@ -23,0 +24,0 @@ saveResult(type, pluginName, hookName, context, start, end) { |
{ | ||
"name": "@datadog/build-plugin", | ||
"version": "1.0.1", | ||
"version": "1.0.2", | ||
"license": "MIT", | ||
@@ -5,0 +5,0 @@ "author": "Datadog", |
@@ -144,2 +144,4 @@ # Build plugin <!-- omit in toc --> | ||
> You can get this dashboard's configuration by running `yarn cli dashboard --prefix <your.prefix>`. | ||
The most basic configuration looks like this, consult | ||
@@ -146,0 +148,0 @@ [the full integration documentation](./src/hooks/datadog) for more details. |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
146429
83
3376
261
11