From 759aa12d2bb0d1d6bddba1aef2487f9d5e862b11 Mon Sep 17 00:00:00 2001 From: Josh Hunt Date: Fri, 25 Apr 2025 22:07:43 +0100 Subject: [PATCH] Revert "Build swagger ui in seperate webpack build" (#104580) Revert "Build swagger ui in seperate webpack build (#102046)" This reverts commit 314e337d76df9adcecfd30f4a302fa9d73e56da9. --- .gitignore | 1 - Makefile | 1 - go.work.sum | 2 - package.json | 1 - pkg/api/dtos/index.go | 8 + pkg/api/frontendsettings.go | 2 +- pkg/api/index.go | 2 +- pkg/api/swagger.go | 2 +- .../testdata/sample-assets-manifest.json | 142 ++++++++++++++---- pkg/api/webassets/webassets.go | 52 +++++-- pkg/api/webassets/webassets_test.go | 110 +++++++++++--- pkg/middleware/recovery.go | 2 +- pkg/services/frontend/index.go | 2 +- project.json | 11 -- public/views/swagger.html | 7 +- scripts/webpack/webpack.common.js | 1 + scripts/webpack/webpack.swagger.js | 27 ---- 17 files changed, 258 insertions(+), 115 deletions(-) delete mode 100644 scripts/webpack/webpack.swagger.js diff --git a/.gitignore b/.gitignore index 285c839f370..5ddb7c03ed1 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,6 @@ awsconfig /.awcache /dist /public/build -/public/build-swagger /emails/dist /reports /e2e/tmp diff --git a/Makefile b/Makefile index 7d7b366aa76..60763468e11 100644 --- a/Makefile +++ b/Makefile @@ -471,7 +471,6 @@ clean: ## Clean up intermediate build artifacts. @echo "cleaning" rm -rf node_modules rm -rf public/build - rm -rf public/build-swagger .PHONY: gen-ts gen-ts: diff --git a/go.work.sum b/go.work.sum index 29ca90c46f7..60f369552b9 100644 --- a/go.work.sum +++ b/go.work.sum @@ -826,7 +826,6 @@ github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creasty/defaults v1.8.0 h1:z27FJxCAa0JKt3utc0sCImAEb+spPucmKoOdLHvHYKk= github.com/creasty/defaults v1.8.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo= @@ -1076,7 +1075,6 @@ github.com/google/renameio/v2 v2.0.0 h1:UifI23ZTGY8Tt29JbYFiuyIU3eX+RNFtUwefq9qA github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/googleapis/cloud-bigtable-clients-test v0.0.2 h1:S+sCHWAiAc+urcEnvg5JYJUOdlQEm/SEzQ/c/IdAH5M= github.com/googleapis/cloud-bigtable-clients-test v0.0.2/go.mod h1:mk3CrkrouRgtnhID6UZQDK3DrFFa7cYCAJcEmNsHYrY= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= diff --git a/package.json b/package.json index 041d7dd474b..1fb6e4e45f5 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,6 @@ "stats": "webpack --mode production --config scripts/webpack/webpack.prod.js --profile --json > compilation-stats.json", "storybook": "yarn workspace @grafana/ui storybook --ci", "storybook:build": "yarn workspace @grafana/ui storybook:build", - "swaggerui:build": "webpack --config scripts/webpack/webpack.swagger.js --progress", "themes-generate": "esbuild --target=es6 ./scripts/cli/generateSassVariableFiles.ts --bundle --platform=node --tsconfig=./scripts/cli/tsconfig.json | node", "themes:usage": "eslint . --ignore-pattern '*.test.ts*' --ignore-pattern '*.spec.ts*' --cache --plugin '@grafana' --rule '{ @grafana/theme-token-usage: \"error\" }'", "typecheck": "tsc --noEmit && yarn run packages:typecheck", diff --git a/pkg/api/dtos/index.go b/pkg/api/dtos/index.go index ad24aeb9033..2a55017e613 100644 --- a/pkg/api/dtos/index.go +++ b/pkg/api/dtos/index.go @@ -42,6 +42,8 @@ type EntryPointAssets struct { CSSFiles []EntryPointAsset `json:"cssFiles"` Dark string `json:"dark"` Light string `json:"light"` + Swagger []EntryPointAsset `json:"swagger"` + SwaggerCSSFiles []EntryPointAsset `json:"swaggerCssFiles"` } type EntryPointAsset struct { @@ -62,4 +64,10 @@ func (a *EntryPointAssets) SetContentDeliveryURL(prefix string) { for i, p := range a.CSSFiles { a.CSSFiles[i].FilePath = prefix + p.FilePath } + for i, p := range a.Swagger { + a.Swagger[i].FilePath = prefix + p.FilePath + } + for i, p := range a.SwaggerCSSFiles { + a.SwaggerCSSFiles[i].FilePath = prefix + p.FilePath + } } diff --git a/pkg/api/frontendsettings.go b/pkg/api/frontendsettings.go index 6a001ea44a2..5333033d2bc 100644 --- a/pkg/api/frontendsettings.go +++ b/pkg/api/frontendsettings.go @@ -73,7 +73,7 @@ func (hs *HTTPServer) GetFrontendAssets(c *contextmodel.ReqContext) { // Assets hash.Reset() - dto, err := webassets.GetWebAssets(c.Req.Context(), "build", hs.Cfg, hs.License) + dto, err := webassets.GetWebAssets(c.Req.Context(), hs.Cfg, hs.License) if err == nil && dto != nil { _, _ = hash.Write([]byte(dto.ContentDeliveryURL)) _, _ = hash.Write([]byte(dto.Dark)) diff --git a/pkg/api/index.go b/pkg/api/index.go index fe2e426e3bd..016a78366c6 100644 --- a/pkg/api/index.go +++ b/pkg/api/index.go @@ -114,7 +114,7 @@ func (hs *HTTPServer) setIndexViewData(c *contextmodel.ReqContext) (*dtos.IndexV } theme := hs.getThemeForIndexData(prefs.Theme, urlPrefs.Theme) - assets, err := webassets.GetWebAssets(c.Req.Context(), "build", hs.Cfg, hs.License) + assets, err := webassets.GetWebAssets(c.Req.Context(), hs.Cfg, hs.License) if err != nil { return nil, err } diff --git a/pkg/api/swagger.go b/pkg/api/swagger.go index c35b08645bd..6e34efdf82a 100644 --- a/pkg/api/swagger.go +++ b/pkg/api/swagger.go @@ -23,7 +23,7 @@ func (hs *HTTPServer) registerSwaggerUI(r routing.RouteRegister) { // The swagger based api navigator r.Get("/swagger", func(c *contextmodel.ReqContext) { ctx := c.Req.Context() - assets, err := webassets.GetWebAssets(ctx, "build-swagger", hs.Cfg, hs.License) + assets, err := webassets.GetWebAssets(ctx, hs.Cfg, hs.License) if err != nil { errhttp.Write(ctx, err, c.Resp) return diff --git a/pkg/api/webassets/testdata/sample-assets-manifest.json b/pkg/api/webassets/testdata/sample-assets-manifest.json index 03ba91f1aeb..7e6791143a0 100644 --- a/pkg/api/webassets/testdata/sample-assets-manifest.json +++ b/pkg/api/webassets/testdata/sample-assets-manifest.json @@ -1,49 +1,135 @@ { - "1085.e73a523ceed532bcdab0.js": { - "src": "public/build/runtime.d0d77f9ceac402028085.js", - "integrity": "sha384-AAAA" + "AdminAuthentication.js": { + "src": "public/build/AdminAuthentication.abcc504db867d1fa3469.js", + "integrity": "sha256-GtJEBbWfWAU2h2hoW+OiHUHNhHuKDzJ6mBEsVKyRc6M= sha384-SfBCROVbdjMZbxWZzYcYq1Ur4qVOmMgCQwRj9rc23op01045mOoRnCSwnENSNnhY sha512-RwKiHjN7M4Wf5BtO0nKFMoZTp0mCPVttkg4SU76+93VVdf8XEnTIpM6Trd+v4GX37wNrWEd34lh/Xaidq5t33g==" }, - "1085.0549a3fcb50e73c4b256.js": { - "src": "public/build/6029.0549a3fcb50e73c4b256.js", - "integrity": "sha384-BBBB" + "AdminEditOrgPage.js": { + "src": "public/build/AdminEditOrgPage.960dc1174d73f4fd46c3.js", + "integrity": "sha256-y9TYWD3xHk5MQiBpvSpKvFgtp7yHovE0hfrUppxsQuw= sha384-kCrsPv6DmRzbRW/ajBaGu5X67nNRRAuOaZZYONCm8YA6KQclrEHG8navPSsMROnk sha512-2oE8w7f0s/vo6SOgDteuYSvuvAAjqMFjPpD4t7b11sah4B007L9dIVs9MF3jTSKsSHlG61hK6L2QCgv+9FtrFg==" }, - "1085.ab25b0e84da80ffc7244.js": { - "src": "public/build/grafana.app.ab25b0e84da80ffc7244.css", - "integrity": "sha384-CCCC" + "AdminFeatureTogglesPage.js": { + "src": "public/build/AdminFeatureTogglesPage.999db7797f1efddde074.js", + "integrity": "sha256-fhZz2BcvirKLQlxqcEprDplsSRAWYu+FiZWMRtFig1g= sha384-V2e+1wmlsKjorbNlJNzDfizXd1E4q8VpqaIX8S8FkumdZwFPPCXMsnHd77rjFKks sha512-LSiPxyiP0tmZ7fS/QOQBnC98pqgLDSATU0V9He5ubNEgziolxd/XmqoSDTGtp1WWZfjDxW6SUoKVmwstc0VzxA==" + }, + "AdminListOrgsPage.js": { + "src": "public/build/AdminListOrgsPage.c573cf876050fc991990.js", + "integrity": "sha256-RSxk6cc52+j9cITdwi4k5lgzER+sKF7Mx5pn6atMYdE= sha384-xE53wdhi0O9e9A+9NKHGlvJgEeSew6ooXYl6oS8e5Qq9slP2TQygvO48/3CCYWJM sha512-YfXZHm9jyZbHAzcAimOv96ZJWEpQrzjZPxxvyVZZVPfB/8Z1FL7rhKhk0HGIhufXTTLhobZp/9CkFKT4no7zTA==" + }, + "AdminSettings.js": { + "src": "public/build/AdminSettings.cfdfc2e959a29968d661.js", + "integrity": "sha256-v/5L4MXpTnSZXjApozisGbt+y+DPfpjWhH3D6bY83zE= sha384-FTIo/3tLgPKqgxwpxXSa8SLoU5hz4HJcgrVgXD2g06/GUnBFLrJcN3lYqYrvsgLu sha512-kBBoMB2XBtXM/iWW0zAFdI9O3ggetQZdpj6LhsiPDLy9pwRhwPQlnwZjlFkJMMEX0YK2uYl3dn9DUUyTKjtVMg==" + }, + "AlertAmRoutes.js": { + "src": "public/build/AlertAmRoutes.bd900447d272cba91413.js", + "integrity": "sha256-K6hY1ruuidLNg5aYV4XZVBpTFCcS7T2q4b1mF9lPOf4= sha384-SFNQUdxgwLjHW/JsukI7Juhs6f2+qdxMCNbsD4ix3Ha44HbiXTKPBTmvxMl4r+CS sha512-eSrh2wrOXlLp9bXd+0zsZS4v8xjJTufSi0Kfgx0FSB8WhnjhOnIOX37wszsV00w1AwyO6VE6yN3q2PGTrpUoeg==" + }, + "AlertGroups.js": { + "src": "public/build/AlertGroups.d04aee7a0d92a3726e5c.js", + "integrity": "sha256-GrsAPOHbrj3qJx97ugYdqF7fEtD1KU+VGZC9EnCzXhM= sha384-WjJwpX218WLCpDgRSkYbHvwjFy0ttlIb9fYpG0pLDgRu9iYQKBZXaYMU9PDKB4Iu sha512-hpE6YahXnP4RSOJ3Xd+oS55gmtDWHDnMrDNr2UOXpWbLuQQJu8e8uRAW5cIBl8u2S63F1SC1vGx6d535hECq2A==" + }, + "AlertRuleListIndex.js": { + "src": "public/build/AlertRuleListIndex.4682f9ab8dd5a8e68722.js", + "integrity": "sha256-xlMu10aTkvXAw8hmtsaEZXTrAqQjaglNkwS6GLRISnU= sha384-hTb2gf6p1Q/M7fULhnDzGOlVjuYjnrVAJCrQ+yNNr0T0EWZkJ+yxrjNh9Q7/9F+G sha512-8xMEU7qfa+rlm62FHWYFb4JNN3E0WNqbhjVdNA2Awq+ZbhSHuzb4XPnmDJoOzakZoG1s+ZgK7GL1wSXBrKbPkw==" + }, + "AlertSilences.js": { + "src": "public/build/AlertSilences.84de2bedd3634a40f4a4.js", + "integrity": "sha256-LamykmTC703pkL5q7hPdOp9zTQWn6ZsMKzRv7v35ubU= sha384-VWDeB7KZFOYL0RWBBXcmvzKds+Yxn2cDU8fSo4Srg165GY29s8+jO6sEG6OY9zj9 sha512-UvlIwoREIwdwkRWdut8+p+GGRgWTyAijW3pNQ1lQRUE8wGNYqBuHa1lGK6Jq4mmhkp1Pqo4/iI4Uk7vrbYFKow==" + }, + "app.css": { + "src": "public/build/grafana.app.91aaa9d81398c147a57c.css", + "integrity": "sha256-77rfikk+dYkH82TOmcmleVoDOHZQdhzVX9gDLcgPbtQ= sha384-IOTlZ1IvTVq5ekKLoaE3/SoZ12K1eExOAnSw9BzkgQ3+RcyQpb1S5hO2w//IIkRB sha512-0Ct3uJBFQIkyxYTvMxseA1cphe2RivXQ2MCbiV0hEm5NzWPiY9sq2P4ay5dXz5v35c++4W47KaknoWlc83bQJQ==" + }, + "app.js": { + "src": "public/build/app.js", + "integrity": "sha256-IOZKp3piC3vddDXP5jy5rIw0vb0KKEOg/k9EGrIxskk= sha384-CBNr5W0pJ23LQMnz5BZI1iVBIExOmF/wpqkEnBtYu9R/yYJIzjpv8KT0a3TBulOi sha512-ockzlzgosuZvLittZrSzh8lexEIZF9iKpy6J9Ii4es3e4D34FpWhHJhDZGpxLVraX4ypLofrDp2Yy0sdUbdi7w==" + }, + "dark.css": { + "src": "public/build/grafana.dark.722d809dba5a31f57d49.css", + "integrity": "sha256-kyPBeKRFdG+i4aLA6vZ0nIkSD25YTHjcCfQ3e2+M6AA= sha384-o2yYT3suDP1EtvTj4UzLsSS+AAlv0F+n5YVaxDePRM6LSGAEPTxFOfxB3myAqD/x sha512-H3Eos9Ff7d+tB7e+6RORDXY49LjNMa8X3ZxiFn8T/OlHUFRnsfXsvj65p9cMqaRom/4qqx0JtmhtnuBoeaysrg==" + }, + "dark.js": { + "src": "public/build/dark.js", + "integrity": "sha256-ON8tNAimyYNoju+WIQP7ux1Aq/oYspSbqoOKvVkeEJY= sha384-figjklDEMn19kCLZ9aq9pUeMGVOC3nlFkQI0PT016cep5KvAd4nyrAl4WA1MALHX sha512-P1xsw+PNS2AVneN4UFfYhYiS3FeEIDPAj4VXAjiQtHqw7qLETqv2K0sYRogoXma23Q/b+h3VL+fw6qtwhJ8WCQ==" + }, + "default-packages_grafana-data_src_field_fieldComparers_ts-packages_grafana-data_src_transform-9dcf20.js": { + "src": "public/build/default-packages_grafana-data_src_field_fieldComparers_ts-packages_grafana-data_src_transform-9dcf20.js", + "integrity": "sha256-BfaH57oBHA9HC5GwpCNAREwyuEGsxbPR+eOEarSMqr0= sha384-elHEqjfd9Guir6jsvCIBsh/wCF4oJ6/wTFfgK9TsKyfyUJecmK3y1qlczBevMotL sha512-92Uk9x490/MViSclM7PjI6iQrM3FNRuiHGP5CWqNFjKX7PWLTcBirSs1xkoZ3tc0QG0m+klaJg6eNVEvpF25dQ==" + }, + "default-packages_grafana-schema_src_raw_composable_barchart_panelcfg_x_BarChartPanelCfg_types-d3da31.js": { + "src": "public/build/default-packages_grafana-schema_src_raw_composable_barchart_panelcfg_x_BarChartPanelCfg_types-d3da31.js", + "integrity": "sha256-elDlrzSExWWpznC49+xQWQletnWQ1Fl6VaarANz2oLk= sha384-2UdE8X6NbOjt/i0WXpvew+eSBXKSTySfFdfxrIrALT0erSyvdbB9oASWPfRuTZyi sha512-so/nTAcSfmcReoZrJUusUbj6xxtGdrKiJ50n0CMZ1yqBh2hB7Y15s4POeX8axeJTNlo59wJ5GAbsdVTy4c0QhA==" + }, + "default-packages_grafana-ui_src_components_Layout_Stack_Stack_tsx-packages_grafana-ui_src_com-2a3620.js": { + "src": "public/build/default-packages_grafana-ui_src_components_Layout_Stack_Stack_tsx-packages_grafana-ui_src_com-2a3620.js", + "integrity": "sha256-+0bPuBGKFGglkXvW4oPiolrNveozRLZVLUrbCYsbVcM= sha384-EIayAgykdDWmyilAuXo4ad96v3tRqdWZp+BHdeDpSSsbAMeg+eoBBbk2Yh219kDg sha512-+jn7kmQ9Id8aTIe66TD+vM+W19cTIVexEfkxbxgqXdJyJ72qalN6ccWyP1ro1w/E1R/laZGNLz1LBc1I4u2Isw==" + }, + "defaultVendors-node_modules_braintree_sanitize-url_dist_index_js-node_modules_emotion_css_dis-e9d917.js": { + "src": "public/build/defaultVendors-node_modules_braintree_sanitize-url_dist_index_js-node_modules_emotion_css_dis-e9d917.js", + "integrity": "sha256-6et8tLQscwAftNYIM4u8L42Xi+tFIlkPsKIlyATTuY4= sha384-9AKIelnSKqxpMktU6Fw1uE1Kz6ZuEtI2ExvQ1PTjwPmpAE41LS6WxQ3pSV6qlLyz sha512-zcqwJExa8qzqZ1cCIK/y+HrWhJxP6rgSC+SbqxRStQUZrU4S1DQa1pwe6eSoZ4DPht/8rSeIii1wnl3DyhdVVg==" + }, + "defaultVendors-node_modules_fingerprintjs_fingerprintjs_dist_fp_esm_js-node_modules_grafana_e-45bb7f.js": { + "src": "public/build/defaultVendors-node_modules_fingerprintjs_fingerprintjs_dist_fp_esm_js-node_modules_grafana_e-45bb7f.js", + "integrity": "sha256-bVtkMWml/TQfwbkV9ueteGi+GhLh7ajxtVevi3gb4Aw= sha384-8+VsDObIkyeW90JyQELbiOsPKFJaBOmScMhBuWKmhtBmV9/7YvjIvqEPvpz1H5gP sha512-L3PzrsTEqfR+ruNzEaIqt0V0ZyX4V1fqbOe7aXWMIOr8JjJSJT1rMPVqJixy5DOL2f0zLDEc/DJvk4SN4BrDuw==" + }, + "defaultVendors-node_modules_swagger-ui-react_index_mjs.js": { + "src": "public/build/defaultVendors-node_modules_swagger-ui-react_index_mjs.js", + "integrity": "sha256-7qtYNxawpAwQUd6KR+2IgH95hkr0w5hZLGFeubAUkcc= sha384-29fQncD6F/vaoKmk4Ccht9JbnrPo2BSyUdHSkTkF4RWEFkhgVEUo1TlSTDc3iOcd sha512-UhXtPd5nXyvyVR0vNYoO5wINJgb49oeYoqfnNaVQndg3n9uIvPi4lr3iUk/jkBsnVH1dEDWiZIErDPiTyHe4+w==" + }, + "light.css": { + "src": "public/build/grafana.light.2fbd901d840329c18394.css", + "integrity": "sha256-OumSnRJ7qttDoFmbB3LMxVvrfpFFjABX5b1iZDcRMmk= sha384-Cq4wA1zPU1cqxA/pc2V+iMwVjzsSdL09vM8xg4fSofGen7YIj6sVUgs2X4AdTzm/ sha512-6J9O/4UFL8undkyqbEGAlNnEjm5N8Us5k9rJdcjhZwYKt1UIKXapw8f320k3tv1N0GB0Wt4xO6EKD9MsrIkCSw==" + }, + "light.js": { + "src": "public/build/light.js", + "integrity": "sha256-TDwcqlc6Pc8yTRNLOk0jp3Wnp06cnF/OSaFvwOnwCVQ= sha384-xJv6KB8Qm9Skru8PY5CRdU9a59e94tcYWonpy5rqaci6fiecQM3aH+eHe41succB sha512-sPXciUAa7rpRofN6b93v9+tWpLP88ER6TqAGpbHkz69mxuQLJv1p580fEfxLeIs3HfLkDXnVPK7rGF0d5Evrog==" + }, + "moment-node_modules_moment_locale_af_js-node_modules_moment_locale_ar-dz_js-node_modules_mome-ddcc36.js": { + "src": "public/build/moment-node_modules_moment_locale_af_js-node_modules_moment_locale_ar-dz_js-node_modules_mome-ddcc36.js", + "integrity": "sha256-BvrNPeEZbt43PpUlZ4r5pUougn3OzHIHKZN9pa5fotw= sha384-gMrZ0j/kyHwx2bhyt5ZjZOPlK7P7TRN6rBnk/0c9iF2X83GVTWNjhHcldmlYJXnf sha512-B+39Sk+Rwdo9hURcDoWL/61/sbMsTlqfES+FCsMC1r2xUH/Fyw/U2H0CgIi+c3AJyu1GLEvp//QBN0RZxaizhw==" + }, + "runtime.js": { + "src": "public/build/runtime.js", + "integrity": "sha256-tM4AGASn3Cb8139+wp3w6rlo3ELFAuUW7K4Pifx226o= sha384-DfxxsYWb0+RxiXOr+wtCSzAAYGecffq/iHyn6CN9tHmaORv1sS+rsrnlnJo2jPQD sha512-qSxdqrx0mJLY1mdkbKrkCyqOoIEgFqzCoY9+uIuFRIVDPFbb2nJy0NtaKMQvDJnAzIrJFwzwW1e250T4WqQNiQ==" + }, + "swagger.css": { + "src": "public/build/grafana.swagger.2733d417270d5dd49373.css", + "integrity": "sha256-GNcHNgIAT7S+J4X7seFjlvNPC1bRhM15d0cQBm3VFoQ= sha384-ywztCBf8uF0tTFjC1mLth33RI2WuFURN3dRy7Bv2PheGzbWJpwlgo9+mtT2Zm7mO sha512-e4c+VedZGqcwLqwfdqRWonggRPO0gjJ7Z0YbXK5z4bFTsUIc+x8ycIJG+eQaf8cuHlsakG4hkWNkRwLBazcFAg==" + }, + "swagger.js": { + "src": "public/build/swagger.js", + "integrity": "sha256-wLlip7zRYODW/TPcI5JZPRdmWirc1KD+UcNF+8V9RBk= sha384-6VGD+LgCpjMZN/ORSjWcrWa9diUzQO3OfEhP0D2ZluSwP4IT+0kH7KEeD9NVbojd sha512-vZOCFzBZBhd34yGv8z7P4Gw4WLVR9HjpuK0y6Kcw+pCBk5Dv9qHBg3ZVs6s0tOnUmiMWwgL4Ne8f+zgiuJVPqg==" }, "entrypoints": { "app": { "assets": { "js": [ - "public/build/runtime.d0d77f9ceac402028085.js", - "public/build/6029.0549a3fcb50e73c4b256.js" + "public/build/runtime.js", + "public/build/default-packages_grafana-ui_src_components_Layout_Stack_Stack_tsx-packages_grafana-ui_src_com-2a3620.js", + "public/build/app.js" ], - "css": [ - "public/build/grafana.app.ab25b0e84da80ffc7244.css" - ] + "css": ["public/build/grafana.app.91aaa9d81398c147a57c.css"] } }, - "dark": { + "swagger": { "assets": { "js": [ - "public/build/runtime.d0d77f9ceac402028085.js", - "public/build/dark.d9196c1e81619cd5ae4f.js" + "public/build/runtime.js", + "public/build/swagger.js" ], - "css": [ - "public/build/grafana.dark.23c5425b7a9e1580d499.css" - ] + "css": ["public/build/grafana.swagger.2733d417270d5dd49373.css"] + } + }, + "dark": { + "assets": { + "js": ["public/build/runtime.js", "public/build/dark.js"], + "css": ["public/build/grafana.dark.722d809dba5a31f57d49.css"] } }, "light": { "assets": { - "js": [ - "public/build/runtime.d0d77f9ceac402028085.js", - "public/build/light.6f4baca9576edc9c2e5b.js" - ], - "css": [ - "public/build/grafana.light.7fb85ddc153a7c559092.css" - ] + "js": ["public/build/runtime.js", "public/build/light.js"], + "css": ["public/build/grafana.light.2fbd901d840329c18394.css"] } } } -} \ No newline at end of file +} diff --git a/pkg/api/webassets/webassets.go b/pkg/api/webassets/webassets.go index bdab5665ba6..b0cd7ab09c9 100644 --- a/pkg/api/webassets/webassets.go +++ b/pkg/api/webassets/webassets.go @@ -20,9 +20,10 @@ type ManifestInfo struct { Integrity string `json:"integrity,omitempty"` // The known entrypoints - App *EntryPointInfo `json:"app,omitempty"` - Dark *EntryPointInfo `json:"dark,omitempty"` - Light *EntryPointInfo `json:"light,omitempty"` + App *EntryPointInfo `json:"app,omitempty"` + Dark *EntryPointInfo `json:"dark,omitempty"` + Light *EntryPointInfo `json:"light,omitempty"` + Swagger *EntryPointInfo `json:"swagger,omitempty"` } type EntryPointInfo struct { @@ -37,7 +38,7 @@ var ( entryPointAssetsCache *dtos.EntryPointAssets // TODO: get rid of global state ) -func GetWebAssets(ctx context.Context, build string, cfg *setting.Cfg, license licensing.Licensing) (*dtos.EntryPointAssets, error) { +func GetWebAssets(ctx context.Context, cfg *setting.Cfg, license licensing.Licensing) (*dtos.EntryPointAssets, error) { entryPointAssetsCacheMu.RLock() ret := entryPointAssetsCache entryPointAssetsCacheMu.RUnlock() @@ -53,11 +54,11 @@ func GetWebAssets(ctx context.Context, build string, cfg *setting.Cfg, license l cdn := "" // "https://grafana-assets.grafana.net/grafana/10.3.0-64123/" if cdn != "" { - result, err = readWebAssetsFromCDN(ctx, build, cdn) + result, err = readWebAssetsFromCDN(ctx, cdn) } if result == nil { - result, err = readWebAssetsFromFile(filepath.Join(cfg.StaticRootPath, build, "assets-manifest.json")) + result, err = readWebAssetsFromFile(filepath.Join(cfg.StaticRootPath, "build", "assets-manifest.json")) if err == nil { cdn, _ = cfg.GetContentDeliveryURL(license.ContentDeliveryPrefix()) if cdn != "" { @@ -82,8 +83,8 @@ func readWebAssetsFromFile(manifestpath string) (*dtos.EntryPointAssets, error) return readWebAssets(f) } -func readWebAssetsFromCDN(ctx context.Context, build string, baseURL string) (*dtos.EntryPointAssets, error) { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, baseURL+"public/"+build+"/assets-manifest.json", nil) +func readWebAssetsFromCDN(ctx context.Context, baseURL string) (*dtos.EntryPointAssets, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, baseURL+"public/build/assets-manifest.json", nil) if err != nil { return nil, err } @@ -122,16 +123,23 @@ func readWebAssets(r io.Reader) (*dtos.EntryPointAssets, error) { if entryPoints.App == nil || len(entryPoints.App.Assets.JS) == 0 { return nil, fmt.Errorf("missing app entry, try running `yarn build`") } - - rsp := &dtos.EntryPointAssets{ - JSFiles: make([]dtos.EntryPointAsset, 0, len(entryPoints.App.Assets.JS)), - CSSFiles: make([]dtos.EntryPointAsset, 0, len(entryPoints.App.Assets.CSS)), + if entryPoints.Dark == nil || len(entryPoints.Dark.Assets.CSS) == 0 { + return nil, fmt.Errorf("missing dark entry, try running `yarn build`") } - if entryPoints.Dark != nil && len(entryPoints.Dark.Assets.CSS) > 0 { - rsp.Dark = entryPoints.Dark.Assets.CSS[0] + if entryPoints.Light == nil || len(entryPoints.Light.Assets.CSS) == 0 { + return nil, fmt.Errorf("missing light entry, try running `yarn build`") } - if entryPoints.Light != nil && len(entryPoints.Light.Assets.CSS) > 0 { - rsp.Light = entryPoints.Light.Assets.CSS[0] + if entryPoints.Swagger == nil || len(entryPoints.Swagger.Assets.JS) == 0 { + return nil, fmt.Errorf("missing swagger entry, try running `yarn build`") + } + + rsp := &dtos.EntryPointAssets{ + JSFiles: make([]dtos.EntryPointAsset, 0, len(entryPoints.App.Assets.JS)), + CSSFiles: make([]dtos.EntryPointAsset, 0, len(entryPoints.App.Assets.CSS)), + Dark: entryPoints.Dark.Assets.CSS[0], + Light: entryPoints.Light.Assets.CSS[0], + Swagger: make([]dtos.EntryPointAsset, 0, len(entryPoints.Swagger.Assets.JS)), + SwaggerCSSFiles: make([]dtos.EntryPointAsset, 0, len(entryPoints.Swagger.Assets.CSS)), } for _, entry := range entryPoints.App.Assets.JS { @@ -146,5 +154,17 @@ func readWebAssets(r io.Reader) (*dtos.EntryPointAssets, error) { Integrity: integrity[entry], }) } + for _, entry := range entryPoints.Swagger.Assets.JS { + rsp.Swagger = append(rsp.Swagger, dtos.EntryPointAsset{ + FilePath: entry, + Integrity: integrity[entry], + }) + } + for _, entry := range entryPoints.Swagger.Assets.CSS { + rsp.SwaggerCSSFiles = append(rsp.SwaggerCSSFiles, dtos.EntryPointAsset{ + FilePath: entry, + Integrity: integrity[entry], + }) + } return rsp, nil } diff --git a/pkg/api/webassets/webassets_test.go b/pkg/api/webassets/webassets_test.go index 65e89217285..b4bb5c25d70 100644 --- a/pkg/api/webassets/webassets_test.go +++ b/pkg/api/webassets/webassets_test.go @@ -3,6 +3,7 @@ package webassets import ( "context" "encoding/json" + "fmt" "testing" "github.com/stretchr/testify/require" @@ -15,32 +16,101 @@ func TestReadWebassets(t *testing.T) { dto, err := json.MarshalIndent(assets, "", " ") require.NoError(t, err) // fmt.Printf("%s\n", string(dto)) + + require.JSONEq(t, `{ + "jsFiles": [ + { + "filePath": "public/build/runtime.js", + "integrity": "sha256-tM4AGASn3Cb8139+wp3w6rlo3ELFAuUW7K4Pifx226o= sha384-DfxxsYWb0+RxiXOr+wtCSzAAYGecffq/iHyn6CN9tHmaORv1sS+rsrnlnJo2jPQD sha512-qSxdqrx0mJLY1mdkbKrkCyqOoIEgFqzCoY9+uIuFRIVDPFbb2nJy0NtaKMQvDJnAzIrJFwzwW1e250T4WqQNiQ==" + }, + { + "filePath": "public/build/default-packages_grafana-ui_src_components_Layout_Stack_Stack_tsx-packages_grafana-ui_src_com-2a3620.js", + "integrity": "sha256-+0bPuBGKFGglkXvW4oPiolrNveozRLZVLUrbCYsbVcM= sha384-EIayAgykdDWmyilAuXo4ad96v3tRqdWZp+BHdeDpSSsbAMeg+eoBBbk2Yh219kDg sha512-+jn7kmQ9Id8aTIe66TD+vM+W19cTIVexEfkxbxgqXdJyJ72qalN6ccWyP1ro1w/E1R/laZGNLz1LBc1I4u2Isw==" + }, + { + "filePath": "public/build/app.js", + "integrity": "sha256-IOZKp3piC3vddDXP5jy5rIw0vb0KKEOg/k9EGrIxskk= sha384-CBNr5W0pJ23LQMnz5BZI1iVBIExOmF/wpqkEnBtYu9R/yYJIzjpv8KT0a3TBulOi sha512-ockzlzgosuZvLittZrSzh8lexEIZF9iKpy6J9Ii4es3e4D34FpWhHJhDZGpxLVraX4ypLofrDp2Yy0sdUbdi7w==" + } + ], + "cssFiles": [ + { + "filePath": "public/build/grafana.app.91aaa9d81398c147a57c.css", + "integrity": "sha256-77rfikk+dYkH82TOmcmleVoDOHZQdhzVX9gDLcgPbtQ= sha384-IOTlZ1IvTVq5ekKLoaE3/SoZ12K1eExOAnSw9BzkgQ3+RcyQpb1S5hO2w//IIkRB sha512-0Ct3uJBFQIkyxYTvMxseA1cphe2RivXQ2MCbiV0hEm5NzWPiY9sq2P4ay5dXz5v35c++4W47KaknoWlc83bQJQ==" + } + ], + "dark": "public/build/grafana.dark.722d809dba5a31f57d49.css", + "light": "public/build/grafana.light.2fbd901d840329c18394.css", + "swagger": [ + { + "filePath": "public/build/runtime.js", + "integrity": "sha256-tM4AGASn3Cb8139+wp3w6rlo3ELFAuUW7K4Pifx226o= sha384-DfxxsYWb0+RxiXOr+wtCSzAAYGecffq/iHyn6CN9tHmaORv1sS+rsrnlnJo2jPQD sha512-qSxdqrx0mJLY1mdkbKrkCyqOoIEgFqzCoY9+uIuFRIVDPFbb2nJy0NtaKMQvDJnAzIrJFwzwW1e250T4WqQNiQ==" + }, + { + "filePath": "public/build/swagger.js", + "integrity": "sha256-wLlip7zRYODW/TPcI5JZPRdmWirc1KD+UcNF+8V9RBk= sha384-6VGD+LgCpjMZN/ORSjWcrWa9diUzQO3OfEhP0D2ZluSwP4IT+0kH7KEeD9NVbojd sha512-vZOCFzBZBhd34yGv8z7P4Gw4WLVR9HjpuK0y6Kcw+pCBk5Dv9qHBg3ZVs6s0tOnUmiMWwgL4Ne8f+zgiuJVPqg==" + } + ], + "swaggerCssFiles": [ + { + "filePath": "public/build/grafana.swagger.2733d417270d5dd49373.css", + "integrity": "sha256-GNcHNgIAT7S+J4X7seFjlvNPC1bRhM15d0cQBm3VFoQ= sha384-ywztCBf8uF0tTFjC1mLth33RI2WuFURN3dRy7Bv2PheGzbWJpwlgo9+mtT2Zm7mO sha512-e4c+VedZGqcwLqwfdqRWonggRPO0gjJ7Z0YbXK5z4bFTsUIc+x8ycIJG+eQaf8cuHlsakG4hkWNkRwLBazcFAg==" + } + ] + }`, string(dto)) + + assets.SetContentDeliveryURL("https://grafana-assets.grafana.net/grafana/10.3.0-64123/") + + dto, err = json.MarshalIndent(assets, "", " ") + require.NoError(t, err) + fmt.Printf("%s\n", string(dto)) + require.JSONEq(t, `{ - "jsFiles": [ - { - "filePath": "public/build/runtime.d0d77f9ceac402028085.js", - "integrity": "sha384-AAAA" - }, - { - "filePath": "public/build/6029.0549a3fcb50e73c4b256.js", - "integrity": "sha384-BBBB" - } - ], - "cssFiles": [ - { - "filePath": "public/build/grafana.app.ab25b0e84da80ffc7244.css", - "integrity": "sha384-CCCC" - } - ], - "dark": "public/build/grafana.dark.23c5425b7a9e1580d499.css", - "light": "public/build/grafana.light.7fb85ddc153a7c559092.css" - }`, string(dto)) + "cdn": "https://grafana-assets.grafana.net/grafana/10.3.0-64123/", + "jsFiles": [ + { + "filePath": "https://grafana-assets.grafana.net/grafana/10.3.0-64123/public/build/runtime.js", + "integrity": "sha256-tM4AGASn3Cb8139+wp3w6rlo3ELFAuUW7K4Pifx226o= sha384-DfxxsYWb0+RxiXOr+wtCSzAAYGecffq/iHyn6CN9tHmaORv1sS+rsrnlnJo2jPQD sha512-qSxdqrx0mJLY1mdkbKrkCyqOoIEgFqzCoY9+uIuFRIVDPFbb2nJy0NtaKMQvDJnAzIrJFwzwW1e250T4WqQNiQ==" + }, + { + "filePath": "https://grafana-assets.grafana.net/grafana/10.3.0-64123/public/build/default-packages_grafana-ui_src_components_Layout_Stack_Stack_tsx-packages_grafana-ui_src_com-2a3620.js", + "integrity": "sha256-+0bPuBGKFGglkXvW4oPiolrNveozRLZVLUrbCYsbVcM= sha384-EIayAgykdDWmyilAuXo4ad96v3tRqdWZp+BHdeDpSSsbAMeg+eoBBbk2Yh219kDg sha512-+jn7kmQ9Id8aTIe66TD+vM+W19cTIVexEfkxbxgqXdJyJ72qalN6ccWyP1ro1w/E1R/laZGNLz1LBc1I4u2Isw==" + }, + { + "filePath": "https://grafana-assets.grafana.net/grafana/10.3.0-64123/public/build/app.js", + "integrity": "sha256-IOZKp3piC3vddDXP5jy5rIw0vb0KKEOg/k9EGrIxskk= sha384-CBNr5W0pJ23LQMnz5BZI1iVBIExOmF/wpqkEnBtYu9R/yYJIzjpv8KT0a3TBulOi sha512-ockzlzgosuZvLittZrSzh8lexEIZF9iKpy6J9Ii4es3e4D34FpWhHJhDZGpxLVraX4ypLofrDp2Yy0sdUbdi7w==" + } + ], + "cssFiles": [ + { + "filePath": "https://grafana-assets.grafana.net/grafana/10.3.0-64123/public/build/grafana.app.91aaa9d81398c147a57c.css", + "integrity": "sha256-77rfikk+dYkH82TOmcmleVoDOHZQdhzVX9gDLcgPbtQ= sha384-IOTlZ1IvTVq5ekKLoaE3/SoZ12K1eExOAnSw9BzkgQ3+RcyQpb1S5hO2w//IIkRB sha512-0Ct3uJBFQIkyxYTvMxseA1cphe2RivXQ2MCbiV0hEm5NzWPiY9sq2P4ay5dXz5v35c++4W47KaknoWlc83bQJQ==" + } + ], + "dark": "https://grafana-assets.grafana.net/grafana/10.3.0-64123/public/build/grafana.dark.722d809dba5a31f57d49.css", + "light": "https://grafana-assets.grafana.net/grafana/10.3.0-64123/public/build/grafana.light.2fbd901d840329c18394.css", + "swagger": [ + { + "filePath": "https://grafana-assets.grafana.net/grafana/10.3.0-64123/public/build/runtime.js", + "integrity": "sha256-tM4AGASn3Cb8139+wp3w6rlo3ELFAuUW7K4Pifx226o= sha384-DfxxsYWb0+RxiXOr+wtCSzAAYGecffq/iHyn6CN9tHmaORv1sS+rsrnlnJo2jPQD sha512-qSxdqrx0mJLY1mdkbKrkCyqOoIEgFqzCoY9+uIuFRIVDPFbb2nJy0NtaKMQvDJnAzIrJFwzwW1e250T4WqQNiQ==" + }, + { + "filePath": "https://grafana-assets.grafana.net/grafana/10.3.0-64123/public/build/swagger.js", + "integrity": "sha256-wLlip7zRYODW/TPcI5JZPRdmWirc1KD+UcNF+8V9RBk= sha384-6VGD+LgCpjMZN/ORSjWcrWa9diUzQO3OfEhP0D2ZluSwP4IT+0kH7KEeD9NVbojd sha512-vZOCFzBZBhd34yGv8z7P4Gw4WLVR9HjpuK0y6Kcw+pCBk5Dv9qHBg3ZVs6s0tOnUmiMWwgL4Ne8f+zgiuJVPqg==" + } + ], + "swaggerCssFiles": [ + { + "filePath": "https://grafana-assets.grafana.net/grafana/10.3.0-64123/public/build/grafana.swagger.2733d417270d5dd49373.css", + "integrity": "sha256-GNcHNgIAT7S+J4X7seFjlvNPC1bRhM15d0cQBm3VFoQ= sha384-ywztCBf8uF0tTFjC1mLth33RI2WuFURN3dRy7Bv2PheGzbWJpwlgo9+mtT2Zm7mO sha512-e4c+VedZGqcwLqwfdqRWonggRPO0gjJ7Z0YbXK5z4bFTsUIc+x8ycIJG+eQaf8cuHlsakG4hkWNkRwLBazcFAg==" + } + ] + }`, string(dto)) } func TestReadWebassetsFromCDN(t *testing.T) { t.Skip() - assets, err := readWebAssetsFromCDN(context.Background(), "build", "https://grafana-assets.grafana.net/grafana/10.3.0-64123/") + assets, err := readWebAssetsFromCDN(context.Background(), "https://grafana-assets.grafana.net/grafana/10.3.0-64123/") require.NoError(t, err) dto, err := json.MarshalIndent(assets, "", " ") diff --git a/pkg/middleware/recovery.go b/pkg/middleware/recovery.go index 63c08172c9b..01e07ee8e38 100644 --- a/pkg/middleware/recovery.go +++ b/pkg/middleware/recovery.go @@ -138,7 +138,7 @@ func Recovery(cfg *setting.Cfg, license licensing.Licensing) web.Middleware { return } - assets, _ := webassets.GetWebAssets(req.Context(), "build", cfg, license) + assets, _ := webassets.GetWebAssets(req.Context(), cfg, license) if assets == nil { assets = &dtos.EntryPointAssets{JSFiles: []dtos.EntryPointAsset{}} } diff --git a/pkg/services/frontend/index.go b/pkg/services/frontend/index.go index 037843e0357..4f02bbe1127 100644 --- a/pkg/services/frontend/index.go +++ b/pkg/services/frontend/index.go @@ -49,7 +49,7 @@ var ( ) func NewIndexProvider(cfg *setting.Cfg, license licensing.Licensing) (*IndexProvider, error) { - assets, err := webassets.GetWebAssets(context.Background(), "build", cfg, license) + assets, err := webassets.GetWebAssets(context.Background(), cfg, license) if err != nil { return nil, err } diff --git a/project.json b/project.json index 62ac256bd91..b67053dbbe6 100644 --- a/project.json +++ b/project.json @@ -5,7 +5,6 @@ "targets": { "start": { "dependsOn": [ - "swaggerui:build", "themes-generate", { "projects": ["tag:scope:plugin"], @@ -15,7 +14,6 @@ }, "build": { "dependsOn": [ - "swaggerui:build", "themes-generate", { "projects": ["tag:scope:plugin"], @@ -37,15 +35,6 @@ "{workspaceRoot}/public/sass/_variables.light.generated.scss" ], "cache": true - }, - "swaggerui:build": { - "inputs": [ - "{workspaceRoot}/packages/grafana-ui/src/themes/**", - "{workspaceRoot}/public/app/core/trustedTypePolicies.ts", - "{workspaceRoot}/public/swagger/**" - ], - "outputs": ["{workspaceRoot}/public/build-swagger"], - "cache": true } } } diff --git a/public/views/swagger.html b/public/views/swagger.html index 464fad8a7f5..44e622e0087 100644 --- a/public/views/swagger.html +++ b/public/views/swagger.html @@ -12,9 +12,10 @@ Grafana API Reference - [[range $asset := .Assets.CSSFiles]] + [[range $asset := .Assets.SwaggerCSSFiles]] [[end]] + @@ -26,11 +27,11 @@
- [[range $asset := .Assets.JSFiles]] + [[range $asset := .Assets.Swagger]] [[end]] diff --git a/scripts/webpack/webpack.common.js b/scripts/webpack/webpack.common.js index 37e8c399066..833438bd51a 100644 --- a/scripts/webpack/webpack.common.js +++ b/scripts/webpack/webpack.common.js @@ -7,6 +7,7 @@ module.exports = { target: 'web', entry: { app: './public/app/index.ts', + swagger: './public/swagger/index.tsx', }, experiments: { // Required to load WASM modules. diff --git a/scripts/webpack/webpack.swagger.js b/scripts/webpack/webpack.swagger.js deleted file mode 100644 index 48c3056877d..00000000000 --- a/scripts/webpack/webpack.swagger.js +++ /dev/null @@ -1,27 +0,0 @@ -// @ts-check -const path = require('path'); - -const makeBaseConfig = require('./webpack.prod.js'); - -module.exports = (env = {}) => { - const baseConfig = makeBaseConfig(env); - - return { - ...baseConfig, - - entry: { - app: './public/swagger/index.tsx', - light: './public/sass/grafana.light.scss', - }, - - // Output to a different directory so each build doesn't clobber each other - output: { - ...baseConfig.output, - clean: true, - path: path.resolve(__dirname, '../../public/build-swagger'), - filename: '[name].[contenthash].js', - // Keep publicPath relative for host.com/grafana/ deployments - publicPath: 'public/build-swagger/', - }, - }; -};