@verdaccio/ui-components 5.0.0-next-9.26 → 5.0.0-next-9.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/build/components/Dependencies/DependencyBlock.js +1 -0
  2. package/build/components/Dependencies/DependencyBlock.js.map +1 -1
  3. package/build/components/Dependencies/DependencyBlock.mjs +1 -0
  4. package/build/components/Dependencies/DependencyBlock.mjs.map +1 -1
  5. package/build/components/Provenance/Provenance.d.ts +14 -0
  6. package/build/components/Provenance/Provenance.js +223 -0
  7. package/build/components/Provenance/Provenance.js.map +1 -0
  8. package/build/components/Provenance/Provenance.mjs +209 -0
  9. package/build/components/Provenance/Provenance.mjs.map +1 -0
  10. package/build/components/Provenance/index.d.ts +1 -0
  11. package/build/components/Provenance/index.js +2 -0
  12. package/build/components/Provenance/index.mjs +1 -0
  13. package/build/i18n/crowdin/ui.js +13 -0
  14. package/build/i18n/crowdin/ui.js.map +1 -1
  15. package/build/i18n/crowdin/ui.json +13 -0
  16. package/build/i18n/crowdin/ui.mjs +13 -0
  17. package/build/i18n/crowdin/ui.mjs.map +1 -1
  18. package/build/i18n/download_translations/cs-CZ/ui.js +13 -0
  19. package/build/i18n/download_translations/cs-CZ/ui.js.map +1 -1
  20. package/build/i18n/download_translations/cs-CZ/ui.json +13 -0
  21. package/build/i18n/download_translations/cs-CZ/ui.mjs +13 -0
  22. package/build/i18n/download_translations/cs-CZ/ui.mjs.map +1 -1
  23. package/build/i18n/download_translations/de-DE/ui.js +136 -121
  24. package/build/i18n/download_translations/de-DE/ui.js.map +1 -1
  25. package/build/i18n/download_translations/de-DE/ui.json +134 -121
  26. package/build/i18n/download_translations/de-DE/ui.mjs +136 -122
  27. package/build/i18n/download_translations/de-DE/ui.mjs.map +1 -1
  28. package/build/i18n/download_translations/es-ES/ui.js +63 -48
  29. package/build/i18n/download_translations/es-ES/ui.js.map +1 -1
  30. package/build/i18n/download_translations/es-ES/ui.json +61 -48
  31. package/build/i18n/download_translations/es-ES/ui.mjs +63 -49
  32. package/build/i18n/download_translations/es-ES/ui.mjs.map +1 -1
  33. package/build/i18n/download_translations/fr-FR/ui.js +66 -53
  34. package/build/i18n/download_translations/fr-FR/ui.js.map +1 -1
  35. package/build/i18n/download_translations/fr-FR/ui.json +66 -53
  36. package/build/i18n/download_translations/fr-FR/ui.mjs +66 -53
  37. package/build/i18n/download_translations/fr-FR/ui.mjs.map +1 -1
  38. package/build/i18n/download_translations/ga-IE/ui.js +13 -0
  39. package/build/i18n/download_translations/ga-IE/ui.js.map +1 -1
  40. package/build/i18n/download_translations/ga-IE/ui.json +13 -0
  41. package/build/i18n/download_translations/ga-IE/ui.mjs +13 -0
  42. package/build/i18n/download_translations/ga-IE/ui.mjs.map +1 -1
  43. package/build/i18n/download_translations/gl-ES/ui.js +13 -0
  44. package/build/i18n/download_translations/gl-ES/ui.js.map +1 -1
  45. package/build/i18n/download_translations/gl-ES/ui.json +13 -0
  46. package/build/i18n/download_translations/gl-ES/ui.mjs +13 -0
  47. package/build/i18n/download_translations/gl-ES/ui.mjs.map +1 -1
  48. package/build/i18n/download_translations/it-IT/ui.js +13 -0
  49. package/build/i18n/download_translations/it-IT/ui.js.map +1 -1
  50. package/build/i18n/download_translations/it-IT/ui.json +13 -0
  51. package/build/i18n/download_translations/it-IT/ui.mjs +13 -0
  52. package/build/i18n/download_translations/it-IT/ui.mjs.map +1 -1
  53. package/build/i18n/download_translations/ko-KR/ui.js +13 -0
  54. package/build/i18n/download_translations/ko-KR/ui.js.map +1 -1
  55. package/build/i18n/download_translations/ko-KR/ui.json +13 -0
  56. package/build/i18n/download_translations/ko-KR/ui.mjs +13 -0
  57. package/build/i18n/download_translations/ko-KR/ui.mjs.map +1 -1
  58. package/build/i18n/download_translations/pl-PL/ui.js +13 -0
  59. package/build/i18n/download_translations/pl-PL/ui.js.map +1 -1
  60. package/build/i18n/download_translations/pl-PL/ui.json +13 -0
  61. package/build/i18n/download_translations/pl-PL/ui.mjs +13 -0
  62. package/build/i18n/download_translations/pl-PL/ui.mjs.map +1 -1
  63. package/build/i18n/download_translations/pt-BR/ui.js +13 -0
  64. package/build/i18n/download_translations/pt-BR/ui.js.map +1 -1
  65. package/build/i18n/download_translations/pt-BR/ui.json +13 -0
  66. package/build/i18n/download_translations/pt-BR/ui.mjs +13 -0
  67. package/build/i18n/download_translations/pt-BR/ui.mjs.map +1 -1
  68. package/build/i18n/download_translations/ru-RU/ui.js +13 -0
  69. package/build/i18n/download_translations/ru-RU/ui.js.map +1 -1
  70. package/build/i18n/download_translations/ru-RU/ui.json +13 -0
  71. package/build/i18n/download_translations/ru-RU/ui.mjs +13 -0
  72. package/build/i18n/download_translations/ru-RU/ui.mjs.map +1 -1
  73. package/build/i18n/download_translations/sr-CS/ui.js +13 -0
  74. package/build/i18n/download_translations/sr-CS/ui.js.map +1 -1
  75. package/build/i18n/download_translations/sr-CS/ui.json +13 -0
  76. package/build/i18n/download_translations/sr-CS/ui.mjs +13 -0
  77. package/build/i18n/download_translations/sr-CS/ui.mjs.map +1 -1
  78. package/build/i18n/download_translations/tr-TR/ui.js +13 -0
  79. package/build/i18n/download_translations/tr-TR/ui.js.map +1 -1
  80. package/build/i18n/download_translations/tr-TR/ui.json +13 -0
  81. package/build/i18n/download_translations/tr-TR/ui.mjs +13 -0
  82. package/build/i18n/download_translations/tr-TR/ui.mjs.map +1 -1
  83. package/build/i18n/download_translations/vi-VN/ui.js +13 -0
  84. package/build/i18n/download_translations/vi-VN/ui.js.map +1 -1
  85. package/build/i18n/download_translations/vi-VN/ui.json +13 -0
  86. package/build/i18n/download_translations/vi-VN/ui.mjs +13 -0
  87. package/build/i18n/download_translations/vi-VN/ui.mjs.map +1 -1
  88. package/build/i18n/download_translations/yo-NG/ui.js +13 -0
  89. package/build/i18n/download_translations/yo-NG/ui.js.map +1 -1
  90. package/build/i18n/download_translations/yo-NG/ui.json +13 -0
  91. package/build/i18n/download_translations/yo-NG/ui.mjs +13 -0
  92. package/build/i18n/download_translations/yo-NG/ui.mjs.map +1 -1
  93. package/build/i18n/download_translations/zh-CN/ui.js +13 -0
  94. package/build/i18n/download_translations/zh-CN/ui.js.map +1 -1
  95. package/build/i18n/download_translations/zh-CN/ui.json +13 -0
  96. package/build/i18n/download_translations/zh-CN/ui.mjs +13 -0
  97. package/build/i18n/download_translations/zh-CN/ui.mjs.map +1 -1
  98. package/build/i18n/download_translations/zh-TW/ui.js +13 -0
  99. package/build/i18n/download_translations/zh-TW/ui.js.map +1 -1
  100. package/build/i18n/download_translations/zh-TW/ui.json +13 -0
  101. package/build/i18n/download_translations/zh-TW/ui.mjs +13 -0
  102. package/build/i18n/download_translations/zh-TW/ui.mjs.map +1 -1
  103. package/build/sections/SideBar/Sidebar.js +8 -0
  104. package/build/sections/SideBar/Sidebar.js.map +1 -1
  105. package/build/sections/SideBar/Sidebar.mjs +8 -0
  106. package/build/sections/SideBar/Sidebar.mjs.map +1 -1
  107. package/build/types/packageMeta.d.ts +12 -0
  108. package/build/types/provenance.d.ts +19 -0
  109. package/build/utils/routes.d.ts +1 -0
  110. package/build/utils/routes.js +1 -0
  111. package/build/utils/routes.js.map +1 -1
  112. package/build/utils/routes.mjs +1 -0
  113. package/build/utils/routes.mjs.map +1 -1
  114. package/package.json +9 -9
@@ -30,6 +30,7 @@ var DependencyBlock = ({ title, dependencies }) => {
30
30
  const navigate = (0, react_router.useNavigate)();
31
31
  const { t } = (0, react_i18next.useTranslation)();
32
32
  const deps = Object.entries(dependencies);
33
+ deps.sort(([nameA], [nameB]) => nameA.localeCompare(nameB));
33
34
  function handleClick(name) {
34
35
  navigate(`${require_routes.Route.DETAIL}${name}`);
35
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DependencyBlock.js","names":["styled","Typography","Chip","useNavigate","useTranslation","Route","Box"],"sources":["../../../src/components/Dependencies/DependencyBlock.tsx"],"sourcesContent":["import styled from '@emotion/styled';\nimport Box from '@mui/material/Box';\nimport Chip from '@mui/material/Chip';\nimport Typography from '@mui/material/Typography';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router';\n\nimport type { Theme } from '../../Theme';\nimport type { PackageDependencies } from '../../types/packageMeta';\nimport { Route } from '../../utils';\n\ninterface DependencyBlockProps {\n title: string;\n dependencies: PackageDependencies;\n}\n\nexport const StyledText = styled(Typography)<{ theme?: Theme }>((props) => ({\n fontWeight: props.theme.fontWeight.bold,\n textTransform: 'capitalize',\n}));\n\nexport const Tags = styled('div')<{ theme?: Theme }>((props) => ({\n display: 'flex',\n justifyContent: 'start',\n flexWrap: 'wrap',\n // force title to be on the same line as the title\n // could be better to avoid margin on the first element\n // but it is a bit tricky to do with flexbox\n marginLeft: props.theme.spacing(-0.6),\n}));\n\nexport const Tag = styled(Chip)<{ theme?: Theme }>((props) => ({\n margin: props.theme.spacing(0.6),\n}));\n\nexport const DependencyBlock: React.FC<DependencyBlockProps> = ({ title, dependencies }) => {\n const navigate = useNavigate();\n const { t } = useTranslation();\n const deps = Object.entries(dependencies);\n\n function handleClick(name: string): void {\n navigate(`${Route.DETAIL}${name}`);\n }\n\n function labelText(title: string, name: string, version: string): string {\n if (title === 'bundleDependencies') {\n return t('dependencies.dependency-block-bundle', { package: name });\n } else {\n return t('dependencies.dependency-block', { package: name, version });\n }\n }\n\n return (\n <Box data-testid={title} sx={{ margin: 2 }}>\n <StyledText sx={{ marginBottom: 1 }} variant=\"subtitle1\">\n {`${title} (${deps.length})`}\n </StyledText>\n <Tags>\n {deps.map(([name, version]: [string, string]) => {\n // Bundle dependencies are stored as array, for example [ 0: \"semver\" ]\n // so the package name arrives here in the version field\n const packageName = title == 'bundleDependencies' ? version : name;\n return (\n <Tag\n className={'dep-tag'}\n clickable={true}\n data-testid={packageName}\n key={packageName}\n label={labelText(title, packageName, version)}\n onClick={() => {\n handleClick(packageName);\n }}\n />\n );\n })}\n </Tags>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,IAAa,cAAA,GAAaA,gBAAAA,QAAAA,CAAOC,yBAAAA,OAAU,CAAC,EAAqB,WAAW;CAC1E,YAAY,MAAM,MAAM,WAAW;CACnC,eAAe;AACjB,EAAE;AAEF,IAAa,QAAA,GAAOD,gBAAAA,QAAAA,CAAO,KAAK,CAAC,EAAqB,WAAW;CAC/D,SAAS;CACT,gBAAgB;CAChB,UAAU;CAIV,YAAY,MAAM,MAAM,QAAQ,GAAI;AACtC,EAAE;AAEF,IAAa,OAAA,GAAMA,gBAAAA,QAAAA,CAAOE,mBAAAA,OAAI,CAAC,EAAqB,WAAW,EAC7D,QAAQ,MAAM,MAAM,QAAQ,EAAG,EACjC,EAAE;AAEF,IAAa,mBAAmD,EAAE,OAAO,mBAAmB;CAC1F,MAAM,YAAA,GAAWC,aAAAA,YAAAA,CAAY;CAC7B,MAAM,EAAE,OAAA,GAAMC,cAAAA,eAAAA,CAAe;CAC7B,MAAM,OAAO,OAAO,QAAQ,YAAY;CAExC,SAAS,YAAY,MAAoB;EACvC,SAAS,GAAGC,eAAAA,MAAM,SAAS,MAAM;CACnC;CAEA,SAAS,UAAU,OAAe,MAAc,SAAyB;EACvE,IAAI,UAAU,sBACZ,OAAO,EAAE,wCAAwC,EAAE,SAAS,KAAK,CAAC;OAElE,OAAO,EAAE,iCAAiC;GAAE,SAAS;GAAM;EAAQ,CAAC;CAExE;CAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACC,kBAAAA,SAAD;EAAK,eAAa;EAAO,IAAI,EAAE,QAAQ,EAAE;EAAzC,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;GAAY,IAAI,EAAE,cAAc,EAAE;GAAG,SAAQ;GAC1C,UAAA,GAAG,MAAM,IAAI,KAAK,OAAO;EAChB,CAAA,GACZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UACG,KAAK,KAAK,CAAC,MAAM,aAA+B;GAG/C,MAAM,cAAc,SAAS,uBAAuB,UAAU;GAC9D,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IACE,WAAW;IACX,WAAW;IACX,eAAa;IAEb,OAAO,UAAU,OAAO,aAAa,OAAO;IAC5C,eAAe;KACb,YAAY,WAAW;IACzB;GACD,GALM,WAKN;EAEL,CAAC,EACG,CAAA,CACH;;AAET"}
1
+ {"version":3,"file":"DependencyBlock.js","names":["styled","Typography","Chip","useNavigate","useTranslation","Route","Box"],"sources":["../../../src/components/Dependencies/DependencyBlock.tsx"],"sourcesContent":["import styled from '@emotion/styled';\nimport Box from '@mui/material/Box';\nimport Chip from '@mui/material/Chip';\nimport Typography from '@mui/material/Typography';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router';\n\nimport type { Theme } from '../../Theme';\nimport type { PackageDependencies } from '../../types/packageMeta';\nimport { Route } from '../../utils';\n\ninterface DependencyBlockProps {\n title: string;\n dependencies: PackageDependencies;\n}\n\nexport const StyledText = styled(Typography)<{ theme?: Theme }>((props) => ({\n fontWeight: props.theme.fontWeight.bold,\n textTransform: 'capitalize',\n}));\n\nexport const Tags = styled('div')<{ theme?: Theme }>((props) => ({\n display: 'flex',\n justifyContent: 'start',\n flexWrap: 'wrap',\n // force title to be on the same line as the title\n // could be better to avoid margin on the first element\n // but it is a bit tricky to do with flexbox\n marginLeft: props.theme.spacing(-0.6),\n}));\n\nexport const Tag = styled(Chip)<{ theme?: Theme }>((props) => ({\n margin: props.theme.spacing(0.6),\n}));\n\nexport const DependencyBlock: React.FC<DependencyBlockProps> = ({ title, dependencies }) => {\n const navigate = useNavigate();\n const { t } = useTranslation();\n const deps = Object.entries(dependencies);\n\n // sort dependencies alphabetically by name\n deps.sort(([nameA], [nameB]) => nameA.localeCompare(nameB));\n\n function handleClick(name: string): void {\n navigate(`${Route.DETAIL}${name}`);\n }\n\n function labelText(title: string, name: string, version: string): string {\n if (title === 'bundleDependencies') {\n return t('dependencies.dependency-block-bundle', { package: name });\n } else {\n return t('dependencies.dependency-block', { package: name, version });\n }\n }\n\n return (\n <Box data-testid={title} sx={{ margin: 2 }}>\n <StyledText sx={{ marginBottom: 1 }} variant=\"subtitle1\">\n {`${title} (${deps.length})`}\n </StyledText>\n <Tags>\n {deps.map(([name, version]: [string, string]) => {\n // Bundle dependencies are stored as array, for example [ 0: \"semver\" ]\n // so the package name arrives here in the version field\n const packageName = title == 'bundleDependencies' ? version : name;\n return (\n <Tag\n className={'dep-tag'}\n clickable={true}\n data-testid={packageName}\n key={packageName}\n label={labelText(title, packageName, version)}\n onClick={() => {\n handleClick(packageName);\n }}\n />\n );\n })}\n </Tags>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,IAAa,cAAA,GAAaA,gBAAAA,QAAAA,CAAOC,yBAAAA,OAAU,CAAC,EAAqB,WAAW;CAC1E,YAAY,MAAM,MAAM,WAAW;CACnC,eAAe;AACjB,EAAE;AAEF,IAAa,QAAA,GAAOD,gBAAAA,QAAAA,CAAO,KAAK,CAAC,EAAqB,WAAW;CAC/D,SAAS;CACT,gBAAgB;CAChB,UAAU;CAIV,YAAY,MAAM,MAAM,QAAQ,GAAI;AACtC,EAAE;AAEF,IAAa,OAAA,GAAMA,gBAAAA,QAAAA,CAAOE,mBAAAA,OAAI,CAAC,EAAqB,WAAW,EAC7D,QAAQ,MAAM,MAAM,QAAQ,EAAG,EACjC,EAAE;AAEF,IAAa,mBAAmD,EAAE,OAAO,mBAAmB;CAC1F,MAAM,YAAA,GAAWC,aAAAA,YAAAA,CAAY;CAC7B,MAAM,EAAE,OAAA,GAAMC,cAAAA,eAAAA,CAAe;CAC7B,MAAM,OAAO,OAAO,QAAQ,YAAY;CAGxC,KAAK,MAAM,CAAC,QAAQ,CAAC,WAAW,MAAM,cAAc,KAAK,CAAC;CAE1D,SAAS,YAAY,MAAoB;EACvC,SAAS,GAAGC,eAAAA,MAAM,SAAS,MAAM;CACnC;CAEA,SAAS,UAAU,OAAe,MAAc,SAAyB;EACvE,IAAI,UAAU,sBACZ,OAAO,EAAE,wCAAwC,EAAE,SAAS,KAAK,CAAC;OAElE,OAAO,EAAE,iCAAiC;GAAE,SAAS;GAAM;EAAQ,CAAC;CAExE;CAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACC,kBAAAA,SAAD;EAAK,eAAa;EAAO,IAAI,EAAE,QAAQ,EAAE;EAAzC,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;GAAY,IAAI,EAAE,cAAc,EAAE;GAAG,SAAQ;GAC1C,UAAA,GAAG,MAAM,IAAI,KAAK,OAAO;EAChB,CAAA,GACZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UACG,KAAK,KAAK,CAAC,MAAM,aAA+B;GAG/C,MAAM,cAAc,SAAS,uBAAuB,UAAU;GAC9D,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IACE,WAAW;IACX,WAAW;IACX,eAAa;IAEb,OAAO,UAAU,OAAO,aAAa,OAAO;IAC5C,eAAe;KACb,YAAY,WAAW;IACzB;GACD,GALM,WAKN;EAEL,CAAC,EACG,CAAA,CACH;;AAET"}
@@ -24,6 +24,7 @@ var DependencyBlock = ({ title, dependencies }) => {
24
24
  const navigate = useNavigate();
25
25
  const { t } = useTranslation();
26
26
  const deps = Object.entries(dependencies);
27
+ deps.sort(([nameA], [nameB]) => nameA.localeCompare(nameB));
27
28
  function handleClick(name) {
28
29
  navigate(`${Route$1.DETAIL}${name}`);
29
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DependencyBlock.mjs","names":["Route"],"sources":["../../../src/components/Dependencies/DependencyBlock.tsx"],"sourcesContent":["import styled from '@emotion/styled';\nimport Box from '@mui/material/Box';\nimport Chip from '@mui/material/Chip';\nimport Typography from '@mui/material/Typography';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router';\n\nimport type { Theme } from '../../Theme';\nimport type { PackageDependencies } from '../../types/packageMeta';\nimport { Route } from '../../utils';\n\ninterface DependencyBlockProps {\n title: string;\n dependencies: PackageDependencies;\n}\n\nexport const StyledText = styled(Typography)<{ theme?: Theme }>((props) => ({\n fontWeight: props.theme.fontWeight.bold,\n textTransform: 'capitalize',\n}));\n\nexport const Tags = styled('div')<{ theme?: Theme }>((props) => ({\n display: 'flex',\n justifyContent: 'start',\n flexWrap: 'wrap',\n // force title to be on the same line as the title\n // could be better to avoid margin on the first element\n // but it is a bit tricky to do with flexbox\n marginLeft: props.theme.spacing(-0.6),\n}));\n\nexport const Tag = styled(Chip)<{ theme?: Theme }>((props) => ({\n margin: props.theme.spacing(0.6),\n}));\n\nexport const DependencyBlock: React.FC<DependencyBlockProps> = ({ title, dependencies }) => {\n const navigate = useNavigate();\n const { t } = useTranslation();\n const deps = Object.entries(dependencies);\n\n function handleClick(name: string): void {\n navigate(`${Route.DETAIL}${name}`);\n }\n\n function labelText(title: string, name: string, version: string): string {\n if (title === 'bundleDependencies') {\n return t('dependencies.dependency-block-bundle', { package: name });\n } else {\n return t('dependencies.dependency-block', { package: name, version });\n }\n }\n\n return (\n <Box data-testid={title} sx={{ margin: 2 }}>\n <StyledText sx={{ marginBottom: 1 }} variant=\"subtitle1\">\n {`${title} (${deps.length})`}\n </StyledText>\n <Tags>\n {deps.map(([name, version]: [string, string]) => {\n // Bundle dependencies are stored as array, for example [ 0: \"semver\" ]\n // so the package name arrives here in the version field\n const packageName = title == 'bundleDependencies' ? version : name;\n return (\n <Tag\n className={'dep-tag'}\n clickable={true}\n data-testid={packageName}\n key={packageName}\n label={labelText(title, packageName, version)}\n onClick={() => {\n handleClick(packageName);\n }}\n />\n );\n })}\n </Tags>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;AAiBA,IAAa,aAAa,OAAO,UAAU,CAAC,EAAqB,WAAW;CAC1E,YAAY,MAAM,MAAM,WAAW;CACnC,eAAe;AACjB,EAAE;AAEF,IAAa,OAAO,OAAO,KAAK,CAAC,EAAqB,WAAW;CAC/D,SAAS;CACT,gBAAgB;CAChB,UAAU;CAIV,YAAY,MAAM,MAAM,QAAQ,GAAI;AACtC,EAAE;AAEF,IAAa,MAAM,OAAO,IAAI,CAAC,EAAqB,WAAW,EAC7D,QAAQ,MAAM,MAAM,QAAQ,EAAG,EACjC,EAAE;AAEF,IAAa,mBAAmD,EAAE,OAAO,mBAAmB;CAC1F,MAAM,WAAW,YAAY;CAC7B,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,OAAO,OAAO,QAAQ,YAAY;CAExC,SAAS,YAAY,MAAoB;EACvC,SAAS,GAAGA,QAAM,SAAS,MAAM;CACnC;CAEA,SAAS,UAAU,OAAe,MAAc,SAAyB;EACvE,IAAI,UAAU,sBACZ,OAAO,EAAE,wCAAwC,EAAE,SAAS,KAAK,CAAC;OAElE,OAAO,EAAE,iCAAiC;GAAE,SAAS;GAAM;EAAQ,CAAC;CAExE;CAEA,OACE,qBAAC,KAAD;EAAK,eAAa;EAAO,IAAI,EAAE,QAAQ,EAAE;EAAzC,UAAA,CACE,oBAAC,YAAD;GAAY,IAAI,EAAE,cAAc,EAAE;GAAG,SAAQ;GAC1C,UAAA,GAAG,MAAM,IAAI,KAAK,OAAO;EAChB,CAAA,GACZ,oBAAC,MAAD,EAAA,UACG,KAAK,KAAK,CAAC,MAAM,aAA+B;GAG/C,MAAM,cAAc,SAAS,uBAAuB,UAAU;GAC9D,OACE,oBAAC,KAAD;IACE,WAAW;IACX,WAAW;IACX,eAAa;IAEb,OAAO,UAAU,OAAO,aAAa,OAAO;IAC5C,eAAe;KACb,YAAY,WAAW;IACzB;GACD,GALM,WAKN;EAEL,CAAC,EACG,CAAA,CACH;;AAET"}
1
+ {"version":3,"file":"DependencyBlock.mjs","names":["Route"],"sources":["../../../src/components/Dependencies/DependencyBlock.tsx"],"sourcesContent":["import styled from '@emotion/styled';\nimport Box from '@mui/material/Box';\nimport Chip from '@mui/material/Chip';\nimport Typography from '@mui/material/Typography';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router';\n\nimport type { Theme } from '../../Theme';\nimport type { PackageDependencies } from '../../types/packageMeta';\nimport { Route } from '../../utils';\n\ninterface DependencyBlockProps {\n title: string;\n dependencies: PackageDependencies;\n}\n\nexport const StyledText = styled(Typography)<{ theme?: Theme }>((props) => ({\n fontWeight: props.theme.fontWeight.bold,\n textTransform: 'capitalize',\n}));\n\nexport const Tags = styled('div')<{ theme?: Theme }>((props) => ({\n display: 'flex',\n justifyContent: 'start',\n flexWrap: 'wrap',\n // force title to be on the same line as the title\n // could be better to avoid margin on the first element\n // but it is a bit tricky to do with flexbox\n marginLeft: props.theme.spacing(-0.6),\n}));\n\nexport const Tag = styled(Chip)<{ theme?: Theme }>((props) => ({\n margin: props.theme.spacing(0.6),\n}));\n\nexport const DependencyBlock: React.FC<DependencyBlockProps> = ({ title, dependencies }) => {\n const navigate = useNavigate();\n const { t } = useTranslation();\n const deps = Object.entries(dependencies);\n\n // sort dependencies alphabetically by name\n deps.sort(([nameA], [nameB]) => nameA.localeCompare(nameB));\n\n function handleClick(name: string): void {\n navigate(`${Route.DETAIL}${name}`);\n }\n\n function labelText(title: string, name: string, version: string): string {\n if (title === 'bundleDependencies') {\n return t('dependencies.dependency-block-bundle', { package: name });\n } else {\n return t('dependencies.dependency-block', { package: name, version });\n }\n }\n\n return (\n <Box data-testid={title} sx={{ margin: 2 }}>\n <StyledText sx={{ marginBottom: 1 }} variant=\"subtitle1\">\n {`${title} (${deps.length})`}\n </StyledText>\n <Tags>\n {deps.map(([name, version]: [string, string]) => {\n // Bundle dependencies are stored as array, for example [ 0: \"semver\" ]\n // so the package name arrives here in the version field\n const packageName = title == 'bundleDependencies' ? version : name;\n return (\n <Tag\n className={'dep-tag'}\n clickable={true}\n data-testid={packageName}\n key={packageName}\n label={labelText(title, packageName, version)}\n onClick={() => {\n handleClick(packageName);\n }}\n />\n );\n })}\n </Tags>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;AAiBA,IAAa,aAAa,OAAO,UAAU,CAAC,EAAqB,WAAW;CAC1E,YAAY,MAAM,MAAM,WAAW;CACnC,eAAe;AACjB,EAAE;AAEF,IAAa,OAAO,OAAO,KAAK,CAAC,EAAqB,WAAW;CAC/D,SAAS;CACT,gBAAgB;CAChB,UAAU;CAIV,YAAY,MAAM,MAAM,QAAQ,GAAI;AACtC,EAAE;AAEF,IAAa,MAAM,OAAO,IAAI,CAAC,EAAqB,WAAW,EAC7D,QAAQ,MAAM,MAAM,QAAQ,EAAG,EACjC,EAAE;AAEF,IAAa,mBAAmD,EAAE,OAAO,mBAAmB;CAC1F,MAAM,WAAW,YAAY;CAC7B,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,OAAO,OAAO,QAAQ,YAAY;CAGxC,KAAK,MAAM,CAAC,QAAQ,CAAC,WAAW,MAAM,cAAc,KAAK,CAAC;CAE1D,SAAS,YAAY,MAAoB;EACvC,SAAS,GAAGA,QAAM,SAAS,MAAM;CACnC;CAEA,SAAS,UAAU,OAAe,MAAc,SAAyB;EACvE,IAAI,UAAU,sBACZ,OAAO,EAAE,wCAAwC,EAAE,SAAS,KAAK,CAAC;OAElE,OAAO,EAAE,iCAAiC;GAAE,SAAS;GAAM;EAAQ,CAAC;CAExE;CAEA,OACE,qBAAC,KAAD;EAAK,eAAa;EAAO,IAAI,EAAE,QAAQ,EAAE;EAAzC,UAAA,CACE,oBAAC,YAAD;GAAY,IAAI,EAAE,cAAc,EAAE;GAAG,SAAQ;GAC1C,UAAA,GAAG,MAAM,IAAI,KAAK,OAAO;EAChB,CAAA,GACZ,oBAAC,MAAD,EAAA,UACG,KAAK,KAAK,CAAC,MAAM,aAA+B;GAG/C,MAAM,cAAc,SAAS,uBAAuB,UAAU;GAC9D,OACE,oBAAC,KAAD;IACE,WAAW;IACX,WAAW;IACX,eAAa;IAEb,OAAO,UAAU,OAAO,aAAa,OAAO;IAC5C,eAAe;KACb,YAAY,WAAW;IACzB;GACD,GALM,WAKN;EAEL,CAAC,EACG,CAAA,CACH;;AAET"}
@@ -0,0 +1,14 @@
1
+ import type { FC } from 'react';
2
+ import type { PackageMetaInterface } from '../../types/packageMeta';
3
+ export declare function provenanceLabel(predicateType: string): string;
4
+ export declare function builderLabel(builder: string, buildType?: string): string;
5
+ export declare function commitUrl(repository: string, commit: string, buildType?: string): string;
6
+ export declare function workflowUrl(repository: string, commit: string, workflowPath: string): string;
7
+ /** "Provenance" sidebar section; its chip opens a dialog with the provenance and signature details. */
8
+ declare const Provenance: FC<{
9
+ packageMeta: PackageMetaInterface;
10
+ packageName: string;
11
+ version?: string;
12
+ showDetails?: boolean;
13
+ }>;
14
+ export default Provenance;
@@ -0,0 +1,223 @@
1
+ const require_runtime = require("../../_virtual/_rolldown/runtime.js");
2
+ const require_url = require("../../utils/url.js");
3
+ const require_routes = require("../../utils/routes.js");
4
+ const require_use_data = require("../../api/use-data.js");
5
+ const require_configuration = require("../../configuration.js");
6
+ const require_utils = require("../../store/utils.js");
7
+ const require_styles = require("../Distribution/styles.js");
8
+ const require_RegistryInfoDialog = require("../RegistryInfoDialog/RegistryInfoDialog.js");
9
+ require("../RegistryInfoDialog/index.js");
10
+ let react = require("react");
11
+ react = require_runtime.__toESM(react);
12
+ let react_i18next = require("react-i18next");
13
+ let react_jsx_runtime = require("react/jsx-runtime");
14
+ let _mui_material_CircularProgress = require("@mui/material/CircularProgress");
15
+ _mui_material_CircularProgress = require_runtime.__toESM(_mui_material_CircularProgress);
16
+ let _mui_material_Link = require("@mui/material/Link");
17
+ _mui_material_Link = require_runtime.__toESM(_mui_material_Link);
18
+ let _mui_material_List = require("@mui/material/List");
19
+ _mui_material_List = require_runtime.__toESM(_mui_material_List);
20
+ let _mui_material_Typography = require("@mui/material/Typography");
21
+ _mui_material_Typography = require_runtime.__toESM(_mui_material_Typography);
22
+ let _mui_material_ListItem = require("@mui/material/ListItem");
23
+ _mui_material_ListItem = require_runtime.__toESM(_mui_material_ListItem);
24
+ let _mui_material_ListItemText = require("@mui/material/ListItemText");
25
+ _mui_material_ListItemText = require_runtime.__toESM(_mui_material_ListItemText);
26
+ let _mui_icons_material_VerifiedUser = require("@mui/icons-material/VerifiedUser");
27
+ _mui_icons_material_VerifiedUser = require_runtime.__toESM(_mui_icons_material_VerifiedUser);
28
+ let _mui_icons_material_VerifiedUserOutlined = require("@mui/icons-material/VerifiedUserOutlined");
29
+ _mui_icons_material_VerifiedUserOutlined = require_runtime.__toESM(_mui_icons_material_VerifiedUserOutlined);
30
+ //#region src/components/Provenance/Provenance.tsx
31
+ function provenanceLabel(predicateType) {
32
+ const version = predicateType.match(/^https:\/\/slsa\.dev\/provenance\/(v[\d.]+)$/)?.[1];
33
+ return version ? `SLSA ${version}` : predicateType;
34
+ }
35
+ var isGitLab = (buildType) => buildType?.startsWith("https://github.com/npm/cli/gitlab");
36
+ function builderLabel(builder, buildType) {
37
+ if (isGitLab(buildType)) return "GitLab CI/CD";
38
+ if (/^https:\/\/github\.com\/actions\/runner(\/|$)/.test(builder)) return builder.endsWith("/self-hosted") ? "GitHub Actions (self-hosted)" : "GitHub Actions";
39
+ return builder;
40
+ }
41
+ var isWorkflowFile = (entry) => /\.ya?ml$/.test(entry);
42
+ function commitUrl(repository, commit, buildType) {
43
+ return `${repository}/${isGitLab(buildType) ? "-/commit" : "commit"}/${encodeURIComponent(commit)}`;
44
+ }
45
+ function workflowUrl(repository, commit, workflowPath) {
46
+ const path = workflowPath.split("/").map(encodeURIComponent).join("/");
47
+ return `${repository}/blob/${encodeURIComponent(commit)}/${path}`;
48
+ }
49
+ function readAttestations(raw) {
50
+ const value = raw;
51
+ const url = typeof value?.url === "string" && value.url.length > 0 ? value.url : void 0;
52
+ const predicateType = value?.provenance?.predicateType;
53
+ const provenance = typeof predicateType === "string" && predicateType.length > 0 ? { predicateType } : void 0;
54
+ return url || provenance ? {
55
+ url,
56
+ provenance
57
+ } : void 0;
58
+ }
59
+ function readSignatures(raw) {
60
+ return Array.isArray(raw) ? raw.filter((item) => typeof item?.keyid === "string" && item.keyid !== "") : [];
61
+ }
62
+ var isHttpUrl = (href) => /^https?:\/\//i.test(href) && require_url.isURL(href);
63
+ var ExternalLink = ({ href, children }) => isHttpUrl(href) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Link.default, {
64
+ href,
65
+ rel: "noopener noreferrer",
66
+ target: "_blank",
67
+ underline: "hover",
68
+ children
69
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children });
70
+ var Detail = ({ label, children }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_ListItem.default, {
71
+ disableGutters: true,
72
+ sx: { py: .5 },
73
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_ListItemText.default, {
74
+ primary: label,
75
+ secondary: children,
76
+ secondaryTypographyProps: { component: "div" }
77
+ })
78
+ });
79
+ var BuildDetails = ({ packageName, version }) => {
80
+ const { t } = (0, react_i18next.useTranslation)();
81
+ const basePath = require_utils.stripTrailingSlash(require_configuration.getConfiguration().base);
82
+ const { data, error, isLoading } = require_use_data.useData(basePath, require_routes.APIRoute.PROVENANCE, packageName, version, { shouldRetryOnError: false });
83
+ if (isLoading) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_CircularProgress.default, {
84
+ "data-testid": "provenance-loading",
85
+ size: 24,
86
+ sx: { my: 2 }
87
+ });
88
+ if (error || !data || typeof data !== "object") return null;
89
+ const repository = data.sourceRepository;
90
+ const commit = data.sourceCommit;
91
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
92
+ data.builder ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Detail, {
93
+ label: t("sidebar.provenance.built-on"),
94
+ children: builderLabel(data.builder, data.buildType)
95
+ }) : null,
96
+ repository ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Detail, {
97
+ label: t("sidebar.provenance.source"),
98
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ExternalLink, {
99
+ href: repository,
100
+ children: repository.replace(/^https?:\/\//, "")
101
+ }), data.sourceRef ? ` (${data.sourceRef.replace(/^refs\/heads\//, "")})` : ""]
102
+ }) : null,
103
+ repository && commit ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Detail, {
104
+ label: t("sidebar.provenance.commit"),
105
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ExternalLink, {
106
+ href: commitUrl(repository, commit, data.buildType),
107
+ children: commit.slice(0, 12)
108
+ })
109
+ }) : null,
110
+ data.workflowPath ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Detail, {
111
+ label: t("sidebar.provenance.workflow"),
112
+ children: repository && commit && isWorkflowFile(data.workflowPath) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ExternalLink, {
113
+ href: workflowUrl(repository, commit, data.workflowPath),
114
+ children: data.workflowPath
115
+ }) : data.workflowPath
116
+ }) : null,
117
+ data.buildRunUrl ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Detail, {
118
+ label: t("sidebar.provenance.build-run"),
119
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ExternalLink, {
120
+ href: data.buildRunUrl,
121
+ children: data.buildRunUrl.replace(/^https?:\/\//, "")
122
+ })
123
+ }) : null,
124
+ data.transparencyLogUrl ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Detail, {
125
+ label: t("sidebar.provenance.transparency-log"),
126
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ExternalLink, {
127
+ href: data.transparencyLogUrl,
128
+ children: `#${data.transparencyLogIndex}`
129
+ })
130
+ }) : null
131
+ ] });
132
+ };
133
+ var ProvenanceDialog = ({ open, onClose, packageName, version, attestations, signatures, showDetails }) => {
134
+ const { t } = (0, react_i18next.useTranslation)();
135
+ const provenance = attestations?.provenance;
136
+ const keyids = [...new Set(signatures.map((signature) => signature.keyid))];
137
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_RegistryInfoDialog.default, {
138
+ onClose,
139
+ open,
140
+ title: t("sidebar.provenance.title"),
141
+ children: [
142
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
143
+ sx: { pt: 2 },
144
+ variant: "subtitle2",
145
+ children: `${packageName}@${version}`
146
+ }),
147
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
148
+ color: "text.secondary",
149
+ variant: "body2",
150
+ children: t("sidebar.provenance.disclaimer")
151
+ }),
152
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_List.default, {
153
+ dense: true,
154
+ children: [
155
+ provenance ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Detail, {
156
+ label: t("sidebar.provenance.provenance"),
157
+ children: provenanceLabel(provenance.predicateType)
158
+ }) : null,
159
+ keyids.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Detail, {
160
+ label: t("sidebar.provenance.registry-signature"),
161
+ children: keyids.map((keyid) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { children: keyid }, keyid))
162
+ }) : null,
163
+ attestations?.url ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Detail, {
164
+ label: t("sidebar.provenance.attestation"),
165
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ExternalLink, {
166
+ href: attestations.url,
167
+ children: attestations.url.replace(/^https?:\/\//, "")
168
+ })
169
+ }) : null,
170
+ showDetails && provenance && open ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BuildDetails, {
171
+ packageName,
172
+ version
173
+ }) : null
174
+ ]
175
+ })
176
+ ]
177
+ });
178
+ };
179
+ /** "Provenance" sidebar section; its chip opens a dialog with the provenance and signature details. */
180
+ var Provenance = ({ packageMeta, packageName, version, showDetails = false }) => {
181
+ const { t } = (0, react_i18next.useTranslation)();
182
+ const [open, setOpen] = (0, react.useState)(false);
183
+ const latest = packageMeta?.latest;
184
+ const attestations = readAttestations(latest?.dist?.attestations);
185
+ const signatures = readSignatures(latest?.dist?.signatures);
186
+ const provenance = attestations?.provenance;
187
+ if (!provenance && signatures.length === 0) return null;
188
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_List.default, {
189
+ subheader: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_styles.StyledText, {
190
+ variant: "subtitle1",
191
+ children: t("sidebar.provenance.title")
192
+ }),
193
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_styles.DistListItem, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_styles.DistChips, {
194
+ clickable: true,
195
+ color: provenance ? "primary" : "default",
196
+ "data-testid": "provenance-badge",
197
+ icon: provenance ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_icons_material_VerifiedUser.default, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_icons_material_VerifiedUserOutlined.default, {}),
198
+ label: provenance ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
199
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: t("sidebar.provenance.provenance") }),
200
+ ": ",
201
+ provenanceLabel(provenance.predicateType)
202
+ ] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: t("sidebar.provenance.registry-signature") }),
203
+ onClick: () => setOpen(true),
204
+ variant: "outlined"
205
+ }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ProvenanceDialog, {
206
+ attestations,
207
+ onClose: () => setOpen(false),
208
+ open,
209
+ packageName,
210
+ showDetails,
211
+ signatures,
212
+ version: version || latest?.version || ""
213
+ })]
214
+ });
215
+ };
216
+ //#endregion
217
+ exports.builderLabel = builderLabel;
218
+ exports.commitUrl = commitUrl;
219
+ exports.default = Provenance;
220
+ exports.provenanceLabel = provenanceLabel;
221
+ exports.workflowUrl = workflowUrl;
222
+
223
+ //# sourceMappingURL=Provenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Provenance.js","names":["isURL","Link","_Fragment","ListItem","ListItemText","useTranslation","stripTrailingSlash","getConfiguration","useData","APIRoute","CircularProgress","RegistryInfoDialog","Typography","List","useState","StyledText","DistListItem","DistChips","VerifiedUserIcon","VerifiedUserOutlinedIcon"],"sources":["../../../src/components/Provenance/Provenance.tsx"],"sourcesContent":["import VerifiedUserIcon from '@mui/icons-material/VerifiedUser';\nimport VerifiedUserOutlinedIcon from '@mui/icons-material/VerifiedUserOutlined';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport Link from '@mui/material/Link';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport ListItemText from '@mui/material/ListItemText';\nimport Typography from '@mui/material/Typography';\nimport type { FC } from 'react';\nimport React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useData } from '../../api/use-data';\nimport { getConfiguration } from '../../configuration';\nimport { stripTrailingSlash } from '../../store/utils';\nimport type { PackageMetaInterface, Signature } from '../../types/packageMeta';\nimport type { ProvenanceSummary } from '../../types/provenance';\nimport { APIRoute } from '../../utils/routes';\nimport { isURL } from '../../utils/url';\nimport { DistChips, DistListItem, StyledText } from '../Distribution/styles';\nimport RegistryInfoDialog from '../RegistryInfoDialog';\n\n// `https://slsa.dev/provenance/v1` → `SLSA v1`; other predicate types are shown as they are\nexport function provenanceLabel(predicateType: string): string {\n const version = predicateType.match(/^https:\\/\\/slsa\\.dev\\/provenance\\/(v[\\d.]+)$/)?.[1];\n return version ? `SLSA ${version}` : predicateType;\n}\n\nconst isGitLab = (buildType?: string) => buildType?.startsWith('https://github.com/npm/cli/gitlab');\n\n// npm and Yarn generate provenance on GitHub Actions (SLSA v1) and GitLab CI/CD (npm's own v0.2 build type)\nexport function builderLabel(builder: string, buildType?: string): string {\n if (isGitLab(buildType)) {\n return 'GitLab CI/CD';\n }\n if (/^https:\\/\\/github\\.com\\/actions\\/runner(\\/|$)/.test(builder)) {\n return builder.endsWith('/self-hosted') ? 'GitHub Actions (self-hosted)' : 'GitHub Actions';\n }\n return builder;\n}\n\n// GitLab statements carry the job name here, GitHub ones the workflow file\nconst isWorkflowFile = (entry: string) => /\\.ya?ml$/.test(entry);\n\n// GitLab commit pages live under `/-/commit/`, GitHub (and most forges) under `/commit/`\nexport function commitUrl(repository: string, commit: string, buildType?: string): string {\n return `${repository}/${isGitLab(buildType) ? '-/commit' : 'commit'}/${encodeURIComponent(commit)}`;\n}\n\n// each segment of the workflow path is encoded on its own so `/` keeps separating them\nexport function workflowUrl(repository: string, commit: string, workflowPath: string): string {\n const path = workflowPath.split('/').map(encodeURIComponent).join('/');\n return `${repository}/blob/${encodeURIComponent(commit)}/${path}`;\n}\n\n// `dist.attestations` and `dist.signatures` come straight from package metadata, not from the decoder\ntype ProvenanceMeta = { url?: string; provenance?: { predicateType: string } };\n\nfunction readAttestations(raw: unknown): ProvenanceMeta | undefined {\n const value = raw as { url?: unknown; provenance?: { predicateType?: unknown } } | undefined;\n const url = typeof value?.url === 'string' && value.url.length > 0 ? value.url : undefined;\n const predicateType = value?.provenance?.predicateType;\n const provenance =\n typeof predicateType === 'string' && predicateType.length > 0 ? { predicateType } : undefined;\n return url || provenance ? { url, provenance } : undefined;\n}\n\nfunction readSignatures(raw: unknown): Signature[] {\n return Array.isArray(raw)\n ? raw.filter((item): item is Signature => typeof item?.keyid === 'string' && item.keyid !== '')\n : [];\n}\n\n// every url here comes from the registry metadata or the attestation bundle\nconst isHttpUrl = (href: string) => /^https?:\\/\\//i.test(href) && isURL(href);\n\nconst ExternalLink: FC<{ href: string; children: React.ReactNode }> = ({ href, children }) =>\n isHttpUrl(href) ? (\n <Link href={href} rel=\"noopener noreferrer\" target=\"_blank\" underline=\"hover\">\n {children}\n </Link>\n ) : (\n <>{children}</>\n );\n\nconst Detail: FC<{ label: string; children: React.ReactNode }> = ({ label, children }) => (\n <ListItem disableGutters={true} sx={{ py: 0.5 }}>\n <ListItemText\n primary={label}\n secondary={children}\n secondaryTypographyProps={{ component: 'div' }}\n />\n </ListItem>\n);\n\nconst BuildDetails: FC<{ packageName: string; version?: string }> = ({ packageName, version }) => {\n const { t } = useTranslation();\n const basePath = stripTrailingSlash(getConfiguration().base);\n const { data, error, isLoading } = useData<ProvenanceSummary>(\n basePath,\n APIRoute.PROVENANCE,\n packageName,\n version,\n { shouldRetryOnError: false }\n );\n\n if (isLoading) {\n return <CircularProgress data-testid=\"provenance-loading\" size={24} sx={{ my: 2 }} />;\n }\n // the summary above is enough when the endpoint fails\n if (error || !data || typeof data !== 'object') {\n return null;\n }\n\n const repository = data.sourceRepository;\n const commit = data.sourceCommit;\n return (\n <>\n {data.builder ? (\n <Detail label={t('sidebar.provenance.built-on')}>\n {builderLabel(data.builder, data.buildType)}\n </Detail>\n ) : null}\n {repository ? (\n <Detail label={t('sidebar.provenance.source')}>\n <ExternalLink href={repository}>{repository.replace(/^https?:\\/\\//, '')}</ExternalLink>\n {data.sourceRef ? ` (${data.sourceRef.replace(/^refs\\/heads\\//, '')})` : ''}\n </Detail>\n ) : null}\n {repository && commit ? (\n <Detail label={t('sidebar.provenance.commit')}>\n <ExternalLink href={commitUrl(repository, commit, data.buildType)}>\n {commit.slice(0, 12)}\n </ExternalLink>\n </Detail>\n ) : null}\n {data.workflowPath ? (\n <Detail label={t('sidebar.provenance.workflow')}>\n {repository && commit && isWorkflowFile(data.workflowPath) ? (\n <ExternalLink href={workflowUrl(repository, commit, data.workflowPath)}>\n {data.workflowPath}\n </ExternalLink>\n ) : (\n data.workflowPath\n )}\n </Detail>\n ) : null}\n {data.buildRunUrl ? (\n <Detail label={t('sidebar.provenance.build-run')}>\n <ExternalLink href={data.buildRunUrl}>\n {data.buildRunUrl.replace(/^https?:\\/\\//, '')}\n </ExternalLink>\n </Detail>\n ) : null}\n {data.transparencyLogUrl ? (\n <Detail label={t('sidebar.provenance.transparency-log')}>\n <ExternalLink\n href={data.transparencyLogUrl}\n >{`#${data.transparencyLogIndex}`}</ExternalLink>\n </Detail>\n ) : null}\n </>\n );\n};\n\nconst ProvenanceDialog: FC<{\n open: boolean;\n onClose: () => void;\n packageName: string;\n version: string;\n attestations?: ProvenanceMeta;\n signatures: Signature[];\n showDetails: boolean;\n}> = ({ open, onClose, packageName, version, attestations, signatures, showDetails }) => {\n const { t } = useTranslation();\n const provenance = attestations?.provenance;\n const keyids = [...new Set(signatures.map((signature) => signature.keyid))];\n\n return (\n <RegistryInfoDialog onClose={onClose} open={open} title={t('sidebar.provenance.title')}>\n <Typography sx={{ pt: 2 }} variant=\"subtitle2\">{`${packageName}@${version}`}</Typography>\n <Typography color=\"text.secondary\" variant=\"body2\">\n {t('sidebar.provenance.disclaimer')}\n </Typography>\n <List dense={true}>\n {provenance ? (\n <Detail label={t('sidebar.provenance.provenance')}>\n {provenanceLabel(provenance.predicateType)}\n </Detail>\n ) : null}\n {keyids.length > 0 ? (\n <Detail label={t('sidebar.provenance.registry-signature')}>\n {keyids.map((keyid) => (\n <div key={keyid}>{keyid}</div>\n ))}\n </Detail>\n ) : null}\n {attestations?.url ? (\n <Detail label={t('sidebar.provenance.attestation')}>\n <ExternalLink href={attestations.url}>\n {attestations.url.replace(/^https?:\\/\\//, '')}\n </ExternalLink>\n </Detail>\n ) : null}\n {showDetails && provenance && open ? (\n <BuildDetails packageName={packageName} version={version} />\n ) : null}\n </List>\n </RegistryInfoDialog>\n );\n};\n\n/** \"Provenance\" sidebar section; its chip opens a dialog with the provenance and signature details. */\nconst Provenance: FC<{\n packageMeta: PackageMetaInterface;\n packageName: string;\n version?: string;\n // only servers exposing the provenance endpoint (ui option `capabilities.provenance`)\n showDetails?: boolean;\n}> = ({ packageMeta, packageName, version, showDetails = false }) => {\n const { t } = useTranslation();\n const [open, setOpen] = useState(false);\n const latest = packageMeta?.latest;\n const attestations = readAttestations(latest?.dist?.attestations);\n const signatures = readSignatures(latest?.dist?.signatures);\n const provenance = attestations?.provenance;\n\n if (!provenance && signatures.length === 0) {\n return null;\n }\n\n return (\n <List subheader={<StyledText variant=\"subtitle1\">{t('sidebar.provenance.title')}</StyledText>}>\n <DistListItem>\n <DistChips\n clickable={true}\n color={provenance ? 'primary' : 'default'}\n data-testid=\"provenance-badge\"\n icon={provenance ? <VerifiedUserIcon /> : <VerifiedUserOutlinedIcon />}\n label={\n provenance ? (\n <>\n <b>{t('sidebar.provenance.provenance')}</b>\n {': '}\n {provenanceLabel(provenance.predicateType)}\n </>\n ) : (\n <b>{t('sidebar.provenance.registry-signature')}</b>\n )\n }\n onClick={() => setOpen(true)}\n variant=\"outlined\"\n />\n </DistListItem>\n <ProvenanceDialog\n attestations={attestations}\n onClose={() => setOpen(false)}\n open={open}\n packageName={packageName}\n showDetails={showDetails}\n signatures={signatures}\n version={version || latest?.version || ''}\n />\n </List>\n );\n};\n\nexport default Provenance;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,gBAAgB,eAA+B;CAC7D,MAAM,UAAU,cAAc,MAAM,8CAA8C,CAAC,GAAG;CACtF,OAAO,UAAU,QAAQ,YAAY;AACvC;AAEA,IAAM,YAAY,cAAuB,WAAW,WAAW,mCAAmC;AAGlG,SAAgB,aAAa,SAAiB,WAA4B;CACxE,IAAI,SAAS,SAAS,GACpB,OAAO;CAET,IAAI,gDAAgD,KAAK,OAAO,GAC9D,OAAO,QAAQ,SAAS,cAAc,IAAI,iCAAiC;CAE7E,OAAO;AACT;AAGA,IAAM,kBAAkB,UAAkB,WAAW,KAAK,KAAK;AAG/D,SAAgB,UAAU,YAAoB,QAAgB,WAA4B;CACxF,OAAO,GAAG,WAAW,GAAG,SAAS,SAAS,IAAI,aAAa,SAAS,GAAG,mBAAmB,MAAM;AAClG;AAGA,SAAgB,YAAY,YAAoB,QAAgB,cAA8B;CAC5F,MAAM,OAAO,aAAa,MAAM,GAAG,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,KAAK,GAAG;CACrE,OAAO,GAAG,WAAW,QAAQ,mBAAmB,MAAM,EAAE,GAAG;AAC7D;AAKA,SAAS,iBAAiB,KAA0C;CAClE,MAAM,QAAQ;CACd,MAAM,MAAM,OAAO,OAAO,QAAQ,YAAY,MAAM,IAAI,SAAS,IAAI,MAAM,MAAM,KAAA;CACjF,MAAM,gBAAgB,OAAO,YAAY;CACzC,MAAM,aACJ,OAAO,kBAAkB,YAAY,cAAc,SAAS,IAAI,EAAE,cAAc,IAAI,KAAA;CACtF,OAAO,OAAO,aAAa;EAAE;EAAK;CAAW,IAAI,KAAA;AACnD;AAEA,SAAS,eAAe,KAA2B;CACjD,OAAO,MAAM,QAAQ,GAAG,IACpB,IAAI,QAAQ,SAA4B,OAAO,MAAM,UAAU,YAAY,KAAK,UAAU,EAAE,IAC5F,CAAC;AACP;AAGA,IAAM,aAAa,SAAiB,gBAAgB,KAAK,IAAI,KAAKA,YAAAA,MAAM,IAAI;AAE5E,IAAM,gBAAiE,EAAE,MAAM,eAC7E,UAAU,IAAI,IACZ,iBAAA,GAAA,kBAAA,IAAA,CAACC,mBAAAA,SAAD;CAAY;CAAM,KAAI;CAAsB,QAAO;CAAS,WAAU;CACnE;AACG,CAAA,IAEN,iBAAA,GAAA,kBAAA,IAAA,CAAAC,kBAAAA,UAAA,EAAG,SAAW,CAAA;AAGlB,IAAM,UAA4D,EAAE,OAAO,eACzE,iBAAA,GAAA,kBAAA,IAAA,CAACC,uBAAAA,SAAD;CAAU,gBAAgB;CAAM,IAAI,EAAE,IAAI,GAAI;CAC5C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,2BAAAA,SAAD;EACE,SAAS;EACT,WAAW;EACX,0BAA0B,EAAE,WAAW,MAAM;CAC9C,CAAA;AACO,CAAA;AAGZ,IAAM,gBAA+D,EAAE,aAAa,cAAc;CAChG,MAAM,EAAE,OAAA,GAAMC,cAAAA,eAAAA,CAAe;CAC7B,MAAM,WAAWC,cAAAA,mBAAmBC,sBAAAA,iBAAiB,CAAC,CAAC,IAAI;CAC3D,MAAM,EAAE,MAAM,OAAO,cAAcC,iBAAAA,QACjC,UACAC,eAAAA,SAAS,YACT,aACA,SACA,EAAE,oBAAoB,MAAM,CAC9B;CAEA,IAAI,WACF,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACC,+BAAAA,SAAD;EAAkB,eAAY;EAAqB,MAAM;EAAI,IAAI,EAAE,IAAI,EAAE;CAAI,CAAA;CAGtF,IAAI,SAAS,CAAC,QAAQ,OAAO,SAAS,UACpC,OAAO;CAGT,MAAM,aAAa,KAAK;CACxB,MAAM,SAAS,KAAK;CACpB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAAR,kBAAAA,UAAA,EAAA,UAAA;EACG,KAAK,UACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAQ,OAAO,EAAE,6BAA6B;GAC3C,UAAA,aAAa,KAAK,SAAS,KAAK,SAAS;EACpC,CAAA,IACN;EACH,aACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;GAAQ,OAAO,EAAE,2BAA2B;GAA5C,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;IAAc,MAAM;IAAa,UAAA,WAAW,QAAQ,gBAAgB,EAAE;GAAgB,CAAA,GACrF,KAAK,YAAY,KAAK,KAAK,UAAU,QAAQ,kBAAkB,EAAE,EAAE,KAAK,EACnE;EACN,CAAA,IAAA;EACH,cAAc,SACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAQ,OAAO,EAAE,2BAA2B;GAC1C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;IAAc,MAAM,UAAU,YAAY,QAAQ,KAAK,SAAS;IAC7D,UAAA,OAAO,MAAM,GAAG,EAAE;GACP,CAAA;EACR,CAAA,IACN;EACH,KAAK,eACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAQ,OAAO,EAAE,6BAA6B;GAC3C,UAAA,cAAc,UAAU,eAAe,KAAK,YAAY,IACvD,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;IAAc,MAAM,YAAY,YAAY,QAAQ,KAAK,YAAY;IAClE,UAAA,KAAK;GACM,CAAA,IAEd,KAAK;EAED,CAAA,IACN;EACH,KAAK,cACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAQ,OAAO,EAAE,8BAA8B;GAC7C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;IAAc,MAAM,KAAK;IACtB,UAAA,KAAK,YAAY,QAAQ,gBAAgB,EAAE;GAChC,CAAA;EACR,CAAA,IACN;EACH,KAAK,qBACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAQ,OAAO,EAAE,qCAAqC;GACpD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;IACE,MAAM,KAAK;IACX,UAAA,IAAI,KAAK;GAAqC,CAAA;EAC1C,CAAA,IACN;CACJ,EAAA,CAAA;AAEN;AAEA,IAAM,oBAQA,EAAE,MAAM,SAAS,aAAa,SAAS,cAAc,YAAY,kBAAkB;CACvF,MAAM,EAAE,OAAA,GAAMG,cAAAA,eAAAA,CAAe;CAC7B,MAAM,aAAa,cAAc;CACjC,MAAM,SAAS,CAAC,GAAG,IAAI,IAAI,WAAW,KAAK,cAAc,UAAU,KAAK,CAAC,CAAC;CAE1E,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACM,2BAAAA,SAAD;EAA6B;EAAe;EAAM,OAAO,EAAE,0BAA0B;EAArF,UAAA;GACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,SAAD;IAAY,IAAI,EAAE,IAAI,EAAE;IAAG,SAAQ;IAAa,UAAA,GAAG,YAAY,GAAG;GAAsB,CAAA;GACxF,iBAAA,GAAA,kBAAA,IAAA,CAACA,yBAAAA,SAAD;IAAY,OAAM;IAAiB,SAAQ;IACxC,UAAA,EAAE,+BAA+B;GACxB,CAAA;GACZ,iBAAA,GAAA,kBAAA,KAAA,CAACC,mBAAAA,SAAD;IAAM,OAAO;IAAb,UAAA;KACG,aACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAQ,OAAO,EAAE,+BAA+B;MAC7C,UAAA,gBAAgB,WAAW,aAAa;KACnC,CAAA,IACN;KACH,OAAO,SAAS,IACf,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAQ,OAAO,EAAE,uCAAuC;MACrD,UAAA,OAAO,KAAK,UACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAA,UAAkB,MAAW,GAAnB,KAAmB,CAC9B;KACK,CAAA,IACN;KACH,cAAc,MACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAQ,OAAO,EAAE,gCAAgC;MAC/C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;OAAc,MAAM,aAAa;OAC9B,UAAA,aAAa,IAAI,QAAQ,gBAAgB,EAAE;MAChC,CAAA;KACR,CAAA,IACN;KACH,eAAe,cAAc,OAC5B,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;MAA2B;MAAsB;KAAU,CAAA,IACzD;IACA;;EACY;;AAExB;;AAGA,IAAM,cAMA,EAAE,aAAa,aAAa,SAAS,cAAc,YAAY;CACnE,MAAM,EAAE,OAAA,GAAMR,cAAAA,eAAAA,CAAe;CAC7B,MAAM,CAAC,MAAM,YAAA,GAAWS,MAAAA,SAAAA,CAAS,KAAK;CACtC,MAAM,SAAS,aAAa;CAC5B,MAAM,eAAe,iBAAiB,QAAQ,MAAM,YAAY;CAChE,MAAM,aAAa,eAAe,QAAQ,MAAM,UAAU;CAC1D,MAAM,aAAa,cAAc;CAEjC,IAAI,CAAC,cAAc,WAAW,WAAW,GACvC,OAAO;CAGT,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACD,mBAAAA,SAAD;EAAM,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAACE,eAAAA,YAAD;GAAY,SAAQ;GAAa,UAAA,EAAE,0BAA0B;EAAc,CAAA;EAA5F,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,eAAAA,cAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,eAAAA,WAAD;GACE,WAAW;GACX,OAAO,aAAa,YAAY;GAChC,eAAY;GACZ,MAAM,aAAa,iBAAA,GAAA,kBAAA,IAAA,CAACC,iCAAAA,SAAD,CAAmB,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAACC,yCAAAA,SAAD,CAA2B,CAAA;GACrE,OACE,aACE,iBAAA,GAAA,kBAAA,KAAA,CAAAjB,kBAAAA,UAAA,EAAA,UAAA;IACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,+BAA+B,EAAK,CAAA;IACzC;IACA,gBAAgB,WAAW,aAAa;GACzC,EAAA,CAAA,IAEF,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,uCAAuC,EAAK,CAAA;GAGtD,eAAe,QAAQ,IAAI;GAC3B,SAAQ;EACT,CAAA,EACW,CAAA,GACd,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;GACgB;GACd,eAAe,QAAQ,KAAK;GACtB;GACO;GACA;GACD;GACZ,SAAS,WAAW,QAAQ,WAAW;EACxC,CAAA,CACG;;AAEV"}
@@ -0,0 +1,209 @@
1
+ import { isURL } from "../../utils/url.mjs";
2
+ import { APIRoute } from "../../utils/routes.mjs";
3
+ import { useData } from "../../api/use-data.mjs";
4
+ import { getConfiguration } from "../../configuration.mjs";
5
+ import { stripTrailingSlash } from "../../store/utils.mjs";
6
+ import { DistChips, DistListItem, StyledText } from "../Distribution/styles.mjs";
7
+ import RegistryInfoDialog from "../RegistryInfoDialog/RegistryInfoDialog.mjs";
8
+ import "../RegistryInfoDialog/index.mjs";
9
+ import { useState } from "react";
10
+ import { useTranslation } from "react-i18next";
11
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
12
+ import CircularProgress from "@mui/material/CircularProgress";
13
+ import Link from "@mui/material/Link";
14
+ import List from "@mui/material/List";
15
+ import Typography from "@mui/material/Typography";
16
+ import ListItem from "@mui/material/ListItem";
17
+ import ListItemText from "@mui/material/ListItemText";
18
+ import VerifiedUserIcon from "@mui/icons-material/VerifiedUser";
19
+ import VerifiedUserOutlinedIcon from "@mui/icons-material/VerifiedUserOutlined";
20
+ //#region src/components/Provenance/Provenance.tsx
21
+ function provenanceLabel(predicateType) {
22
+ const version = predicateType.match(/^https:\/\/slsa\.dev\/provenance\/(v[\d.]+)$/)?.[1];
23
+ return version ? `SLSA ${version}` : predicateType;
24
+ }
25
+ var isGitLab = (buildType) => buildType?.startsWith("https://github.com/npm/cli/gitlab");
26
+ function builderLabel(builder, buildType) {
27
+ if (isGitLab(buildType)) return "GitLab CI/CD";
28
+ if (/^https:\/\/github\.com\/actions\/runner(\/|$)/.test(builder)) return builder.endsWith("/self-hosted") ? "GitHub Actions (self-hosted)" : "GitHub Actions";
29
+ return builder;
30
+ }
31
+ var isWorkflowFile = (entry) => /\.ya?ml$/.test(entry);
32
+ function commitUrl(repository, commit, buildType) {
33
+ return `${repository}/${isGitLab(buildType) ? "-/commit" : "commit"}/${encodeURIComponent(commit)}`;
34
+ }
35
+ function workflowUrl(repository, commit, workflowPath) {
36
+ const path = workflowPath.split("/").map(encodeURIComponent).join("/");
37
+ return `${repository}/blob/${encodeURIComponent(commit)}/${path}`;
38
+ }
39
+ function readAttestations(raw) {
40
+ const value = raw;
41
+ const url = typeof value?.url === "string" && value.url.length > 0 ? value.url : void 0;
42
+ const predicateType = value?.provenance?.predicateType;
43
+ const provenance = typeof predicateType === "string" && predicateType.length > 0 ? { predicateType } : void 0;
44
+ return url || provenance ? {
45
+ url,
46
+ provenance
47
+ } : void 0;
48
+ }
49
+ function readSignatures(raw) {
50
+ return Array.isArray(raw) ? raw.filter((item) => typeof item?.keyid === "string" && item.keyid !== "") : [];
51
+ }
52
+ var isHttpUrl = (href) => /^https?:\/\//i.test(href) && isURL(href);
53
+ var ExternalLink = ({ href, children }) => isHttpUrl(href) ? /* @__PURE__ */ jsx(Link, {
54
+ href,
55
+ rel: "noopener noreferrer",
56
+ target: "_blank",
57
+ underline: "hover",
58
+ children
59
+ }) : /* @__PURE__ */ jsx(Fragment$1, { children });
60
+ var Detail = ({ label, children }) => /* @__PURE__ */ jsx(ListItem, {
61
+ disableGutters: true,
62
+ sx: { py: .5 },
63
+ children: /* @__PURE__ */ jsx(ListItemText, {
64
+ primary: label,
65
+ secondary: children,
66
+ secondaryTypographyProps: { component: "div" }
67
+ })
68
+ });
69
+ var BuildDetails = ({ packageName, version }) => {
70
+ const { t } = useTranslation();
71
+ const basePath = stripTrailingSlash(getConfiguration().base);
72
+ const { data, error, isLoading } = useData(basePath, APIRoute.PROVENANCE, packageName, version, { shouldRetryOnError: false });
73
+ if (isLoading) return /* @__PURE__ */ jsx(CircularProgress, {
74
+ "data-testid": "provenance-loading",
75
+ size: 24,
76
+ sx: { my: 2 }
77
+ });
78
+ if (error || !data || typeof data !== "object") return null;
79
+ const repository = data.sourceRepository;
80
+ const commit = data.sourceCommit;
81
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
82
+ data.builder ? /* @__PURE__ */ jsx(Detail, {
83
+ label: t("sidebar.provenance.built-on"),
84
+ children: builderLabel(data.builder, data.buildType)
85
+ }) : null,
86
+ repository ? /* @__PURE__ */ jsxs(Detail, {
87
+ label: t("sidebar.provenance.source"),
88
+ children: [/* @__PURE__ */ jsx(ExternalLink, {
89
+ href: repository,
90
+ children: repository.replace(/^https?:\/\//, "")
91
+ }), data.sourceRef ? ` (${data.sourceRef.replace(/^refs\/heads\//, "")})` : ""]
92
+ }) : null,
93
+ repository && commit ? /* @__PURE__ */ jsx(Detail, {
94
+ label: t("sidebar.provenance.commit"),
95
+ children: /* @__PURE__ */ jsx(ExternalLink, {
96
+ href: commitUrl(repository, commit, data.buildType),
97
+ children: commit.slice(0, 12)
98
+ })
99
+ }) : null,
100
+ data.workflowPath ? /* @__PURE__ */ jsx(Detail, {
101
+ label: t("sidebar.provenance.workflow"),
102
+ children: repository && commit && isWorkflowFile(data.workflowPath) ? /* @__PURE__ */ jsx(ExternalLink, {
103
+ href: workflowUrl(repository, commit, data.workflowPath),
104
+ children: data.workflowPath
105
+ }) : data.workflowPath
106
+ }) : null,
107
+ data.buildRunUrl ? /* @__PURE__ */ jsx(Detail, {
108
+ label: t("sidebar.provenance.build-run"),
109
+ children: /* @__PURE__ */ jsx(ExternalLink, {
110
+ href: data.buildRunUrl,
111
+ children: data.buildRunUrl.replace(/^https?:\/\//, "")
112
+ })
113
+ }) : null,
114
+ data.transparencyLogUrl ? /* @__PURE__ */ jsx(Detail, {
115
+ label: t("sidebar.provenance.transparency-log"),
116
+ children: /* @__PURE__ */ jsx(ExternalLink, {
117
+ href: data.transparencyLogUrl,
118
+ children: `#${data.transparencyLogIndex}`
119
+ })
120
+ }) : null
121
+ ] });
122
+ };
123
+ var ProvenanceDialog = ({ open, onClose, packageName, version, attestations, signatures, showDetails }) => {
124
+ const { t } = useTranslation();
125
+ const provenance = attestations?.provenance;
126
+ const keyids = [...new Set(signatures.map((signature) => signature.keyid))];
127
+ return /* @__PURE__ */ jsxs(RegistryInfoDialog, {
128
+ onClose,
129
+ open,
130
+ title: t("sidebar.provenance.title"),
131
+ children: [
132
+ /* @__PURE__ */ jsx(Typography, {
133
+ sx: { pt: 2 },
134
+ variant: "subtitle2",
135
+ children: `${packageName}@${version}`
136
+ }),
137
+ /* @__PURE__ */ jsx(Typography, {
138
+ color: "text.secondary",
139
+ variant: "body2",
140
+ children: t("sidebar.provenance.disclaimer")
141
+ }),
142
+ /* @__PURE__ */ jsxs(List, {
143
+ dense: true,
144
+ children: [
145
+ provenance ? /* @__PURE__ */ jsx(Detail, {
146
+ label: t("sidebar.provenance.provenance"),
147
+ children: provenanceLabel(provenance.predicateType)
148
+ }) : null,
149
+ keyids.length > 0 ? /* @__PURE__ */ jsx(Detail, {
150
+ label: t("sidebar.provenance.registry-signature"),
151
+ children: keyids.map((keyid) => /* @__PURE__ */ jsx("div", { children: keyid }, keyid))
152
+ }) : null,
153
+ attestations?.url ? /* @__PURE__ */ jsx(Detail, {
154
+ label: t("sidebar.provenance.attestation"),
155
+ children: /* @__PURE__ */ jsx(ExternalLink, {
156
+ href: attestations.url,
157
+ children: attestations.url.replace(/^https?:\/\//, "")
158
+ })
159
+ }) : null,
160
+ showDetails && provenance && open ? /* @__PURE__ */ jsx(BuildDetails, {
161
+ packageName,
162
+ version
163
+ }) : null
164
+ ]
165
+ })
166
+ ]
167
+ });
168
+ };
169
+ /** "Provenance" sidebar section; its chip opens a dialog with the provenance and signature details. */
170
+ var Provenance = ({ packageMeta, packageName, version, showDetails = false }) => {
171
+ const { t } = useTranslation();
172
+ const [open, setOpen] = useState(false);
173
+ const latest = packageMeta?.latest;
174
+ const attestations = readAttestations(latest?.dist?.attestations);
175
+ const signatures = readSignatures(latest?.dist?.signatures);
176
+ const provenance = attestations?.provenance;
177
+ if (!provenance && signatures.length === 0) return null;
178
+ return /* @__PURE__ */ jsxs(List, {
179
+ subheader: /* @__PURE__ */ jsx(StyledText, {
180
+ variant: "subtitle1",
181
+ children: t("sidebar.provenance.title")
182
+ }),
183
+ children: [/* @__PURE__ */ jsx(DistListItem, { children: /* @__PURE__ */ jsx(DistChips, {
184
+ clickable: true,
185
+ color: provenance ? "primary" : "default",
186
+ "data-testid": "provenance-badge",
187
+ icon: provenance ? /* @__PURE__ */ jsx(VerifiedUserIcon, {}) : /* @__PURE__ */ jsx(VerifiedUserOutlinedIcon, {}),
188
+ label: provenance ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
189
+ /* @__PURE__ */ jsx("b", { children: t("sidebar.provenance.provenance") }),
190
+ ": ",
191
+ provenanceLabel(provenance.predicateType)
192
+ ] }) : /* @__PURE__ */ jsx("b", { children: t("sidebar.provenance.registry-signature") }),
193
+ onClick: () => setOpen(true),
194
+ variant: "outlined"
195
+ }) }), /* @__PURE__ */ jsx(ProvenanceDialog, {
196
+ attestations,
197
+ onClose: () => setOpen(false),
198
+ open,
199
+ packageName,
200
+ showDetails,
201
+ signatures,
202
+ version: version || latest?.version || ""
203
+ })]
204
+ });
205
+ };
206
+ //#endregion
207
+ export { builderLabel, commitUrl, Provenance as default, provenanceLabel, workflowUrl };
208
+
209
+ //# sourceMappingURL=Provenance.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Provenance.mjs","names":["_Fragment"],"sources":["../../../src/components/Provenance/Provenance.tsx"],"sourcesContent":["import VerifiedUserIcon from '@mui/icons-material/VerifiedUser';\nimport VerifiedUserOutlinedIcon from '@mui/icons-material/VerifiedUserOutlined';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport Link from '@mui/material/Link';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport ListItemText from '@mui/material/ListItemText';\nimport Typography from '@mui/material/Typography';\nimport type { FC } from 'react';\nimport React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useData } from '../../api/use-data';\nimport { getConfiguration } from '../../configuration';\nimport { stripTrailingSlash } from '../../store/utils';\nimport type { PackageMetaInterface, Signature } from '../../types/packageMeta';\nimport type { ProvenanceSummary } from '../../types/provenance';\nimport { APIRoute } from '../../utils/routes';\nimport { isURL } from '../../utils/url';\nimport { DistChips, DistListItem, StyledText } from '../Distribution/styles';\nimport RegistryInfoDialog from '../RegistryInfoDialog';\n\n// `https://slsa.dev/provenance/v1` → `SLSA v1`; other predicate types are shown as they are\nexport function provenanceLabel(predicateType: string): string {\n const version = predicateType.match(/^https:\\/\\/slsa\\.dev\\/provenance\\/(v[\\d.]+)$/)?.[1];\n return version ? `SLSA ${version}` : predicateType;\n}\n\nconst isGitLab = (buildType?: string) => buildType?.startsWith('https://github.com/npm/cli/gitlab');\n\n// npm and Yarn generate provenance on GitHub Actions (SLSA v1) and GitLab CI/CD (npm's own v0.2 build type)\nexport function builderLabel(builder: string, buildType?: string): string {\n if (isGitLab(buildType)) {\n return 'GitLab CI/CD';\n }\n if (/^https:\\/\\/github\\.com\\/actions\\/runner(\\/|$)/.test(builder)) {\n return builder.endsWith('/self-hosted') ? 'GitHub Actions (self-hosted)' : 'GitHub Actions';\n }\n return builder;\n}\n\n// GitLab statements carry the job name here, GitHub ones the workflow file\nconst isWorkflowFile = (entry: string) => /\\.ya?ml$/.test(entry);\n\n// GitLab commit pages live under `/-/commit/`, GitHub (and most forges) under `/commit/`\nexport function commitUrl(repository: string, commit: string, buildType?: string): string {\n return `${repository}/${isGitLab(buildType) ? '-/commit' : 'commit'}/${encodeURIComponent(commit)}`;\n}\n\n// each segment of the workflow path is encoded on its own so `/` keeps separating them\nexport function workflowUrl(repository: string, commit: string, workflowPath: string): string {\n const path = workflowPath.split('/').map(encodeURIComponent).join('/');\n return `${repository}/blob/${encodeURIComponent(commit)}/${path}`;\n}\n\n// `dist.attestations` and `dist.signatures` come straight from package metadata, not from the decoder\ntype ProvenanceMeta = { url?: string; provenance?: { predicateType: string } };\n\nfunction readAttestations(raw: unknown): ProvenanceMeta | undefined {\n const value = raw as { url?: unknown; provenance?: { predicateType?: unknown } } | undefined;\n const url = typeof value?.url === 'string' && value.url.length > 0 ? value.url : undefined;\n const predicateType = value?.provenance?.predicateType;\n const provenance =\n typeof predicateType === 'string' && predicateType.length > 0 ? { predicateType } : undefined;\n return url || provenance ? { url, provenance } : undefined;\n}\n\nfunction readSignatures(raw: unknown): Signature[] {\n return Array.isArray(raw)\n ? raw.filter((item): item is Signature => typeof item?.keyid === 'string' && item.keyid !== '')\n : [];\n}\n\n// every url here comes from the registry metadata or the attestation bundle\nconst isHttpUrl = (href: string) => /^https?:\\/\\//i.test(href) && isURL(href);\n\nconst ExternalLink: FC<{ href: string; children: React.ReactNode }> = ({ href, children }) =>\n isHttpUrl(href) ? (\n <Link href={href} rel=\"noopener noreferrer\" target=\"_blank\" underline=\"hover\">\n {children}\n </Link>\n ) : (\n <>{children}</>\n );\n\nconst Detail: FC<{ label: string; children: React.ReactNode }> = ({ label, children }) => (\n <ListItem disableGutters={true} sx={{ py: 0.5 }}>\n <ListItemText\n primary={label}\n secondary={children}\n secondaryTypographyProps={{ component: 'div' }}\n />\n </ListItem>\n);\n\nconst BuildDetails: FC<{ packageName: string; version?: string }> = ({ packageName, version }) => {\n const { t } = useTranslation();\n const basePath = stripTrailingSlash(getConfiguration().base);\n const { data, error, isLoading } = useData<ProvenanceSummary>(\n basePath,\n APIRoute.PROVENANCE,\n packageName,\n version,\n { shouldRetryOnError: false }\n );\n\n if (isLoading) {\n return <CircularProgress data-testid=\"provenance-loading\" size={24} sx={{ my: 2 }} />;\n }\n // the summary above is enough when the endpoint fails\n if (error || !data || typeof data !== 'object') {\n return null;\n }\n\n const repository = data.sourceRepository;\n const commit = data.sourceCommit;\n return (\n <>\n {data.builder ? (\n <Detail label={t('sidebar.provenance.built-on')}>\n {builderLabel(data.builder, data.buildType)}\n </Detail>\n ) : null}\n {repository ? (\n <Detail label={t('sidebar.provenance.source')}>\n <ExternalLink href={repository}>{repository.replace(/^https?:\\/\\//, '')}</ExternalLink>\n {data.sourceRef ? ` (${data.sourceRef.replace(/^refs\\/heads\\//, '')})` : ''}\n </Detail>\n ) : null}\n {repository && commit ? (\n <Detail label={t('sidebar.provenance.commit')}>\n <ExternalLink href={commitUrl(repository, commit, data.buildType)}>\n {commit.slice(0, 12)}\n </ExternalLink>\n </Detail>\n ) : null}\n {data.workflowPath ? (\n <Detail label={t('sidebar.provenance.workflow')}>\n {repository && commit && isWorkflowFile(data.workflowPath) ? (\n <ExternalLink href={workflowUrl(repository, commit, data.workflowPath)}>\n {data.workflowPath}\n </ExternalLink>\n ) : (\n data.workflowPath\n )}\n </Detail>\n ) : null}\n {data.buildRunUrl ? (\n <Detail label={t('sidebar.provenance.build-run')}>\n <ExternalLink href={data.buildRunUrl}>\n {data.buildRunUrl.replace(/^https?:\\/\\//, '')}\n </ExternalLink>\n </Detail>\n ) : null}\n {data.transparencyLogUrl ? (\n <Detail label={t('sidebar.provenance.transparency-log')}>\n <ExternalLink\n href={data.transparencyLogUrl}\n >{`#${data.transparencyLogIndex}`}</ExternalLink>\n </Detail>\n ) : null}\n </>\n );\n};\n\nconst ProvenanceDialog: FC<{\n open: boolean;\n onClose: () => void;\n packageName: string;\n version: string;\n attestations?: ProvenanceMeta;\n signatures: Signature[];\n showDetails: boolean;\n}> = ({ open, onClose, packageName, version, attestations, signatures, showDetails }) => {\n const { t } = useTranslation();\n const provenance = attestations?.provenance;\n const keyids = [...new Set(signatures.map((signature) => signature.keyid))];\n\n return (\n <RegistryInfoDialog onClose={onClose} open={open} title={t('sidebar.provenance.title')}>\n <Typography sx={{ pt: 2 }} variant=\"subtitle2\">{`${packageName}@${version}`}</Typography>\n <Typography color=\"text.secondary\" variant=\"body2\">\n {t('sidebar.provenance.disclaimer')}\n </Typography>\n <List dense={true}>\n {provenance ? (\n <Detail label={t('sidebar.provenance.provenance')}>\n {provenanceLabel(provenance.predicateType)}\n </Detail>\n ) : null}\n {keyids.length > 0 ? (\n <Detail label={t('sidebar.provenance.registry-signature')}>\n {keyids.map((keyid) => (\n <div key={keyid}>{keyid}</div>\n ))}\n </Detail>\n ) : null}\n {attestations?.url ? (\n <Detail label={t('sidebar.provenance.attestation')}>\n <ExternalLink href={attestations.url}>\n {attestations.url.replace(/^https?:\\/\\//, '')}\n </ExternalLink>\n </Detail>\n ) : null}\n {showDetails && provenance && open ? (\n <BuildDetails packageName={packageName} version={version} />\n ) : null}\n </List>\n </RegistryInfoDialog>\n );\n};\n\n/** \"Provenance\" sidebar section; its chip opens a dialog with the provenance and signature details. */\nconst Provenance: FC<{\n packageMeta: PackageMetaInterface;\n packageName: string;\n version?: string;\n // only servers exposing the provenance endpoint (ui option `capabilities.provenance`)\n showDetails?: boolean;\n}> = ({ packageMeta, packageName, version, showDetails = false }) => {\n const { t } = useTranslation();\n const [open, setOpen] = useState(false);\n const latest = packageMeta?.latest;\n const attestations = readAttestations(latest?.dist?.attestations);\n const signatures = readSignatures(latest?.dist?.signatures);\n const provenance = attestations?.provenance;\n\n if (!provenance && signatures.length === 0) {\n return null;\n }\n\n return (\n <List subheader={<StyledText variant=\"subtitle1\">{t('sidebar.provenance.title')}</StyledText>}>\n <DistListItem>\n <DistChips\n clickable={true}\n color={provenance ? 'primary' : 'default'}\n data-testid=\"provenance-badge\"\n icon={provenance ? <VerifiedUserIcon /> : <VerifiedUserOutlinedIcon />}\n label={\n provenance ? (\n <>\n <b>{t('sidebar.provenance.provenance')}</b>\n {': '}\n {provenanceLabel(provenance.predicateType)}\n </>\n ) : (\n <b>{t('sidebar.provenance.registry-signature')}</b>\n )\n }\n onClick={() => setOpen(true)}\n variant=\"outlined\"\n />\n </DistListItem>\n <ProvenanceDialog\n attestations={attestations}\n onClose={() => setOpen(false)}\n open={open}\n packageName={packageName}\n showDetails={showDetails}\n signatures={signatures}\n version={version || latest?.version || ''}\n />\n </List>\n );\n};\n\nexport default Provenance;\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { default } from './Provenance';
@@ -0,0 +1,2 @@
1
+ const require_Provenance = require("./Provenance.js");
2
+ exports.default = require_Provenance.default;
@@ -0,0 +1 @@
1
+ export { default } from "./Provenance.mjs";
@@ -128,6 +128,19 @@ var sidebar = {
128
128
  "size": "Size",
129
129
  "file-count": "File Count"
130
130
  },
131
+ "provenance": {
132
+ "title": "Provenance",
133
+ "provenance": "Provenance",
134
+ "registry-signature": "Registry signature",
135
+ "built-on": "Built on",
136
+ "source": "Source",
137
+ "commit": "Commit",
138
+ "workflow": "Workflow",
139
+ "build-run": "Build run",
140
+ "transparency-log": "Transparency log",
141
+ "attestation": "Attestation",
142
+ "disclaimer": "Registry-provided metadata; cryptographic verification has not been performed."
143
+ },
131
144
  "keywords": { "title": "Keywords" },
132
145
  "maintainers": { "title": "Maintainers" },
133
146
  "contributors": { "title": "Contributors" },