diff --git a/NEWS.md b/NEWS.md
index 27e654f097..c01584e0a7 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -7,6 +7,7 @@
 ## Improvements
 
 * `ggplotly()` now works better with the development version of ggplot2 (> v3.4.4). (#2315, #2368)
+* Create the proper `bundleTraceMap` list as internal package data object directly from the upstream JS file when plotly.js is updated. As a consequence, it's now possible to use the [`strict` bundle](https://github.com/plotly/plotly.js/blob/master/dist/README.md#plotlyjs-strict) via `plotly::partial_bundle(type = "strict")`.
 
 ## Bug fixes
 
diff --git a/R/partial_bundles.R b/R/partial_bundles.R
index fc7a66795e..def7b7bd62 100644
--- a/R/partial_bundles.R
+++ b/R/partial_bundles.R
@@ -87,9 +87,9 @@ verify_partial_bundle <- function(p) {
   
   if (identical(bundleType, "auto")) {
     
-    # resolve an auto bundle by using the 1st bundle that supports all the types
-    # (ordering of bundleTraceMap is important!)
-    for (i in seq_along(bundleTraceMap)) {
+    # resolve an auto bundle by using the 1st bundle that supports all the types,
+    # except for the 'strict' bundle (ordering of bundleTraceMap is important!)
+    for (i in seq_along(bundleTraceMap[names(bundleTraceMap) != "strict"])) {
       if (all(types %in% bundleTraceMap[[i]])) {
         bundleType <- names(bundleTraceMap)[[i]]
         break
@@ -158,59 +158,3 @@ plotlyjsBundleIDX <- function(p) {
 plotlyjsBundle <- function(p) {
   p$dependencies[[plotlyjsBundleIDX(p)]]
 }
-
-# TODO: create this object in inst/plotlyjs.R from the dist/README.md
-bundleTraceMap <- list(
-  basic = c(
-    "scatter",
-    "bar",
-    "pie"
-  ),
-  cartesian = c(
-    "scatter",
-    "bar",
-    "pie",
-    "box",
-    "heatmap",
-    "histogram",
-    "histogram2d",
-    "histogram2dcontour",
-    "contour",
-    "scatterternary",
-    "violin"
-  ),
-  geo = c(
-    "scatter",
-    "scattergeo",
-    "choropleth"
-  ),
-  gl3d = c(
-    "scatter",
-    "scatter3d",
-    "surface",
-    "mesh3d",
-    "cone"
-  ),
-  gl2d = c(
-    "scatter",
-    "scattergl",
-    "splom",
-    "pointcloud",
-    "heatmapgl",
-    "contourgl",
-    "parcoords"
-  ),
-  mapbox = c(
-    "scatter",
-    "scattermapbox"
-  ),
-  finance = c(
-    "scatter",
-    "bar",
-    "pie",
-    "histogram",
-    "ohlc",
-    "candlestick",
-    "waterfall"
-  )
-)
diff --git a/R/sysdata.rda b/R/sysdata.rda
index 5be2b34f3d..769b5374ce 100644
Binary files a/R/sysdata.rda and b/R/sysdata.rda differ
diff --git a/tests/testthat/test-plotly-partial-bundles.R b/tests/testthat/test-plotly-partial-bundles.R
index ff6af2cc14..601ff64d07 100644
--- a/tests/testthat/test-plotly-partial-bundles.R
+++ b/tests/testthat/test-plotly-partial-bundles.R
@@ -42,7 +42,7 @@ test_that("Throws an informative error if wrong bundle is specified", {
   
   expect_error(
     partial_bundle(p1, type = "basic"),
-    "The 'basic' bundle supports the following trace types: 'scatter', 'bar', 'pie'"
+    "The 'basic' bundle supports the following trace types: 'bar', 'pie', 'scatter'"
   )
 })
 
diff --git a/tools/update_plotlyjs.R b/tools/update_plotlyjs.R
index e5e1703870..4fbd56ea84 100644
--- a/tools/update_plotlyjs.R
+++ b/tools/update_plotlyjs.R
@@ -1,21 +1,18 @@
-library(httr)
-library(rprojroot)
-
 # get zip URL to latest plotly.js release
-x <- RETRY(
+x <- httr::RETRY(
   verb = "GET",
   url = 'https://api.github.com/repos/plotly/plotly.js/releases/latest',
   times = 5,
   terminate_on = c(400, 401, 403, 404),
   terminate_on_success = TRUE
 )
-zip <- content(x)$zipball_url
+zip <- httr::content(x)$zipball_url
 
 # remember where to copy over assets
-pkg_dir <- find_package_root_file()
-lib_dir <- find_package_root_file("inst/htmlwidgets/lib/plotlyjs")
+pkg_dir <- rprojroot::find_package_root_file()
+lib_dir <- rprojroot::find_package_root_file("inst/htmlwidgets/lib/plotlyjs")
 patches <- list.files(
-  find_package_root_file("tools/patches"), 
+  rprojroot::find_package_root_file("tools/patches"), 
   full.names = TRUE
 )
 
@@ -25,8 +22,8 @@ dir.create(tmpdir)
 
 withr::with_dir(tmpdir, {
   # download source
-  download.file(zip, "plotly-js.zip")
-  unzip("plotly-js.zip", exdir = "plotly-js")
+  utils::download.file(zip, "plotly-js.zip")
+  utils::unzip("plotly-js.zip", exdir = "plotly-js")
   
   withr::with_dir(
     dir("plotly-js", full.names = TRUE), {
@@ -65,10 +62,27 @@ withr::with_dir(tmpdir, {
         file.path(lib_dir, "locales", sub("^plotly-locale-", "", basename(locales))),
         overwrite = TRUE
       )
-      # update plot schema
-      Schema <- jsonlite::fromJSON(Sys.glob("dist/plot-schema.json"))
+      # update plot schema and (partial) bundles
+      Schema <- jsonlite::fromJSON("dist/plot-schema.json")
+      bundleTraceMap <-
+        paste0(readLines("tasks/util/constants.js"), collapse = "\n") |>
+        stringr::str_extract(pattern = "(?<=\\b(const|var) partialBundleTraces = )\\{[^}]+\\}")
+      
+      if (is.na(bundleTraceMap)) {
+        stop("No `partialBundleTraces` variable definition found in Plotly source file `tasks/util/constants.js`. Does the regex pattern need an update?")
+      }
+      bundleTraceMap <- yaml::read_yaml(text = bundleTraceMap)
+      
       withr::with_dir(
-        pkg_dir, usethis::use_data(Schema, overwrite = TRUE, internal = TRUE)
+        pkg_dir, usethis::use_data(
+          Schema,
+          bundleTraceMap,
+          internal = TRUE,
+          overwrite = TRUE,
+          compress = "xz",
+          # TODO: use `version = 3L` once we depend on R (>= 3.5.0)
+          version = 2L
+        )
       )
       
       # plotly.js used to bundle a typedarray polyfill to support older browsers,
@@ -81,7 +95,8 @@ withr::with_dir(tmpdir, {
       #)
       
       message("Update plotlyMainBundle()'s version with ", basename(zip))
-      
   })
-  
 })
+
+# clean up
+unlink(tmpdir, recursive = TRUE)