diff --git a/framework/src/Volo.Abp.Swashbuckle/Microsoft/AspNetCore/Builder/AbpSwaggerUIBuilderExtensions.cs b/framework/src/Volo.Abp.Swashbuckle/Microsoft/AspNetCore/Builder/AbpSwaggerUIBuilderExtensions.cs index f7d85e32561..b999005f253 100644 --- a/framework/src/Volo.Abp.Swashbuckle/Microsoft/AspNetCore/Builder/AbpSwaggerUIBuilderExtensions.cs +++ b/framework/src/Volo.Abp.Swashbuckle/Microsoft/AspNetCore/Builder/AbpSwaggerUIBuilderExtensions.cs @@ -16,7 +16,6 @@ public static IApplicationBuilder UseAbpSwaggerUI( return app.UseSwaggerUI(options => { options.InjectJavascript("ui/abp.js"); - options.InjectJavascript("ui/abp.swagger.js"); options.IndexStream = () => resolver?.Resolver(); setupAction?.Invoke(options); diff --git a/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/SwaggerHtmlResolver.cs b/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/SwaggerHtmlResolver.cs index f9b39faf1d7..be4ebfe4e8a 100644 --- a/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/SwaggerHtmlResolver.cs +++ b/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/SwaggerHtmlResolver.cs @@ -10,12 +10,14 @@ public class SwaggerHtmlResolver : ISwaggerHtmlResolver, ITransientDependency { public virtual Stream Resolver() { + var scriptBundleScript = ""; + var abpSwaggerScript = ""; var stream = typeof(SwaggerUIOptions).GetTypeInfo().Assembly .GetManifestResourceStream("Swashbuckle.AspNetCore.SwaggerUI.index.html"); var html = new StreamReader(stream!) .ReadToEnd() - .Replace("src=\"index.js\"", "src=\"ui/index.js\""); + .Replace(scriptBundleScript, $"{scriptBundleScript}\n{abpSwaggerScript}"); return new MemoryStream(Encoding.UTF8.GetBytes(html)); } diff --git a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js index 4e8790d38cb..b8abb0df258 100644 --- a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js +++ b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js @@ -1,9 +1,10 @@ var abp = abp || {}; (function () { - - abp.SwaggerUIBundle = function (configObject) { - + + var oldSwaggerUIBundle = SwaggerUIBundle; + + SwaggerUIBundle = function (configObject) { var excludeUrl = ["swagger.json", "connect/token"] var firstRequest = true; var oidcSupportedFlows = configObject.oidcSupportedFlows || []; @@ -109,6 +110,9 @@ var abp = abp || {}; }); } - return SwaggerUIBundle(configObject); + return oldSwaggerUIBundle(configObject); } + + SwaggerUIBundle = Object.assign(SwaggerUIBundle, oldSwaggerUIBundle); + })(); diff --git a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/index.js b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/index.js deleted file mode 100644 index d7b6ebdb535..00000000000 --- a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/index.js +++ /dev/null @@ -1,75 +0,0 @@ -//Copy from https://github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/master/src/Swashbuckle.AspNetCore.SwaggerUI/index.js - -/* Source: https://gist.github.com/lamberta/3768814 - * Parse a string function definition and return a function object. Does not use eval. - * @param {string} str - * @return {function} - * - * Example: - * var f = function (x, y) { return x * y; }; - * var g = parseFunction(f.toString()); - * g(33, 3); //=> 99 - */ -function parseFunction(str) { - if (!str) return void (0); - - var fn_body_idx = str.indexOf('{'), - fn_body = str.substring(fn_body_idx + 1, str.lastIndexOf('}')), - fn_declare = str.substring(0, fn_body_idx), - fn_params = fn_declare.substring(fn_declare.indexOf('(') + 1, fn_declare.lastIndexOf(')')), - args = fn_params.split(','); - - args.push(fn_body); - - function Fn() { - return Function.apply(this, args); - } - Fn.prototype = Function.prototype; - - return new Fn(); -} - -window.onload = function () { - var configObject = JSON.parse('%(ConfigObject)'); - var oauthConfigObject = JSON.parse('%(OAuthConfigObject)'); - - // Workaround for https://github.com/swagger-api/swagger-ui/issues/5945 - configObject.urls.forEach(function (item) { - if (item.url.startsWith("http") || item.url.startsWith("/")) return; - item.url = window.location.href.replace("index.html", item.url).split('#')[0]; - }); - - // If validatorUrl is not explicitly provided, disable the feature by setting to null - if (!configObject.hasOwnProperty("validatorUrl")) - configObject.validatorUrl = null - - // If oauth2RedirectUrl isn't specified, use the built-in default - if (!configObject.hasOwnProperty("oauth2RedirectUrl")) - configObject.oauth2RedirectUrl = (new URL("oauth2-redirect.html", window.location.href)).href; - - // Apply mandatory parameters - configObject.dom_id = "#swagger-ui"; - configObject.presets = [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset]; - configObject.layout = "StandaloneLayout"; - - // Parse and add interceptor functions - var interceptors = JSON.parse('%(Interceptors)'); - if (interceptors.RequestInterceptorFunction) - configObject.requestInterceptor = parseFunction(interceptors.RequestInterceptorFunction); - if (interceptors.ResponseInterceptorFunction) - configObject.responseInterceptor = parseFunction(interceptors.ResponseInterceptorFunction); - - if (configObject.plugins) { - configObject.plugins = configObject.plugins.map(eval); - } - - // Begin Swagger UI call region - - const ui = abp.SwaggerUIBundle(configObject); - - ui.initOAuth(oauthConfigObject); - - // End Swagger UI call region - - window.ui = ui -} \ No newline at end of file