{"version":3,"sources":["jsdelivr-header.js","/npm/fis3-deploy-gfe-combo-url@1.0.6/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNA,aA4HA,SAAS,eAAe,GACpB,OAAO,KAAK,MAAM,EAAQ,QAAQ,OAAQ,IAAI,QAAQ,UAAW,MAAM,QAAQ,KAAM,KAAK,QAAQ,UAAW,SACjH,CApHA,OAAO,QAAU,SAAS,EAAS,EAAU,EAAO,GAEhD,IAAI,EAAW,EAAQ,QAAS,EAE5B,EAAoB,EAAQ,mBAAqB,KAEjD,EAAsB,EAAQ,qBAAuB,IAErD,EAAc,qGAEd,EAAqB,qHAErB,EAAgB,sDAEhB,EAAkB,iEAElB,EAAe,gEAEf,EAAe,wFAEf,EAAmB,yCAEnB,EAAe,uCAMnB,EAAS,SAAQ,SAAS,GACtB,GAAI,EAAK,UAA0C,iBAAvB,EAAK,aAA4B,CACzD,IAAI,EAAU,EAAK,aAEf,IAAgB,EAAQ,QAAQ,WAAa,EAAQ,QAAQ,aAAe,EAAQ,QAAQ,WAAa,EAAQ,QAAQ,aAAe,EAAQ,QAAQ,WAAa,EAAQ,QAAQ,UAGrL,GAAY,mBAAmB,KAAK,EAAK,QAAU,UAAU,KAAK,EAAK,WAAa,IAyBpF,GAtBA,EAAU,EAAQ,QAAQ,GAAoB,SAAS,GACnD,IAEI,EAFA,EAAe,GACf,EAAS,kCAET,EAAY,EAShB,GANG,EAAa,KAAK,KACjB,EAAY,GAEhB,EAAa,QAAQ,GAAU,SAAS,EAAK,GACzC,EAAe,CACnB,KACI,EAAe,OAAO,EAC1B,IAAI,EAAU,eAAe,GAE7B,IAAI,IAAI,KADR,EAAQ,EAAQ,OAAS,EAAQ,MAE7B,GAAU,gBAAiB,EAAM,GAAO,kBAG5C,OAAO,EAAO,+BAClB,KACkB,QAAQ,GAAa,SAAS,GAC5C,IAAI,EAAW,GACX,EAAS,GACT,EAAY,GACZ,EAAW,GAGX,EAAc,KAAK,KACnB,EA5CD,2CA6CC,EAAW,EAAa,MAAM,GAAe,KAAI,SAAS,GAEtD,OAAO,EAAM,QAAQ,EAAe,MAAM,MAAM,GAAI,EACxD,KAGA,EAAgB,KAAK,KACrB,EAlDC,qCAmDD,EAAW,EAAa,MAAM,GAAiB,KAAI,SAAS,GAExD,OAAO,EAAM,QAAQ,EAAiB,MAAM,MAAM,GAAI,EAC1D,KAGJ,EAAS,SAAQ,SAAS,EAAK,GACb,IAAV,GAAgB,EAAa,KAAK,IAE9B,EAAa,KAAK,KAClB,EAAS,EAAI,MAAM,GAAc,IAIzC,IAAI,EAAO,EAAI,QAAQ,EAAc,IAAI,QAAQ,MAAO,IACxD,EAAU,KAAK,EACnB,IAGA,IAAI,EAAW,GAAqB,KAAX,EAAgB,EAAoB,IAAM,EAAU,KAAK,GAGlF,OAFA,EAAW,EAAS,QAAQ,YAAa,EAG7C,IAEA,EAAK,WAAW,GAExB,CACJ,IACA,GACJ","file":"/npm/fis3-deploy-gfe-combo-url@1.0.6/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/fis3-deploy-gfe-combo-url@1.0.6/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\r\n\r\n/**\r\n * 对静态资源的url进行combo，请确保combo的资源包括在指定标签中\r\n * @param  {Object}   options  插件配置\r\n * @param  {Object}   modified 修改了的文件列表（对应watch功能）\r\n * @param  {Object}   total    所有文件列表\r\n * @param  {Function} next     调用下一个插件\r\n * @return {undefined}\r\n */\r\nmodule.exports = function(options, modified, total, next) {\r\n    //是否使用combo\r\n    var useCombo = options.combo || true;\r\n    //combo的url的分隔符\r\n    var comboUrlDelimiter = options.comboUrlDelimiter || '??';\r\n    //combo的查询分隔符\r\n    var comboQueryDelimiter = options.comboQueryDelimiter || ',';\r\n    //combo内容正则表达式\r\n    var comboRegExp = /<!--\\s*gfis:combo:begin\\s*-->((?!<!--\\s*gfis:combo:end\\s*-->)[\\s\\S])*<!--\\s*gfis:combo:end\\s*-->/gi;\r\n    //模块combo内容正则表达式\r\n    var modulesComboRegExp = /<!--\\s*gfis:modules-combo:begin\\s*-->((?!<!--\\s*gfis:combo:end\\s*-->)[\\s\\S])*<!--\\s*gfis:modules-combo:end\\s*-->/gi;\r\n    //link标签正则表达式\r\n    var linkTagRegExp = /<link[^>]*?href\\s*=\\s*('[^']*'|\"[^\"]*\")[^>]*?\\/?>/gi;\r\n    //script标签正则表达式\r\n    var scriptTagRegExp = /<script[^>]*?src=('[^']*'|\"[^\"]*\")[^>]*?>\\s*<\\s*\\/script\\s*>/gi;\r\n    //ssi标签正则表达式\r\n    var ssiTagRegExp = /<!--[ ]*#[ ]*([a-z]+)([ ]+([a-z]+)=(\"|')(.+?)(\"|'))*[ ]*-->/gi;\r\n    //domain正则表达式\r\n    var domainRegExp = /^((https:\\/\\/|http:\\/\\/|\\/\\/)[a-zA-Z\\.0-9]+(?=\\/))|(__CSS_DOMAIN__)|(__JS_DOMAIN__)/gi;\r\n    //combo的require Config 正则表达式\r\n    var requireConfigExp = /require\\.config\\((\\{[\\s\\S]*?\\})\\);?/img;\r\n    //combo的sea Config 正则表达式\r\n    var seaConfigExp = /seajs\\.config\\((\\{[\\s\\S]*?\\})\\);?/img;\r\n    //combo的link标签\r\n    var comboLinkTag = '<link rel=\"stylesheet\" href=\"COMBO_URL\">';\r\n    //combo的script标签\r\n    var comboScriptTag = '<script src=\"COMBO_URL\"></script>';\r\n   \r\n    modified.forEach(function(file) {\r\n        if (file.isText() || typeof(file.getContent()) === 'string') {\r\n            var content = file.getContent();\r\n            //包含html基本结构的入口文件\r\n            var isEntryFile = (~content.indexOf('/html') || ~content.indexOf('/HTML')) && (~content.indexOf('/head') || ~content.indexOf('/HEAD')) && (~content.indexOf('/body') || ~content.indexOf('/BODY'));\r\n\r\n            //html入口文件(非-debug调试文件)才combo\r\n            if (useCombo && /\\.(html|ftl|tpl)/.test(file.rExt) && !/-debug$/.test(file.filename) && isEntryFile) {\r\n\r\n                //模块化合包处理\r\n                content = content.replace(modulesComboRegExp, function(comboContent) {\r\n                    var temConfigStr = '';\r\n                    var strUrl = '<!-- gfis:combo:begin -->';\r\n                    var paths = null;\r\n                    var temRegExp = requireConfigExp;\r\n\r\n                    //sea的处理\r\n                    if(seaConfigExp.test(content)) {\r\n                        temRegExp = seaConfigExp;\r\n                    }\r\n                    comboContent.replace(temRegExp,function(all, configStr){\r\n                        temConfigStr = configStr;\r\n                    })\r\n                    if(!temConfigStr) {return comboContent};\r\n                    var mConfig = superParseJson(temConfigStr);\r\n                    paths = mConfig.paths || mConfig.alias;\r\n                    for(var attr in paths) {\r\n                        strUrl += '<script src=\"'+ paths[attr] +'.js\"></script>'\r\n                    }\r\n                    \r\n                    return strUrl+'<!-- gfis:combo:end -->';\r\n                })\r\n                content = content.replace(comboRegExp, function(comboContent) {\r\n                    var comboTag = '';\r\n                    var domain = '';\r\n                    var pathArray = [];\r\n                    var urlArray = [];\r\n\r\n                    //link标签combo\r\n                    if (linkTagRegExp.test(comboContent)) {\r\n                        comboTag = comboLinkTag;\r\n                        urlArray = comboContent.match(linkTagRegExp).map(function(value) {\r\n                            //提取url并去除url首尾引号\r\n                            return value.replace(linkTagRegExp, '$1').slice(1, -1);\r\n                        });\r\n                    }\r\n                    //script标签combo\r\n                    if (scriptTagRegExp.test(comboContent)) {\r\n                        comboTag = comboScriptTag;\r\n                        urlArray = comboContent.match(scriptTagRegExp).map(function(value) {\r\n                            //提取url并去除url首尾引号\r\n                            return value.replace(scriptTagRegExp, '$1').slice(1, -1);\r\n                        });\r\n                    }\r\n\r\n                    urlArray.forEach(function(url, index) {\r\n                        if (index === 0 && !ssiTagRegExp.test(url)) {\r\n                            //以常量，http,https,//开头的域名\r\n                            if (domainRegExp.test(url)) {\r\n                                domain = url.match(domainRegExp)[0];\r\n                            }\r\n                        }\r\n\r\n                        var path = url.replace(domainRegExp, '').replace(/^\\//, '');\r\n                        pathArray.push(path);\r\n                    });\r\n\r\n                    //如果domain为空，说明ssi为第一个，则不添加域名\r\n                    var comboUrl = domain + (domain !== '' ? comboUrlDelimiter : '') + pathArray.join(comboQueryDelimiter);\r\n                    comboTag = comboTag.replace('COMBO_URL', comboUrl);\r\n\r\n                    return comboTag;\r\n                });\r\n\r\n                file.setContent(content);\r\n            }\r\n        }\r\n    });\r\n    next();\r\n};\r\n\r\n/**\r\n * superParseJson 用于处理把字符串json转换成json对象\r\n * @param  {String} jsonStr 字符串json\r\n * @return  {Json}  json对象\r\n */\r\nfunction superParseJson(jsonStr) {\r\n    return JSON.parse(jsonStr.replace(/\\s*/g, '').replace(/,(}|])/g, '$1').replace(/'/g, '\"').replace(/(\\w+):/g, '\"$1\":'));\r\n}\r\n"]}