@datadog/esbuild-plugin 2.5.1-dev-8 → 2.5.2-dev-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,7 +10,7 @@ A esbuild plugin to interact with Datadog from your ESBuild builds.
10
10
  yarn add -D @datadog/esbuild-plugin
11
11
  ```
12
12
 
13
- - NPM
13
+ - npm
14
14
 
15
15
  ```bash
16
16
  npm install --save-dev @datadog/esbuild-plugin
@@ -12,8 +12,6 @@ declare class TrackedFilesMatcher {
12
12
  private getFilename;
13
13
  }
14
14
 
15
- declare const CONFIG_KEY$2: "errorTracking";
16
-
17
15
  type MinifiedPathPrefix = `http://${string}` | `https://${string}` | `/${string}`;
18
16
  type SourcemapsOptions = {
19
17
  bailOnError?: boolean;
@@ -29,17 +27,13 @@ type ErrorTrackingOptions = {
29
27
  disabled?: boolean;
30
28
  sourcemaps?: SourcemapsOptions;
31
29
  };
32
- interface OptionsWithErrorTracking extends GetPluginsOptions {
33
- [CONFIG_KEY$2]: ErrorTrackingOptions;
34
- }
30
+
31
+ declare const CONFIG_KEY$2: "errorTracking";
35
32
 
36
33
  type types$2 = {
37
34
  ErrorTrackingOptions: ErrorTrackingOptions;
38
- OptionsWithErrorTracking: OptionsWithErrorTracking;
39
35
  };
40
36
 
41
- declare const CONFIG_KEY$1: "rum";
42
-
43
37
  type RumOptions = {
44
38
  disabled?: boolean;
45
39
  sdk?: SDKOptions;
@@ -49,13 +43,11 @@ type RumInitConfiguration = RumInitConfiguration$1;
49
43
  type SDKOptions = Assign<RumInitConfiguration, {
50
44
  clientToken?: string;
51
45
  }>;
52
- interface OptionsWithRum extends GetPluginsOptions {
53
- [CONFIG_KEY$1]: RumOptions;
54
- }
46
+
47
+ declare const CONFIG_KEY$1: "rum";
55
48
 
56
49
  type types$1 = {
57
50
  RumOptions: RumOptions;
58
- OptionsWithRum: OptionsWithRum;
59
51
  RumPublicApi: RumPublicApi;
60
52
  RumInitConfiguration: RumInitConfiguration;
61
53
  };
@@ -94,6 +86,18 @@ type Output = File & {
94
86
  type Entry = Output & {
95
87
  outputs: Output[];
96
88
  };
89
+ type Timer = {
90
+ label: string;
91
+ pluginName: string;
92
+ spans: {
93
+ start: number;
94
+ end?: number;
95
+ tags?: string[];
96
+ }[];
97
+ tags: string[];
98
+ total: number;
99
+ logLevel: LogLevel;
100
+ };
97
101
  type BuildReport = {
98
102
  bundler: Omit<BundlerReport, 'outDir' | 'rawConfig'>;
99
103
  errors: string[];
@@ -105,6 +109,7 @@ type BuildReport = {
105
109
  message: string;
106
110
  time: number;
107
111
  }[];
112
+ timings: Timer[];
108
113
  entries?: Entry[];
109
114
  inputs?: Input[];
110
115
  outputs?: Output[];
@@ -135,15 +140,32 @@ type ToInjectItem = {
135
140
  position?: InjectPosition;
136
141
  fallback?: ToInjectItem;
137
142
  };
143
+ type TimeLogger = {
144
+ timer: Timer;
145
+ resume: () => void;
146
+ end: () => void;
147
+ pause: () => void;
148
+ tag: (tags: string[], opts?: {
149
+ span?: boolean;
150
+ }) => void;
151
+ };
152
+ type TimeLog = (label: string, opts?: {
153
+ level?: LogLevel;
154
+ start?: boolean;
155
+ log?: boolean;
156
+ tags?: string[];
157
+ }) => TimeLogger;
138
158
  type GetLogger = (name: string) => Logger;
139
159
  type Logger = {
140
160
  getLogger: GetLogger;
161
+ time: TimeLog;
141
162
  error: (text: any) => void;
142
163
  warn: (text: any) => void;
143
164
  info: (text: any) => void;
144
165
  debug: (text: any) => void;
145
166
  };
146
167
  type Env = (typeof ALL_ENVS)[number];
168
+ type TriggerHook<R> = <K extends keyof CustomHooks>(name: K, ...args: Parameters<NonNullable<CustomHooks[K]>>) => R;
147
169
  type GlobalContext = {
148
170
  auth?: AuthOptions;
149
171
  inject: (item: ToInjectItem) => void;
@@ -153,12 +175,35 @@ type GlobalContext = {
153
175
  env: Env;
154
176
  getLogger: GetLogger;
155
177
  git?: RepositoryData;
178
+ asyncHook: TriggerHook<Promise<void[]>>;
179
+ hook: TriggerHook<void>;
180
+ plugins: (PluginOptions | CustomPluginOptions)[];
156
181
  pluginNames: string[];
157
182
  sendLog: (message: string, ctx?: any) => Promise<void>;
158
183
  start: number;
159
184
  version: string;
160
185
  };
161
- type GetCustomPlugins = (options: Options, context: GlobalContext) => UnpluginOptions[];
186
+ type HookFn<T extends Array<any>> = (...args: T) => void;
187
+ type AsyncHookFn<T extends Array<any>> = (...args: T) => Promise<void> | void;
188
+ type CustomHooks = {
189
+ cwd?: HookFn<[string]>;
190
+ init?: HookFn<[GlobalContext]>;
191
+ buildReport?: HookFn<[BuildReport]>;
192
+ bundlerReport?: HookFn<[BundlerReport]>;
193
+ git?: AsyncHookFn<[RepositoryData]>;
194
+ };
195
+ type PluginOptions = Assign<UnpluginOptions & CustomHooks, {
196
+ name: PluginName;
197
+ }>;
198
+ type CustomPluginOptions = Assign<PluginOptions, {
199
+ name: string;
200
+ }>;
201
+ type GetPluginsArg = {
202
+ bundler: any;
203
+ context: GlobalContext;
204
+ options: Options;
205
+ };
206
+ type GetCustomPlugins = (arg: GetPluginsArg) => CustomPluginOptions[];
162
207
  type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';
163
208
  type AuthOptions = {
164
209
  apiKey?: string;
@@ -175,7 +220,7 @@ interface Options extends BaseOptions {
175
220
  [CONFIG_KEY]?: TelemetryOptions;
176
221
  customPlugins?: GetCustomPlugins;
177
222
  }
178
- type GetPluginsOptions = Required<BaseOptions>;
223
+ type PluginName = `datadog-${Lowercase<string>}-plugin`;
179
224
 
180
225
  interface Metric {
181
226
  metric: string;
package/dist/src/index.js CHANGED
@@ -1,5 +1,5 @@
1
- "use strict";var e=require("unplugin"),t=require("chalk"),n=require("outdent"),s=require("path"),o=require("async-retry"),r=require("fs/promises"),i=require("fs"),a=require("glob"),u=require("buffer"),p=require("p-queue"),c=require("stream"),l=require("zlib"),d=require("pretty-bytes"),f=require("perf_hooks"),m=require("simple-git"),h=require("url"),g=require("os"),w=require("module"),y=require("esbuild");const b="__datadog-helper-file",v=["development","production","test"],$={debug:0,info:1,warn:2,error:3,none:4},k=(e,n="warn")=>s=>{const o=(e=>e.split(">").map((e=>e.replace(/^datadog-|-plugin$/g,""))).join(">"))(s),r=(s,r="debug")=>{let i=t.dim,a=console.log;"error"===r?(i=t.red,a=console.error):"warn"===r?(i=t.yellow,a=console.warn):"info"===r&&(i=t.cyan,a=console.log);const u=`[${r}|${e.bundler.fullName}|${o}]`,p="string"==typeof s?s:JSON.stringify(s,null,2);e.logs.push({bundler:e.bundler.fullName,pluginName:o,type:r,message:p,time:Date.now()}),"error"===r&&e.errors.push(p),"warn"===r&&e.warnings.push(p),$[r]>=$[n]&&a(`${i(u)} ${p}`)};return{getLogger:t=>k(e,n)(`${o}>${t}`),error:e=>r(e,"error"),warn:e=>r(e,"warn"),info:e=>r(e,"info"),debug:e=>r(e,"debug")}},S="errorTracking",D="datadog-error-tracking-plugin",E=(e,n,o)=>{if(".map"!==s.extname(o))throw new Error(`The file ${t.green.bold(o)} is not a sourcemap.`);const r=o.replace(/\.map$/,""),i=r.replace(n.bundler.outDir,"");return{minifiedFilePath:r,minifiedUrl:e.minifiedPathPrefix?s.join(e.minifiedPathPrefix,i):i,relativePath:i}},M=e=>{const t=Math.floor(e/1e3/60/60/24),n=new Date(e-24*t*60*60*1e3),s=n.getUTCHours(),o=n.getUTCMinutes(),r=n.getUTCSeconds(),i=n.getUTCMilliseconds(),a=`${t?`${t}d `:""}${s?`${s}h `:""}${o?`${o}m `:""}${r?`${r}s`:""}`.trim();return`${a}${!a||i?` ${i}ms`:""}`.trim()},P=async(e,t,n)=>{const s=[],o=e.initialOptions.entryPoints,r=[],i=[];if(Array.isArray(o))for(const e of o){const t=e&&"object"==typeof e?e.in:e;r.push({path:t})}else o&&"object"==typeof o&&r.push(...Object.entries(o).map((([e,t])=>({name:e,path:t}))));const u=r.flatMap((e=>{return(t=e.path,t.includes("*")?a.glob.sync(t):[t]).map((t=>[e,t]));var t})).map((async([n,o])=>{const r=await e.resolve(o,{kind:"entry-point",resolveDir:t.cwd});r.errors.length&&i.push(...r.errors.map((e=>e.text))),r.path&&s.push({name:n.name,resolved:r.path,original:n.path})}));for(const e of i)n.error(e);return await Promise.all(u),s},j=[400,403,413],T=e=>{const{auth:t,url:n,method:s="GET",getData:r,type:i="text"}=e,a={retries:0===e.retries?0:e.retries||5,onRetry:e.onRetry,maxTimeout:e.maxTimeout,minTimeout:e.minTimeout};return o((async(e,o)=>{let a;try{const e={method:s,duplex:"half"};let o={};if(t?.apiKey&&(o["DD-API-KEY"]=t.apiKey),t?.appKey&&(o["DD-APPLICATION-KEY"]=t.appKey),"function"==typeof r){const{data:t,headers:n}=await r();e.body=t,o={...o,...n}}a=await fetch(n,{...e,headers:o})}catch(t){return e(t),{}}if(!a.ok){const t=`HTTP ${a.status} ${a.statusText}`;if(j.includes(a.status))return e(new Error(t)),{};throw new Error(t)}try{let e;return e="json"===i?await a.json():await a.text(),e}catch(t){return e(t),{}}}),a)},O=(e,t=60,n="[...]")=>{if(e.length<=t)return e;const s=Math.max(4,t-n.length),o=Math.min(10,Math.floor(s/2)),r=s-o;return`${e.slice(0,o)}${n}${e.slice(-r)}`},x=e=>e.includes(b),z=async(e,t)=>{await(async e=>r.mkdir(e,{recursive:!0}))(s.dirname(e)),await r.writeFile(e,t,{encoding:"utf-8"})},N=(e,t)=>{var n;n=s.dirname(e),i.mkdirSync(n,{recursive:!0}),i.writeFileSync(e,t,{encoding:"utf-8"})};let R=0;const I=()=>`${Date.now()}.${performance.now()}.${++R}`,A=(e,t)=>x(t)?b:t.startsWith(e)||s.isAbsolute(t)?t:s.resolve(e,t),F=/[/]+|[\\]+/g,q=/^[/]+|^[\\]+|[/]+$|[\\]+$/g,C=(e,t)=>{const n=e.replace(q,"").split(F),s=t.replace(q,"").split(F),o=n.join("/");let r="";for(let e=0;e<s.length;e+=1){const t=s.slice(-e).join("/");o.startsWith(t)&&(r=t)}return r},L=async e=>{const t={empty:!1,exists:!0};try{0===(await i.promises.stat(e)).size&&(t.empty=!0)}catch(e){if("ENOENT"!==e.code)throw e;t.exists=!1}return t},_=async(e,t,n,o)=>{const r=await(async(e,t)=>{const[n,s]=await Promise.all([L(e.minifiedFilePath),L(e.sourcemapFilePath)]);return{file:n,sourcemap:s,repeatedPrefix:C(e.relativePath,t)}})(e,n),i=[],a=[],u=new Map([["event",{type:"string",options:{contentType:"application/json",filename:"event"},value:JSON.stringify({...t,minified_url:e.minifiedUrl})}],["source_map",{type:"file",path:e.sourcemapFilePath,options:{filename:"source_map",contentType:"application/json"}}],["minified_file",{type:"file",path:e.minifiedFilePath,options:{filename:"minified_file",contentType:"application/javascript"}}]]);if(o)try{u.set("repository",{type:"string",options:{contentType:"application/json",filename:"repository"},value:JSON.stringify({data:[{files:o.trackedFilesMatcher.matchSourcemap(e.sourcemapFilePath,(t=>{a.push(`${s.basename(e.sourcemapFilePath)}: "${t}"`)})),hash:o.hash,repository_url:o.remote}],version:1})})}catch(t){a.push(`Could not attach git data for sourcemap ${e.sourcemapFilePath}: ${t.message}`)}return r.file.empty&&i.push(`Minified file is empty: ${e.minifiedFilePath}`),r.file.exists||i.push(`Minified file not found: ${e.minifiedFilePath}`),r.sourcemap.empty&&i.push(`Sourcemap file is empty: ${e.sourcemapFilePath}`),r.sourcemap.exists||i.push(`Sourcemap file not found: ${e.sourcemapFilePath}`),r.repeatedPrefix&&a.push(`The minified file path contains a repeated pattern with the minified path prefix: ${r.repeatedPrefix}`),{content:u,errors:i,warnings:a}},K=t.green.bold,W=t.yellow.bold,B=t.red.bold,H=async(e,t)=>{if("function"==typeof i.openAsBlob){const n=await i.openAsBlob(e,{type:t.contentType});return new u.File([n],t.filename)}{const n=c.Readable.toWeb(i.createReadStream(e)),s=await new Response(n).blob();return new u.File([s],t.filename,{type:t.contentType})}},U=(e,t={})=>async()=>{const n=new FormData,s=l.createGzip();for(const[t,s]of e.content){const e="file"===s.type?await H(s.path,s.options):new Blob([s.value],{type:s.options.contentType});n.append(t,e,s.options.filename)}const o=new Request("fake://url",{method:"POST",body:n});return{data:c.Readable.fromWeb(o.body).pipe(s),headers:{"Content-Encoding":"gzip",...t,...Object.fromEntries(o.headers.entries())}}},G=async(e,t,n,s)=>{const o=Date.now(),r=t.minifiedPathPrefix,i={git_repository_url:n.git?.remote,git_commit_sha:n.git?.hash,plugin_version:n.version,project_path:n.bundler.outDir,service:t.service,type:"js_sourcemap",version:t.releaseVersion},a=await Promise.all(e.map((e=>_(e,i,r,n.git)))),u=a.map((e=>e.errors)).flat(),c=a.map((e=>e.warnings)).flat();if(c.length>0&&s.warn(`Warnings while preparing payloads:\n - ${c.join("\n - ")}`),u.length>0){const e=`Failed to prepare payloads, aborting upload :\n - ${u.join("\n - ")}`;if(s.error(e),!0===t.bailOnError)throw new Error(e);return}const{errors:l,warnings:d}=await(async(e,t,n,s)=>{const o=[],r=[];if(!n.auth?.apiKey)return o.push({error:new Error("No authentication token provided")}),{errors:o,warnings:r};if(0===e.length)return r.push("No sourcemaps to upload"),{errors:o,warnings:r};const i=new(p.default?p.default:p)({concurrency:t.maxConcurrency}),a={"DD-API-KEY":n.auth.apiKey,"DD-EVP-ORIGIN":`${n.bundler.fullName}-build-plugin_sourcemaps`,"DD-EVP-ORIGIN-VERSION":n.version},u=[];for(const p of e){const e={sourcemap:p.content.get("source_map")?.path.replace(n.bundler.outDir,"."),file:p.content.get("minified_file")?.path.replace(n.bundler.outDir,".")};s.debug(`Queuing ${K(e.sourcemap)} | ${K(e.file)}`),u.push(i.add((async()=>{try{await T({url:t.intakeUrl,method:"POST",getData:U(p,a),onRetry:(t,n)=>{const o=`Failed to upload ${W(e.sourcemap)} | ${W(e.file)}:\n ${t.message}\nRetrying ${n}/5`;r.push(o),s.debug(o)}}),s.debug(`Sent ${K(e.sourcemap)} | ${K(e.file)}`)}catch(n){if(o.push({metadata:e,error:n}),!0===t.bailOnError)throw n}})))}return await Promise.all(u),await i.onIdle(),{warnings:r,errors:o}})(a,t,n,s);if(s.info(`Done uploading ${K(e.length.toString())} sourcemaps in ${K(M(Date.now()-o))}.`),l.length>0){const e=`Failed to upload some sourcemaps:\n${` - ${l.map((({metadata:e,error:t})=>e?`${B(e.file)} | ${B(e.sourcemap)} : ${t.message}`:t.message)).join("\n - ")}`}`;if(s.error(e),!0===t.bailOnError)throw new Error(e)}d.length>0&&s.warn(`Warnings while uploading sourcemaps:\n - ${d.join("\n - ")}`)},J=async(e,s,o)=>{const r=t.green.bold,i=Object.entries(e.sourcemaps).map((([e,t])=>` - ${e}: ${r(t.toString())}`)).join("\n"),a=((e,t)=>{if(!t.build.outputs||0===t.build.outputs.length)throw new Error("No output files found.");return t.build.outputs.filter((e=>e.filepath.endsWith(".map"))).map((e=>e.filepath)).map((n=>({...E(e,t,n),sourcemapFilePath:n,minifiedPathPrefix:e.minifiedPathPrefix})))})(e.sourcemaps,s),u=n.outdent`
2
- Uploading ${r(a.length.toString())} sourcemaps with configuration:
3
- ${i}
4
- `;o.info(u),await G(a,e.sourcemaps,s,o)},V=`https://sourcemap-intake.${process.env.DATADOG_SITE||"datadoghq.com"}/api/v2/srcmap`,Y=e=>{const n=t.bold.red,s=e[S]||{},o={errors:[]};if(s.sourcemaps){s.sourcemaps.releaseVersion||o.errors.push(`${n("sourcemaps.releaseVersion")} is required.`),s.sourcemaps.service||o.errors.push(`${n("sourcemaps.service")} is required.`),s.sourcemaps.minifiedPathPrefix||o.errors.push(`${n("sourcemaps.minifiedPathPrefix")} is required.`),s.sourcemaps.minifiedPathPrefix&&((e=>{let t;try{t=new URL(e).host}catch{}return!(!t&&!e.startsWith("/"))})(s.sourcemaps.minifiedPathPrefix)||o.errors.push(`${n("sourcemaps.minifiedPathPrefix")} must be a valid URL or start with '/'.`));const e={bailOnError:!1,disableGit:!1,dryRun:!1,maxConcurrency:20,intakeUrl:process.env.DATADOG_SOURCEMAP_INTAKE_URL||s.sourcemaps.intakeUrl||V,...s.sourcemaps};o.config=e}return o},Q=(e,t)=>{const n=t.getLogger(D),s=((e,t)=>{const n=[],s=Y(e);if(n.push(...s.errors),n.length)throw t.error(`\n - ${n.join("\n - ")}`),new Error(`Invalid configuration for ${D}.`);const o={...e[S],sourcemaps:void 0};return s.config&&(o.sourcemaps=s.config),o})(e,n);return[{name:D,enforce:"post",async writeBundle(){s.disabled||s.sourcemaps&&await J(s,t,n)}}]};var X=(e=>(e[e.BEFORE=0]="BEFORE",e[e.MIDDLE=1]="MIDDLE",e[e.AFTER=2]="AFTER",e))(X||{});const Z="rum",ee="datadog-rum-plugin",te=e=>`DD_RUM.init({${JSON.stringify(e.sdk).replace(/(^{|}$)/g,"")}});\n`,ne=(e,t)=>{const n=e.sdk;if(n.clientToken)return te(e);if(!t.auth?.apiKey||!t.auth?.appKey)throw new Error('Missing "auth.apiKey" and/or "auth.appKey" to fetch "rum.sdk.clientToken".');return async()=>{let s;try{const e=await T({url:`https://api.datadoghq.com/api/v2/rum/applications/${n.applicationId}`,type:"json",auth:t.auth});s=e.data?.attributes?.client_token}catch(e){throw new Error(`Could not fetch the clientToken: ${e.message}`)}if(!s)throw new Error("Missing clientToken in the API response.");return te({...e,sdk:{clientToken:s,...n}})}},se=e=>{const n=t.bold.red,s=e[Z]||{},o={errors:[]};if(s.sdk){s.sdk.applicationId||o.errors.push(`Missing ${n("applicationId")} in the SDK configuration.`),e.auth?.apiKey&&e.auth?.appKey||s.sdk.clientToken||o.errors.push(`Missing ${n('"auth.apiKey"')} and/or ${n('"auth.appKey"')} to fetch missing client token.`);const t={applicationId:"unknown_application_id",allowUntrustedEvents:!1,compressIntakeRequests:!1,defaultPrivacyLevel:"mask",enablePrivacyForActionName:!1,sessionReplaySampleRate:0,sessionSampleRate:100,silentMultipleInit:!1,site:"datadoghq.com",startSessionReplayRecordingManually:!1,storeContextsAcrossPages:!1,telemetrySampleRate:20,traceSampleRate:100,trackingConsent:"granted",trackLongTasks:!1,trackResources:!1,trackUserInteractions:!1,trackViewsManually:!1};o.config={...t,...s.sdk}}return o},oe=(e,t)=>{const n=((e,t)=>{const n=[],s=se(e);if(n.push(...s.errors),n.length)throw t.error(`\n - ${n.join("\n - ")}`),new Error(`Invalid configuration for ${ee}.`);const o={...e[Z],sdk:void 0};return s.config&&(o.sdk=s.config),o})(e,t.getLogger(ee));return n.sdk&&(t.inject({type:"file",position:X.MIDDLE,value:s.join(__dirname,"./rum-browser-sdk.js")}),t.inject({type:"code",position:X.MIDDLE,value:ne(n,t)})),[]},re="telemetry",ie="datadog-telemetry-plugin",ae=[e=>/modules\.tree\.(count|size)$/.test(e.metric)?null:e,e=>e.tags.some((e=>/^assetName:.*\.map$/.test(e)||/^moduleName:\/node_modules/.test(e)))?null:e,e=>{const t={size:1e5,count:10,duration:1e3};return/(entries|loaders|warnings|errors)\.count$/.test(e.metric)&&(t.count=0),/(modules\.(dependencies|dependents)$)/.test(e.metric)&&(t.count=30),/modules\.tree\.count$/.test(e.metric)&&(t.count=150),/modules\.tree\.size$/.test(e.metric)&&(t.size=15e5),/entries\.size$/.test(e.metric)&&(t.size=0),/entries\.modules\.count$/.test(e.metric)&&(t.count=0),e.value>t[e.type]?e:null}],ue=(e,t)=>({type:"gauge",tags:[...e.tags,...t.tags],metric:`${t.prefix?`${t.prefix}.`:""}${e.metric}`,points:[[t.timestamp,e.value]]}),pe=(e="")=>e.endsWith("/")?e:`${e}/`,ce=(e,t)=>{let n=e;return e.split(pe(t)),n.split("!").pop().replace(/(.*)?\/node_modules\//,"/node_modules/").replace(/^((\.)*\/)+/,"")},le=(e,t)=>e.split("!").pop().replace(pe(t),"./"),de=(e,t,n)=>{let s=e.name||e.userRequest;return s||(s=((e,t)=>{let n=e.userRequest;if(!n){let s;s=t.moduleGraph&&"function"==typeof t.moduleGraph.getIssuer?t.moduleGraph.getIssuer(e):e.issuer,n=s?.userRequest,n||(n=e._identifier?.split("!").pop())}return n||"unknown"})(e,t)),le(s||"no-name",n)},fe=e=>e.replace(/^.*\/node_modules\/(@[a-z0-9][\w-.]+\/[a-z0-9][\w-.]*|[^/]+).*$/,"$1"),me=e=>e.map((e=>({type:e?.constructor?.name??typeof e,name:e?.name,value:"string"==typeof e?e:void 0}))),he=(e,t,n,s)=>{const o=new Set;if(s){const{timings:e}=s;e&&(e.tapables&&((e,t)=>{t.add({metric:"plugins.count",type:"count",value:e.size,tags:[]});for(const n of e.values()){let e=0,s=0;for(const o of Object.values(n.events)){let r=0;s+=o.values.length;for(const t of o.values){const n=t.end-t.start;r+=n,e+=n}t.add({metric:"plugins.hooks.duration",type:"duration",value:r,tags:[`pluginName:${n.name}`,`hookName:${o.name}`]}).add({metric:"plugins.hooks.increment",type:"count",value:o.values.length,tags:[`pluginName:${n.name}`,`hookName:${o.name}`]})}t.add({metric:"plugins.duration",type:"duration",value:e,tags:[`pluginName:${n.name}`]}).add({metric:"plugins.increment",type:"count",value:s,tags:[`pluginName:${n.name}`]})}})(e.tapables,o),e.loaders&&((e,t)=>{t.add({metric:"loaders.count",type:"count",value:e.size,tags:[]});for(const n of e.values())t.add({metric:"loaders.duration",type:"duration",value:n.duration,tags:[`loaderName:${n.name}`]}).add({metric:"loaders.increment",type:"count",value:n.increment,tags:[`loaderName:${n.name}`]})})(e.loaders,o))}((e,t)=>{const n=e.build.inputs||[],s=e.build.outputs||[],o=e.build.entries||[],r=e.build.warnings.length,i=e.build.errors.length,a=e.build.duration,u=new Map,p=new Map,c=new Map;for(const e of o){for(const t of e.inputs)u.has(t.filepath)||u.set(t.filepath,[]),u.get(t.filepath).push(e.name);for(const t of e.outputs){const n=t.filepath.replace(/\.map$/,"");c.has(n)||c.set(n,[]),c.get(n).push(e.name)}}for(const e of s)for(const t of e.inputs)p.has(t.filepath)||p.set(t.filepath,[]),p.get(t.filepath).push(e.name);t.add({metric:"assets.count",type:"count",value:s.length,tags:[]}).add({metric:"entries.count",type:"count",value:o.length,tags:[]}).add({metric:"errors.count",type:"count",value:i,tags:[]}).add({metric:"modules.count",type:"count",value:n.length,tags:[]}).add({metric:"warnings.count",type:"count",value:r,tags:[]}),a&&t.add({metric:"compilation.duration",type:"duration",value:a,tags:[]});for(const e of n){const n=[`moduleName:${e.name}`,`moduleType:${e.type}`];u.has(e.filepath)&&n.push(...u.get(e.filepath).map((e=>`entryName:${e}`))),p.has(e.filepath)&&n.push(...p.get(e.filepath).map((e=>`assetName:${e}`))),t.add({metric:"modules.size",type:"size",value:e.size,tags:n}).add({metric:"modules.dependencies",type:"count",value:e.dependencies.size,tags:n}).add({metric:"modules.dependents",type:"count",value:e.dependents.size,tags:n})}for(const e of s){const n=[`assetName:${e.name}`,`assetType:${e.type}`],s=e.filepath.replace(/\.map$/,"");c.has(s)&&n.push(...c.get(s).map((e=>`entryName:${e}`))),t.add({metric:"assets.size",type:"size",value:e.size,tags:n}).add({metric:"assets.modules.count",type:"count",value:e.inputs.length,tags:n})}for(const e of o){const n=[`entryName:${e.name}`];t.add({metric:"entries.size",type:"size",value:e.size,tags:n}).add({metric:"entries.modules.count",type:"count",value:e.inputs.length,tags:n}).add({metric:"entries.assets.count",type:"count",value:e.outputs.length,tags:n})}})(e,o);for(const e of o)if(t.filters?.length){let s=e;for(const n of t.filters){if(!s)break;s=n(e)}s&&n.add(ue(s,t))}else n.add(ue(e,t))},ge=async(e,t,n,o)=>{if("string"!=typeof t&&"object"!=typeof t&&!t)return;const{report:r,metrics:i}=e,a=Date.now();let u="";const p={timings:!0,metrics:!0};"object"==typeof t?(u=t.destination,p.timings=t.timings||!1,p.metrics=t.metrics||!1):"string"==typeof t&&(u=t);const c=s.resolve(o,u);try{const e={},t={};p.timings&&r?.timings&&(t.timings={content:{tapables:r.timings.tapables?Array.from(r.timings.tapables.values()):null,loaders:r.timings.loaders?Array.from(r.timings.loaders.values()):null,modules:r.timings.modules?Array.from(r.timings.modules.values()):null}}),p.metrics&&(t.metrics={content:Array.from(i)});const o=Object.entries(t).map((async([t,o])=>{const r=Date.now();n.debug(`Start writing ${t}.json.`);try{await(async(e,t)=>{const n=JSON.stringify(t,null,4);return z(e,n)})(s.join(c,`${t}.json`),o.content),n.debug(`Wrote ${t}.json in ${M(Date.now()-r)}`)}catch(s){n.error(`Failed to write ${t}.json in ${M(Date.now()-r)}`),e[t]=s}}));await Promise.all(o),n.debug(`Wrote files in ${M(Date.now()-a)}.`);const u=Object.keys(e);u.length&&n.error(`Couldn't write files.\n${u.map((t=>` - ${t}: ${e[t].toString()}`))}`)}catch(e){n.error(`Couldn't write files. ${e}`)}},we=t.bold.red,ye=t.bold.cyan,be=e=>(t,n)=>{let s,o;return"function"==typeof e?(s=e(t),o=e(n)):(s=t[e],o=n[e]),s>o?-1:s<o?1:0},ve=(e,t)=>{if(!t||!t.size)return[];const n=Array.from(t.values());n.sort(be("duration"));const s={name:`${e} duration`,values:n.map((e=>({name:e.name,value:M(e.duration)}))),top:!0};n.sort(be("increment"));return[s,{name:`${e} hits`,values:n.map((e=>({name:e.name,value:e.increment.toString()}))),top:!0}]},$e=(e,t,n)=>{const s=[];var o;n&&(s.push(...ve("Loader",n.timings.loaders)),s.push(...ve("Tapable",n.timings.tapables)),s.push(...ve("Module",n.timings.modules))),s.push(...(e=>{const t={name:"Module total dependents",values:[],top:!0},n={name:"Module total dependencies",values:[],top:!0},s={name:"Module size",values:[],top:!0},o={name:"Module aggregated size",values:[],top:!0},r=new Set,i=(e=>{const t={bundler:e.bundler,errors:e.errors,warnings:e.warnings,logs:e.logs,start:e.start,end:e.end,duration:e.duration,writeDuration:e.writeDuration,entries:[],inputs:[],outputs:[]};for(const n of e.entries||[]){const e={...n,inputs:[],outputs:[]};n.inputs&&(e.inputs=n.inputs.map((e=>e.filepath))),n.outputs&&(e.outputs=n.outputs.map((e=>e.filepath))),t.entries.push(e)}for(const n of e.inputs||[]){const e={...n,dependencies:[],dependents:[]};if(n.dependencies)for(const t of n.dependencies)e.dependencies.push(t.filepath);if(n.dependents)for(const t of n.dependents)e.dependents.push(t.filepath);t.inputs.push(e)}for(const n of e.outputs||[]){const e={...n,inputs:[]};n.inputs&&(e.inputs=n.inputs.map((e=>e.filepath))),t.outputs.push(e)}return t})(e.build),a=new Map,u=new Map,p=new Map;for(const e of i.inputs||[]){if("map"===e.type)continue;const t=new Set(e.dependencies),n=new Set(e.dependents);for(const n of t)p.has(n)||p.set(n,new Set),p.get(n).add(e.filepath);for(const t of n)u.has(t)||u.set(t,new Set),u.get(t).add(e.filepath);if(u.has(e.filepath)){const n=u.get(e.filepath);for(const e of n)t.add(e)}if(p.has(e.filepath)){const t=p.get(e.filepath);for(const e of t)n.add(e)}u.set(e.filepath,t),p.set(e.filepath,n),a.set(e.filepath,{name:e.name,size:e.size,dependencies:t,dependents:n})}for(const[e,t]of a){const n=u.get(e)||new Set,s=p.get(e)||new Set;let o=t.size;for(const e of n)o+=a.get(e)?.size||0;r.add({name:t.name,size:t.size,aggregatedSize:o,dependents:s,dependencies:n})}if(!r.size)return[t,n,s];const c=Array.from(r);return c.sort(be((e=>e.dependents.size))),t.values=c.map((e=>({name:e.name,value:e.dependents.size.toString()}))),c.sort(be((e=>e.dependencies.size))),n.values=c.map((e=>({name:e.name,value:e.dependencies.size.toString()}))),c.sort(be("size")),s.values=c.map((e=>({name:e.name,value:d(e.size)}))),c.sort(be("aggregatedSize")),o.values=c.map((e=>({name:e.name,value:d(e.aggregatedSize||e.size)}))),[t,n,s,o]})(e)),s.push(...(o=e,[{name:"Asset size",values:(o.build.outputs||[]).filter((e=>"map"!==e.type)).sort(be((e=>e.size))).map((e=>({name:e.name,value:d(e.size)}))),top:!0},{name:"Entry aggregated size",values:(o.build.entries||[]).sort(be((e=>e.size))).map((e=>({name:e.name,value:d(e.size)}))),top:!0},{name:"Entry number of modules",values:(o.build.entries||[]).sort(be((e=>e.size))).map((e=>({name:e.name,value:e.inputs.length.toString()})))||[],top:!0}])),s.push(...(e=>{const t={name:"General Numbers",values:[],top:!1},n=e.build.inputs?e.build.inputs.length:0,s=e.build.outputs?e.build.outputs.length:0,o=e.build.warnings.length,r=e.build.errors.length,i=e.build.entries?e.build.entries.length:0;return e.build.start&&t.values.push({name:"Overhead duration",value:M(e.build.start-e.start)}),e.build.duration&&t.values.push({name:"Build duration",value:M(e.build.duration)}),e.build.writeDuration&&t.values.push({name:"Write duration",value:M(e.build.writeDuration)}),t.values.push({name:"Number of modules",value:n.toString()},{name:"Number of assets",value:s.toString()},{name:"Number of entries",value:i.toString()},{name:"Number of warnings",value:o.toString()},{name:"Number of errors",value:r.toString()}),[t]})(e));const r=(e=>{let t="";for(const t of e){t.top&&t.values.length>=5&&(t.values=t.values.slice(0,5),t.name=`Top 5 ${t.name}`);for(const e of t.values)e.name=O(e.name,60)}const n=Math.max(...e.map((e=>e.name.length))),s=Math.max(...e.flatMap((e=>e.values.map((e=>e.name.length))))),o=Math.max(...e.flatMap((e=>e.values.map((e=>e.value.length))))),r=Math.max(n+4,s+o+4);for(const n of e){if(0===n.values.length)continue;const e=r-(n.name.length+4);t+=`\n== ${n.name} ${"=".repeat(e)}=\n`;for(const e of n.values){const n=o-e.value.length;t+=` [${we(e.value)}] ${" ".repeat(n)}${ye(e.name)}\n`}}return t})(s);t.info(r)},ke=["onStart","onLoad","onResolve","onEnd"],Se=new Map,De=new Map,Ee=(e,t,n)=>{const s=Object.assign({},e);for(const o of ke)s[o]=async(s,r)=>{const i=Se.get(t)||{name:t,increment:0,duration:0,events:{}};i.events[o]=i.events[o]||{name:o,values:[]};return(0,e[o])(s,(async(...e)=>{const s=le(e[0].path,n),a=De.get(s)||{name:s,increment:0,duration:0,events:{}};a.events[o]=a.events[o]||{name:o,values:[]};const u=f.performance.now();try{return await r(...e)}finally{const n=f.performance.now(),r=n-u,p={start:u,end:n,duration:r,context:me(e)};i.events[o].values.push(p),i.duration+=r,i.increment+=1,Se.set(t,i),a.events[o].values.push(p),a.duration+=r,a.increment+=1,De.set(s,a)}}))};return s},Me=(e,t,n)=>({setup:s=>{t.build.start=Date.now(),s.initialOptions.metafile=!0,((e,t)=>{const n=e.initialOptions.plugins;if(n){const e=n.map((e=>({...e})));for(const s of n){if(s.name.includes(ie))continue;const n=s.setup;s.setup=async o=>{const r=Ee(o,s.name,t);await n({...r,initialOptions:{...r.initialOptions,plugins:e}})}}}})(s,t.cwd),s.onEnd((async t=>{if(!t.metafile)return void n.warn("Missing metafile, can't proceed with modules data.");const{plugins:s,modules:o}={plugins:Se,modules:De};e.report={timings:{tapables:s,modules:o}}}))}});class Pe{constructor(e){this.started={},this.finished=[],this.cwd=e}buildModule(e,t){const n=de(e,t,this.cwd),s=(e=>(e.loaders||[]).map((e=>e.loader||e)).map(fe))(e);s.length||s.push("no-loader"),this.started[n]={module:ce(n),timings:{start:f.performance.now(),duration:0,end:0},loaders:s}}succeedModule(e,t){const n=de(e,t,this.cwd),s=this.started[n];s&&(s.timings.end=f.performance.now(),s.timings.duration=s.timings.end-s.timings.start,this.finished.push(s),delete this.started[n])}getResults(){const e=new Map,t=new Map;for(const n of this.finished){const s=n.timings.end-n.timings.start,o=t.get(n.module)||{name:n.module,increment:0,duration:0,events:{}},r=n.loaders.join(",");o.events[r]=o.events[r]||{name:r,values:[]},o.events[r].values.push(n.timings),o.increment+=1,o.duration+=s,t.set(n.module,o);for(const t of n.loaders){const n=e.get(t)||{name:t,increment:0,duration:0,events:{}};n.increment+=1,n.duration+=s,e.set(t,n)}}return{loaders:e,modules:t}}}class je{constructor(e){this.monitoredTaps={},this.tapables=[],this.hooks={},this.timings=new Map,this.ignoredHooks=["normalModuleLoader"],this.cwd=e}saveResult(e,t,n,s,o,r){const i=this.timings.get(t)||{name:t,duration:0,increment:0,events:{}};i.events[n]||(i.events[n]={name:n,values:[]}),i.events[n].values.push({start:o,end:r,duration:r-o,context:s,type:e}),i.duration+=r-o,i.increment+=1,this.timings.set(t,i)}getResults(){const e=this.timings;for(const[t,n]of this.timings){const s=n;s.duration=Object.values(n.events).map((e=>e.values.reduce(((e,t)=>e+t.end-t.start),0))).reduce(((e,t)=>e+t),0),e.set(t,s)}return{monitoredTaps:this.monitoredTaps,tapables:this.tapables,hooks:this.hooks,timings:e}}getPromiseTapPatch(e,t,n,s){return(...o)=>{this.checkNewHooks();const r=f.performance.now(),i=t.apply(this,o),a=()=>{this.saveResult(e,n,s,me(o),r,f.performance.now())};return i.then(a,a),i}}getAsyncTapPatch(e,t,n,s){return(...o)=>{this.checkNewHooks();const r=f.performance.now(),i=o.pop();return t.apply(this,[...o,(...t)=>(this.saveResult(e,n,s,me(o),r,f.performance.now()),i(...t))])}}getDefaultTapPatch(e,t,n,s){return(...o)=>{this.checkNewHooks();const r=f.performance.now(),i=t.apply(this,o);return this.saveResult(e,n,s,me(o),r,f.performance.now()),i}}getTapPatch(e,t,n,s){switch(e){case"promise":return this.getPromiseTapPatch(e,t,n,s);case"async":return this.getAsyncTapPatch(e,t,n,s);default:return this.getDefaultTapPatch(e,t,n,s)}}newTap(e,t,n,s){return(o,r)=>{const i="string"==typeof(a=o)?a:a.name;var a;const u=`${t}-${i}`;if(this.monitoredTaps[u])return n.call(s,o,r);this.monitoredTaps[u]=!0;const p=this.getTapPatch(e,r,i,t);return n.call(s,o,p)}}replaceTaps(e,t){t.tap=this.newTap("default",e,t.tap,t),t.tapAsync=this.newTap("async",e,t.tapAsync,t),t.tapPromise=this.newTap("promise",e,t.tapPromise,t)}patchHook(e,t,n){n._fakeHook||e.includes(ie)||(this.hooks[e]||(this.hooks[e]=[]),this.hooks[e].includes(t)||(this.hooks[e].push(t),this.replaceTaps(t,n)))}patchHooks(e){const t=e.constructor.name,n=Object.keys(e.hooks).filter((e=>!this.ignoredHooks.includes(e)&&!this.hooks[t]?.includes(e)));for(const s of n)this.patchHook(t,s,e.hooks[s])}checkNewHooks(){for(const e of this.tapables)this.patchHooks(e)}throughHooks(e){this.tapables.includes(e)||this.tapables.push(e),this.patchHooks(e)}}const Te=(e,t)=>async n=>{t.build.start=Date.now();const s={name:ie},o=new je(t.cwd),r=new Pe(t.cwd);o.throughHooks(n),n.hooks.thisCompilation.tap(s,(e=>{o.throughHooks(e),e.hooks.buildModule.tap(s,(t=>{r.buildModule(t,e)})),e.hooks.succeedModule.tap(s,(t=>{r.succeedModule(t,e)}))})),n.hooks.afterEmit.tapPromise(s,(async t=>{const{timings:n}=o.getResults(),{loaders:s,modules:i}=r.getResults();e.report={timings:{tapables:n,loaders:s,modules:i}}}))},Oe={filters:ae},xe=(e,t)=>{const n=t.getLogger(ie);let s=0;const o={start:Date.now()},r=(e=>{const t=e[re]||{},n=t.endPoint||"https://app.datadoghq.com";return{disabled:!1,enableTracing:!1,filters:ae,output:!1,prefix:"",tags:[],...t,endPoint:n.startsWith("http")?n:`https://${n}`}})(e),i=[],a={name:ie,enforce:"pre",esbuild:Me(o,t,n),webpack:Te(o,t),rspack:Te(o,t)},u={name:"datadog-universal-telemetry-plugin",enforce:"post",buildStart(){t.build.start=t.build.start||Date.now()},buildEnd(){s=Date.now()},async writeBundle(){t.build.end=Date.now(),t.build.duration=t.build.end-t.build.start,t.build.writeDuration=t.build.end-s;const e=new Set,i=(e=>({timestamp:Math.floor((e.timestamp||Date.now())/1e3),tags:e.tags,prefix:e.prefix,filters:e.filters}))(r);he(t,i,e,o.report),await ge({report:o.report,metrics:e},r.output,n,t.bundler.outDir),$e(t,n,o.report),await(async(e,t,n)=>{if(!t.apiKey)return void n.info("Won't send metrics to Datadog: missing API Key.");if(!e.size)return void n.info("No metrics to send.");const s=new Map;for(const t of e)s.has(t.metric)||s.set(t.metric,0),s.set(t.metric,s.get(t.metric)+1);const o=Array.from(s.entries()).map((([e,t])=>`${e} - ${t}`));return n.debug(`\nSending ${e.size} metrics.\nMetrics:\n - ${o.join("\n - ")}`),T({method:"POST",url:`${t.endPoint}/api/v1/series?api_key=${t.apiKey}`,getData:()=>({data:JSON.stringify({series:Array.from(e)})})}).catch((e=>{n.error(`Error sending metrics ${e}`)}))})(e,{apiKey:t.auth?.apiKey,endPoint:r.endPoint},n)}};return r.enableTracing&&i.push(a),i.push(u),i},ze="datadog-analytics-plugin",Ne=e=>{const t=e.getLogger(ze);return e.sendLog=async(n,s={})=>{if("production"===e.env)try{const t={name:e.bundler.name,version:e.bundler.version};await T({retries:2,minTimeout:100,url:"https://browser-http-intake.logs.datadoghq.com/v1/input/pub44d5f4eb86e1392037b7501f7adc540e",method:"POST",type:"json",getData:async()=>{const o={ddsource:`@datadog/${t.name}-plugin`,env:e.env,message:n,service:"build-plugins",bundler:t,plugins:e.pluginNames,version:e.version,team:"language-foundations",...s};return{data:JSON.stringify(o),headers:{"Content-Type":"application/json"}}}})}catch(e){t.debug(`Could not submit data to Datadog: ${e}`)}},[{name:ze,async buildStart(){await e.sendLog("Build started")}}]},Re=/\.(?!.*(?:\.|\/|\\))(\w{1,})/g,Ie=/(\?|%3F|\|)+/gi,Ae=e=>{return"unknown"===e?e:e.includes("webpack/runtime")?"runtime":(t=Ce(e),Re.lastIndex=0,Re.exec(t)?.[1]||"unknown");var t},Fe=["unknown","commonjsHelpers.js","vite/preload-helper.js"],qe=(e,t,n)=>{const s=new Set;for(const n of e){const e=Ce(n);x(n)||e===t||Fe.includes(e)||s.add(e)}return s},Ce=e=>e.split("!").pop().split(Ie).shift().replace(/^[^\w\s.,!@#$%^&*()=+~`\-/]+/,""),Le=(e,t)=>x(t)?b:"unknown"===t?t:t.includes("webpack/runtime")?t.replace("webpack/runtime/","").replace(/ +/g,"-"):t.split("!").pop().replace(A(e.cwd,e.bundler.outDir),"").replace(e.cwd,"").split("node_modules").pop().split(Ie).shift().replace(/^((\.\.?)?\/)+/,""),_e=(e,t)=>Object.fromEntries(Object.entries(e).map((([e,n])=>[A(t,e),n]))),Ke=(e,t)=>({setup(n){const o=new Map,r=[];n.onStart((async()=>{r.push(...await P(n,e,t));for(const t of r){const n=Le(e,t.resolved);t.name?o.set(n,t.name):o.set(n,n)}})),n.onEnd((n=>{const r=e.cwd;for(const t of n.errors)e.build.errors.push(t.text);for(const t of n.warnings)e.build.warnings.push(t.text);if(!n.metafile){const n="Missing metafile from build report.";return e.build.warnings.push(n),void t.warn(n)}const i=[],a=[],u=[],p=[],c=[],l={},d={},f=_e(n.metafile.inputs,r),m=_e(n.metafile.outputs,r),h=e=>{if(!x(e))return e;const t=f[A(r,e)];if(!t)return e;const n=t.imports.find((e=>!x(e.path)));return n?n.path:e};for(const[t,s]of Object.entries(n.metafile.inputs)){if(x(t))continue;const n=A(r,t),o={name:Le(e,t),filepath:n,dependents:new Set,dependencies:new Set,size:s.bytes,type:Ae(t)};l[n]=o,i.push(o)}for(const[s,i]of Object.entries(n.metafile.outputs)){const n=A(r,s),c=Le(e,n),f=[];for(const e of Object.keys(i.inputs)){if(x(e))continue;const n=l[A(r,e)];n?f.push(n):t.debug(`Input ${e} not found for output ${c}`)}if(i.entryPoint&&!f.length){const e=l[A(r,i.entryPoint)];if(!e){t.debug(`Input ${i.entryPoint} not found for output ${c}`);continue}f.push(e)}const m={name:c,filepath:n,inputs:f,size:i.bytes,type:Ae(n)};if(d[n]=m,"map"===m.type&&p.push(m),a.push(m),!i.entryPoint)continue;const g=l[A(r,h(i.entryPoint))];if(g){if(!o.get(g.name))continue;const e={...m,name:o.get(g.name)||g.name,outputs:[m],size:m.size};u.push(e)}}for(const e of p){const n=d[e.filepath.replace(/\.map$/,"")];n?e.inputs.push(n):t.debug(`Could not find output for sourcemap ${e.name}`)}const g={inputs:{report:l,meta:f},outputs:{report:d,meta:m}},w=/(<runtime>|https:|file:|data:|#)/g,y=e=>!x(e)&&!e.match(w),b=(n,o,a={})=>{if(!y(n))return a;const u=o.report[n];if(!u)return t.debug(`Could not find report's ${n}`),a;if(a[u.filepath])return a;a[u.filepath]=u;const p=o.meta[n];if(!p)return t.debug(`Could not find metafile's ${n}`),a;if(!p.imports||!p.imports.length)return a;for(const t of p.imports){const p=t.path.match(/^\.\.?\//),c=p?s.dirname(n):r,l=A(c,t.path);if(t.external){if(y(t.path)){const n=p?l:t.path,s=g.inputs.report[n]||{filepath:n,name:Le(e,t.path),size:0,type:"external",dependencies:new Set,dependents:new Set};"dependencies"in u&&(s.dependents.add(u),u.dependencies.add(s)),"inputs"in u&&!u.inputs.includes(s)&&u.inputs.push(s),i.includes(s)||i.push(s),g.inputs.report[n]=s,a[s.filepath]=s}}else b(l,o,a)}return a};for(const e of u){const t={},n={};for(const n of e.inputs)b(n.filepath,g.inputs,t);for(const t of e.outputs)b(t.filepath,g.outputs,n);e.inputs=Object.values(t),e.outputs=Object.values(n),e.size=e.outputs.reduce(((e,t)=>e+t.size),0),c.push(e)}for(const e of i){if("external"===e.type)continue;const n=g.inputs.meta[e.filepath];if(n)for(const o of n.imports){if(!y(o.path))continue;const n=o.path.match(/^\.?\.\//),i=n?s.dirname(e.filepath):r,a=A(i,o.path);let u;if(o.external){const e=n?a:o.path;u=g.inputs.report[e]}else u=g.inputs.report[a];u?(e.dependencies.add(u),u.dependents.add(e)):t.debug(`Could not find input file of ${o.path} imported from ${e.name}`)}else t.debug(`Could not find metafile's ${e.name}`)}e.build.outputs=a,e.build.inputs=i,e.build.entries=c}))}}),We=(e,t)=>{const n={};return{onLog(t,n){"warn"===t&&e.build.warnings.push(n.message||n.toString())},renderError(t){t&&e.build.errors.push(t.message)},moduleParsed(e){const t=Ce(e.id),s=n[t]||{dependencies:new Set,dependents:new Set},o=qe(new Set([...e.dynamicallyImportedIds,...e.importedIds]),t),r=qe(new Set([...e.dynamicImporters,...e.importers]),t);for(const e of r)s.dependents.add(e);for(const e of o)s.dependencies.add(e);n[t]=s},writeBundle(s,o){const r=[],i=[],a=[],u=[],p={},c=[],l={},d={};for(const[e,{dependencies:t,dependents:s}]of Object.entries(n)){for(const s of t){const t=Ce(s);n[t]||(n[t]={dependencies:new Set,dependents:new Set}),n[t].dependents.has(e)||n[t].dependents.add(e)}for(const t of s){const s=Ce(t);n[s]||(n[s]={dependencies:new Set,dependents:new Set}),n[s].dependencies.has(e)||n[s].dependencies.add(e)}}for(const[s,c]of Object.entries(o)){const o={name:s,filepath:A(e.bundler.outDir,s),inputs:[],size:"code"in c?Buffer.byteLength(c.code,"utf8"):Buffer.byteLength(c.source,"utf8"),type:Ae(s)};if("map"===o.type&&u.push(o),"modules"in c)for(const[t,n]of Object.entries(c.modules)){if(Ce(t)!==t)continue;const s={name:Le(e,t),dependencies:new Set,dependents:new Set,filepath:t,size:n.originalLength,type:Ae(t)};o.inputs.push(s),l[s.filepath]=s,r.push(s)}if("imports"in c)for(const s of c.imports){const i=Ce(s);if(!n[i]){p[A(e.bundler.outDir,i)]=o;continue}if(l[i]){t.debug(`Input report already there for ${i} from ${o.name}.`);continue}const a={name:Le(e,s),dependencies:new Set,dependents:new Set,filepath:i,size:0,type:"external"};o.inputs.push(a),l[a.filepath]=a,r.push(a)}"isEntry"in c&&c.isEntry&&a.push({...o,name:c.name,size:0,outputs:[o]}),d[o.filepath]=o,i.push(o)}for(const[e,n]of Object.entries(p)){const s=d[e];s?n.inputs.includes(s)||n.inputs.push(s):t.debug(`Could not find the output report for ${e}.`)}for(const s of r){const o=n[s.filepath];if(o){for(const n of o.dependencies){const o=l[n];o?s.dependencies.add(o):t.debug(`Could not find input for dependency ${Le(e,n)} of ${s.name}`)}for(const n of o.dependents){const o=l[n];o?s.dependents.add(o):t.debug(`Could not find input for dependent ${Le(e,n)} of ${s.name}`)}}else t.debug(`Could not find the import report for ${s.name}.`)}if(u.length)for(const e of u){const n=e.filepath.replace(/\.map$/,""),s=d[n];s?e.inputs.push(s):t.debug(`Could not find output for sourcemap ${e.name}`)}const f=(n,s={})=>{if(s[n])return s;const r=Le(e,n),i=d[n];if(!i){return!!l[r]||t.debug(`Could not find output for ${r}`),s}s[n]=i;const a=o[Le(e,n)];if(!a)return t.debug(`Could not find asset for ${r}`),s;const u=[];"imports"in a&&u.push(...a.imports),"dynamicImports"in a&&u.push(...a.dynamicImports);for(const t of u)f(A(e.bundler.outDir,t),s);return s};for(const e of a){const t=f(e.filepath);e.outputs=Object.values(t),e.inputs=Array.from(new Set(e.outputs.flatMap((e=>e.inputs)))),e.size=e.outputs.reduce(((e,t)=>e+t.size),0),c.push(e)}e.build.inputs=r,e.build.outputs=i,e.build.entries=c}}},Be=(e,t,n)=>s=>{const o=[],r=[],i=[],a=new Map,u=new Map,p=new Map,c=new Map,l=[],d=new Map,f=e=>!(!e||e.startsWith("webpack/runtime")||e.includes("/webpack4/buildin/")||e.startsWith("multi ")||x(e)),m=e=>e.replace(/(^external[^"]+"|"$)/g,""),h=e=>{const t={identifier:e.identifier()};"resource"in e&&"string"==typeof e.resource&&(t.resource=e.resource),"request"in e&&"string"==typeof e.request&&(t.request=e.request),"rawRequest"in e&&"string"==typeof e.rawRequest&&(t.rawRequest=e.rawRequest),"userRequest"in e&&"string"==typeof e.userRequest&&(t.userRequest=e.userRequest);const s=new Set;for(const[o,r]of Object.entries(t))r&&(c.has(r)?(n.debug(`Module ${e.identifier()} is already indexed by ${o}.`),c.get(r)!==e&&n.debug(`Module ${e.identifier()} is indexed with a different value.`)):(s.add(r),r.startsWith("external ")&&s.add(m(r))));return s},g=(e,t=[])=>{if("dependencies"in e)for(const n of e.dependencies)t.push(n),g(n,t);if("blocks"in e)for(const n of e.blocks)g(n,t);return t},w=(e,t)=>{if("request"in t&&t.request){if(c.has(t.request))return c.get(t.request);if(e.context&&c.has(A(e.context,t.request)))return c.get(A(e.context,t.request))}},y=e=>!(!("externalType"in e)||!e.externalType)||(!(!("external"in e)||!e.external)||!!e.identifier?.().startsWith("external "));s.hooks.thisCompilation.tap(t,(s=>{s.hooks.finishModules.tap(t,(t=>{for(const e of t){const t=h(e);for(const n of t)c.set(n,e)}for(const n of t){const t=n.identifier(),s=Le(e,t),r=new Set(g(n).map((e=>{const s=w(n,e);if(!s?.identifier())return!1;const o=s.identifier();return!!f(o)&&(o!==t&&(y(s)?m(o):o))})).filter(Boolean));if(!f(t))continue;for(const e of r){const n=d.get(e)||{dependencies:new Set,dependents:new Set};n.dependents.add(t),d.set(e,n)}const i=d.get(t)||{dependents:new Set,dependencies:new Set};for(const e of r)i.dependencies.add(e);d.set(t,i);const u=y(n)?{size:0,name:m(s),dependencies:new Set,dependents:new Set,filepath:t,type:"external"}:{size:n.size()||0,name:s,dependencies:new Set,dependents:new Set,filepath:t,type:Ae(t)};o.push(u),a.set(t,u),y(n)&&a.set(m(t),u)}for(const e of o){const t=d.get(e.filepath);if(t){for(const s of t.dependencies){const t=a.get(s);t?e.dependencies.add(t):n.debug(`Could not find input of dependency ${s}`)}for(const s of t.dependents){const t=a.get(s);t?e.dependents.add(t):n.debug(`Could not find input of dependent ${s}`)}}else n.debug(`Could not find dependency report for ${e.name}`)}}))})),s.hooks.afterEmit.tap(t,(t=>{const s=t.chunks,c=t.getAssets(),d=t=>[...t.files||[],...t.auxiliaryFiles||[]].map((t=>A(e.bundler.outDir,t))),m=t.chunkGraph;for(const e of s){const t=d(e),n=(m?m?.getChunkModules(e):"getModules"in e&&"function"==typeof e.getModules?e.getModules():[]).flatMap((e=>"modules"in e&&Array.isArray(e.modules)?e.modules.map((e=>e.identifier())):e.identifier())).filter(f);for(const e of t){if("map"===Ae(e))continue;const t=p.get(e)||[];p.set(e,[...t,...n])}}for(const t of c){const s={size:t.source.size()||0,name:t.name,inputs:[],filepath:A(e.bundler.outDir,t.name),type:Ae(t.name)};if(u.set(s.filepath,s),r.push(s),"map"===s.type){l.push(s);continue}const o=p.get(s.filepath);if(o)for(const e of o){const t=a.get(e);t?s.inputs.push(t):n.debug(`Could not find input of ${e}`)}else n.debug(`Could not find modules for ${s.name}`)}for(const e of l){const t=u.get(e.filepath.replace(/\.map$/,""));t?e.inputs.push(t):n.debug(`Output not found for sourcemap ${e.name}`)}for(const[s,o]of t.entrypoints){const t=[],r=[];let a=0;const p=o.chunks.flatMap(d),c=o.chunks.filter((e=>m?m.getChunkEntryModulesIterable(e):"hasEntryModule"in e&&"function"==typeof e.hasEntryModule&&e.hasEntryModule())).flatMap((e=>Array.from(e.files))).filter((e=>e.includes(s)||o.name&&e.includes(o.name))).find((e=>"js"===Ae(e)));for(const e of p){const s=u.get(e);e&&s?"map"===s.type||t.includes(s)||(t.push(s),r.push(...s.inputs),a+=s.size):n.debug(`Could not find output of ${JSON.stringify(e)}`)}const l={name:s,filepath:c?A(e.bundler.outDir,c):"unknown",size:a,inputs:Array.from(new Set(r)),outputs:t,type:c?Ae(c):"unknown"};i.push(l)}for(const n of t.errors)e.build.errors.push(n.message);for(const n of t.warnings)e.build.warnings.push(n.message);e.build.inputs=o,e.build.outputs=r,e.build.entries=i}))},He="datadog-build-report-plugin",Ue=e=>{const t=e.getLogger(He);return[{name:He,enforce:"post",esbuild:Ke(e,t),rspack:Be(e,He,t),webpack:Be(e,He,t),vite:We(e,t),rollup:We(e,t)}]},Ge=(e,t)=>{const n=(e=>{let t,n=A(process.cwd(),e),o=n.split("/").length;for(;o>0;){const e=s.resolve(n,"package.json");i.existsSync(e)&&(t=n),n=n.split("/").slice(0,-1).join("/"),o--}return t})(t);if(n)return n;const o=(e=>{const t=[...e].map((e=>A(process.cwd(),e).split(s.sep))),n=Math.min(...t.map((e=>e.length))),o=[];for(let e=0;e<n;e++){const n=t[0][e];if(!t.every((t=>t[e]===n)))break;o.push(n)}return o.length>0&&o.join(s.sep)||s.sep})(Array.from(e));return o!==s.sep?o:void 0},Je=e=>t=>{e.bundler.rawConfig=t.options,t.options.output?.path&&(e.bundler.outDir=t.options.output.path),t.options.context&&(e.cwd=t.options.context)},Ve=e=>{const t=new Set,n=n=>{n&&(n.dir?(e.bundler.outDir=n.dir,t.add(n.dir)):n.file&&(e.bundler.outDir=s.dirname(n.file),t.add(e.bundler.outDir)),e.bundler.outDir=A(process.cwd(),e.bundler.outDir),"vite"!==e.bundler.name&&(e.cwd=Ge(t,e.bundler.outDir)||e.cwd))},o=()=>({options(o){if(e.bundler.rawConfig=o,o.input)if(Array.isArray(o.input))for(const e of o.input)t.add(s.dirname(e));else if("object"==typeof o.input)for(const e of Object.values(o.input))t.add(s.dirname(e));else{if("string"!=typeof o.input)throw new Error("Invalid input type");t.add(s.dirname(o.input))}if("output"in o){const e=Array.isArray(o.output)?o.output:[o.output];for(const t of e)n(t)}}});return[{name:"datadog-bundler-report-plugin",enforce:"pre",esbuild:{setup(t){e.bundler.rawConfig=t.initialOptions,t.initialOptions.outdir&&(e.bundler.outDir=t.initialOptions.outdir),t.initialOptions.outfile&&(e.bundler.outDir=s.dirname(t.initialOptions.outfile)),t.initialOptions.absWorkingDir&&(e.cwd=t.initialOptions.absWorkingDir),t.initialOptions.metafile=!0}},webpack:Je(e),rspack:Je(e),vite:{...o(),config(n){n.root?e.cwd=n.root:e.cwd=Ge(t,e.bundler.outDir)||e.cwd}},rollup:o()}]};class Ye{constructor(e){this.trackedFilenames=new Map;for(const t of e){const e=this.getFilename(t),n=this.trackedFilenames.get(e);n?n.push(t):this.trackedFilenames.set(e,new Array(t))}}displaySource(e){return e.length<=40?e:`[...]${e.slice(-35)}`}matchSourcemap(e,t){const n=i.readFileSync(e,"utf8"),s=JSON.parse(n);if(!s.sources)return void t("Missing 'sources' field in sourcemap.");const o=s.sources;if(0===o.length)return void t("Empty 'sources' field in sourcemap.");const r=this.matchSources(o);if(0!==r.length)return r;t(`${o.map(this.displaySource).join(", ")} not in the tracked files.`)}matchSources(e){let t=[];const n=new Set;for(const s of e){const e=this.getFilename(s);if(n.has(e))continue;n.add(e);const o=this.trackedFilenames.get(e);o&&(t=t.concat(o))}return t}rawTrackedFilesList(){let e=[];return this.trackedFilenames.forEach((t=>{e=e.concat(t)})),e}getFilename(e){let t=e.lastIndexOf("/");-1===t?t=0:t++;let n=e.lastIndexOf("?");return(-1===n||n<=t)&&(n=e.length),e.substring(t,n)}}const Qe=async e=>{const t=await e.getRemotes(!0);if(0===t.length)throw new Error("No git remotes available");const n=await Xe(e);for(const e of t)if(e.name===n)return Ze(e.refs.push);return Ze(t[0].refs.push)},Xe=async e=>{try{return(await e.getConfig("clone.defaultRemoteName"))?.value??"origin"}catch(e){return"origin"}},Ze=e=>{try{const t=new h.URL(e);return t.username="",t.password="",t.toString()}catch{return e}},et=async e=>e.revparse("HEAD"),tt=async e=>(await e.raw("ls-files")).split(/\r\n|\r|\n/),nt="datadog-git-plugin",st=(e,t)=>{const n=t.getLogger(nt);return[{name:nt,enforce:"pre",async buildStart(){if(e.errorTracking?.sourcemaps&&!0!==e.errorTracking?.sourcemaps.disableGit&&!0!==e.disableGit)try{const e=await(async e=>{let t,n,s;return[t,n,s]=await Promise.all([Qe(e),et(e),tt(e)]),{hash:n,remote:t,trackedFilesMatcher:new Ye(s)}})(await(async e=>{const t={baseDir:e||process.cwd(),binary:"git",maxConcurrentProcesses:3};try{const e=m.simpleGit(t),n=await e.revparse("--show-toplevel");t.baseDir=n}catch{}return m.simpleGit(t)})(t.cwd));t.git=e}catch(e){n.error(`Could not get git information: ${e.message}`)}}}]},ot="datadog-injection-plugin",rt=/^https?:\/\//,it=async(e,t,n=process.cwd())=>{let s;const o=await(async e=>"function"==typeof e.value?e.value():e.value)(e);try{if("file"===e.type)s=o.match(rt)?await(async(e,t=5e3)=>{let n;return Promise.race([T({retries:2,minTimeout:100,url:e}).finally((()=>{t&&clearTimeout(n)})),new Promise(((e,s)=>{n=setTimeout((()=>{s(new Error("Timeout"))}),t)}))])})(o):await(async(e,t=process.cwd())=>{const n=A(t,e);return r.readFile(n,{encoding:"utf-8"})})(o,n);else{if("code"!==e.type)throw new Error(`Invalid item type "${e.type}", only accepts "code" or "file".`);s=o}}catch(n){const r=`${e.type} - ${O(o)}`;e.fallback?(t.info(`Fallback for "${r}": ${n.toString()}`),s=await it(e.fallback,t)):(t.warn(`Failed "${r}": ${n.toString()}`),s="")}return s},at=e=>{if(0===e.size)return"";return`// begin injection by Datadog build plugins\n${Array.from(e.values()).map((e=>`(() => {${e}})();`)).join("\n\n")}\n// end injection by Datadog build plugins`},ut=async(e,t,n,s=process.cwd())=>{const o=await(async(e,t,n=process.cwd())=>{const s=new Map;for(const[o,r]of e.entries()){const e=await it(r,t,n);e&&s.set(o,{value:e,position:r.position||X.BEFORE})}return s})(t,e,s);for(const[e,t]of o.entries())n[t.position].set(e,t.value)},pt=i.promises,ct=(e,t,n)=>({setup(o){const{onStart:r,onResolve:a,onLoad:u,onEnd:p,esbuild:c,initialOptions:l}=o,d=[],f=`${I()}.${X.MIDDLE}.${b}.js`,m=i.realpathSync(g.tmpdir()),h=s.resolve(m,f),w=new RegExp(`${f}$`),y=l.inject;l.inject=y?[...y]:[],l.inject.push(h),r((async()=>{d.push(...await P(o,t,e)),o.initialOptions.inject=y;try{await z(h,"")}catch(t){e.error(`Could not create the files: ${t.message}`)}})),a({filter:w},(async e=>({path:e.path,namespace:ot}))),u({filter:w,namespace:ot},(async()=>({contents:at(n[X.MIDDLE])||" ",resolveDir:t.cwd,loader:"js"}))),p((async s=>{if(!s.metafile)return void e.warn("Missing metafile from build result.");const o=at(n[X.BEFORE]),r=at(n[X.AFTER]);if(!o&&!r)return;const i=Object.entries(s.metafile.outputs).map((([e,n])=>{const s=n.entryPoint;if(!s)return;return d.find((e=>e.resolved.endsWith(s)))?A(t.cwd,e):void 0})).filter(Boolean).map((async e=>{const t=await pt.readFile(e,"utf-8"),n=await c.transform(t,{loader:"default",banner:o,footer:r});await pt.writeFile(e,n.code)}));await Promise.all(i)}))}}),lt=b,dt="?inject-proxy",ft=e=>({banner:t=>t.isEntry?at(e[X.BEFORE]):"",async resolveId(t,n,s){if(x(t))return{id:t,moduleSideEffects:!0};if(s.isEntry&&at(e[X.MIDDLE])){const e=await this.resolve(t,n,s);if(!e||e.external)return e;return(await this.load(e)).moduleSideEffects=!0,`${e.id}${dt}`}return null},load(t){if(x(t))return at(e[X.MIDDLE]);if(t.endsWith(dt)){const e=t.slice(0,-13),n=this.getModuleInfo(e);let s=`import ${JSON.stringify(lt)};\nexport * from ${JSON.stringify(e)};`;return n?.hasDefaultExport&&(s+=`export { default } from ${JSON.stringify(e)};`),s}return null},footer:t=>t.isEntry?at(e[X.AFTER]):""}),mt=(e,t,n,o,r)=>a=>{const u=new WeakMap,p=(e=>{if(!e?.sources?.ConcatSource)return w.createRequire(require.resolve("webpack"))("webpack-sources").ConcatSource;return e.sources.ConcatSource})(e),c=s.resolve(n.bundler.outDir,`${I()}.${X.MIDDLE}.${b}.js`);N(c,"");const l=()=>{(async e=>{i.rmSync(e,{force:!0,maxRetries:3,recursive:!0})})(c)};a.hooks.shutdown?a.hooks.shutdown.tap(ot,l):(a.hooks.done.tap(ot,l),a.hooks.failed.tap(ot,l));a.hooks.beforeRun.tapPromise(ot,(async()=>{await ut(t,o,r,n.cwd)})),a.hooks.compilation.tap(ot,(t=>{const n=()=>{const e=at(r[X.BEFORE]),n=at(r[X.AFTER]);for(const s of t.chunks)if(s.canBeInitial())for(const o of s.files)t.updateAsset(o,(t=>{const s=u.get(t);if(!s||s.banner!==e||s.footer!==n){const s=new p(e,"\n",t,"\n",n);return u.set(t,{source:s,banner:e,footer:n}),s}return s.source}))};if(t.hooks.processAssets){const s=e.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS;t.hooks.processAssets.tap({name:ot,stage:s},n)}else t.hooks.optimizeChunkAssets.tap({name:ot},n)}));const d=(e=>{const s="webpack4"===n.bundler.fullName?c:{import:[c]},o=e=>{for(const[n,s]of Object.entries(e))"object"==typeof s?(s.import=s.import||[],s.import.unshift(c)):"string"==typeof s?e[n]=[c,s]:Array.isArray(s)?s.unshift(c):t.error("Invalid entry type: "+typeof s)};return e?"function"==typeof e?async()=>{const t=await e();return o(t),t}:"object"!=typeof e?"string"==typeof e?[s,e]:(t.error("Invalid entry type: "+typeof e),e):(o(e),e):{ddHelper:s}})(a.options.entry);a.options.entry=d},ht=(e,t)=>{const n=t.getLogger(ot),s=new Map,o={[X.BEFORE]:new Map,[X.MIDDLE]:new Map,[X.AFTER]:new Map};t.inject=e=>{s.set(I(),e)};const r={name:ot,enforce:"post",esbuild:ct(n,t,o),webpack:mt(e,n,t,s,o),rspack:mt(e,n,t,s,o),rollup:ft(o),vite:{...ft(o),enforce:"pre"}};var i;return i=t.bundler.fullName,["rspack","webpack4","webpack5","webpack"].includes(i)?(r.loadInclude=e=>!!x(e)||null,r.load=e=>x(e)?{code:at(o[X.MIDDLE])}:null):r.buildStart=async()=>{await ut(n,s,o,t.cwd)},[r]},gt={[re]:Oe},wt="datadog-build-plugins";var yt="2.5.1-dev-8";const bt=(({bundler:n,version:s})=>e.createUnplugin(((e,o)=>{const r=((e={})=>({auth:{},disableGit:!1,logLevel:"warn",...e}))(e);"esbuild"===o.framework&&(o.esbuildHostName=wt);const i=(({options:e,bundlerName:t,bundlerVersion:n,version:s})=>{const o=process.cwd(),r="webpack"===t?n.split(".")[0]:"",i={errors:[],warnings:[],logs:[],bundler:{name:t,fullName:`${t}${r}`,variant:r,version:n}},a=process.env.BUILD_PLUGINS_ENV||"production",u=v.includes(a)?a:"development";return{auth:e.auth,pluginNames:[],bundler:{...i.bundler,outDir:o},build:i,cwd:o,env:u,getLogger:k(i,e.logLevel),inject:()=>{throw new Error("Inject function called before it was initialized.")},sendLog:()=>{throw new Error("SendLog function called before it was initialized.")},start:Date.now(),version:s}})({options:r,bundlerVersion:n.version||n.VERSION,bundlerName:o.framework,version:s});i.pluginNames.push(wt);const a=[...Ne(i),...Ue(i),...Ve(i),...st(r,i),...ht(n,i)];if(r.customPlugins){const e=r.customPlugins(r,i);a.push(...e)}r[S]&&!0!==r[S].disabled&&a.push(...Q(r,i)),r[Z]&&!0!==r[Z].disabled&&a.push(...oe(r,i)),r[re]&&!0!==r[re].disabled&&a.push(...xe(r,i)),i.pluginNames.push(...a.map((e=>e.name)));const u=new Set(i.pluginNames.filter((e=>i.pluginNames.filter((t=>t===e)).length>1)));if(u.size>0)throw new Error(`Duplicate plugin names: ${t.bold.red(Array.from(u).join(", "))}`);return a})))({bundler:y,version:yt}).esbuild,vt=yt,$t=gt;exports.datadogEsbuildPlugin=bt,exports.helpers=$t,exports.version=vt;
1
+ "use strict";var e=require("unplugin"),t=require("chalk"),n=require("fs/promises"),s=require("fs"),o=require("path"),i=require("outdent"),r=require("async-retry"),a=require("buffer"),u=require("p-queue"),p=require("stream"),c=require("zlib"),l=require("pretty-bytes"),d=require("perf_hooks"),m=require("glob"),f=require("simple-git"),h=require("url"),g=require("os"),w=require("module"),y=require("esbuild");const b="__datadog-helper-file",v=["development","production","test"],$="datadog-build-plugins",k=async(e,t)=>{await(async e=>n.mkdir(e,{recursive:!0}))(o.dirname(e)),await n.writeFile(e,t,{encoding:"utf-8"})},S=(e,t)=>{var n;n=o.dirname(e),s.mkdirSync(n,{recursive:!0}),s.writeFileSync(e,t,{encoding:"utf-8"})},D=e=>e.replace(/^@dd\/(datadog-|internal-)?|^datadog-|-plugin$/g,""),E=e=>e.includes(b),P=e=>{const t=Math.floor(e/1e3/60/60/24),n=new Date(e-24*t*60*60*1e3),s=n.getUTCHours(),o=n.getUTCMinutes(),i=n.getUTCSeconds(),r=n.getUTCMilliseconds(),a=`${t?`${t}d `:""}${s?`${s}h `:""}${o?`${o}m `:""}${i?`${i}s`:""}`.trim();return`${a}${!a||r?` ${r}ms`:""}`.trim()},M=(e,t=60,n="[...]")=>{if(e.length<=t)return e;const s=Math.max(4,t-n.length),o=Math.min(10,Math.floor(s/2)),i=s-o;return`${e.slice(0,o)}${n}${e.slice(-i)}`};let x=0;const j=()=>`${Date.now()}.${performance.now()}.${++x}`,T={debug:0,info:1,warn:2,error:3,none:4},z=(e,n="warn")=>s=>{const o=(e=>e.split(">").map(D).join(">"))(s),i=(s,i="debug")=>{let r=t.dim,a=console.log;"error"===i?(r=t.red,a=console.error):"warn"===i?(r=t.yellow,a=console.warn):"info"===i&&(r=t.cyan,a=console.log);const u=`[${i}|${e.bundler.fullName}|${o}]`,p="string"==typeof s?s:JSON.stringify(s,null,2);e.logs.push({bundler:e.bundler.fullName,pluginName:o,type:i,message:p,time:Date.now()}),"error"===i&&e.errors.push(p),"warn"===i&&e.warnings.push(p),T[i]>=T[n]&&a(`${r(u)} ${p}`)};return{getLogger:t=>z(e,n)(`${o}>${t}`),time:(n,s={})=>{const{level:r="debug",start:a=!0,log:u=!0,tags:p=[]}=s,c={pluginName:o,label:n,spans:[],tags:p,logLevel:r,total:0};e.timings.push(c);const l=()=>c.spans.filter((e=>!e.end)),d=()=>{!c.spans.length&&u&&i(t.dim(`[${t.cyan(n)}] : start`),"debug"),c.spans.push({start:Date.now()})},m=()=>{const e=l();if(e?.length){e.length>1&&i(`Timer ${t.cyan(n)} has more than one ongoing span.`,"debug");for(const t of e)t.end=Date.now()}else i(`Timer ${t.cyan(n)} cannot be paused, no ongoing span.`,"debug")};a&&d();return{timer:c,resume:d,end:()=>{m();const e=c.spans.reduce(((e,t)=>e+(t.end-t.start)),0);c.total=e,u&&i(`[${t.cyan(n)}] : ${t.cyan(P(e))}`,r)},pause:m,tag:(e,t={})=>{const{span:n=!1}=t;if(n){const t=l();for(const n of t)n.tags=n.tags||[],n.tags.push(...e)}else c.tags.push(...e)}}},error:e=>i(e,"error"),warn:e=>i(e,"warn"),info:e=>i(e,"info"),debug:e=>i(e,"debug")}},O=["buildEnd","buildStart","load","loadInclude","resolveId","transform","transformInclude","watchChange","writeBundle","cwd","init","buildReport","bundlerReport","git"],N=(e,t,n,s)=>(...o)=>{const i=s.time(`hook | ${e} | ${t}`,{log:!1}),r=n(...o);return r instanceof Promise?r.finally((()=>{i.end()})):(i.end(),r)},R=(e,t,n)=>{const s=e.getLogger($);return e=>{const o=s.time(`hook | init ${n}`,{log:!1}),i=t(e).map((e=>((e,t)=>{const n={...e};for(const s of O){const o=e[s];o&&(n[s]=N(e.name,s,o,t))}return n})(e,s))),r=i.map((e=>`plugin:${e.name}`));return o.tag(r),o.end(),i}},I="errorTracking",A="datadog-error-tracking-plugin",F=(e,n,s)=>{if(".map"!==o.extname(s))throw new Error(`The file ${t.green.bold(s)} is not a sourcemap.`);const i=s.replace(/\.map$/,""),r=i.replace(n.bundler.outDir,"");return{minifiedFilePath:i,minifiedUrl:e.minifiedPathPrefix?o.join(e.minifiedPathPrefix,r):r,relativePath:r}},C=[400,403,413],L=e=>{const{auth:t,url:n,method:s="GET",getData:o,type:i="text"}=e,a={retries:0===e.retries?0:e.retries||5,onRetry:e.onRetry,maxTimeout:e.maxTimeout,minTimeout:e.minTimeout};return r((async(e,r)=>{let a;try{const e={method:s,duplex:"half"};let i={};if(t?.apiKey&&(i["DD-API-KEY"]=t.apiKey),t?.appKey&&(i["DD-APPLICATION-KEY"]=t.appKey),"function"==typeof o){const{data:t,headers:n}=await o();e.body=t,i={...i,...n}}a=await fetch(n,{...e,headers:i})}catch(t){return e(t),{}}if(!a.ok){const t=`HTTP ${a.status} ${a.statusText}`;if(C.includes(a.status))return e(new Error(t)),{};throw new Error(t)}try{let e;return e="json"===i?await a.json():await a.text(),e}catch(t){return e(t),{}}}),a)},_=/[/]+|[\\]+/g,q=/^[/]+|^[\\]+|[/]+$|[\\]+$/g,H=(e,t)=>{const n=e.replace(q,"").split(_),s=t.replace(q,"").split(_),o=n.join("/");let i="";for(let e=0;e<s.length;e+=1){const t=s.slice(-e).join("/");o.startsWith(t)&&(i=t)}return i},K=async e=>{const t={empty:!1,exists:!0};try{0===(await s.promises.stat(e)).size&&(t.empty=!0)}catch(e){if("ENOENT"!==e.code)throw e;t.exists=!1}return t},W=async(e,t,n,s)=>{const i=await(async(e,t)=>{const[n,s]=await Promise.all([K(e.minifiedFilePath),K(e.sourcemapFilePath)]);return{file:n,sourcemap:s,repeatedPrefix:H(e.relativePath,t)}})(e,n),r=[],a=[],u=new Map([["event",{type:"string",options:{contentType:"application/json",filename:"event"},value:JSON.stringify({...t,minified_url:e.minifiedUrl})}],["source_map",{type:"file",path:e.sourcemapFilePath,options:{filename:"source_map",contentType:"application/json"}}],["minified_file",{type:"file",path:e.minifiedFilePath,options:{filename:"minified_file",contentType:"application/javascript"}}]]);if(s)try{u.set("repository",{type:"string",options:{contentType:"application/json",filename:"repository"},value:JSON.stringify({data:[{files:s.trackedFilesMatcher.matchSourcemap(e.sourcemapFilePath,(t=>{a.push(`${o.basename(e.sourcemapFilePath)}: "${t}"`)})),hash:s.hash,repository_url:s.remote}],version:1})})}catch(t){a.push(`Could not attach git data for sourcemap ${e.sourcemapFilePath}: ${t.message}`)}return i.file.empty&&r.push(`Minified file is empty: ${e.minifiedFilePath}`),i.file.exists||r.push(`Minified file not found: ${e.minifiedFilePath}`),i.sourcemap.empty&&r.push(`Sourcemap file is empty: ${e.sourcemapFilePath}`),i.sourcemap.exists||r.push(`Sourcemap file not found: ${e.sourcemapFilePath}`),i.repeatedPrefix&&a.push(`The minified file path contains a repeated pattern with the minified path prefix: ${i.repeatedPrefix}`),{content:u,errors:r,warnings:a}},B=t.green.bold,U=t.yellow.bold,G=t.red.bold,J=async(e,t)=>{if("function"==typeof s.openAsBlob){const n=await s.openAsBlob(e,{type:t.contentType});return new a.File([n],t.filename)}{const n=p.Readable.toWeb(s.createReadStream(e)),o=await new Response(n).blob();return new a.File([o],t.filename,{type:t.contentType})}},V=(e,t={})=>async()=>{const n=new FormData,s=c.createGzip();for(const[t,s]of e.content){const e="file"===s.type?await J(s.path,s.options):new Blob([s.value],{type:s.options.contentType});n.append(t,e,s.options.filename)}const o=new Request("fake://url",{method:"POST",body:n});return{data:p.Readable.fromWeb(o.body).pipe(s),headers:{"Content-Encoding":"gzip",...t,...Object.fromEntries(o.headers.entries())}}},Y=async(e,t,n,s)=>{const o=Date.now(),i=t.minifiedPathPrefix,r={git_repository_url:n.git?.remote,git_commit_sha:n.git?.hash,plugin_version:n.version,project_path:n.bundler.outDir,service:t.service,type:"js_sourcemap",version:t.releaseVersion},a=await Promise.all(e.map((e=>W(e,r,i,n.git)))),p=a.map((e=>e.errors)).flat(),c=a.map((e=>e.warnings)).flat();if(c.length>0&&s.warn(`Warnings while preparing payloads:\n - ${c.join("\n - ")}`),p.length>0){const e=`Failed to prepare payloads, aborting upload :\n - ${p.join("\n - ")}`;if(s.error(e),!0===t.bailOnError)throw new Error(e);return}const{errors:l,warnings:d}=await(async(e,t,n,s)=>{const o=[],i=[];if(!n.auth?.apiKey)return o.push({error:new Error("No authentication token provided")}),{errors:o,warnings:i};if(0===e.length)return i.push("No sourcemaps to upload"),{errors:o,warnings:i};const r=new(u.default?u.default:u)({concurrency:t.maxConcurrency}),a={"DD-API-KEY":n.auth.apiKey,"DD-EVP-ORIGIN":`${n.bundler.fullName}-build-plugin_sourcemaps`,"DD-EVP-ORIGIN-VERSION":n.version},p=[];for(const u of e){const e={sourcemap:u.content.get("source_map")?.path.replace(n.bundler.outDir,"."),file:u.content.get("minified_file")?.path.replace(n.bundler.outDir,".")};s.debug(`Queuing ${B(e.sourcemap)} | ${B(e.file)}`),p.push(r.add((async()=>{try{await L({url:t.intakeUrl,method:"POST",getData:V(u,a),onRetry:(t,n)=>{const o=`Failed to upload ${U(e.sourcemap)} | ${U(e.file)}:\n ${t.message}\nRetrying ${n}/5`;i.push(o),s.debug(o)}}),s.debug(`Sent ${B(e.sourcemap)} | ${B(e.file)}`)}catch(n){if(o.push({metadata:e,error:n}),!0===t.bailOnError)throw n}})))}return await Promise.all(p),await r.onIdle(),{warnings:i,errors:o}})(a,t,n,s);if(s.info(`Done uploading ${B(e.length.toString())} sourcemaps in ${B(P(Date.now()-o))}.`),l.length>0){const e=`Failed to upload some sourcemaps:\n${` - ${l.map((({metadata:e,error:t})=>e?`${G(e.file)} | ${G(e.sourcemap)} : ${t.message}`:t.message)).join("\n - ")}`}`;if(s.error(e),!0===t.bailOnError)throw new Error(e)}d.length>0&&s.warn(`Warnings while uploading sourcemaps:\n - ${d.join("\n - ")}`)},Q=async(e,n,s)=>{const o=t.green.bold,r=Object.entries(e.sourcemaps).map((([e,t])=>` - ${e}: ${o(t.toString())}`)).join("\n"),a=s.time("get sourcemaps files"),u=((e,t)=>{if(!t.build.outputs||0===t.build.outputs.length)throw new Error("No output files found.");return t.build.outputs.filter((e=>e.filepath.endsWith(".map"))).map((e=>e.filepath)).map((n=>({...F(e,t,n),sourcemapFilePath:n,minifiedPathPrefix:e.minifiedPathPrefix})))})(e.sourcemaps,n);a.end();const p=i.outdent`
2
+ Uploading ${o(u.length.toString())} sourcemaps with configuration:
3
+ ${r}
4
+ `;s.info(p);const c=s.time("send sourcemaps");await Y(u,e.sourcemaps,n,s),c.end()},X=`https://sourcemap-intake.${process.env.DATADOG_SITE||"datadoghq.com"}/api/v2/srcmap`,Z=e=>{const n=t.bold.red,s=e[I]||{},o={errors:[]};if(s.sourcemaps){s.sourcemaps.releaseVersion||o.errors.push(`${n("sourcemaps.releaseVersion")} is required.`),s.sourcemaps.service||o.errors.push(`${n("sourcemaps.service")} is required.`),s.sourcemaps.minifiedPathPrefix||o.errors.push(`${n("sourcemaps.minifiedPathPrefix")} is required.`),s.sourcemaps.minifiedPathPrefix&&((e=>{let t;try{t=new URL(e).host}catch{}return!(!t&&!e.startsWith("/"))})(s.sourcemaps.minifiedPathPrefix)||o.errors.push(`${n("sourcemaps.minifiedPathPrefix")} must be a valid URL or start with '/'.`));const e={bailOnError:!1,disableGit:!1,dryRun:!1,maxConcurrency:20,intakeUrl:process.env.DATADOG_SOURCEMAP_INTAKE_URL||s.sourcemaps.intakeUrl||X,...s.sourcemaps};o.config=e}return o},ee=({options:e,context:t})=>{const n=t.getLogger(A),s=n.time("validate options"),o=((e,t)=>{const n=[],s=Z(e);if(n.push(...s.errors),n.length)throw t.error(`\n - ${n.join("\n - ")}`),new Error(`Invalid configuration for ${A}.`);const o={disabled:!e[I],...e[I],sourcemaps:void 0};return s.config&&(o.sourcemaps=s.config),o})(e,n);return s.end(),o.disabled?[]:[{name:A,enforce:"post",async writeBundle(){if(!o.disabled&&o.sourcemaps){const e=n.time("sourcemaps process");await Q(o,t,n),e.end()}}}]};var te=(e=>(e[e.BEFORE=0]="BEFORE",e[e.MIDDLE=1]="MIDDLE",e[e.AFTER=2]="AFTER",e))(te||{});const ne="rum",se="datadog-rum-plugin",oe=e=>`DD_RUM.init({${JSON.stringify(e.sdk).replace(/(^{|}$)/g,"")}});\n`,ie=(e,t)=>{const n=e.sdk;if(n.clientToken)return oe(e);if(!t.auth?.apiKey||!t.auth?.appKey)throw new Error('Missing "auth.apiKey" and/or "auth.appKey" to fetch "rum.sdk.clientToken".');return async()=>{let s;try{const e=await L({url:`https://api.datadoghq.com/api/v2/rum/applications/${n.applicationId}`,type:"json",auth:t.auth});s=e.data?.attributes?.client_token}catch(e){throw new Error(`Could not fetch the clientToken: ${e.message}`)}if(!s)throw new Error("Missing clientToken in the API response.");return oe({...e,sdk:{clientToken:s,...n}})}},re=e=>{const n=t.bold.red,s=e[ne]||{},o={errors:[]};if(s.sdk){s.sdk.applicationId||o.errors.push(`Missing ${n("applicationId")} in the SDK configuration.`),e.auth?.apiKey&&e.auth?.appKey||s.sdk.clientToken||o.errors.push(`Missing ${n('"auth.apiKey"')} and/or ${n('"auth.appKey"')} to fetch missing client token.`);const t={applicationId:"unknown_application_id",allowUntrustedEvents:!1,compressIntakeRequests:!1,defaultPrivacyLevel:"mask",enablePrivacyForActionName:!1,sessionReplaySampleRate:0,sessionSampleRate:100,silentMultipleInit:!1,site:"datadoghq.com",startSessionReplayRecordingManually:!1,storeContextsAcrossPages:!1,telemetrySampleRate:20,traceSampleRate:100,trackingConsent:"granted",trackLongTasks:!1,trackResources:!1,trackUserInteractions:!1,trackViewsManually:!1};o.config={...t,...s.sdk}}return o},ae=({options:e,context:t})=>{const n=((e,t)=>{const n=[],s=re(e);if(n.push(...s.errors),n.length)throw t.error(`\n - ${n.join("\n - ")}`),new Error(`Invalid configuration for ${se}.`);const o={disabled:!e[ne],...e[ne],sdk:void 0};return s.config&&(o.sdk=s.config),o})(e,t.getLogger(se)),s=[];return n.disabled||n.sdk&&(t.inject({type:"file",position:te.MIDDLE,value:o.join(__dirname,"./rum-browser-sdk.js")}),t.inject({type:"code",position:te.MIDDLE,value:ie(n,t)})),s},ue="telemetry",pe="datadog-telemetry-plugin",ce=[e=>/modules\.tree\.(count|size)$/.test(e.metric)?null:e,e=>e.tags.some((e=>/^assetName:.*\.map$/.test(e)||/^moduleName:\/node_modules/.test(e)))?null:e,e=>{const t={size:1e5,count:10,duration:1e3};return/(entries|loaders|warnings|errors)\.count$/.test(e.metric)&&(t.count=0),/(modules\.(dependencies|dependents)$)/.test(e.metric)&&(t.count=30),/modules\.tree\.count$/.test(e.metric)&&(t.count=150),/modules\.tree\.size$/.test(e.metric)&&(t.size=15e5),/entries\.size$/.test(e.metric)&&(t.size=0),/entries\.modules\.count$/.test(e.metric)&&(t.count=0),e.value>t[e.type]?e:null}],le=(e,t)=>({type:"gauge",tags:[...e.tags,...t.tags],metric:`${t.prefix?`${t.prefix}.`:""}${e.metric}`,points:[[t.timestamp,e.value]]}),de=(e="")=>e.endsWith("/")?e:`${e}/`,me=(e,t)=>{let n=e;return e.split(de(t)),n.split("!").pop().replace(/(.*)?\/node_modules\//,"/node_modules/").replace(/^((\.)*\/)+/,"")},fe=(e,t)=>e.split("!").pop().replace(de(t),"./"),he=(e,t,n)=>{let s=e.name||e.userRequest;return s||(s=((e,t)=>{let n=e.userRequest;if(!n){let s;s=t.moduleGraph&&"function"==typeof t.moduleGraph.getIssuer?t.moduleGraph.getIssuer(e):e.issuer,n=s?.userRequest,n||(n=e._identifier?.split("!").pop())}return n||"unknown"})(e,t)),fe(s||"no-name",n)},ge=e=>e.replace(/^.*\/node_modules\/(@[a-z0-9][\w-.]+\/[a-z0-9][\w-.]*|[^/]+).*$/,"$1"),we=e=>e.map((e=>({type:e?.constructor?.name??typeof e,name:e?.name,value:"string"==typeof e?e:void 0}))),ye=(e,t,n,s)=>{const o=new Set;if(s){const{timings:e}=s;e&&(e.tapables&&((e,t)=>{t.add({metric:"plugins.count",type:"count",value:e.size,tags:[]});for(const n of e.values()){let e=0,s=0;for(const o of Object.values(n.events)){let i=0;s+=o.values.length;for(const t of o.values){const n=t.end-t.start;i+=n,e+=n}t.add({metric:"plugins.hooks.duration",type:"duration",value:i,tags:[`pluginName:${n.name}`,`hookName:${o.name}`]}).add({metric:"plugins.hooks.increment",type:"count",value:o.values.length,tags:[`pluginName:${n.name}`,`hookName:${o.name}`]})}t.add({metric:"plugins.duration",type:"duration",value:e,tags:[`pluginName:${n.name}`]}).add({metric:"plugins.increment",type:"count",value:s,tags:[`pluginName:${n.name}`]})}})(e.tapables,o),e.loaders&&((e,t)=>{t.add({metric:"loaders.count",type:"count",value:e.size,tags:[]});for(const n of e.values())t.add({metric:"loaders.duration",type:"duration",value:n.duration,tags:[`loaderName:${n.name}`]}).add({metric:"loaders.increment",type:"count",value:n.increment,tags:[`loaderName:${n.name}`]})})(e.loaders,o))}((e,t)=>{const n=e.build.inputs||[],s=e.build.outputs||[],o=e.build.entries||[],i=e.build.warnings.length,r=e.build.errors.length,a=e.build.duration,u=new Map,p=new Map,c=new Map;for(const e of o){for(const t of e.inputs)u.has(t.filepath)||u.set(t.filepath,[]),u.get(t.filepath).push(e.name);for(const t of e.outputs){const n=t.filepath.replace(/\.map$/,"");c.has(n)||c.set(n,[]),c.get(n).push(e.name)}}for(const e of s)for(const t of e.inputs)p.has(t.filepath)||p.set(t.filepath,[]),p.get(t.filepath).push(e.name);t.add({metric:"assets.count",type:"count",value:s.length,tags:[]}).add({metric:"entries.count",type:"count",value:o.length,tags:[]}).add({metric:"errors.count",type:"count",value:r,tags:[]}).add({metric:"modules.count",type:"count",value:n.length,tags:[]}).add({metric:"warnings.count",type:"count",value:i,tags:[]}),a&&t.add({metric:"compilation.duration",type:"duration",value:a,tags:[]});for(const e of n){const n=[`moduleName:${e.name}`,`moduleType:${e.type}`];u.has(e.filepath)&&n.push(...u.get(e.filepath).map((e=>`entryName:${e}`))),p.has(e.filepath)&&n.push(...p.get(e.filepath).map((e=>`assetName:${e}`))),t.add({metric:"modules.size",type:"size",value:e.size,tags:n}).add({metric:"modules.dependencies",type:"count",value:e.dependencies.size,tags:n}).add({metric:"modules.dependents",type:"count",value:e.dependents.size,tags:n})}for(const e of s){const n=[`assetName:${e.name}`,`assetType:${e.type}`],s=e.filepath.replace(/\.map$/,"");c.has(s)&&n.push(...c.get(s).map((e=>`entryName:${e}`))),t.add({metric:"assets.size",type:"size",value:e.size,tags:n}).add({metric:"assets.modules.count",type:"count",value:e.inputs.length,tags:n})}for(const e of o){const n=[`entryName:${e.name}`];t.add({metric:"entries.size",type:"size",value:e.size,tags:n}).add({metric:"entries.modules.count",type:"count",value:e.inputs.length,tags:n}).add({metric:"entries.assets.count",type:"count",value:e.outputs.length,tags:n})}})(e,o);for(const e of o)if(t.filters?.length){let s=e;for(const n of t.filters){if(!s)break;s=n(e)}s&&n.add(le(s,t))}else n.add(le(e,t))},be=async(e,t,n,s)=>{if("string"!=typeof t&&"object"!=typeof t&&!t)return;const{report:i,metrics:r}=e,a=Date.now();let u="";const p={timings:!0,metrics:!0};"object"==typeof t?(u=t.destination,p.timings=t.timings||!1,p.metrics=t.metrics||!1):"string"==typeof t&&(u=t);const c=o.resolve(s,u);try{const e={},t={};p.timings&&i?.timings&&(t.timings={content:{tapables:i.timings.tapables?Array.from(i.timings.tapables.values()):null,loaders:i.timings.loaders?Array.from(i.timings.loaders.values()):null,modules:i.timings.modules?Array.from(i.timings.modules.values()):null}}),p.metrics&&(t.metrics={content:Array.from(r)});const s=Object.entries(t).map((async([t,s])=>{const i=Date.now();n.debug(`Start writing ${t}.json.`);try{await(async(e,t)=>{const n=JSON.stringify(t,null,4);return k(e,n)})(o.join(c,`${t}.json`),s.content),n.debug(`Wrote ${t}.json in ${P(Date.now()-i)}`)}catch(s){n.error(`Failed to write ${t}.json in ${P(Date.now()-i)}`),e[t]=s}}));await Promise.all(s),n.debug(`Wrote files in ${P(Date.now()-a)}.`);const u=Object.keys(e);u.length&&n.error(`Couldn't write files.\n${u.map((t=>` - ${t}: ${e[t].toString()}`))}`)}catch(e){n.error(`Couldn't write files. ${e}`)}},ve=t.bold.red,$e=t.bold.cyan,ke=e=>(t,n)=>{let s,o;return"function"==typeof e?(s=e(t),o=e(n)):(s=t[e],o=n[e]),s>o?-1:s<o?1:0},Se=(e,t)=>{if(!t||!t.size)return[];const n=Array.from(t.values());n.sort(ke("duration"));const s={name:`${e} duration`,values:n.map((e=>({name:e.name,value:P(e.duration)}))),top:!0};n.sort(ke("increment"));return[s,{name:`${e} hits`,values:n.map((e=>({name:e.name,value:e.increment.toString()}))),top:!0}]},De=(e,t,n)=>{const s=[];var o;n&&(s.push(...Se("Loader",n.timings.loaders)),s.push(...Se("Tapable",n.timings.tapables)),s.push(...Se("Module",n.timings.modules))),s.push(...(e=>{const t={name:"Module total dependents",values:[],top:!0},n={name:"Module total dependencies",values:[],top:!0},s={name:"Module size",values:[],top:!0},o={name:"Module aggregated size",values:[],top:!0},i=new Set,r=(e=>{const t={bundler:e.bundler,errors:e.errors,warnings:e.warnings,logs:e.logs,timings:e.timings,start:e.start,end:e.end,duration:e.duration,writeDuration:e.writeDuration,entries:[],inputs:[],outputs:[]};for(const n of e.entries||[]){const e={...n,inputs:[],outputs:[]};n.inputs&&(e.inputs=n.inputs.map((e=>e.filepath))),n.outputs&&(e.outputs=n.outputs.map((e=>e.filepath))),t.entries.push(e)}for(const n of e.inputs||[]){const e={...n,dependencies:[],dependents:[]};if(n.dependencies)for(const t of n.dependencies)e.dependencies.push(t.filepath);if(n.dependents)for(const t of n.dependents)e.dependents.push(t.filepath);t.inputs.push(e)}for(const n of e.outputs||[]){const e={...n,inputs:[]};n.inputs&&(e.inputs=n.inputs.map((e=>e.filepath))),t.outputs.push(e)}return t})(e.build),a=new Map,u=new Map,p=new Map;for(const e of r.inputs||[]){if("map"===e.type)continue;const t=new Set(e.dependencies),n=new Set(e.dependents);for(const n of t)p.has(n)||p.set(n,new Set),p.get(n).add(e.filepath);for(const t of n)u.has(t)||u.set(t,new Set),u.get(t).add(e.filepath);if(u.has(e.filepath)){const n=u.get(e.filepath);for(const e of n)t.add(e)}if(p.has(e.filepath)){const t=p.get(e.filepath);for(const e of t)n.add(e)}u.set(e.filepath,t),p.set(e.filepath,n),a.set(e.filepath,{name:e.name,size:e.size,dependencies:t,dependents:n})}for(const[e,t]of a){const n=u.get(e)||new Set,s=p.get(e)||new Set;let o=t.size;for(const e of n)o+=a.get(e)?.size||0;i.add({name:t.name,size:t.size,aggregatedSize:o,dependents:s,dependencies:n})}if(!i.size)return[t,n,s];const c=Array.from(i);return c.sort(ke((e=>e.dependents.size))),t.values=c.map((e=>({name:e.name,value:e.dependents.size.toString()}))),c.sort(ke((e=>e.dependencies.size))),n.values=c.map((e=>({name:e.name,value:e.dependencies.size.toString()}))),c.sort(ke("size")),s.values=c.map((e=>({name:e.name,value:l(e.size)}))),c.sort(ke("aggregatedSize")),o.values=c.map((e=>({name:e.name,value:l(e.aggregatedSize||e.size)}))),[t,n,s,o]})(e)),s.push(...(o=e,[{name:"Asset size",values:(o.build.outputs||[]).filter((e=>"map"!==e.type)).sort(ke((e=>e.size))).map((e=>({name:e.name,value:l(e.size)}))),top:!0},{name:"Entry aggregated size",values:(o.build.entries||[]).sort(ke((e=>e.size))).map((e=>({name:e.name,value:l(e.size)}))),top:!0},{name:"Entry number of modules",values:(o.build.entries||[]).sort(ke((e=>e.size))).map((e=>({name:e.name,value:e.inputs.length.toString()})))||[],top:!0}])),s.push(...(e=>{const t={name:"General Numbers",values:[],top:!1},n=e.build.inputs?e.build.inputs.length:0,s=e.build.outputs?e.build.outputs.length:0,o=e.build.warnings.length,i=e.build.errors.length,r=e.build.entries?e.build.entries.length:0;return e.build.start&&t.values.push({name:"Overhead duration",value:P(e.build.start-e.start)}),e.build.duration&&t.values.push({name:"Build duration",value:P(e.build.duration)}),e.build.writeDuration&&t.values.push({name:"Write duration",value:P(e.build.writeDuration)}),t.values.push({name:"Number of modules",value:n.toString()},{name:"Number of assets",value:s.toString()},{name:"Number of entries",value:r.toString()},{name:"Number of warnings",value:o.toString()},{name:"Number of errors",value:i.toString()}),[t]})(e));const i=(e=>{let t="";for(const t of e){t.top&&t.values.length>=5&&(t.values=t.values.slice(0,5),t.name=`Top 5 ${t.name}`);for(const e of t.values)e.name=M(e.name,60)}const n=Math.max(...e.map((e=>e.name.length))),s=Math.max(...e.flatMap((e=>e.values.map((e=>e.name.length))))),o=Math.max(...e.flatMap((e=>e.values.map((e=>e.value.length))))),i=Math.max(n+4,s+o+4);for(const n of e){if(0===n.values.length)continue;const e=i-(n.name.length+4);t+=`\n== ${n.name} ${"=".repeat(e)}=\n`;for(const e of n.values){const n=o-e.value.length;t+=` [${ve(e.value)}] ${" ".repeat(n)}${$e(e.name)}\n`}}return t})(s);t.info(i)},Ee=["onStart","onLoad","onResolve","onEnd"],Pe=new Map,Me=new Map,xe=(e,t,n)=>{const s=Object.assign({},e);for(const o of Ee)s[o]=async(s,i)=>{const r=Pe.get(t)||{name:t,increment:0,duration:0,events:{}};r.events[o]=r.events[o]||{name:o,values:[]};return(0,e[o])(s,(async(...e)=>{const s=fe(e[0].path,n),a=Me.get(s)||{name:s,increment:0,duration:0,events:{}};a.events[o]=a.events[o]||{name:o,values:[]};const u=d.performance.now();try{return await i(...e)}finally{const n=d.performance.now(),i=n-u,p={start:u,end:n,duration:i,context:we(e)};r.events[o].values.push(p),r.duration+=i,r.increment+=1,Pe.set(t,r),a.events[o].values.push(p),a.duration+=i,a.increment+=1,Me.set(s,a)}}))};return s},je=(e,t,n)=>({setup:s=>{t.build.start=Date.now(),s.initialOptions.metafile=!0;const o=n.time("wrapping plugins");((e,t)=>{const n=e.initialOptions.plugins;if(n){const e=n.map((e=>({...e})));for(const s of n){if(s.name.includes(pe))continue;const n=s.setup;s.setup=async o=>{const i=xe(o,s.name,t);await n({...i,initialOptions:{...i.initialOptions,plugins:e}})}}}})(s,t.cwd),o.end(),s.onEnd((async t=>{if(!t.metafile)return void n.warn("Missing metafile, can't proceed with modules data.");const s=n.time("getting plugins results"),{plugins:o,modules:i}={plugins:Pe,modules:Me};s.end(),e.report={timings:{tapables:o,modules:i}}}))}});class Te{constructor(e){this.started={},this.finished=[],this.cwd=e}startModule(e,t){const n=he(e,t,this.cwd),s=(e=>(e.loaders||[]).map((e=>e.loader||e)).map(ge))(e);s.length||s.push("no-loader"),this.started[n]={module:me(n),timings:{start:d.performance.now(),duration:0,end:0},loaders:s}}doneModule(e,t){const n=he(e,t,this.cwd),s=this.started[n];s&&(s.timings.end=d.performance.now(),s.timings.duration=s.timings.end-s.timings.start,this.finished.push(s),delete this.started[n])}getResults(){const e=new Map,t=new Map;for(const n of this.finished){const s=n.timings.end-n.timings.start,o=t.get(n.module)||{name:n.module,increment:0,duration:0,events:{}},i=n.loaders.join(",");o.events[i]=o.events[i]||{name:i,values:[]},o.events[i].values.push(n.timings),o.increment+=1,o.duration+=s,t.set(n.module,o);for(const t of n.loaders){const n=e.get(t)||{name:t,increment:0,duration:0,events:{}};n.increment+=1,n.duration+=s,e.set(t,n)}}return{loaders:e,modules:t}}}class ze{constructor(e){this.monitoredTaps={},this.tapables=[],this.hooks={},this.timings=new Map,this.ignoredHooks=["normalModuleLoader"],this.cwd=e}saveResult(e,t,n,s,o,i){const r=this.timings.get(t)||{name:t,duration:0,increment:0,events:{}};r.events[n]||(r.events[n]={name:n,values:[]}),r.events[n].values.push({start:o,end:i,duration:i-o,context:s,type:e}),r.duration+=i-o,r.increment+=1,this.timings.set(t,r)}getResults(){const e=this.timings;for(const[t,n]of this.timings){const s=n;s.duration=Object.values(n.events).map((e=>e.values.reduce(((e,t)=>e+t.end-t.start),0))).reduce(((e,t)=>e+t),0),e.set(t,s)}return{monitoredTaps:this.monitoredTaps,tapables:this.tapables,hooks:this.hooks,timings:e}}getPromiseTapPatch(e,t,n,s){return(...o)=>{this.checkNewHooks();const i=d.performance.now(),r=t.apply(this,o),a=()=>{this.saveResult(e,n,s,we(o),i,d.performance.now())};return r.then(a,a),r}}getAsyncTapPatch(e,t,n,s){return(...o)=>{this.checkNewHooks();const i=d.performance.now(),r=o.pop();return t.apply(this,[...o,(...t)=>(this.saveResult(e,n,s,we(o),i,d.performance.now()),r(...t))])}}getDefaultTapPatch(e,t,n,s){return(...o)=>{this.checkNewHooks();const i=d.performance.now(),r=t.apply(this,o);return this.saveResult(e,n,s,we(o),i,d.performance.now()),r}}getTapPatch(e,t,n,s){switch(e){case"promise":return this.getPromiseTapPatch(e,t,n,s);case"async":return this.getAsyncTapPatch(e,t,n,s);default:return this.getDefaultTapPatch(e,t,n,s)}}newTap(e,t,n,s){return(o,i)=>{const r="string"==typeof(a=o)?a:a.name;var a;const u=`${t}-${r}`;if(this.monitoredTaps[u])return n.call(s,o,i);this.monitoredTaps[u]=!0;const p=this.getTapPatch(e,i,r,t);return n.call(s,o,p)}}replaceTaps(e,t){t.tap=this.newTap("default",e,t.tap,t),t.tapAsync=this.newTap("async",e,t.tapAsync,t),t.tapPromise=this.newTap("promise",e,t.tapPromise,t)}patchHook(e,t,n){n._fakeHook||e.includes(pe)||(this.hooks[e]||(this.hooks[e]=[]),this.hooks[e].includes(t)||(this.hooks[e].push(t),this.replaceTaps(t,n)))}patchHooks(e){const t=e.constructor.name,n=Object.keys(e.hooks).filter((e=>!this.ignoredHooks.includes(e)&&!this.hooks[t]?.includes(e)));for(const s of n)this.patchHook(t,s,e.hooks[s])}checkNewHooks(){for(const e of this.tapables)this.patchHooks(e)}throughHooks(e){this.tapables.includes(e)||this.tapables.push(e),this.patchHooks(e)}}const Oe=(e,t)=>async n=>{const s=t.getLogger(pe);t.build.start=Date.now();const o={name:pe},i=new ze(t.cwd),r=new Te(t.cwd),a=s.time("parse compiler hooks");i.throughHooks(n),a.end(),n.hooks.thisCompilation.tap(o,(e=>{const t=s.time("parse compilation hooks");i.throughHooks(e),t.end(),e.hooks.buildModule.tap(o,(t=>{r.startModule(t,e)})),e.hooks.succeedModule.tap(o,(t=>{r.doneModule(t,e)})),e.hooks.failedModule&&e.hooks.failedModule.tap(o,(t=>{r.doneModule(t,e)}))})),n.hooks.afterEmit.tapPromise(o,(async t=>{const{timings:n}=i.getResults(),{loaders:s,modules:o}=r.getResults();e.report={timings:{tapables:n,loaders:s,modules:o}}}))},Ne={filters:ce},Re=({options:e,context:t})=>{const n=t.getLogger(pe);let s=0;const o={start:Date.now()},i=(e=>{const t=e[ue]?.endPoint||"https://app.datadoghq.com";return{disabled:!e[ue],enableTracing:!1,filters:ce,output:!1,prefix:"",tags:[],...e[ue],endPoint:t.startsWith("http")?t:`https://${t}`}})(e),r=[];if(i.disabled)return r;const a={name:pe,enforce:"pre",esbuild:je(o,t,n),webpack:Oe(o,t),rspack:Oe(o,t)},u=n.time("build",{start:!1}),p={name:"datadog-universal-telemetry-plugin",enforce:"post",buildStart(){u.resume(),t.build.start=t.build.start||Date.now()},buildEnd(){u.end(),s=Date.now()},async writeBundle(){t.build.end=Date.now(),t.build.duration=t.build.end-t.build.start,t.build.writeDuration=t.build.end-s;const e=new Set,r=(e=>({timestamp:Math.floor((e.timestamp||Date.now())/1e3),tags:e.tags,prefix:e.prefix,filters:e.filters}))(i),a=n.time("aggregating metrics");ye(t,r,e,o.report),a.end();const u=n.time("writing to files");await be({report:o.report,metrics:e},i.output,n,t.bundler.outDir),u.end();const p=n.time("outputing report");De(t,n,o.report),p.end();const c=n.time("sending metrics to Datadog");await((e,t,n)=>{if(!t.apiKey)return void n.info("Won't send metrics to Datadog: missing API Key.");if(!e.size)return void n.info("No metrics to send.");const s=new Map;for(const t of e)s.has(t.metric)||s.set(t.metric,0),s.set(t.metric,s.get(t.metric)+1);const o=Array.from(s.entries()).map((([e,t])=>`${e} - ${t}`));return n.debug(`\nSending ${e.size} metrics.\nMetrics:\n - ${o.join("\n - ")}`),L({method:"POST",url:`${t.endPoint}/api/v1/series?api_key=${t.apiKey}`,getData:()=>({data:JSON.stringify({series:Array.from(e)})})}).catch((e=>{n.error(`Error sending metrics ${e}`)}))})(e,{apiKey:t.auth?.apiKey,endPoint:i.endPoint},n),c.end()}};return i.enableTracing&&r.push(a),r.push(p),r},Ie="datadog-analytics-plugin",Ae=e=>{const{context:t}=e,n=e.context.getLogger(Ie);return t.sendLog=async(e,s={})=>{if("production"===t.env)try{const n={name:t.bundler.name,version:t.bundler.version};await L({retries:2,minTimeout:100,url:"https://browser-http-intake.logs.datadoghq.com/v1/input/pub44d5f4eb86e1392037b7501f7adc540e",method:"POST",type:"json",getData:async()=>{const o={ddsource:`@datadog/${n.name}-plugin`,env:t.env,message:e,service:"build-plugins",bundler:n,plugins:t.pluginNames,version:t.version,team:"language-foundations",...s};return{data:JSON.stringify(o),headers:{"Content-Type":"application/json"}}}})}catch(e){n.debug(`Could not submit data to Datadog: ${e}`)}},[{name:Ie,async buildStart(){await t.sendLog("Build started")}}]},Fe=async(e,t,n)=>{const s=[],o=e.initialOptions.entryPoints,i=[],r=[];if(Array.isArray(o))for(const e of o){const t=e&&"object"==typeof e?e.in:e;i.push({path:t})}else o&&"object"==typeof o&&i.push(...Object.entries(o).map((([e,t])=>({name:e,path:t}))));const a=i.flatMap((e=>{return(t=e.path,t.includes("*")?m.glob.sync(t):[t]).map((t=>[e,t]));var t})).map((async([n,o])=>{const i=await e.resolve(o,{kind:"entry-point",resolveDir:t.cwd});i.errors.length&&r.push(...i.errors.map((e=>e.text))),i.path&&s.push({name:n.name,resolved:i.path,original:n.path})}));for(const e of r)n.error(e);return await Promise.all(a),s},Ce=(e,t)=>E(t)?b:t.startsWith(e)||o.isAbsolute(t)?t:o.resolve(e,t),Le=/\.(?!.*(?:\.|\/|\\))(\w{1,})/g,_e=/(\?|%3F|\|)+/gi,qe=e=>{return"unknown"===e?e:e.includes("webpack/runtime")?"runtime":(t=We(e),Le.lastIndex=0,Le.exec(t)?.[1]||"unknown");var t},He=["unknown","commonjsHelpers.js","vite/preload-helper.js"],Ke=(e,t,n)=>{const s=new Set;for(const n of e){const e=We(n);E(n)||e===t||He.includes(e)||s.add(e)}return s},We=e=>e.split("!").pop().split(_e).shift().replace(/^[^\w\s.,!@#$%^&*()=+~`\-/]+/,""),Be=(e,t)=>E(t)?b:"unknown"===t?t:t.includes("webpack/runtime")?t.replace("webpack/runtime/","").replace(/ +/g,"-"):t.split("!").pop().replace(Ce(e.cwd,e.bundler.outDir),"").replace(e.cwd,"").split("node_modules").pop().split(_e).shift().replace(/^((\.\.?)?\/)+/,""),Ue=(e,t)=>Object.fromEntries(Object.entries(e).map((([e,n])=>[Ce(t,e),n]))),Ge=(e,t)=>({setup(n){const s=new Map;let i=[];const r=t.time("build report",{start:!1});n.onStart((async()=>{s.clear(),i=[],r.resume();const o=t.time("process entries");i.push(...await Fe(n,e,t));for(const t of i){const n=Be(e,t.resolved);t.name?s.set(n,t.name):s.set(n,n)}o.end(),r.pause()})),n.onEnd((n=>{r.resume();const i=t.time("collecting errors and warnings"),a=e.cwd;for(const t of n.errors)e.build.errors.push(t.text);for(const t of n.warnings)e.build.warnings.push(t.text);if(i.end(),!n.metafile){const n="Missing metafile from build report.";return e.build.warnings.push(n),void t.warn(n)}const u=[],p=[],c=[],l=[],d=[],m={},f={},h=t.time("indexing metafile data"),g=Ue(n.metafile.inputs,a),w=Ue(n.metafile.outputs,a);h.end();const y=e=>{if(!E(e))return e;const t=g[Ce(a,e)];if(!t)return e;const n=t.imports.find((e=>!E(e.path)));return n?n.path:e},b=t.time("looping through inputs");for(const[t,s]of Object.entries(n.metafile.inputs)){if(E(t))continue;const n=Ce(a,t),o={name:Be(e,t),filepath:n,dependents:new Set,dependencies:new Set,size:s.bytes,type:qe(t)};m[n]=o,u.push(o)}b.end();const v=t.time("looping through outputs");for(const[o,i]of Object.entries(n.metafile.outputs)){const n=Ce(a,o),r=Be(e,n),u=[];for(const e of Object.keys(i.inputs)){if(E(e))continue;const n=m[Ce(a,e)];n?u.push(n):t.debug(`Input ${e} not found for output ${r}`)}if(i.entryPoint&&!u.length){const e=m[Ce(a,i.entryPoint)];if(!e){t.debug(`Input ${i.entryPoint} not found for output ${r}`);continue}u.push(e)}const d={name:r,filepath:n,inputs:u,size:i.bytes,type:qe(n)};if(f[n]=d,"map"===d.type&&l.push(d),p.push(d),!i.entryPoint)continue;const h=m[Ce(a,y(i.entryPoint))];if(h){if(!s.get(h.name))continue;const e={...d,name:s.get(h.name)||h.name,outputs:[d],size:d.size};c.push(e)}}v.end();const $=t.time("looping through sourcemaps");for(const e of l){const n=f[e.filepath.replace(/\.map$/,"")];n?e.inputs.push(n):t.debug(`Could not find output for sourcemap ${e.name}`)}$.end();const k={inputs:{report:m,meta:g},outputs:{report:f,meta:w}},S=/(<runtime>|https:|file:|data:|#)/g,D=e=>!E(e)&&!e.match(S),P=(n,s,i={})=>{if(!D(n))return i;const r=s.report[n];if(!r)return t.debug(`Could not find report's ${n}`),i;if(i[r.filepath])return i;i[r.filepath]=r;const p=s.meta[n];if(!p)return t.debug(`Could not find metafile's ${n}`),i;if(!p.imports||!p.imports.length)return i;for(const t of p.imports){const p=t.path.match(/^\.\.?\//),c=p?o.dirname(n):a,l=Ce(c,t.path);if(t.external){if(D(t.path)){const n=p?l:t.path,s=k.inputs.report[n]||{filepath:n,name:Be(e,t.path),size:0,type:"external",dependencies:new Set,dependents:new Set};"dependencies"in r&&(s.dependents.add(r),r.dependencies.add(s)),"inputs"in r&&!r.inputs.includes(s)&&r.inputs.push(s),u.includes(s)||u.push(s),k.inputs.report[n]=s,i[s.filepath]=s}}else P(l,s,i)}return i},M=t.time("looping through entries");for(const e of c){const t={},n={};for(const n of e.inputs)P(n.filepath,k.inputs,t);for(const t of e.outputs)P(t.filepath,k.outputs,n);e.inputs=Object.values(t),e.outputs=Object.values(n),e.size=e.outputs.reduce(((e,t)=>e+t.size),0),d.push(e)}M.end();const x=t.time("aggregate dependencies and dependents");for(const e of u){if("external"===e.type)continue;const n=k.inputs.meta[e.filepath];if(n)for(const s of n.imports){if(!D(s.path))continue;const n=s.path.match(/^\.?\.\//),i=n?o.dirname(e.filepath):a,r=Ce(i,s.path);let u;if(s.external){const e=n?r:s.path;u=k.inputs.report[e]}else u=k.inputs.report[r];u?(e.dependencies.add(u),u.dependents.add(e)):t.debug(`Could not find input file of ${s.path} imported from ${e.name}`)}else t.debug(`Could not find metafile's ${e.name}`)}x.end(),e.build.outputs=p,e.build.inputs=u,e.build.entries=d,r.end(),e.hook("buildReport",e.build)}))}}),Je=(e,t)=>{const n=t.time("build report",{start:!1});let s={};return{buildStart(){s={}},onLog(t,n){"warn"===t&&e.build.warnings.push(n.message||n.toString())},renderError(t){t&&e.build.errors.push(t.message)},moduleParsed(e){n.resume();const t=We(e.id),o=s[t]||{dependencies:new Set,dependents:new Set},i=Ke(new Set([...e.dynamicallyImportedIds,...e.importedIds]),t),r=Ke(new Set([...e.dynamicImporters,...e.importers]),t);for(const e of r)o.dependents.add(e);for(const e of i)o.dependencies.add(e);s[t]=o,n.pause()},writeBundle(o,i){n.resume();const r=[],a=[],u=[],p=[],c={},l=[],d={},m={},f=t.time("completing dependencies and dependents");for(const[e,{dependencies:t,dependents:n}]of Object.entries(s)){for(const n of t){const t=We(n);s[t]||(s[t]={dependencies:new Set,dependents:new Set}),s[t].dependents.has(e)||s[t].dependents.add(e)}for(const t of n){const n=We(t);s[n]||(s[n]={dependencies:new Set,dependents:new Set}),s[n].dependencies.has(e)||s[n].dependencies.add(e)}}f.end();const h=t.time("filling inputs and outputs");for(const[n,o]of Object.entries(i)){const i={name:n,filepath:Ce(e.bundler.outDir,n),inputs:[],size:"code"in o?Buffer.byteLength(o.code,"utf8"):Buffer.byteLength(o.source,"utf8"),type:qe(n)};if("map"===i.type&&p.push(i),"modules"in o)for(const[t,n]of Object.entries(o.modules)){if(We(t)!==t)continue;const s={name:Be(e,t),dependencies:new Set,dependents:new Set,filepath:t,size:n.originalLength,type:qe(t)};i.inputs.push(s),d[s.filepath]=s,r.push(s)}if("imports"in o)for(const n of o.imports){const o=We(n);if(!s[o]){c[Ce(e.bundler.outDir,o)]=i;continue}if(d[o]){t.debug(`Input report already there for ${o} from ${i.name}.`);continue}const a={name:Be(e,n),dependencies:new Set,dependents:new Set,filepath:o,size:0,type:"external"};i.inputs.push(a),d[a.filepath]=a,r.push(a)}"isEntry"in o&&o.isEntry&&u.push({...i,name:o.name,size:0,outputs:[i]}),m[i.filepath]=i,a.push(i)}h.end();for(const[e,n]of Object.entries(c)){const s=m[e];s?n.inputs.includes(s)||n.inputs.push(s):t.debug(`Could not find the output report for ${e}.`)}const g=t.time("filling dependencies and dependents");for(const n of r){const o=s[n.filepath];if(o){for(const s of o.dependencies){const o=d[s];o?n.dependencies.add(o):t.debug(`Could not find input for dependency ${Be(e,s)} of ${n.name}`)}for(const s of o.dependents){const o=d[s];o?n.dependents.add(o):t.debug(`Could not find input for dependent ${Be(e,s)} of ${n.name}`)}}else t.debug(`Could not find the import report for ${n.name}.`)}if(g.end(),p.length){const e=t.time("filling sourcemaps inputs");for(const e of p){const n=e.filepath.replace(/\.map$/,""),s=m[n];s?e.inputs.push(s):t.debug(`Could not find output for sourcemap ${e.name}`)}e.end()}const w=(n,s={})=>{if(s[n])return s;const o=Be(e,n),r=m[n];if(!r){return!!d[o]||t.debug(`Could not find output for ${o}`),s}s[n]=r;const a=i[Be(e,n)];if(!a)return t.debug(`Could not find asset for ${o}`),s;const u=[];"imports"in a&&u.push(...a.imports),"dynamicImports"in a&&u.push(...a.dynamicImports);for(const t of u)w(Ce(e.bundler.outDir,t),s);return s},y=t.time("filling entries");for(const e of u){const t=w(e.filepath);e.outputs=Object.values(t),e.inputs=Array.from(new Set(e.outputs.flatMap((e=>e.inputs)))),e.size=e.outputs.reduce(((e,t)=>e+t.size),0),l.push(e)}y.end(),e.build.inputs=r,e.build.outputs=a,e.build.entries=l,n.end(),e.hook("buildReport",e.build)}}},Ve=(e,t,n)=>s=>{let o=[],i=[],r=[];const a=new Map,u=new Map,p=new Map,c=new Map,l=[],d=new Map,m=n.time("build report",{start:!1}),f=e=>!(!e||e.startsWith("webpack/runtime")||e.includes("/webpack4/buildin/")||e.startsWith("multi ")||E(e)),h=e=>e.replace(/(^external[^"]+"|"$)/g,""),g=e=>{const t=(e=>{const t=e.identifier();return{identifier:()=>t,dependencies:"dependencies"in e?[...e.dependencies]:[],blocks:"blocks"in e?[...e.blocks]:[],externalType:"externalType"in e?e.externalType:void 0,external:"external"in e?e.external:void 0}})(e),n=(e=>{const t=new Set,n=["rawRequest","resource","request","userRequest"],s=e=>{const n=We(e);t.add(n),n.startsWith("external ")&&t.add(h(n))};s(e.identifier());for(const t of n){const n=e[t];t&&t in e&&"string"==typeof n&&s(n)}return t})(e);for(const e of n)if(c.has(e)){const n=c.get(e);n.dependencies.push(...t.dependencies||[]),n.blocks.push(...t.blocks||[])}else c.set(e,t)},w=(e,t=[])=>{if("dependencies"in e)for(const n of e.dependencies)t.push(n),w(n,t);if("blocks"in e)for(const n of e.blocks)w(n,t);return t},y=(e,t)=>{if("request"in t&&t.request){const n=We(t.request);if(c.has(n))return c.get(n);if(e.context){const t=Ce(We(e.context),n);if(c.has(t))return c.get(t)}}},b=e=>!(!("externalType"in e)||!e.externalType)||(!(!("external"in e)||!e.external)||!!e.identifier?.().startsWith("external "));s.hooks.thisCompilation.tap(t,(s=>{o=[],i=[],r=[],a.clear(),u.clear(),c.clear(),d.clear(),s.hooks.finishModules.tap(t,(t=>{m.resume();const s=n.time("dependency graph"),i=n.time("indexing modules");for(const e of t)g(e);i.end();const r=n.time("building inputs");for(const n of t){const t=n.identifier(),s=Be(e,t),i=new Set(w(n).map((e=>{const s=y(n,e);if(!s?.identifier())return!1;const o=s.identifier();return!!f(o)&&(o!==t&&(b(s)?h(o):o))})).filter(Boolean));if(!f(t))continue;const r=d.get(t)||{dependents:new Set,dependencies:new Set};for(const e of i){const n=d.get(e)||{dependencies:new Set,dependents:new Set};n.dependents.add(t),r.dependencies.add(e),d.set(e,n)}d.set(t,r);const u=b(n)?{size:0,name:h(s),dependencies:new Set,dependents:new Set,filepath:t,type:"external"}:{size:n.size()||0,name:s,dependencies:new Set,dependents:new Set,filepath:t,type:qe(t)};o.push(u),a.set(t,u),b(n)&&a.set(h(t),u)}r.end();const u=n.time("assigning dependencies and dependents");for(const e of o){const t=d.get(e.filepath);if(t){for(const s of t.dependencies){const t=a.get(s);t?e.dependencies.add(t):n.debug(`Could not find input of dependency ${s}`)}for(const s of t.dependents){const t=a.get(s);t?e.dependents.add(t):n.debug(`Could not find input of dependent ${s}`)}}else n.debug(`Could not find dependency report for ${e.name}`)}u.end(),s.end(),m.pause()}))})),s.hooks.afterEmit.tap(t,(t=>{m.resume();const s=t.chunks,c=t.getAssets(),d=t=>[...t.files||[],...t.auxiliaryFiles||[]].map((t=>Ce(e.bundler.outDir,t))),h=n.time("indexing chunks"),g=t.chunkGraph;for(const e of s){const t=d(e),n=(g?g?.getChunkModules(e):"getModules"in e&&"function"==typeof e.getModules?e.getModules():[]).flatMap((e=>"modules"in e&&Array.isArray(e.modules)?e.modules.map((e=>e.identifier())):e.identifier())).filter(f);for(const e of t){if("map"===qe(e))continue;const t=p.get(e)||new Set;for(const e of n)t.add(e);p.set(e,t)}}h.end();const w=n.time("building outputs");for(const t of c){const s={size:t.source.size()||0,name:t.name,inputs:[],filepath:Ce(e.bundler.outDir,t.name),type:qe(t.name)};if(u.set(s.filepath,s),i.push(s),"map"===s.type){l.push(s);continue}const o=p.get(s.filepath);if(o)for(const e of o){const t=a.get(e);t?s.inputs.push(t):n.debug(`Could not find input of ${e}`)}else n.debug(`Could not find modules for ${s.name}`)}w.end();const y=n.time("filling sourcemaps inputs");for(const e of l){const t=u.get(e.filepath.replace(/\.map$/,""));t?e.inputs.push(t):n.debug(`Output not found for sourcemap ${e.name}`)}y.end();const b=n.time("building entries");for(const[s,o]of t.entrypoints){const t=new Map,i=new Map;let a=0;const p=o.chunks.flatMap(d),c=o.chunks.filter((e=>g?g.getChunkEntryModulesIterable(e):"hasEntryModule"in e&&"function"==typeof e.hasEntryModule&&e.hasEntryModule())).flatMap((e=>Array.from(e.files))).filter((e=>e.includes(s)||o.name&&e.includes(o.name))).find((e=>"js"===qe(e)));for(const e of p){const s=u.get(e);if(e&&s){if("map"!==s.type&&!t.has(s.name)){t.set(s.name,s);for(const e of s.inputs)i.has(e.filepath)||i.set(e.filepath,e);a+=s.size}}else n.debug(`Could not find output of ${JSON.stringify(e)}`)}const l={name:s,filepath:c?Ce(e.bundler.outDir,c):"unknown",size:a,inputs:Array.from(i.values()),outputs:Array.from(t.values()),type:c?qe(c):"unknown"};r.push(l)}b.end();for(const n of t.errors)e.build.errors.push(n.message);for(const n of t.warnings)e.build.warnings.push(n.message);e.build.inputs=o,e.build.outputs=i,e.build.entries=r,m.end(),e.hook("buildReport",e.build)}))},Ye="datadog-build-report-plugin",Qe=e=>{const{context:t}=e,n=t.getLogger(Ye);return[{name:Ye,enforce:"post",esbuild:Ge(t,n),rspack:Ve(t,Ye,n),webpack:Ve(t,Ye,n),vite:Je(t,n),rollup:Je(t,n)}]},Xe=(e,t)=>{const n=(e=>{let t,n=Ce(process.cwd(),e),i=n.split("/").length;for(;i>0;){const e=o.resolve(n,"package.json");s.existsSync(e)&&(t=n),n=n.split("/").slice(0,-1).join("/"),i--}return t})(t);if(n)return n;const i=(e=>{const t=[...e].map((e=>Ce(process.cwd(),e).split(o.sep))),n=Math.min(...t.map((e=>e.length))),s=[];for(let e=0;e<n;e++){const n=t[0][e];if(!t.every((t=>t[e]===n)))break;s.push(n)}return s.length>0&&s.join(o.sep)||o.sep})(Array.from(e));return i!==o.sep?i:void 0},Ze=e=>t=>{e.bundler.rawConfig=t.options,t.options.output?.path&&(e.bundler.outDir=t.options.output.path),e.hook("bundlerReport",e.bundler),t.options.context&&(e.cwd=t.options.context),e.hook("cwd",e.cwd)},et=e=>{const{context:t}=e,n=new Set,s=e=>{e&&(e.dir?(t.bundler.outDir=e.dir,n.add(e.dir)):e.file&&(t.bundler.outDir=o.dirname(e.file),n.add(t.bundler.outDir)),t.bundler.outDir=Ce(process.cwd(),t.bundler.outDir),t.hook("bundlerReport",t.bundler),"vite"!==t.bundler.name&&(t.cwd=Xe(n,t.bundler.outDir)||t.cwd,t.hook("cwd",t.cwd)))},i=()=>({options(e){if(t.bundler.rawConfig=e,e.input)if(Array.isArray(e.input))for(const t of e.input)n.add(o.dirname(t));else if("object"==typeof e.input)for(const t of Object.values(e.input))n.add(o.dirname(t));else{if("string"!=typeof e.input)throw new Error("Invalid input type");n.add(o.dirname(e.input))}if("output"in e){const t=Array.isArray(e.output)?e.output:[e.output];for(const e of t)s(e)}}});return[{name:"datadog-bundler-report-plugin",enforce:"pre",esbuild:{setup(e){t.bundler.rawConfig=e.initialOptions,e.initialOptions.outdir&&(t.bundler.outDir=e.initialOptions.outdir),e.initialOptions.outfile&&(t.bundler.outDir=o.dirname(e.initialOptions.outfile)),t.hook("bundlerReport",t.bundler),e.initialOptions.absWorkingDir&&(t.cwd=e.initialOptions.absWorkingDir),t.hook("cwd",t.cwd),e.initialOptions.metafile=!0}},webpack:Ze(t),rspack:Ze(t),vite:{...i(),config(e){e.root?t.cwd=e.root:t.cwd=Xe(n,t.bundler.outDir)||t.cwd,t.hook("cwd",t.cwd)}},rollup:i()}]},tt="datadog-custom-hooks-plugin",nt=e=>{const{context:t}=e,n=t.getLogger(tt),s=e=>(s,...o)=>{const i=n.time(`hook | ${s}`),r=[],a=[];for(const n of t.plugins){if(!(s in n))continue;const t=n[s];if("function"==typeof t)try{const i=t(...o);i instanceof Promise&&(e||r.push(`Plugin "${n.name}" returned a promise on the non async hook "${s}".`),a.push(i))}catch(e){r.push(`Plugin "${n.name}" errored on hook "${s}". [${e}]`)}else r.push(`Plugin "${n.name}" has an invalid hook type for "${s}". [${typeof t}]`)}if(r.length>0){for(const e of r)n.error(e);throw new Error("Some plugins errored during the hook execution.")}return Promise.all(a).finally((()=>i.end()))};return t.hook=s(!1),t.asyncHook=s(!0),[{name:tt,enforce:"pre"}]};class st{constructor(e){this.trackedFilenames=new Map;for(const t of e){const e=this.getFilename(t),n=this.trackedFilenames.get(e);n?n.push(t):this.trackedFilenames.set(e,new Array(t))}}displaySource(e){return e.length<=40?e:`[...]${e.slice(-35)}`}matchSourcemap(e,t){const n=s.readFileSync(e,"utf8"),o=JSON.parse(n);if(!o.sources)return void t("Missing 'sources' field in sourcemap.");const i=o.sources;if(0===i.length)return void t("Empty 'sources' field in sourcemap.");const r=this.matchSources(i);if(0!==r.length)return r;t(`${i.map(this.displaySource).join(", ")} not in the tracked files.`)}matchSources(e){let t=[];const n=new Set;for(const s of e){const e=this.getFilename(s);if(n.has(e))continue;n.add(e);const o=this.trackedFilenames.get(e);o&&(t=t.concat(o))}return t}rawTrackedFilesList(){let e=[];return this.trackedFilenames.forEach((t=>{e=e.concat(t)})),e}getFilename(e){let t=e.lastIndexOf("/");-1===t?t=0:t++;let n=e.lastIndexOf("?");return(-1===n||n<=t)&&(n=e.length),e.substring(t,n)}}const ot=async e=>{const t=await e.getRemotes(!0);if(0===t.length)throw new Error("No git remotes available");const n=await it(e);for(const e of t)if(e.name===n)return rt(e.refs.push);return rt(t[0].refs.push)},it=async e=>{try{return(await e.getConfig("clone.defaultRemoteName"))?.value??"origin"}catch(e){return"origin"}},rt=e=>{try{const t=new h.URL(e);return t.username="",t.password="",t.toString()}catch{return e}},at=async e=>e.revparse("HEAD"),ut=async e=>(await e.raw("ls-files")).split(/\r\n|\r|\n/),pt="datadog-git-plugin",ct=e=>{const{options:t,context:n}=e,s=n.getLogger(pt);return[{name:pt,enforce:"pre",async buildStart(){if(t.errorTracking?.sourcemaps&&!0!==t.errorTracking?.sourcemaps.disableGit&&!0!==t.disableGit)try{const e=s.time("get git information"),t=await(async e=>{let t,n,s;return[t,n,s]=await Promise.all([ot(e),at(e),ut(e)]),{hash:n,remote:t,trackedFilesMatcher:new st(s)}})(await(async e=>{const t={baseDir:e||process.cwd(),binary:"git",maxConcurrentProcesses:3};try{const e=f.simpleGit(t),n=await e.revparse("--show-toplevel");t.baseDir=n}catch{}return f.simpleGit(t)})(n.cwd));n.git=t,e.end(),await n.asyncHook("git",n.git)}catch(e){s.error(`Could not get git information: ${e.message}`)}}}]},lt="datadog-injection-plugin",dt=/^https?:\/\//,mt=async(e,t,s=process.cwd())=>{let o;const i=await(async e=>"function"==typeof e.value?e.value():e.value)(e);try{if("file"===e.type)o=i.match(dt)?await(async(e,t=5e3)=>{let n;return Promise.race([L({retries:2,minTimeout:100,url:e}).finally((()=>{t&&clearTimeout(n)})),new Promise(((e,s)=>{n=setTimeout((()=>{s(new Error("Timeout"))}),t)}))])})(i):await(async(e,t=process.cwd())=>{const s=Ce(t,e);return n.readFile(s,{encoding:"utf-8"})})(i,s);else{if("code"!==e.type)throw new Error(`Invalid item type "${e.type}", only accepts "code" or "file".`);o=i}}catch(n){const s=`${e.type} - ${M(i)}`;e.fallback?(t.info(`Fallback for "${s}": ${n.toString()}`),o=await mt(e.fallback,t)):(t.warn(`Failed "${s}": ${n.toString()}`),o="")}return o},ft=e=>{if(0===e.size)return"";return`// begin injection by Datadog build plugins\n${Array.from(e.values()).map((e=>`(() => {${e}})();`)).join("\n\n")}\n// end injection by Datadog build plugins`},ht=async(e,t,n,s=process.cwd())=>{const o=await(async(e,t,n=process.cwd())=>{const s=new Map;for(const[o,i]of e.entries()){const e=await mt(i,t,n);e&&s.set(o,{value:e,position:i.position||te.BEFORE})}return s})(t,e,s);for(const[e,t]of o.entries())n[t.position].set(e,t.value)},gt=s.promises,wt=(e,t,n)=>({setup(i){const{onStart:r,onResolve:a,onLoad:u,onEnd:p,esbuild:c,initialOptions:l}=i,d=[],m=`${j()}.${te.MIDDLE}.${b}.js`,f=s.realpathSync(g.tmpdir()),h=o.resolve(f,m),w=new RegExp(`${m}$`),y=l.inject;l.inject=y?[...y]:[],l.inject.push(h),r((async()=>{d.push(...await Fe(i,t,e)),i.initialOptions.inject=y;try{await k(h,"")}catch(t){e.error(`Could not create the files: ${t.message}`)}})),a({filter:w},(async e=>({path:e.path,namespace:lt}))),u({filter:w,namespace:lt},(async()=>({contents:ft(n[te.MIDDLE])||" ",resolveDir:t.cwd,loader:"js"}))),p((async s=>{if(!s.metafile)return void e.warn("Missing metafile from build result.");const o=ft(n[te.BEFORE]),i=ft(n[te.AFTER]);if(!o&&!i)return;const r=Object.entries(s.metafile.outputs).map((([e,n])=>{const s=n.entryPoint;if(!s)return;return d.find((e=>e.resolved.endsWith(s)))?Ce(t.cwd,e):void 0})).filter(Boolean).map((async e=>{const t=await gt.readFile(e,"utf-8"),n=await c.transform(t,{loader:"default",banner:o,footer:i});await gt.writeFile(e,n.code)}));await Promise.all(r)}))}}),yt=b,bt="?inject-proxy",vt=e=>({banner:t=>t.isEntry?ft(e[te.BEFORE]):"",async resolveId(t,n,s){if(E(t))return{id:t,moduleSideEffects:!0};if(s.isEntry&&ft(e[te.MIDDLE])){const e=await this.resolve(t,n,s);if(!e||e.external)return e;return(await this.load(e)).moduleSideEffects=!0,`${e.id}${bt}`}return null},load(t){if(E(t))return ft(e[te.MIDDLE]);if(t.endsWith(bt)){const e=t.slice(0,-13),n=this.getModuleInfo(e);let s=`import ${JSON.stringify(yt)};\nexport * from ${JSON.stringify(e)};`;return n?.hasDefaultExport&&(s+=`export { default } from ${JSON.stringify(e)};`),s}return null},footer:t=>t.isEntry?ft(e[te.AFTER]):""}),$t=(e,t,n,i,r)=>a=>{const u=new WeakMap,p=(e=>{if(!e?.sources?.ConcatSource)return w.createRequire(require.resolve("webpack"))("webpack-sources").ConcatSource;return e.sources.ConcatSource})(e),c=o.resolve(n.bundler.outDir,`${j()}.${te.MIDDLE}.${b}.js`);S(c,"");const l=()=>{var e;e=c,s.rmSync(e,{force:!0,maxRetries:3,recursive:!0})};a.hooks.shutdown?a.hooks.shutdown.tap(lt,l):(a.hooks.done.tap(lt,l),a.hooks.failed.tap(lt,l));a.hooks.beforeRun.tapPromise(lt,(async()=>{await ht(t,i,r,n.cwd)})),a.hooks.compilation.tap(lt,(t=>{const n=()=>{const e=ft(r[te.BEFORE]),n=ft(r[te.AFTER]);for(const s of t.chunks)if(s.canBeInitial())for(const o of s.files)t.updateAsset(o,(t=>{const s=u.get(t);if(!s||s.banner!==e||s.footer!==n){const s=new p(e,"\n",t,"\n",n);return u.set(t,{source:s,banner:e,footer:n}),s}return s.source}))};if(t.hooks.processAssets){const s=e.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS;t.hooks.processAssets.tap({name:lt,stage:s},n)}else t.hooks.optimizeChunkAssets.tap({name:lt},n)}));const d=(e=>{const s="webpack4"===n.bundler.fullName?c:{import:[c]},o=e=>{for(const[n,s]of Object.entries(e))"object"==typeof s?(s.import=s.import||[],s.import.unshift(c)):"string"==typeof s?e[n]=[c,s]:Array.isArray(s)?s.unshift(c):t.error("Invalid entry type: "+typeof s)};return e?"function"==typeof e?async()=>{const t=await e();return o(t),t}:"object"!=typeof e?"string"==typeof e?[s,e]:(t.error("Invalid entry type: "+typeof e),e):(o(e),e):{ddHelper:s}})(a.options.entry);a.options.entry=d},kt=e=>{const{bundler:t,context:n}=e,s=n.getLogger(lt),o=new Map,i={[te.BEFORE]:new Map,[te.MIDDLE]:new Map,[te.AFTER]:new Map};n.inject=e=>{o.set(j(),e)};const r={name:lt,enforce:"post",esbuild:wt(s,n,i),webpack:$t(t,s,n,o,i),rspack:$t(t,s,n,o,i),rollup:vt(i),vite:{...vt(i),enforce:"pre"}};var a;return a=n.bundler.fullName,["rspack","webpack4","webpack5","webpack"].includes(a)?(r.loadInclude=e=>!!E(e)||null,r.load=e=>E(e)?{code:ft(i[te.MIDDLE])}:null):r.buildStart=async()=>{await ht(s,o,i,n.cwd)},[r]},St={[ue]:Ne};var Dt="2.5.2-dev-0";const Et=(({bundler:n,version:s})=>e.createUnplugin(((e,o)=>{const i=((e={})=>({auth:{},disableGit:!1,logLevel:"warn",...e}))(e);"esbuild"===o.framework&&(o.esbuildHostName=$);const r=(({options:e,bundlerName:t,bundlerVersion:n,version:s})=>{const o=process.cwd(),i="webpack"===t?n.split(".")[0]:"",r={errors:[],warnings:[],logs:[],timings:[],bundler:{name:t,fullName:`${t}${i}`,variant:i,version:n}},a=process.env.BUILD_PLUGINS_ENV||"production",u=v.includes(a)?a:"development";return{auth:e.auth,pluginNames:[],bundler:{...r.bundler,outDir:o},build:r,cwd:o,env:u,getLogger:z(r,e.logLevel),asyncHook:()=>{throw new Error("AsyncHook function called before it was initialized.")},hook:()=>{throw new Error("Hook function called before it was initialized.")},inject:()=>{throw new Error("Inject function called before it was initialized.")},sendLog:()=>{throw new Error("SendLog function called before it was initialized.")},plugins:[],start:Date.now(),version:s}})({options:i,bundlerVersion:n.version||n.VERSION,bundlerName:o.framework,version:s});r.pluginNames.push($);const a=[];a.push(["analytics",Ae],["build-report",Qe],["bundler-report",et],["custom-hooks",nt],["git",ct],["injection",kt]),i.customPlugins&&a.push(["custom",i.customPlugins]),a.push(["error-tracking",ee],["rum",ae],["telemetry",Re]);for(const[e,t]of a)r.plugins.push(...R(r,t,e)({bundler:n,context:r,options:i}));r.pluginNames.push(...r.plugins.map((e=>e.name)));const u=new Set(r.pluginNames.filter((e=>r.pluginNames.filter((t=>t===e)).length>1)));if(u.size>0)throw new Error(`Duplicate plugin names: ${t.bold.red(Array.from(u).join(", "))}`);return r.hook("init",r),r.plugins})))({bundler:y,version:Dt}).esbuild,Pt=Dt,Mt=St;exports.datadogEsbuildPlugin=Et,exports.helpers=Mt,exports.version=Pt;
5
5
  //# sourceMappingURL=index.js.map