UNPKG

hud-sdk

Version:

Hud's Node SDK

2 lines 13.7 kB
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var o in r)("object"==typeof exports?exports:e)[o]=r[o]}}(global,()=>(()=>{"use strict";var e={523:e=>{e.exports=require("./logger")},1351:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const a=o(r(1620));class i extends a.default{savedLogs;constructor(e){super(e),this.savedLogs=[]}log(e,t){this.savedLogs.push(e),setImmediate(()=>this.emit("logged",e)),t()}}t.default=i},1455:e=>{e.exports=require("node:fs/promises")},1620:e=>{e.exports=require("winston-transport")},2305:e=>{e.exports=require("form-data")},2546:e=>{e.exports=require("./lib")},3024:e=>{e.exports=require("node:fs")},3903:e=>{e.exports=require("uuid")},4409:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.tempSourceMapFiles=void 0,t.createSourceMapUploadPlugin=function({accessToken:e,apiEndpoint:r=l.HUD_API_ENDPOINT,cleanupTempSourceMaps:o=!1}){return r.endsWith("/")&&(r=r.slice(0,-1)),async a=>{c.logger.debug("Recieved artifacts",{artifacts:a});const i=a.filter(e=>e.endsWith(".js")||e.endsWith(".mjs")||e.endsWith(".cjs"));if(0===i.length)return c.logger.warn("No build artifacts to upload"),!1;if(c.logger.debug("Uploading build artifacts",{artifacts:i}),o)for(const e of i){const r=`${e}.map`;try{await(0,n.access)(r),t.tempSourceMapFiles.add(r),c.logger.debug("Tracked source map for cleanup",{sourceMapPath:r})}catch{c.logger.debug("Source map doesn't exist, nothing to track",{sourceMapPath:r})}}const l=(await Promise.all(i.map(async t=>{try{const o=await async function(e){let t;try{t=await(0,n.readFile)(e,"utf-8")}catch{return void c.logger.error("Could not read file. File will not be source mapped: ",{uploadFilePath:e})}const r=await async function(e,t){const r=t.match(/^\s*\/\/# sourceMappingURL=(.*)$/m);if(r){const t=f(e,r[1]);if(t)try{return await(0,n.access)(t,s.default.constants.R_OK),t}catch{}}try{const t=`${e}.map`;return await(0,n.access)(t,s.default.constants.R_OK),t}catch{}c.logger.debug("Could not determine source map path - Did you turn on source map generation in your bundler?",{file:e})}(e,t);if(void 0===r)return void c.logger.debug("Could not find source map for artifact. File will not be source mapped: ",{uploadFilePath:e});const o=d(t);if(void 0!==o)return{buildID:o,sourceMapPath:r};c.logger.error("Could not find build ID in artifact. File will not be source mapped: ",{uploadFilePath:e})}(t);if(void 0===o)return;if(c.logger.debug("Uploading source map",{path:o.sourceMapPath,buildID:o.buildID}),await p(o.buildID,o.sourceMapPath,r,e))return c.logger.debug("Source map uploaded successfully",{path:o.sourceMapPath,buildID:o.buildID}),{sourceMapPath:o.sourceMapPath,buildID:o.buildID,sourceFilePath:t}}catch(e){c.logger.error("Error uploading source map",e)}}))).filter(Boolean);if(c.logger.info("Source Map Upload Report"),0===l.length)c.logger.info(" No source maps uploaded");else for(const e of l)e&&c.logger.info(` ${u.default.basename(e.sourceFilePath)} -> ${u.default.basename(e.sourceMapPath)} (build-id: ${e.buildID})`);return l.length>0}},t.cleanupTemporarySourceMaps=async function(){const e=Array.from(t.tempSourceMapFiles);if(t.tempSourceMapFiles.clear(),0===e.length)return;const r=e.map(async e=>{try{await(0,n.unlink)(e)}catch(t){throw c.logger.error("Failed to clean up temporary source map",{filePath:e,error:t}),t}});await Promise.all(r)},t.getBuildIDForArtifact=d,t.resolveSourceMapUrl=f;const a=o(r(8938)),i=o(r(2305)),s=o(r(3024)),n=r(1455),u=o(r(6760)),l=r(8805),c=r(5449);async function p(e,t,r,o,u=!0){const d=new i.default;let f;d.append("build_id",e),d.append("token",o);try{f=await(0,n.readFile)(t,"utf-8")}catch(r){return c.logger.error("Failed to upload source map due file read failure",{error:r,path:t,buildID:e}),!1}try{const e=JSON.parse(f);delete e.sourcesContent,d.append("sourcemap",JSON.stringify(e),{filename:"sourcemap",contentType:"application/json"})}catch(r){c.logger.warn("Failed to parse the sourcemap as JSON",{error:r,path:t,buildID:e}),d.append("sourcemap",s.default.createReadStream(t))}try{await a.default.post(`${r}${l.HUD_API_URI}`,d,{headers:{"Content-Type":"multipart/form-data"},timeout:1e4})}catch(a){const i=a;return 401===i.response?.status?(c.logger.error("Failed to upload source map: Unauthorized. Please check your access token."),!1):(c.logger.error("Failed to upload source map",{error:i.message,status:i.response?.status,path:t,buildID:e}),u?(c.logger.debug("Retrying source map upload"),await new Promise(e=>setTimeout(e,1e3)),p(e,t,r,o,!1)):(c.logger.error("Failed to upload source map: Retries exhausted"),!1))}return!0}function d(e){const t=e.match(`${l.BUILD_ID_VAR_NAME}="([0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12})"`);return t?t[1]:void 0}function f(e,t){const r=u.default.normalize(t);try{if("file:"===new URL(r).protocol)return r}catch{return u.default.isAbsolute(r)?r:u.default.join(u.default.dirname(e),r)}}t.tempSourceMapFiles=new Set},5124:e=>{e.exports=require("winston")},5449:function(e,t,r){var o,a=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r);var a=Object.getOwnPropertyDescriptor(t,r);a&&!("get"in a?!t.__esModule:a.writable||a.configurable)||(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,o,a)}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),s=this&&this.__importStar||(o=function(e){return o=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t},o(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=o(e),s=0;s<r.length;s++)"default"!==r[s]&&a(t,e,r[s]);return i(t,e),t}),n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.logger=void 0,t.getLogPath=h,t.flushLogs=async function(e){t.logger.end();let r=[];for(const o of t.logger.transports)o instanceof f.default&&(e&&o.savedLogs.map(t=>(t.accessToken=e,t)),r=r.concat(o.savedLogs));const o=t.logger.transports.map(e=>new Promise(t=>{e.on("finish",t)}));await Promise.all(o);try{await u.default.post(d.HUD_API_LOG_ENDPOINT,{messages:r},{headers:{"x-hudx-plugin":"true","Content-Type":"application/json"}})}catch{}};const u=n(r(8938)),l=s(r(8161)),c=s(r(6760)),p=s(r(5124)),d=r(8805),f=n(r(1351));let g;function h(){const e=new Date,t=`bundler-plugin-${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}-${String(e.getHours()).padStart(2,"0")}${String(e.getMinutes()).padStart(2,"0")}${String(e.getSeconds()).padStart(2,"0")}.log`;return g??=c.join(function(){const e=l.homedir();switch(l.platform()){case"darwin":return c.join(e,"Library","Logs","hud");case"win32":return c.join(e,"AppData","hud","Logs");default:return c.join(e,".hud","logs")}}(),t)}t.logger=p.createLogger({level:d.DEFAULT_LOG_LEVEL,transports:[new p.transports.File({filename:h(),format:p.format.combine(p.format.label({label:"hud-bundler-plugin"}),p.format.timestamp({format:()=>(new Date).toISOString()}),p.format.json())}),new p.transports.Console({level:d.USER_CONSOLE_LOG_LEVEL,format:p.format.printf(({message:e,...t})=>(delete t.level,`Hud: ${e} ${Object.keys(t).length>0?` ${JSON.stringify(t)}`:""}`))}),new f.default({format:p.format.combine(p.format.timestamp(),p.format.json())})]})},6760:e=>{e.exports=require("node:path")},6807:e=>{e.exports=require("webpack")},8161:e=>{e.exports=require("node:os")},8805:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HUD_API_LOG_ENDPOINT=t.HUD_API_URI=t.HUD_API_ENDPOINT=t.BUILD_ID_VAR_NAME=t.HUD_UUID_NAMESPACE=t.USER_CONSOLE_LOG_LEVEL=t.DEFAULT_LOG_LEVEL=void 0,t.DEFAULT_LOG_LEVEL="info",t.USER_CONSOLE_LOG_LEVEL="error",t.HUD_UUID_NAMESPACE="00c1e90b-af75-4d8e-9935-68485877f759",t.BUILD_ID_VAR_NAME="hudFileBuildID",t.HUD_API_ENDPOINT="https://api-prod.hud.io",t.HUD_API_URI="/sink/sourcemap",t.HUD_API_LOG_ENDPOINT="https://yqp37dddrsewm6wdwwpwfraxqm0shdmx.lambda-url.eu-central-1.on.aws/"},8938:e=>{e.exports=require("axios")},9017:function(e,t,r){var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.hudWebpackPlugin=void 0;const a=r(2546),i=r(523),s=r(1455),n=o(r(6760)),u=o(r(9899)),l=r(3903),c=r(8805),p=r(4409),d=r(5449);class f{apply(e){const t=e?.webpack?.BannerPlugin||r(6807).BannerPlugin;e.options.plugins=e.options.plugins||[],e.options.plugins.push(new t({raw:!0,footer:!0,include:/\.(js|ts|jsx|tsx|mjs|cjs|mts|cts)$/,banner:e=>{return t=e?.chunk?.hash?(0,l.v5)(e.chunk.hash,c.HUD_UUID_NAMESPACE):(0,l.v4)(),`;!function(){try{globalThis? globalThis.${c.BUILD_ID_VAR_NAME}="${t}":null}catch(e){}}();`;var t}}))}}class g{upload;accessToken;constructor(e,t){this.upload=e,this.accessToken=t}apply(e){e.hooks.afterEmit.tapPromise("hud-webpack-build-id-source-map-upload-plugin",async e=>{try{const t=e.outputOptions.path??n.default.resolve(),r=Object.keys(e.assets).map(e=>n.default.join(t,e));await this.upload(r)?i.customer_logger.log(a.UserLogs.WebpackUploadedSourcemapSuccess()):i.customer_logger.log(a.UserErrorLogs.WebpackFailedUploadingSourcemap())}catch{d.logger.error("Source map upload failed - terminating plugin"),i.customer_logger.log(a.UserErrorLogs.WebpackFailedUploadingSourcemap())}})}}class h{projectDir;initFilePath;distDir;constructor(e,t="hud.ts",r){this.projectDir=e,this.initFilePath=t,this.distDir=r}apply(e){this.projectDir?e.hooks.afterEmit.tapPromise("hud-init-file-copy-plugin",async()=>{try{const e=n.default.join(this.projectDir,this.initFilePath);try{await(0,s.access)(e)}catch{return void d.logger.debug("Init file not found, skipping copy",{sourcePath:e,initFile:this.initFilePath})}const t=this.distDir?n.default.join(this.projectDir,this.distDir):n.default.join(this.projectDir,".next"),r=this.initFilePath.endsWith(".ts")||this.initFilePath.endsWith(".tsx");let o,a;if(r){d.logger.debug("Compiling TypeScript init file",{sourcePath:e,initFile:this.initFilePath});try{o=await async function(e){const t=await(0,s.readFile)(e,"utf-8"),r={target:u.default.ScriptTarget.ES2018,module:u.default.ModuleKind.CommonJS,esModuleInterop:!0,allowSyntheticDefaultImports:!0,skipLibCheck:!0,strict:!1,declaration:!1,sourceMap:!1};return u.default.transpileModule(t,{compilerOptions:r,fileName:e}).outputText}(e),a=n.default.basename(this.initFilePath).replace(/\.tsx?$/,".js")}catch(t){return void d.logger.error("Failed to compile TypeScript init file",{error:t,sourcePath:e,initFile:this.initFilePath})}}else o=await(0,s.readFile)(e,"utf-8"),a=n.default.basename(this.initFilePath);const i=n.default.join(t,a);await(0,s.writeFile)(i,o,"utf-8"),d.logger.info("Successfully copied init file to output directory",{from:e,to:i,initFile:this.initFilePath,compiled:r})}catch(e){d.logger.error("Failed to copy init file",{error:e,initFile:this.initFilePath})}}):d.logger.debug("No project directory provided, skipping init file copy")}}class m{cleanupTempSourceMaps;accessToken;constructor(e,t){this.cleanupTempSourceMaps=e,this.accessToken=t}apply(e){this.cleanupTempSourceMaps&&e.hooks.shutdown.tapPromise({name:"hud-webpack-cleanup-plugin",stage:Number.MAX_SAFE_INTEGER},async()=>{try{const e=p.tempSourceMapFiles.size;await(0,p.cleanupTemporarySourceMaps)(),e>0&&d.logger.info(`Cleaned up ${e} temporary source map files`)}catch{d.logger.error("Source map cleanup failed - terminating plugin"),i.customer_logger.log(a.UserErrorLogs.SourceMapCleanupFailed()),await(0,d.flushLogs)(this.accessToken),process.exit(1)}await(0,d.flushLogs)(this.accessToken)})}}t.hudWebpackPlugin=e=>{const t=[];return e.accessToken?(e.silent&&(d.logger.silent=!0),e.verbose&&(d.logger.transports[1].level="info"),t.push(new f),t.push(new g((0,p.createSourceMapUploadPlugin)({accessToken:e.accessToken,apiEndpoint:e.apiEndpoint,cleanupTempSourceMaps:e.cleanupTempSourceMaps}),e.accessToken)),t.push(new h(e.projectDir,e.initFilePath,e.distDir)),t.push(new m(e.cleanupTempSourceMaps||!1,e.accessToken)),t):(d.logger.error("No access token provided. Source maps will not be uploaded to Hud."),(0,d.flushLogs)().catch(()=>{}),t)},t.default=t.hudWebpackPlugin},9899:e=>{e.exports=require("typescript")}},t={};function r(o){var a=t[o];if(void 0!==a)return a.exports;var i=t[o]={exports:{}};return e[o].call(i.exports,i,i.exports,r),i.exports}var o={};return(()=>{var e=o;Object.defineProperty(e,"__esModule",{value:!0}),e.withHud=i;const t=r(5449),a=r(9017);function i(e,r){const o=e.webpack,i={...e,webpack:(i,s)=>(o&&(i=o(i,s)),function(e,r,o){const{dev:i,isServer:s,nextRuntime:n}=r;if(i||!s||"edge"===n)return e;const u=e.devtool&&("source-map"===e.devtool||"inline-source-map"===e.devtool||"nosources-source-map"===e.devtool);return u||(t.logger.debug("No source maps detected, temporarily enabling source-map"),e.devtool="source-map"),e.plugins=e.plugins||[],e.plugins.push(...(0,a.hudWebpackPlugin)({...o,projectDir:r.dir,initFilePath:o.initFilePath,cleanupTempSourceMaps:!u})),e.module||(e.module={}),e.module.rules||(e.module.rules=[]),e.module.rules.unshift({test:/\.[jt]sx?$/,enforce:"pre",exclude:/node_modules/,loader:"hud-sdk/nextServerLoader"}),e}(i,s,{...r,distDir:e.distDir}))};return i}e.default=i})(),o})()); //# sourceMappingURL=nextjsPlugin.js.map