diff --git a/lib/modules/datasource/cdnjs/__fixtures__/bulma.json b/lib/modules/datasource/cdnjs/__fixtures__/bulma.json
deleted file mode 100644
index c314ec5a3dc2347d9ac1c1879dbc82ca5112e52d..0000000000000000000000000000000000000000
--- a/lib/modules/datasource/cdnjs/__fixtures__/bulma.json
+++ /dev/null
@@ -1,690 +0,0 @@
-{
-  "homepage": "http://bulma.io",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/jgthms/bulma.git"
-  },
-  "assets": [
-    {
-      "version": "0.8.1",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-uByAjQgKh5//Z/gDvbL7MWsDcbwX7d/KizVil6On1dQ=",
-        "css/bulma.min.css": "sha256-1nEaE91OpXJD7M6W5uSiqxhdmrY+lOOTHC1iUxU9Pds="
-      }
-    },
-    {
-      "version": "0.8.0",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-XF2msWsEjJwE8ORQ0exG5nFk8jDTntTMbUZKtvPRkgU=",
-        "css/bulma.min.css": "sha256-D9M5yrVDqFlla7nlELDaYZIpXfFWDytQtiV+TaH6F1I="
-      }
-    },
-    {
-      "version": "0.7.5",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "only/0.7.5/style.css"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-ujE/ZUB6CMZmyJSgQjXGCF4sRRneOimQplBVLu8OU5w=",
-        "css/bulma.min.css": "sha256-vK3UTo/8wHbaUn+dTQD0X6dzidqc5l7gczvH+Bnowwk="
-      }
-    },
-    {
-      "version": "0.7.4",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-aan9tQnm7lVach/6JxYyrQRlheajRD+UBDwwWo3tAHQ=",
-        "css/bulma.min.css": "sha256-8B1OaG0zT7uYA572S2xOxWACq9NXYPQ+U5kHPV1bJN4="
-      }
-    },
-    {
-      "version": "0.7.2",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-dMQYvN6BU9M4mHK94P22cZ4dPGTSGOVP41yVXvXatws=",
-        "css/bulma.min.css": "sha256-2pUeJf+y0ltRPSbKOeJh09ipQFYxUdct5nTY6GAXswA="
-      }
-    },
-    {
-      "version": "0.7.1",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-zKA1Bf41O96+gJSlkn/Bh2HATW/OhwkApPlYTp3B5O8=",
-        "css/bulma.min.css": "sha256-zIG416V1ynj3Wgju/scU80KAEWOsO5rRLfVyRDuOv7Q="
-      }
-    },
-    {
-      "version": "0.7.0",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-8WedeikvPp0OAPWnwgdUHHaoIsl0TPbfX0Q+2P83mGw=",
-        "css/bulma.min.css": "sha256-Oe/IiGiJY0aqEFSXQHUCtq2gi0cNs2yUqVGFls9EgK8="
-      }
-    },
-    {
-      "version": "0.6.2",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-Ll4Z8mX5+0pGybXIES6J8YjUZUBFcQsJfS00wbXdbG8=",
-        "css/bulma.min.css": "sha256-2k1KVsNPRXxZOsXQ8aqcZ9GOOwmJTMoOB5o5Qp1d6/s="
-      }
-    },
-    {
-      "version": "0.6.1",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-lUssH++umYLC/97WXqr424ew3ing8e+dATTAmMpCF40=",
-        "css/bulma.min.css": "sha256-v5YlJGWVLS5hQ+o48fBzCKHEP2vMNsku57x3CosYykc="
-      }
-    },
-    {
-      "version": "0.6.0",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-0QptA3Zlf5Rkda4TBEMHhvZyWUd29CEvGbXG+P0BPYo=",
-        "css/bulma.min.css": "sha256-HEtF7HLJZSC3Le1HcsWbz1hDYFPZCqDhZa9QsCgVUdw="
-      }
-    },
-    {
-      "version": "0.5.3",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-vbUO+RDktGo8FKNb8XNn0q8liFDhdzxL3BbgMFVp07w=",
-        "css/bulma.min.css": "sha256-spCEAaZMKebC3rE/ZTt8jITn65b0Zan45WXblWjyDyQ="
-      }
-    },
-    {
-      "version": "0.5.2",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-zwJtr1GyyB98zj9jDSq9OGfgKEFzDYUmXudKYhhhOZo=",
-        "css/bulma.min.css": "sha256-d+mgRrjtsPCjrT7ltuB1sZ2VybUn1Xgdf8piVG/Va/k="
-      }
-    },
-    {
-      "version": "0.5.1",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-KGzlh3GrZQG1IDswBxp0OXmxeb7h0WezxI8tXeGr3yc=",
-        "css/bulma.min.css": "sha256-CDVQJfU+jJGU/oyDzvnzuGXbv0rz+SyBsPQwyn7x/jQ="
-      }
-    },
-    {
-      "version": "0.5.0",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-q//QGxAiKlL4UaKx9ox+b2JCphPqIbkl4OATVNeIvI8=",
-        "css/bulma.min.css": "sha256-qzwp3+P/LN8/hrx0ourjvGEOgPKNS+YNz7dNhasiRmQ="
-      }
-    },
-    {
-      "version": "0.4.4",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-nNnltvVPBWEs6TWdPICdwz/5mbVRtcbK8wzWFdhWle4=",
-        "css/bulma.min.css": "sha256-cqlVHMFcSR4diUVzW7ot+yIE0EHW0jfNvRG9GVEt8pE="
-      }
-    },
-    {
-      "version": "0.4.3",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-iO7hYdKmrm9CzcGgNrUri6m9rA8CVi0qkG++7J6KlsM=",
-        "css/bulma.min.css": "sha256-VC9bpAao257nf22leBRLU7AqKGwS9/Ylz8hfpHmOob4="
-      }
-    },
-    {
-      "version": "0.4.2",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-tzp6mtxeugpv7nF5uY4rqr1ZxZynL8F7G5MCwYxJkmY=",
-        "css/bulma.min.css": "sha256-5MiG346KC5bVXrbDQQU0cjus8r2Yxh07eorYOPNUcmw="
-      }
-    },
-    {
-      "version": "0.4.1",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-PELQzdZwUQw2WSX3q4QLMSzDqQyWrmrXODp2bZy6JOU=",
-        "css/bulma.min.css": "sha256-n+Ch7oRdzZ9+8/inp+1mK/0Bt4T/2PSmo4L6YGoDiVM="
-      }
-    },
-    {
-      "version": "0.4.0",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-i1MIGXdkXeJJLRlh6NXC1pmb/Rj3jEr0Y4tU0KjK9s4=",
-        "css/bulma.min.css": "sha256-8nf+BDtOgthqqdcfZXfDwth8LL6k314ILswPBDzXMp4="
-      }
-    },
-    {
-      "version": "0.3.2",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-2W7D1+BaVS4IyQ/jHh9Z97iKyfTY0IdVP+GLoD8Zfi8=",
-        "css/bulma.min.css": "sha256-gFMi0ldgZQk7xqpcLc/KjAYdPTLqv5Nv5gOkIPxuZkY="
-      }
-    },
-    {
-      "version": "0.3.1",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-E3NFAdoEdCZvMUGANNJ8cM/gRzIO+9Tx9QGCCzYHquw=",
-        "css/bulma.min.css": "sha256-6ZFIKt0ohcBorQWIruhlYBoADBIFrJuXtEJsjFxb2Wk="
-      }
-    },
-    {
-      "version": "0.3.0",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-IvbQzFiRARtQQANvvpAMfmLISux+WKZi/SOUJ/PU8BU=",
-        "css/bulma.min.css": "sha256-J2MxVJvpHeOeT0uUGqoj5CkoFkT4zBEweNmqP/UWu1U="
-      }
-    },
-    {
-      "version": "0.2.3",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-JPJOXvCZ7dfewrTiPV+GJzvdwvrVs3f2jTyMOjLq0aQ=",
-        "css/bulma.min.css": "sha256-F7gqKszCwmz8vhiti+AICU8dLfIEpxzPVihhhGfbbKg="
-      }
-    },
-    {
-      "version": "0.2.1",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-7cnnfR3Xk2kOdjB77b/yXopZ/CXuQlrUjWJcNQae+Qg=",
-        "css/bulma.min.css": "sha256-DRcOKg8NK1KkSkcymcGmxOtS/lAn0lHWJXRa15gMHHk="
-      }
-    },
-    {
-      "version": "0.2.0",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-OPtsycqLTj6B65PTzKGB/Db4QfWS7gQhBDHXApoOTXs=",
-        "css/bulma.min.css": "sha256-3jZh3lKj2GrREJG7pFXmh36IM2o9LLVrRIBQyE04D8Y="
-      }
-    },
-    {
-      "version": "0.1.2",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-LGC7VogpY1DEM2eIKie4gNcoyCjGNgjRBKh94PEmH/E=",
-        "css/bulma.min.css": "sha256-8TT9mHOU3psGaXjyZO82K8wm1ZwLUwWhN5zeZOxJ1Qs="
-      }
-    },
-    {
-      "version": "0.1.1",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-LGC7VogpY1DEM2eIKie4gNcoyCjGNgjRBKh94PEmH/E=",
-        "css/bulma.min.css": "sha256-8TT9mHOU3psGaXjyZO82K8wm1ZwLUwWhN5zeZOxJ1Qs="
-      }
-    },
-    {
-      "version": "0.1.0",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-mNUQ65hYdxtmWfzH1XghcPVZqqgS5UW82C8/tfax82Y=",
-        "css/bulma.min.css": "sha256-wY1WE5wUnk5ETTxanjGH8AfXaIyH5+tbA9aqvi6gSAw="
-      }
-    },
-    {
-      "version": "0.0.28",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-HWy4oyHCAsQUrboCiZM3QKQc832qCYyP6CJyN1gRLUc=",
-        "css/bulma.min.css": "sha256-b/7wl9KgZZEFwnFedQHe2Z+qcYMEPkmD7Kx13OT1wlQ="
-      }
-    },
-    {
-      "version": "0.0.27",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-gVVbkaQ5cXLnonjD5dGt9Ss4AbwnYuTfT0tmAnxCNDQ=",
-        "css/bulma.min.css": "sha256-JLahqXfDsi2eVA53OTdKfMOGzScPDFk+rbasxKSGsIc="
-      }
-    },
-    {
-      "version": "0.0.26",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-gVVbkaQ5cXLnonjD5dGt9Ss4AbwnYuTfT0tmAnxCNDQ=",
-        "css/bulma.min.css": "sha256-JLahqXfDsi2eVA53OTdKfMOGzScPDFk+rbasxKSGsIc="
-      }
-    },
-    {
-      "version": "0.0.25",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-5UeclJB2PL89MerRb1P6/cRigIHUDAwsBLAvTCxOsQo=",
-        "css/bulma.min.css": "sha256-UeLjY4mw4rw6henK/wENCf+ddAKmKXKpF94dqmNIdTI="
-      }
-    },
-    {
-      "version": "0.0.24",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-EGdHMzN0C86q1vhj0+w8kVwSsECqGN2tuSPLMuWqB3E=",
-        "css/bulma.min.css": "sha256-szI8Qt+cO6CUU/4frmHdH7uD1Yj6PjK4D+MUr1oIO7M="
-      }
-    },
-    {
-      "version": "0.0.23",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-8IKGWdeUJRHWtaxDjAO8le9gNTcyCvYtX+S964nl8AY=",
-        "css/bulma.min.css": "sha256-OnKsMZ9cPpVp4NksTsReXyjIKtb9FM+mezAZtuK0fHM="
-      }
-    },
-    {
-      "version": "0.0.22",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-CI0D79wfhW/fvYQf7+4Q/K5EGZUVwoSGZApeUlWeaew=",
-        "css/bulma.min.css": "sha256-BypekIZ6af8I3uWccMZ824MO8mD4F5cARkVYkxbP0oM="
-      }
-    },
-    {
-      "version": "0.0.21",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-CWfwx68mfMIapO4JcMtaWiup4Rh0KZb9bGsWm7Ijz+c=",
-        "css/bulma.min.css": "sha256-UEP+sG/JcDA1dtbWrdV/OQWiprVqEHAwj4KoZo5yCJ8="
-      }
-    },
-    {
-      "version": "0.0.20",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-/lwxjz5MrL8ymXcSdZ4q1rM24QbHqkFC6TAD39dlzmo=",
-        "css/bulma.min.css": "sha256-MrONUixIVU9UUzQTvQh0OZOc1RuD2igiZ82hJ+zy8ME="
-      }
-    },
-    {
-      "version": "0.0.19",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-WPzD5Utt3RSCLgUfwSfahDFPRZzYacbAikJyFjuj56w=",
-        "css/bulma.min.css": "sha256-2ckO9k7x6jD9dxp2rwqMMXA3O/MqBUyYdL85e5Oy+3o="
-      }
-    },
-    {
-      "version": "0.0.18",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-WPzD5Utt3RSCLgUfwSfahDFPRZzYacbAikJyFjuj56w=",
-        "css/bulma.min.css": "sha256-2ckO9k7x6jD9dxp2rwqMMXA3O/MqBUyYdL85e5Oy+3o="
-      }
-    },
-    {
-      "version": "0.0.17",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-WPzD5Utt3RSCLgUfwSfahDFPRZzYacbAikJyFjuj56w=",
-        "css/bulma.min.css": "sha256-2ckO9k7x6jD9dxp2rwqMMXA3O/MqBUyYdL85e5Oy+3o="
-      }
-    },
-    {
-      "version": "0.0.16",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-DaKywHsbjxdWISmW0vj1rqxXo+2m9jP58M82vE26/lo=",
-        "css/bulma.min.css": "sha256-t/8w8MBY+1xcArrA+FR7cizygVRFvCVb7YdwjQ1Szoo="
-      }
-    },
-    {
-      "version": "0.0.15",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-o+ckoIHHuI6C5rAJaVU5cPVqx3sBiPP0oM7UV42OchQ=",
-        "css/bulma.min.css": "sha256-yDRdc0rFCjFlV6phoR5U+IIo2BX6r1s64na0xV/3VII="
-      }
-    },
-    {
-      "version": "0.0.14",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-4n2LOsDn3dDiRt4+fumSkXG3Nx9e0VWXSlEHQ32AYM8=",
-        "css/bulma.min.css": "sha256-5j0oQLxKYqE6SIOENLM5Z+XwV0BDckBsmiZehD8kplg="
-      }
-    },
-    {
-      "version": "0.0.13",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-EEfwnmzAb2KFBMTyTn8Ayx5hOG/i1RRet1YUcTX/6K8=",
-        "css/bulma.min.css": "sha256-U4vo5QfK7+6vpb9prQCfKl5prRF5CAVdXE67Kw2q+zk="
-      }
-    },
-    {
-      "version": "0.0.12",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-WC0vtYAfKzLNqLbnaMiHky4bbui/DrhAfu+auISMki8=",
-        "css/bulma.min.css": "sha256-PxTvtkcYmnB3QTF1yEOZ+hZ3QtdruwGgH8gi+5ZhvL0="
-      }
-    },
-    {
-      "version": "0.0.11",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-kIMc9qJDvs9gUItCZOWS4j9IJTEH5cPA0XYDNNh615M=",
-        "css/bulma.min.css": "sha256-H3ycCK4h9KQ3eaT/hd10aawWxLrs55pvJSc4+AW/7Ss="
-      }
-    },
-    {
-      "version": "0.0.10",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-H+qxyugPe8R8ZDJ7624T+qBBGQtJxLfk6IwHDFU4qQQ=",
-        "css/bulma.min.css": "sha256-vSPLpIGAPxtjcNIvRnMG+qBMNHoiKWIfjWE9krwJs2w="
-      }
-    },
-    {
-      "version": "0.0.9",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-2p8Ap5rGQkvy/eSbHqq7YInLn7KlK+ttS7j83/4Mu5U=",
-        "css/bulma.min.css": "sha256-Ujuen6wSGYNncOiwgkf6etS4ynNQk09lEKe5N5EpVjY="
-      }
-    },
-    {
-      "version": "0.0.8",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-o9/qiZDq1YQYmN/l/FQ9ZfPWx0X1XCB7qN19NgU9mjI=",
-        "css/bulma.min.css": "sha256-ThvEzznTSx5zY/pglLOhYXMx/4Cna0fNekj5njnQi84="
-      }
-    },
-    {
-      "version": "0.0.7",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-3lL6WRsXNPHBD5kr4k7P2YDcUZFzmPnFG+9VKNiHmpk=",
-        "css/bulma.min.css": "sha256-h5PclMMTALOOZU4kVrwZ0hcvvYbE59vjueh4hCOerxM="
-      }
-    },
-    {
-      "version": "0.0.6",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-3lL6WRsXNPHBD5kr4k7P2YDcUZFzmPnFG+9VKNiHmpk=",
-        "css/bulma.min.css": "sha256-h5PclMMTALOOZU4kVrwZ0hcvvYbE59vjueh4hCOerxM="
-      }
-    },
-    {
-      "version": "0.0.5",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.css.map",
-        "css/bulma.min.css",
-        "css/bulma.min.css.map"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-SPVsd3RXnpGaxE3nQZdk7O/bmqIotrumXX6tMbr/5ig=",
-        "css/bulma.min.css": "sha256-agoMXPaQbV3bQHc/V/IzswebgOhTaiv9kfMy3haisgg="
-      }
-    },
-    {
-      "version": "0.0.4",
-      "files": [
-        "css/bulma.css",
-        "css/bulma.min.css"
-      ],
-      "sri": {
-        "css/bulma.css": "sha256-HXOcPLKtDcuDy077hNwHqc/fwYY+c/wBzT379yHbphc=",
-        "css/bulma.min.css": "sha256-R+ODP4cL6k8BoKDqlXzcdbihW8iymks89ySJO0H6pPI="
-      }
-    }
-  ]
-}
diff --git a/lib/modules/datasource/cdnjs/__fixtures__/d3-force.json b/lib/modules/datasource/cdnjs/__fixtures__/d3-force.json
index ca8c49e315386feed0daf9d84eced1fcc86effdd..983d15a376239eaab3cd1b0d971c4e82142f2a0b 100644
--- a/lib/modules/datasource/cdnjs/__fixtures__/d3-force.json
+++ b/lib/modules/datasource/cdnjs/__fixtures__/d3-force.json
@@ -1,295 +1,46 @@
 {
   "homepage": "https://d3js.org/d3-force/",
   "repository": {
-    "type": "git",
-    "url": "https://github.com/d3/d3-force.git"
+      "type": "git",
+      "url": "https://github.com/d3/d3-force.git"
   },
-  "assets": [
-    {
-      "version": "1.1.0",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-gp0SbnQfnXL6TyrP5b7JAifyBupTdBDiYpRArpdhIKg=",
-        "d3-force.min.js": "sha256-fXvqx6BMrmrNPsEbCbVn0ABWVE0Oyv/gkQscFLx1J+w="
-      }
-    },
-    {
-      "version": "1.0.6",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-5D0Nfdo36KQmwzPqSzwmgaB81NzrlAAenDn9CXxO9eA=",
-        "d3-force.min.js": "sha256-YsvdiZz1+06xnsmO/dcy/6oPe76ZJYH2mLsQOCPT8m8="
-      }
-    },
-    {
-      "version": "1.0.5",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-NqhhKDL7mFceODpyCsdd1vUHIgOK96DJNDUKtYJyHo8=",
-        "d3-force.min.js": "sha256-sqTZZsQcY2MWdMB/MPigRvcLxqIKhiM67KeAW7Z3imc="
-      }
-    },
-    {
-      "version": "1.0.4",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-T7VhvwL3G9POw0nHoRgl4OP0PmfiAHZObfHza0Lbp3s=",
-        "d3-force.min.js": "sha256-CRAbrJ8WtPmeIe/7tdGnM1l5NT4HtrwWNp8/V8XoZVI="
-      }
-    },
-    {
-      "version": "1.0.3",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-Pco5eBqSA/Wozq5wQVuZ5YuRC8Zn4EfBbht4kK09hms=",
-        "d3-force.min.js": "sha256-RaVSELLEPiSZSg9PGpLDFaG18eCP+7OFG2qscWQW4YI="
-      }
-    },
-    {
-      "version": "1.0.2",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-a2jXPrguES4/PmuoJJaVi+Qev/ZUGmIOJmG0/LIIcME=",
-        "d3-force.min.js": "sha256-Au6DV8G3g+2QsAMU4ZlVaRxS6QApao5plSungOoxVzs="
-      }
-    },
-    {
-      "version": "1.0.1",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-BkiOgLEeo2ERn7/yYgsU+t97dOXWuUP8nOc6T7sf4aQ=",
-        "d3-force.min.js": "sha256-hkttlmSMhFUFZeU+elS5DhAJqjuUNX1VVoWy6OhEe1A="
-      }
-    },
-    {
-      "version": "1.0.0",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-hRMRHUxlb4+aq13/P/Fk7RmVGX8r0n7psFs7cysjtQo=",
-        "d3-force.min.js": "sha256-JeMSB0vYijvTRUp6J/Zk8w4xLMsuovZdmrTSmmmSgns="
-      }
-    },
-    {
-      "version": "0.7.1",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-C4xhHucs90cw3YQ2Kry4IjovxF6hzXIXlt7XLSgn4uw=",
-        "d3-force.min.js": "sha256-gHNSgLjwLAZRo6w9Ga9AiwRSvRBC6a4/w15bsLqOjyI="
-      }
-    },
-    {
-      "version": "0.7.0",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-U93AQ12JgwO+Crpoop0f4VVtgo5EWyy5Ac/VDbr9nrw=",
-        "d3-force.min.js": "sha256-6N3BTqE/cUrcMS0ABzxSqq8ljwxFLVzjzY61oeYawN0="
-      }
-    },
-    {
-      "version": "0.6.3",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-3/LnH5zecwn1jl4B8/VwDUKLxHvD4tQv9pecq4I+lY0=",
-        "d3-force.min.js": "sha256-anFjoj3JrkmBNGyGOfjkNMTK7YOCqIGbEHpF3My+pys="
-      }
-    },
-    {
-      "version": "0.6.2",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-SG9SrF1YlltbriU+Z6Q7bvTgRJPw4XZBW4KjulEHiFQ=",
-        "d3-force.min.js": "sha256-6p2cfzJjQ0jdqtrb7rnwXj+yQeJ+hvnGJEXDi25ZmzE="
-      }
-    },
-    {
-      "version": "0.6.1",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-SYfALXpqoQWY7PB5stjN2B10R0t6B8OizEug3nV5hgk=",
-        "d3-force.min.js": "sha256-tuQU+X7+WeN6wqdiJJ6Padc45t9LZiKZ58oYMGr1uMo="
-      }
-    },
-    {
-      "version": "0.6.0",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-b07xptMLcxLFDYrlbaq7z9oD+Qe5X0jNjEqpRArWPJU=",
-        "d3-force.min.js": "sha256-cnOp3O9r4MlTvHFqvpdeaG/IwjS091dmqwHBAnFuc0g="
-      }
-    },
-    {
-      "version": "0.5.0",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-FEYdY1bzDtPA2tvvyXVSgl/y9EIjF/L5+de3tD4OTF4=",
-        "d3-force.min.js": "sha256-94L4/qOXNt6h6vhYolt0ukEnf1HjctqSd4HBth0OgJg="
-      }
-    },
-    {
-      "version": "0.4.1",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-nqSSxi5zHLx8IDv465yKPl7iQa9bKmB1tO1CYwHfORI=",
-        "d3-force.min.js": "sha256-6q2kj+Wndz0v3g+0IxzqiZ8Ilmi6QqFsWmZqVMS5nYU="
-      }
-    },
-    {
-      "version": "0.4.0",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-h5Ap2n1itK1bTRb5syvo31u3huhwOvIvv8YAq45SMHE=",
-        "d3-force.min.js": "sha256-Z+yWONCIFUqIdpFiXo0zggYxX/TMpyXYf5GW2SC4tog="
-      }
-    },
-    {
-      "version": "0.3.0",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-v/EpI8zylc/rx6tNiqL631j1d1C2BbPJGpgyJHIidt0=",
-        "d3-force.min.js": "sha256-lI3/m84DU88hxv49lzy/maO5glfV+80XK4WEmNa9YR8="
-      }
-    },
-    {
-      "version": "0.2.2",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-4jWVeft3EbQiO6mOzBN5gQISLLtiVk1gjk3sTBzxqWE=",
-        "d3-force.min.js": "sha256-BoVy0gQ+DQiYRwXOUnGWFbaxojy2X0dJn01uCuR4bRA="
-      }
-    },
-    {
-      "version": "0.2.1",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-R5hN8fDqziJDFPXVYztdJ0VcuA4NVaiMmYpIO7QkHMc=",
-        "d3-force.min.js": "sha256-LKaqpRLJ9Dm/duWf7SVRpEgR5/o6q7eXDDpEy/qX8lg="
-      }
-    },
-    {
-      "version": "0.2.0",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-VRq0I3f7XeNjPc3fa/jPoCVWii+1VAMS5GSc98yOjeQ=",
-        "d3-force.min.js": "sha256-uJV0fvOphwVSnweSYF0+6X0yR1jsfpP0k8gRK4RNjpY="
-      }
-    },
-    {
-      "version": "0.1.0",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-otPu46hPGgaRCnEkZuH3VQ9dKT6H7uzcAmrjvtCXIzQ=",
-        "d3-force.min.js": "sha256-csgvQYdPPjcKsIakaSeqE02/Wl54T3mStgKQsYkI1zs="
-      }
-    },
-    {
-      "version": "0.0.4",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-7hyoFVueIL/RLbMcV01X6kfVEB0/WpEWKyf7W716Pqs=",
-        "d3-force.min.js": "sha256-jw3G+KYLKmYEPZIQRVIIXUDULmlS0yJ4SvyBqZNwQMg="
-      }
-    },
-    {
-      "version": "0.0.3",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-NuLk1K9PD9BeilzdXFVmimrPbt5kURq5mhCqb8WQ8qk=",
-        "d3-force.min.js": "sha256-WYmckBv0+sEr0YsPm2Z3OC2WfCZIcD045KlXN/tbBmA="
-      }
-    },
-    {
-      "version": "0.0.2",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-yrh9ylv/W7CahimBrLMhf4X7uVuO3pTHHRKASy4nmt8=",
-        "d3-force.min.js": "sha256-CczIvgT14ZuOfCe40K647R5MlbnqEKfWBZJv2T4vrcI="
-      }
-    },
-    {
-      "version": "0.0.1",
-      "files": [
-        "d3-force.js",
-        "d3-force.min.js"
-      ],
-      "sri": {
-        "d3-force.js": "sha256-DNKhvPNPQByxMloPGL2GfmxYsbWDcrznYp+/r4eXs+o=",
-        "d3-force.min.js": "sha256-UlCqIE7wnu4y7TDeQsl91i7Wxmhr4E7vy7VYi2XFqk8="
-      }
-    }
+  "versions": [
+      "0.0.1",
+      "0.0.2",
+      "0.0.3",
+      "0.0.4",
+      "0.1.0",
+      "0.2.0",
+      "0.2.1",
+      "0.2.2",
+      "0.3.0",
+      "0.4.0",
+      "0.4.1",
+      "0.5.0",
+      "0.6.0",
+      "0.6.1",
+      "0.6.2",
+      "0.6.3",
+      "0.7.0",
+      "0.7.1",
+      "1.0.0",
+      "1.0.1",
+      "1.0.2",
+      "1.0.3",
+      "1.0.4",
+      "1.0.5",
+      "1.0.6",
+      "1.1.0",
+      "1.1.1",
+      "1.1.2",
+      "1.2.0",
+      "1.2.1",
+      "2.0.0",
+      "2.0.1",
+      "2.1.0",
+      "2.1.0-rc.1",
+      "2.1.0-rc.2",
+      "2.1.1",
+      "3.0.0"
   ]
 }
diff --git a/lib/modules/datasource/cdnjs/__fixtures__/sri.json b/lib/modules/datasource/cdnjs/__fixtures__/sri.json
new file mode 100644
index 0000000000000000000000000000000000000000..971794440829aaaeaf45f8640e1c3f643b932178
--- /dev/null
+++ b/lib/modules/datasource/cdnjs/__fixtures__/sri.json
@@ -0,0 +1,27 @@
+{
+  "sri": {
+      "css/bootstrap-grid.css": "sha512-Fxj/xUyzF1sPpG8bmkIT/Rh4tAHwPn3roK9DwsoBoglSt2tfNpYWF+vWiwVw0SVhXVEjxmdDwkCzD/wtFOIAUg==",
+      "css/bootstrap-grid.min.css": "sha512-JQksK36WdRekVrvdxNyV3B0Q1huqbTkIQNbz1dlcFVgNynEMRl0F8OSqOGdVppLUDIvsOejhr/W5L3G/b3J+8w==",
+      "css/bootstrap-grid.rtl.css": "sha512-kDjyCDssHgTQcTtM8Dwe+mzK0NbM28pXKC17zAWZ8fxiok4pWtB4V0ve92sdG/urSLky9gi8AHyCsiYBrjMWCQ==",
+      "css/bootstrap-grid.rtl.min.css": "sha512-TVEh7Wv2VL7denA2jjLclu/YHda8TiwmLZBhUqmJa+PVhIgbOs4mkx4nGQw+ok1f+3tf/NpbVDIuPKIHcSyEhw==",
+      "css/bootstrap-reboot.css": "sha512-OHLj7fFQzMuQeBvepMhoFo2xEVTEWyxRFNc42DOd+Jjwcko8LW7GjN9y91POlKkl8Ivzc9a0ZfIhD4HDIjCGxA==",
+      "css/bootstrap-reboot.min.css": "sha512-IS8Z2ZgFvTz/yLxE6H07ip/Ad+yAGswoD1VliOeC2T4WaPFNPC1TwmQ5zomGS+syaR2oO3aXJGKaHv21Dspx0g==",
+      "css/bootstrap-reboot.rtl.css": "sha512-YJ7dzM3VK2DJiSkfp9zrN8OrJgYQUJTv7m+WCr7geqqeDD5daxvd7MUzaVUBgkWM/Yl/PtV511SmYi/AS34yLg==",
+      "css/bootstrap-reboot.rtl.min.css": "sha512-MWXegIfPaJ2ht1ccssKjDqUk4DDiTyoKQqb4zGNEAXqUfP8ukuEtxraKdo7nko3m+4mY+ZXlPOUX6y4SV0VXPA==",
+      "css/bootstrap-utilities.css": "sha512-nUciEVa4bEB5Ct7WEC1mVgN0+i5iMZQK8mrhc9qjyw3FhpIsYYPl1Qhh1zQUHaPq1rzqspA+CTkyKp3NzWBs+g==",
+      "css/bootstrap-utilities.min.css": "sha512-DEGBrwaCF4lkKzMKNwt8Qe/V54bmJctk7I1HyfINGAIugDvsdBeuWzAWZmXAmm49P6EBfl/OeUM01U3r7cW4jg==",
+      "css/bootstrap-utilities.rtl.css": "sha512-yHpTyYQws1/5DtDZm0KBhJaMVPHoSp+bwCOCXj7EL+asqQHnIH5VaBxBqA2PiOc8k6knFwvqkPvLHKAhE2IigA==",
+      "css/bootstrap-utilities.rtl.min.css": "sha512-1W/oJs3Mky37ftCexP/qGfEA5rEjkxtZb6dbxfqr2lGUSJzbrqYkIPZPrQdrsnZbH0Rj9Y6nsxyp4mgmvGbZew==",
+      "css/bootstrap.css": "sha512-bR79Bg78Wmn33N5nvkEyg66hNg+xF/Q8NA8YABbj+4sBngYhv9P8eum19hdjYcY7vXk/vRkhM3v/ZndtgEXRWw==",
+      "css/bootstrap.min.css": "sha512-SbiR/eusphKoMVVXysTKG/7VseWii+Y3FdHrt0EpKgpToZeemhqHeZeLWLhJutz/2ut2Vw1uQEj2MbRF+TVBUA==",
+      "css/bootstrap.rtl.css": "sha512-Om2bVDiRJwpT9sJcj95YLYdECykFzo5dicv/8fzrFhm/uHQRYkapARZb6Ioer8+4KJGL2T1lKIfWxk+LlhfbqQ==",
+      "css/bootstrap.rtl.min.css": "sha512-tC3gnye8BsHmrW3eRP3Nrj/bs+CSVUfzkjOlfLNrfvcbKXFxk5+b8dQCZi9rgVFjDudwipXfqEhsKMMgRZGCDw==",
+      "js/bootstrap.bundle.js": "sha512-gMrnU9iM+azBQtrSC8kTJy6+g+hjaIHnElQmb41QeHNTGYjbbtm0BptpIMgXYpS6iyWq9bPkxrcqgK8aqRsjAg==",
+      "js/bootstrap.bundle.min.js": "sha512-i9cEfJwUwViEPFKdC1enz4ZRGBj8YQo6QByFTF92YXHi7waCqyexvRD75S5NVTsSiTv7rKWqG9Y5eFxmRsOn0A==",
+      "js/bootstrap.esm.js": "sha512-Usuu2Q6MtOYYaCc10FhONUvYeYZagj4i85fsXe09ZQyRtIdwBSHXWt5PQpAyGjrFcbQy2//LTsqZkdgzzcBBbg==",
+      "js/bootstrap.esm.min.js": "sha512-ruQ4xI8Jfep9W+qJQ8FLbxsjPVR0WvEt31XNw0mZxri2Nya9eQr7VTFsi+S7OvW0bIUI7vxF8zoaPNSq/PsvxA==",
+      "js/bootstrap.js": "sha512-L6XANV6sOsx9N9c787eDN1pjB2Pzautd3xDgn4cMKuoleHSuCJi5pCDGPCtwE3Bd4A1Olnr0k0aQXbczYzg+wg==",
+      "js/bootstrap.min.js": "sha512-1/RvZTcCDEUjY/CypiMz+iqqtaoQfAITmNSJY17Myp4Ms5mdxPS5UV7iOfdZoxcGhzFbOm6sntTKJppjvuhg4g=="
+  },
+  "version": "5.2.3"
+}
diff --git a/lib/modules/datasource/cdnjs/__snapshots__/index.spec.ts.snap b/lib/modules/datasource/cdnjs/__snapshots__/index.spec.ts.snap
index c779cc09bbdd7932542c6228bfa68e4e32cbc686..322da077cccde8ee15958b25dcfef572891bf281 100644
--- a/lib/modules/datasource/cdnjs/__snapshots__/index.spec.ts.snap
+++ b/lib/modules/datasource/cdnjs/__snapshots__/index.spec.ts.snap
@@ -1,127 +1,121 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`modules/datasource/cdnjs/index getReleases filters releases by asset presence 1`] = `
-{
-  "homepage": "http://bulma.io",
-  "registryUrl": "https://api.cdnjs.com/",
-  "releases": [
-    {
-      "version": "0.7.5",
-    },
-  ],
-  "sourceUrl": "https://github.com/jgthms/bulma",
-}
-`;
-
 exports[`modules/datasource/cdnjs/index getReleases processes real data 1`] = `
 {
   "homepage": "https://d3js.org/d3-force/",
   "registryUrl": "https://api.cdnjs.com/",
   "releases": [
     {
-      "newDigest": "sha256-DNKhvPNPQByxMloPGL2GfmxYsbWDcrznYp+/r4eXs+o=",
       "version": "0.0.1",
     },
     {
-      "newDigest": "sha256-yrh9ylv/W7CahimBrLMhf4X7uVuO3pTHHRKASy4nmt8=",
       "version": "0.0.2",
     },
     {
-      "newDigest": "sha256-NuLk1K9PD9BeilzdXFVmimrPbt5kURq5mhCqb8WQ8qk=",
       "version": "0.0.3",
     },
     {
-      "newDigest": "sha256-7hyoFVueIL/RLbMcV01X6kfVEB0/WpEWKyf7W716Pqs=",
       "version": "0.0.4",
     },
     {
-      "newDigest": "sha256-otPu46hPGgaRCnEkZuH3VQ9dKT6H7uzcAmrjvtCXIzQ=",
       "version": "0.1.0",
     },
     {
-      "newDigest": "sha256-VRq0I3f7XeNjPc3fa/jPoCVWii+1VAMS5GSc98yOjeQ=",
       "version": "0.2.0",
     },
     {
-      "newDigest": "sha256-R5hN8fDqziJDFPXVYztdJ0VcuA4NVaiMmYpIO7QkHMc=",
       "version": "0.2.1",
     },
     {
-      "newDigest": "sha256-4jWVeft3EbQiO6mOzBN5gQISLLtiVk1gjk3sTBzxqWE=",
       "version": "0.2.2",
     },
     {
-      "newDigest": "sha256-v/EpI8zylc/rx6tNiqL631j1d1C2BbPJGpgyJHIidt0=",
       "version": "0.3.0",
     },
     {
-      "newDigest": "sha256-h5Ap2n1itK1bTRb5syvo31u3huhwOvIvv8YAq45SMHE=",
       "version": "0.4.0",
     },
     {
-      "newDigest": "sha256-nqSSxi5zHLx8IDv465yKPl7iQa9bKmB1tO1CYwHfORI=",
       "version": "0.4.1",
     },
     {
-      "newDigest": "sha256-FEYdY1bzDtPA2tvvyXVSgl/y9EIjF/L5+de3tD4OTF4=",
       "version": "0.5.0",
     },
     {
-      "newDigest": "sha256-b07xptMLcxLFDYrlbaq7z9oD+Qe5X0jNjEqpRArWPJU=",
       "version": "0.6.0",
     },
     {
-      "newDigest": "sha256-SYfALXpqoQWY7PB5stjN2B10R0t6B8OizEug3nV5hgk=",
       "version": "0.6.1",
     },
     {
-      "newDigest": "sha256-SG9SrF1YlltbriU+Z6Q7bvTgRJPw4XZBW4KjulEHiFQ=",
       "version": "0.6.2",
     },
     {
-      "newDigest": "sha256-3/LnH5zecwn1jl4B8/VwDUKLxHvD4tQv9pecq4I+lY0=",
       "version": "0.6.3",
     },
     {
-      "newDigest": "sha256-U93AQ12JgwO+Crpoop0f4VVtgo5EWyy5Ac/VDbr9nrw=",
       "version": "0.7.0",
     },
     {
-      "newDigest": "sha256-C4xhHucs90cw3YQ2Kry4IjovxF6hzXIXlt7XLSgn4uw=",
       "version": "0.7.1",
     },
     {
-      "newDigest": "sha256-hRMRHUxlb4+aq13/P/Fk7RmVGX8r0n7psFs7cysjtQo=",
       "version": "1.0.0",
     },
     {
-      "newDigest": "sha256-BkiOgLEeo2ERn7/yYgsU+t97dOXWuUP8nOc6T7sf4aQ=",
       "version": "1.0.1",
     },
     {
-      "newDigest": "sha256-a2jXPrguES4/PmuoJJaVi+Qev/ZUGmIOJmG0/LIIcME=",
       "version": "1.0.2",
     },
     {
-      "newDigest": "sha256-Pco5eBqSA/Wozq5wQVuZ5YuRC8Zn4EfBbht4kK09hms=",
       "version": "1.0.3",
     },
     {
-      "newDigest": "sha256-T7VhvwL3G9POw0nHoRgl4OP0PmfiAHZObfHza0Lbp3s=",
       "version": "1.0.4",
     },
     {
-      "newDigest": "sha256-NqhhKDL7mFceODpyCsdd1vUHIgOK96DJNDUKtYJyHo8=",
       "version": "1.0.5",
     },
     {
-      "newDigest": "sha256-5D0Nfdo36KQmwzPqSzwmgaB81NzrlAAenDn9CXxO9eA=",
       "version": "1.0.6",
     },
     {
-      "newDigest": "sha256-gp0SbnQfnXL6TyrP5b7JAifyBupTdBDiYpRArpdhIKg=",
       "version": "1.1.0",
     },
+    {
+      "version": "1.1.1",
+    },
+    {
+      "version": "1.1.2",
+    },
+    {
+      "version": "1.2.0",
+    },
+    {
+      "version": "1.2.1",
+    },
+    {
+      "version": "2.0.0",
+    },
+    {
+      "version": "2.0.1",
+    },
+    {
+      "version": "2.1.0",
+    },
+    {
+      "version": "2.1.0-rc.1",
+    },
+    {
+      "version": "2.1.0-rc.2",
+    },
+    {
+      "version": "2.1.1",
+    },
+    {
+      "version": "3.0.0",
+    },
   ],
   "sourceUrl": "https://github.com/d3/d3-force",
 }
diff --git a/lib/modules/datasource/cdnjs/index.spec.ts b/lib/modules/datasource/cdnjs/index.spec.ts
index 506eb7b03107c9fd44a51764ec28ffefe03aa600..3c09dcf986e18bf710d704ea9895cb85d6a5d144 100644
--- a/lib/modules/datasource/cdnjs/index.spec.ts
+++ b/lib/modules/datasource/cdnjs/index.spec.ts
@@ -1,13 +1,17 @@
-import { getPkgReleases } from '..';
+import { getDigest, getPkgReleases } from '..';
 import { Fixtures } from '../../../../test/fixtures';
 import * as httpMock from '../../../../test/http-mock';
 import { EXTERNAL_HOST_ERROR } from '../../../constants/error-messages';
+import { HttpError } from '../../../util/http';
 import { CdnJsDatasource } from '.';
 
 const baseUrl = 'https://api.cdnjs.com/';
 
 const pathFor = (s: string): string =>
-  `/libraries/${s.split('/').shift()}?fields=homepage,repository,assets`;
+  `/libraries/${s.split('/').shift()}?fields=homepage,repository,versions`;
+
+const pathForDigest = (s: string, version: string): string =>
+  `/libraries/${s.split('/').shift()}/${version}?fields=sri`;
 
 describe('modules/datasource/cdnjs/index', () => {
   describe('getReleases', () => {
@@ -105,17 +109,86 @@ describe('modules/datasource/cdnjs/index', () => {
       });
       expect(res).toMatchSnapshot();
     });
+  });
 
-    it('filters releases by asset presence', async () => {
+  describe('getDigest', () => {
+    it('returs null for no result', async () => {
       httpMock
         .scope(baseUrl)
-        .get(pathFor('bulma/only/0.7.5/style.css'))
-        .reply(200, Fixtures.get('bulma.json'));
-      const res = await getPkgReleases({
-        datasource: CdnJsDatasource.id,
-        packageName: 'bulma/only/0.7.5/style.css',
-      });
-      expect(res).toMatchSnapshot();
+        .get(pathForDigest('foo/bar', '1.2.0'))
+        .reply(200, '{}');
+
+      const res = await getDigest(
+        {
+          datasource: CdnJsDatasource.id,
+          packageName: 'foo/bar',
+        },
+        '1.2.0',
+      );
+      expect(res).toBeNull();
+    });
+
+    it('returs null for empty sri object', async () => {
+      httpMock
+        .scope(baseUrl)
+        .get(pathForDigest('foo/bar', '1.2.0'))
+        .reply(200, JSON.stringify({ sri: {} }));
+
+      const res = await getDigest(
+        {
+          datasource: CdnJsDatasource.id,
+          packageName: 'foo/bar',
+        },
+        '1.2.0',
+      );
+      expect(res).toBeNull();
+    });
+
+    it('returs null if file not found', async () => {
+      httpMock
+        .scope(baseUrl)
+        .get(pathForDigest('foo/bar', '1.2.0'))
+        .reply(200, JSON.stringify({ sri: { string: 'hash' } }));
+
+      const res = await getDigest(
+        {
+          datasource: CdnJsDatasource.id,
+          packageName: 'foo/bar',
+        },
+        '1.2.0',
+      );
+      expect(res).toBeNull();
+    });
+
+    it('returns null for 404', async () => {
+      httpMock.scope(baseUrl).get(pathForDigest('foo/bar', '1.2.0')).reply(404);
+      await expect(
+        getDigest(
+          {
+            datasource: CdnJsDatasource.id,
+            packageName: 'foo/bar',
+          },
+          '1.2.0',
+        ),
+      ).rejects.toThrow(HttpError);
+    });
+
+    it('returns digest', async () => {
+      httpMock
+        .scope(baseUrl)
+        .get(pathForDigest('bootstrap/js/bootstrap.min.js', '5.2.3'))
+        .reply(200, Fixtures.get('sri.json'));
+
+      const res = await getDigest(
+        {
+          datasource: CdnJsDatasource.id,
+          packageName: 'bootstrap/js/bootstrap.min.js',
+        },
+        '5.2.3',
+      );
+      expect(res).toBe(
+        'sha512-1/RvZTcCDEUjY/CypiMz+iqqtaoQfAITmNSJY17Myp4Ms5mdxPS5UV7iOfdZoxcGhzFbOm6sntTKJppjvuhg4g==',
+      );
     });
   });
 });
diff --git a/lib/modules/datasource/cdnjs/index.ts b/lib/modules/datasource/cdnjs/index.ts
index e7618185887b7629c8f7bd77660989020092be00..6a142235e97fe3ace7c4da5979c887f48713d8e8 100644
--- a/lib/modules/datasource/cdnjs/index.ts
+++ b/lib/modules/datasource/cdnjs/index.ts
@@ -1,30 +1,21 @@
-import { ZodError, z } from 'zod';
+import { ZodError } from 'zod';
 import { logger } from '../../../logger';
 import { ExternalHostError } from '../../../types/errors/external-host-error';
+import { cache } from '../../../util/cache/package/decorator';
 import type { HttpError } from '../../../util/http';
 import { Result } from '../../../util/result';
 import { Datasource } from '../datasource';
-import { ReleasesConfig } from '../schema';
-import type { GetReleasesConfig, Release, ReleaseResult } from '../types';
-
-const Homepage = z.string().optional().catch(undefined);
-
-const Repository = z
-  .object({
-    type: z.literal('git'),
-    url: z.string(),
-  })
-  .transform(({ url }) => url)
-  .optional()
-  .catch(undefined);
-
-const Assets = z.array(
-  z.object({
-    version: z.string(),
-    files: z.string().array(),
-    sri: z.record(z.string()).optional(),
-  }),
-);
+import { DigestsConfig, ReleasesConfig } from '../schema';
+import type {
+  DigestConfig,
+  GetReleasesConfig,
+  Release,
+  ReleaseResult,
+} from '../types';
+import {
+  CdnjsAPISriResponseSchema,
+  CdnjsAPIVersionResponseSchema,
+} from './schema';
 
 export class CdnJsDatasource extends Datasource {
   static readonly id = 'cdnjs';
@@ -37,39 +28,21 @@ export class CdnJsDatasource extends Datasource {
 
   override readonly defaultRegistryUrls = ['https://api.cdnjs.com/'];
 
-  override readonly caching = true;
-
+  @cache({
+    namespace: `datasource-${CdnJsDatasource.id}`,
+    key: ({ packageName }: GetReleasesConfig) => packageName.split('/')[0],
+  })
   async getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {
     const result = Result.parse(config, ReleasesConfig)
       .transform(({ packageName, registryUrl }) => {
         const [library] = packageName.split('/');
-        const assetName = packageName.replace(`${library}/`, '');
-
-        const url = `${registryUrl}libraries/${library}?fields=homepage,repository,assets`;
-
-        const schema = z.object({
-          homepage: Homepage,
-          repository: Repository,
-          assets: Assets.transform((assets) =>
-            assets
-              .filter(({ files }) => files.includes(assetName))
-              .map(({ version, sri }) => {
-                const res: Release = { version };
-
-                const newDigest = sri?.[assetName];
-                if (newDigest) {
-                  res.newDigest = newDigest;
-                }
-
-                return res;
-              }),
-          ),
-        });
-
-        return this.http.getJsonSafe(url, schema);
+
+        const url = `${registryUrl}libraries/${library}?fields=homepage,repository,versions`;
+
+        return this.http.getJsonSafe(url, CdnjsAPIVersionResponseSchema);
       })
-      .transform(({ assets, homepage, repository }): ReleaseResult => {
-        const releases: Release[] = assets;
+      .transform(({ versions, homepage, repository }): ReleaseResult => {
+        const releases: Release[] = versions;
 
         const res: ReleaseResult = { releases };
 
@@ -98,6 +71,43 @@ export class CdnJsDatasource extends Datasource {
     return val;
   }
 
+  @cache({
+    namespace: `datasource-${CdnJsDatasource.id}-digest`,
+    key: ({ registryUrl, packageName }: DigestConfig, newValue: string) =>
+      `${registryUrl}:${packageName}:${newValue}}`,
+  })
+  override async getDigest(
+    config: DigestConfig,
+    newValue: string,
+  ): Promise<string | null> {
+    const { packageName } = config;
+    const [library] = packageName.split('/');
+    const assetName = packageName.replace(`${library}/`, '');
+
+    const result = Result.parse(config, DigestsConfig)
+      .transform(({ registryUrl }) => {
+        const url = `${registryUrl}libraries/${library}/${newValue}?fields=sri`;
+
+        return this.http.getJsonSafe(url, CdnjsAPISriResponseSchema);
+      })
+      .transform(({ sri }): string => {
+        return sri?.[assetName];
+      });
+
+    const { val = null, err } = await result.unwrap();
+
+    if (err instanceof ZodError) {
+      logger.debug({ err }, 'cdnjs: validation error');
+      return null;
+    }
+
+    if (err) {
+      this.handleGenericErrors(err);
+    }
+
+    return val;
+  }
+
   override handleHttpErrors(err: HttpError): void {
     if (err.response?.statusCode !== 404) {
       throw new ExternalHostError(err);
diff --git a/lib/modules/datasource/cdnjs/schema.ts b/lib/modules/datasource/cdnjs/schema.ts
new file mode 100644
index 0000000000000000000000000000000000000000..38341de296d397cd7a509760778a105430f64eba
--- /dev/null
+++ b/lib/modules/datasource/cdnjs/schema.ts
@@ -0,0 +1,30 @@
+import { z } from 'zod';
+import type { Release } from '../types';
+
+export const Homepage = z.string().optional().catch(undefined);
+
+export const Repository = z
+  .object({
+    type: z.literal('git'),
+    url: z.string(),
+  })
+  .transform(({ url }) => url)
+  .optional()
+  .catch(undefined);
+
+export const Versions = z
+  .string()
+  .transform((version): Release => ({ version }))
+  .array();
+
+export const Sri = z.record(z.string());
+
+export const CdnjsAPIVersionResponseSchema = z.object({
+  homepage: Homepage,
+  repository: Repository,
+  versions: Versions,
+});
+
+export const CdnjsAPISriResponseSchema = z.object({
+  sri: Sri,
+});
diff --git a/lib/modules/datasource/schema.ts b/lib/modules/datasource/schema.ts
index 3f31fbaa964ee7bc6defe37a6d051fce2c0aae28..b0922942a0fb4ab4f0df5c7675f3781d583c09f4 100644
--- a/lib/modules/datasource/schema.ts
+++ b/lib/modules/datasource/schema.ts
@@ -4,3 +4,8 @@ export const ReleasesConfig = z.object({
   packageName: z.string(),
   registryUrl: z.string(),
 });
+
+export const DigestsConfig = z.object({
+  packageName: z.string(),
+  registryUrl: z.string(),
+});
diff --git a/lib/util/cache/package/types.ts b/lib/util/cache/package/types.ts
index 57a5ffc1dc3a1a26abf1a209a4d92dbeed4a9f4b..b1e59a59f6ad3c121b4f8ecd70dc295c945ba65e 100644
--- a/lib/util/cache/package/types.ts
+++ b/lib/util/cache/package/types.ts
@@ -33,6 +33,8 @@ export type PackageCacheNamespace =
   | 'datasource-azure-pipelines-tasks'
   | 'datasource-bazel'
   | 'datasource-bitbucket-tags'
+  | 'datasource-cdnjs-digest'
+  | 'datasource-cdnjs'
   | 'datasource-conan-revisions'
   | 'datasource-conan'
   | 'datasource-conda'