Socket
Socket
Sign inDemoInstall

@datadog/build-plugin

Package Overview
Dependencies
Maintainers
3
Versions
14
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@datadog/build-plugin - npm Package Compare versions

Comparing version 1.0.1 to 1.0.2

dist/__tests__/hooks/outputFiles.test.d.ts

12

dist/__tests__/esbuild/modules.test.js

@@ -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.

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc