@porsche-design-system/components-angular 4.7.0-beta.0 → 4.7.0
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.
- package/CHANGELOG.md +35 -0
- package/bin/pds-skill.js +50 -41
- package/package.json +2 -2
- package/skills/pds-audit-deprecations-angular/SKILL.md +247 -0
- package/skills/pds-audit-deprecations-angular/references/report-template.md +128 -0
- package/skills/pds-audit-deprecations-angular/references/report.schema.json +446 -0
- package/skills/pds-knowledge-angular/SKILL.md +9 -3
- package/skills/pds-knowledge-angular/references/components/p-button/examples/AiGradientGlow.ts +1 -1
- package/skills/pds-knowledge-angular/references/deprecations.md +686 -0
- package/skills/pds-knowledge-angular/references/styles/scss.md +3 -2
- package/skills/pds-knowledge-angular/references/styles/tailwindcss.md +0 -2
- package/tailwindcss/index.css +16 -16
- package/vanilla-extract/cjs/blur/deprecated/frostedGlassStyle.cjs +1 -1
- package/vanilla-extract/cjs/border/deprecated/border.cjs +1 -1
- package/vanilla-extract/cjs/border/deprecated/borderRadius.cjs +1 -1
- package/vanilla-extract/cjs/border/deprecated/borderRadiusLarge.cjs +1 -1
- package/vanilla-extract/cjs/border/deprecated/borderRadiusMedium.cjs +1 -1
- package/vanilla-extract/cjs/border/deprecated/borderRadiusSmall.cjs +1 -1
- package/vanilla-extract/cjs/border/deprecated/borderWidth.cjs +1 -1
- package/vanilla-extract/cjs/border/deprecated/borderWidthBase.cjs +1 -1
- package/vanilla-extract/cjs/border/deprecated/borderWidthThin.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/theme.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDark.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkBackgroundBase.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkBackgroundFrosted.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkBackgroundShading.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkBackgroundSurface.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkContrastHigh.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkContrastLow.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkContrastMedium.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkNotificationError.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkNotificationErrorSoft.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkNotificationInfo.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkNotificationInfoSoft.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkNotificationSuccess.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkNotificationSuccessSoft.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkNotificationWarning.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkNotificationWarningSoft.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkPrimary.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkStateActive.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkStateDisabled.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkStateFocus.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeDarkStateHover.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLight.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightBackgroundBase.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightBackgroundFrosted.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightBackgroundShading.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightBackgroundSurface.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightContrastHigh.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightContrastLow.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightContrastMedium.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightNotificationError.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightNotificationErrorSoft.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightNotificationInfo.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightNotificationInfoSoft.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightNotificationSuccess.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightNotificationSuccessSoft.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightNotificationWarning.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightNotificationWarningSoft.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightPrimary.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightStateActive.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightStateDisabled.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightStateFocus.cjs +1 -1
- package/vanilla-extract/cjs/color/deprecated/themeLightStateHover.cjs +1 -1
- package/vanilla-extract/cjs/focus/deprecated/getFocusStyle.cjs +1 -0
- package/vanilla-extract/cjs/font/deprecated/fontFamily.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontLineHeight.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSize.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSizeDisplay.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSizeHeading.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSizeHeadingLarge.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSizeHeadingMedium.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSizeHeadingSmall.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSizeHeadingXLarge.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSizeHeadingXXLarge.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSizeText.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSizeTextLarge.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSizeTextMedium.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSizeTextSmall.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSizeTextXLarge.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSizeTextXSmall.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontSizeTextXXSmall.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontStyle.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontStyleItalic.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontStyleNormal.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontVariant.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontWeight.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontWeightRegular.cjs +1 -1
- package/vanilla-extract/cjs/font/deprecated/fontWeightSemiBold.cjs +1 -1
- package/vanilla-extract/cjs/gradient/deprecated/gradientToBottomStyle.cjs +1 -1
- package/vanilla-extract/cjs/gradient/deprecated/gradientToLeftStyle.cjs +1 -1
- package/vanilla-extract/cjs/gradient/deprecated/gradientToRightStyle.cjs +1 -1
- package/vanilla-extract/cjs/gradient/deprecated/gradientToTopStyle.cjs +1 -1
- package/vanilla-extract/cjs/motion/deprecated/motionDurationLong.cjs +1 -1
- package/vanilla-extract/cjs/motion/deprecated/motionDurationModerate.cjs +1 -1
- package/vanilla-extract/cjs/motion/deprecated/motionDurationShort.cjs +1 -1
- package/vanilla-extract/cjs/motion/deprecated/motionDurationVeryLong.cjs +1 -1
- package/vanilla-extract/cjs/motion/deprecated/motionEasingBase.cjs +1 -1
- package/vanilla-extract/cjs/motion/deprecated/motionEasingIn.cjs +1 -1
- package/vanilla-extract/cjs/motion/deprecated/motionEasingOut.cjs +1 -1
- package/vanilla-extract/cjs/shadow/deprecated/dropShadowHighStyle.cjs +1 -1
- package/vanilla-extract/cjs/shadow/deprecated/dropShadowLowStyle.cjs +1 -1
- package/vanilla-extract/cjs/shadow/deprecated/dropShadowMediumStyle.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacing.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacingFluid.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacingFluidLarge.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacingFluidMedium.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacingFluidSmall.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacingFluidXLarge.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacingFluidXSmall.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacingFluidXXLarge.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacingStatic.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacingStaticLarge.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacingStaticMedium.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacingStaticSmall.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacingStaticXLarge.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacingStaticXSmall.cjs +1 -1
- package/vanilla-extract/cjs/spacing/deprecated/spacingStaticXXLarge.cjs +1 -1
- package/vanilla-extract/cjs/typography/deprecated/display/displayLargeStyle.cjs +1 -1
- package/vanilla-extract/cjs/typography/deprecated/display/displayMediumStyle.cjs +1 -1
- package/vanilla-extract/cjs/typography/deprecated/display/displaySmallStyle.cjs +1 -1
- package/vanilla-extract/cjs/typography/deprecated/heading/headingLargeStyle.cjs +1 -1
- package/vanilla-extract/cjs/typography/deprecated/heading/headingMediumStyle.cjs +1 -1
- package/vanilla-extract/cjs/typography/deprecated/heading/headingSmallStyle.cjs +1 -1
- package/vanilla-extract/cjs/typography/deprecated/heading/headingXLargeStyle.cjs +1 -1
- package/vanilla-extract/cjs/typography/deprecated/heading/headingXXLargeStyle.cjs +1 -1
- package/vanilla-extract/cjs/typography/deprecated/text/textLargeStyle.cjs +1 -1
- package/vanilla-extract/cjs/typography/deprecated/text/textMediumStyle.cjs +1 -1
- package/vanilla-extract/cjs/typography/deprecated/text/textSmallStyle.cjs +1 -1
- package/vanilla-extract/cjs/typography/deprecated/text/textXLargeStyle.cjs +1 -1
- package/vanilla-extract/cjs/typography/deprecated/text/textXSmallStyle.cjs +1 -1
- package/vanilla-extract/cjs/typography/deprecated/text/textXXSmallStyle.cjs +1 -1
- package/vanilla-extract/esm/blur/deprecated/frostedGlassStyle.d.ts +1 -1
- package/vanilla-extract/esm/blur/deprecated/frostedGlassStyle.mjs +1 -1
- package/vanilla-extract/esm/border/deprecated/border.d.ts +1 -1
- package/vanilla-extract/esm/border/deprecated/border.mjs +1 -1
- package/vanilla-extract/esm/border/deprecated/borderRadius.d.ts +1 -1
- package/vanilla-extract/esm/border/deprecated/borderRadius.mjs +1 -1
- package/vanilla-extract/esm/border/deprecated/borderRadiusLarge.d.ts +1 -1
- package/vanilla-extract/esm/border/deprecated/borderRadiusLarge.mjs +1 -1
- package/vanilla-extract/esm/border/deprecated/borderRadiusMedium.d.ts +1 -1
- package/vanilla-extract/esm/border/deprecated/borderRadiusMedium.mjs +1 -1
- package/vanilla-extract/esm/border/deprecated/borderRadiusSmall.d.ts +1 -1
- package/vanilla-extract/esm/border/deprecated/borderRadiusSmall.mjs +1 -1
- package/vanilla-extract/esm/border/deprecated/borderWidth.d.ts +1 -1
- package/vanilla-extract/esm/border/deprecated/borderWidth.mjs +1 -1
- package/vanilla-extract/esm/border/deprecated/borderWidthBase.d.ts +1 -1
- package/vanilla-extract/esm/border/deprecated/borderWidthBase.mjs +1 -1
- package/vanilla-extract/esm/border/deprecated/borderWidthThin.d.ts +1 -1
- package/vanilla-extract/esm/border/deprecated/borderWidthThin.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/theme.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/theme.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDark.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDark.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkBackgroundBase.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkBackgroundBase.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkBackgroundFrosted.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkBackgroundFrosted.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkBackgroundShading.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkBackgroundShading.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkBackgroundSurface.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkBackgroundSurface.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkContrastHigh.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkContrastHigh.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkContrastLow.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkContrastLow.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkContrastMedium.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkContrastMedium.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationError.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationError.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationErrorSoft.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationErrorSoft.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationInfo.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationInfo.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationInfoSoft.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationInfoSoft.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationSuccess.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationSuccess.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationSuccessSoft.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationSuccessSoft.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationWarning.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationWarning.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationWarningSoft.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkNotificationWarningSoft.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkPrimary.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkPrimary.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkStateActive.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkStateActive.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkStateDisabled.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkStateDisabled.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkStateFocus.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkStateFocus.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkStateHover.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeDarkStateHover.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLight.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLight.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightBackgroundBase.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightBackgroundBase.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightBackgroundFrosted.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightBackgroundFrosted.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightBackgroundShading.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightBackgroundShading.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightBackgroundSurface.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightBackgroundSurface.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightContrastHigh.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightContrastHigh.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightContrastLow.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightContrastLow.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightContrastMedium.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightContrastMedium.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationError.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationError.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationErrorSoft.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationErrorSoft.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationInfo.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationInfo.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationInfoSoft.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationInfoSoft.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationSuccess.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationSuccess.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationSuccessSoft.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationSuccessSoft.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationWarning.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationWarning.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationWarningSoft.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightNotificationWarningSoft.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightPrimary.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightPrimary.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightStateActive.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightStateActive.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightStateDisabled.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightStateDisabled.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightStateFocus.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightStateFocus.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightStateHover.d.ts +1 -1
- package/vanilla-extract/esm/color/deprecated/themeLightStateHover.mjs +1 -1
- package/vanilla-extract/esm/color/deprecated/themeShared.d.ts +1 -1
- package/vanilla-extract/esm/focus/deprecated/getFocusStyle.d.ts +1 -0
- package/vanilla-extract/esm/focus/deprecated/getFocusStyle.mjs +1 -0
- package/vanilla-extract/esm/font/deprecated/fontFamily.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontFamily.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontLineHeight.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontLineHeight.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSize.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSize.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeDisplay.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeDisplay.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeHeading.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeHeading.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeHeadingLarge.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeHeadingLarge.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeHeadingMedium.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeHeadingMedium.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeHeadingSmall.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeHeadingSmall.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeHeadingXLarge.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeHeadingXLarge.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeHeadingXXLarge.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeHeadingXXLarge.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeText.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeText.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeTextLarge.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeTextLarge.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeTextMedium.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeTextMedium.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeTextSmall.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeTextSmall.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeTextXLarge.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeTextXLarge.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeTextXSmall.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeTextXSmall.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeTextXXSmall.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontSizeTextXXSmall.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontStyle.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontStyle.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontStyleItalic.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontStyleItalic.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontStyleNormal.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontStyleNormal.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontVariant.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontVariant.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontWeight.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontWeight.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontWeightRegular.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontWeightRegular.mjs +1 -1
- package/vanilla-extract/esm/font/deprecated/fontWeightSemiBold.d.ts +1 -1
- package/vanilla-extract/esm/font/deprecated/fontWeightSemiBold.mjs +1 -1
- package/vanilla-extract/esm/gradient/deprecated/gradientToBottomStyle.d.ts +1 -1
- package/vanilla-extract/esm/gradient/deprecated/gradientToBottomStyle.mjs +1 -1
- package/vanilla-extract/esm/gradient/deprecated/gradientToLeftStyle.d.ts +1 -1
- package/vanilla-extract/esm/gradient/deprecated/gradientToLeftStyle.mjs +1 -1
- package/vanilla-extract/esm/gradient/deprecated/gradientToRightStyle.d.ts +1 -1
- package/vanilla-extract/esm/gradient/deprecated/gradientToRightStyle.mjs +1 -1
- package/vanilla-extract/esm/gradient/deprecated/gradientToTopStyle.d.ts +1 -1
- package/vanilla-extract/esm/gradient/deprecated/gradientToTopStyle.mjs +1 -1
- package/vanilla-extract/esm/motion/deprecated/motionDurationLong.d.ts +1 -1
- package/vanilla-extract/esm/motion/deprecated/motionDurationLong.mjs +1 -1
- package/vanilla-extract/esm/motion/deprecated/motionDurationModerate.d.ts +1 -1
- package/vanilla-extract/esm/motion/deprecated/motionDurationModerate.mjs +1 -1
- package/vanilla-extract/esm/motion/deprecated/motionDurationShort.d.ts +1 -1
- package/vanilla-extract/esm/motion/deprecated/motionDurationShort.mjs +1 -1
- package/vanilla-extract/esm/motion/deprecated/motionDurationVeryLong.d.ts +1 -1
- package/vanilla-extract/esm/motion/deprecated/motionDurationVeryLong.mjs +1 -1
- package/vanilla-extract/esm/motion/deprecated/motionEasingBase.d.ts +1 -1
- package/vanilla-extract/esm/motion/deprecated/motionEasingBase.mjs +1 -1
- package/vanilla-extract/esm/motion/deprecated/motionEasingIn.d.ts +1 -1
- package/vanilla-extract/esm/motion/deprecated/motionEasingIn.mjs +1 -1
- package/vanilla-extract/esm/motion/deprecated/motionEasingOut.d.ts +1 -1
- package/vanilla-extract/esm/motion/deprecated/motionEasingOut.mjs +1 -1
- package/vanilla-extract/esm/shadow/deprecated/dropShadowHighStyle.d.ts +1 -1
- package/vanilla-extract/esm/shadow/deprecated/dropShadowHighStyle.mjs +1 -1
- package/vanilla-extract/esm/shadow/deprecated/dropShadowLowStyle.d.ts +1 -1
- package/vanilla-extract/esm/shadow/deprecated/dropShadowLowStyle.mjs +1 -1
- package/vanilla-extract/esm/shadow/deprecated/dropShadowMediumStyle.d.ts +1 -1
- package/vanilla-extract/esm/shadow/deprecated/dropShadowMediumStyle.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacing.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacing.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingFluid.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingFluid.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingFluidLarge.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingFluidLarge.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingFluidMedium.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingFluidMedium.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingFluidSmall.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingFluidSmall.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingFluidXLarge.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingFluidXLarge.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingFluidXSmall.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingFluidXSmall.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingFluidXXLarge.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingFluidXXLarge.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingStatic.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingStatic.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingStaticLarge.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingStaticLarge.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingStaticMedium.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingStaticMedium.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingStaticSmall.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingStaticSmall.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingStaticXLarge.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingStaticXLarge.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingStaticXSmall.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingStaticXSmall.mjs +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingStaticXXLarge.d.ts +1 -1
- package/vanilla-extract/esm/spacing/deprecated/spacingStaticXXLarge.mjs +1 -1
- package/vanilla-extract/esm/typography/deprecated/display/displayLargeStyle.d.ts +1 -1
- package/vanilla-extract/esm/typography/deprecated/display/displayLargeStyle.mjs +1 -1
- package/vanilla-extract/esm/typography/deprecated/display/displayMediumStyle.d.ts +1 -1
- package/vanilla-extract/esm/typography/deprecated/display/displayMediumStyle.mjs +1 -1
- package/vanilla-extract/esm/typography/deprecated/display/displaySmallStyle.d.ts +1 -1
- package/vanilla-extract/esm/typography/deprecated/display/displaySmallStyle.mjs +1 -1
- package/vanilla-extract/esm/typography/deprecated/heading/headingLargeStyle.d.ts +1 -1
- package/vanilla-extract/esm/typography/deprecated/heading/headingLargeStyle.mjs +1 -1
- package/vanilla-extract/esm/typography/deprecated/heading/headingMediumStyle.d.ts +1 -1
- package/vanilla-extract/esm/typography/deprecated/heading/headingMediumStyle.mjs +1 -1
- package/vanilla-extract/esm/typography/deprecated/heading/headingSmallStyle.d.ts +1 -1
- package/vanilla-extract/esm/typography/deprecated/heading/headingSmallStyle.mjs +1 -1
- package/vanilla-extract/esm/typography/deprecated/heading/headingXLargeStyle.d.ts +1 -1
- package/vanilla-extract/esm/typography/deprecated/heading/headingXLargeStyle.mjs +1 -1
- package/vanilla-extract/esm/typography/deprecated/heading/headingXXLargeStyle.d.ts +1 -1
- package/vanilla-extract/esm/typography/deprecated/heading/headingXXLargeStyle.mjs +1 -1
- package/vanilla-extract/esm/typography/deprecated/text/textLargeStyle.d.ts +1 -1
- package/vanilla-extract/esm/typography/deprecated/text/textLargeStyle.mjs +1 -1
- package/vanilla-extract/esm/typography/deprecated/text/textMediumStyle.d.ts +1 -1
- package/vanilla-extract/esm/typography/deprecated/text/textMediumStyle.mjs +1 -1
- package/vanilla-extract/esm/typography/deprecated/text/textSmallStyle.d.ts +1 -1
- package/vanilla-extract/esm/typography/deprecated/text/textSmallStyle.mjs +1 -1
- package/vanilla-extract/esm/typography/deprecated/text/textXLargeStyle.d.ts +1 -1
- package/vanilla-extract/esm/typography/deprecated/text/textXLargeStyle.mjs +1 -1
- package/vanilla-extract/esm/typography/deprecated/text/textXSmallStyle.d.ts +1 -1
- package/vanilla-extract/esm/typography/deprecated/text/textXSmallStyle.mjs +1 -1
- package/vanilla-extract/esm/typography/deprecated/text/textXXSmallStyle.d.ts +1 -1
- package/vanilla-extract/esm/typography/deprecated/text/textXXSmallStyle.mjs +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -14,6 +14,41 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0),
|
|
|
14
14
|
|
|
15
15
|
## [Unreleased]
|
|
16
16
|
|
|
17
|
+
## [4.7.0] - 2026-09-09
|
|
18
|
+
|
|
19
|
+
## [4.7.0-rc.0] - 2026-09-09
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- `Audit Deprecations Skill`: new skill shipped as `pds-audit-deprecations-{js|angular|react|vue}` in the package's
|
|
24
|
+
`skills/` directory. Invoke it to audit a project for deprecated Porsche Design System API usage; it writes its report
|
|
25
|
+
below `.pds/audits/` and never changes your code
|
|
26
|
+
([#4645](https://github.com/porsche-design-system/porsche-design-system/pull/4645))
|
|
27
|
+
- `Knowledge Skill`: `references/deprecations.md`, a version-exact index of every deprecated component, prop, prop
|
|
28
|
+
value, event, slot, CSS variable and styling alias together with what to use instead
|
|
29
|
+
([#4645](https://github.com/porsche-design-system/porsche-design-system/pull/4645))
|
|
30
|
+
- **Partials**: `getMetaTagsAndIconLinks()` now links a webmanifest with maskable icons for Android PWA installation
|
|
31
|
+
([#4709](https://github.com/porsche-design-system/porsche-design-system/pull/4709))
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- `pds-skill`: Skill links are now created with a relative target on macOS and Linux, so they stay valid across
|
|
36
|
+
symlink-capable clones and in CI and can be committed. Re-run the command to migrate links created by an earlier
|
|
37
|
+
version. Windows keeps using directory junctions, which cannot be relative
|
|
38
|
+
([#4645](https://github.com/porsche-design-system/porsche-design-system/pull/4645))
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- **Breakpoint Customizable Props**: setting a breakpoint customizable boolean prop as an HTML boolean attribute without
|
|
43
|
+
a value, e.g. `<p-input-text hide-label>`, was ignored and logged a validation error instead of behaving like
|
|
44
|
+
`<p-input-text hide-label="true">`. Affects `hide-label`, `stretch`, `indent`, `fullscreen`, `pagination` and
|
|
45
|
+
`compact` (the latter only on `Button`, `Link`, `Link Tile` and `Button Tile`, where it is breakpoint customizable).
|
|
46
|
+
([#4701](https://github.com/porsche-design-system/porsche-design-system/pull/4701))
|
|
47
|
+
- **React Server Components**: prerendering crashed with `Cannot use 'in' operator to search for 'type' in null` when a
|
|
48
|
+
component from `@porsche-design-system/components-react/ssr` received `null` as its only child, e.g.
|
|
49
|
+
`<PTableCell>{cond ? <PIcon /> : null}</PTableCell>`
|
|
50
|
+
([#4685](https://github.com/porsche-design-system/porsche-design-system/pull/4685))
|
|
51
|
+
|
|
17
52
|
## [4.7.0-beta.0] - 2026-08-27
|
|
18
53
|
|
|
19
54
|
### Added
|
package/bin/pds-skill.js
CHANGED
|
@@ -1,19 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// --package selects which installed wrapper supplies the skills, independently of which
|
|
6
|
-
// wrapper supplies the bin.
|
|
7
|
-
//
|
|
8
|
-
// --location is the destination parent directory for the skill links (e.g. `.claude/skills`,
|
|
9
|
-
// `.agents`, `.github/skills`). Relative locations resolve from the cwd.
|
|
10
|
-
//
|
|
11
|
-
// --skill may be repeated to install only named skills. Omit it to install all discovered skills.
|
|
12
|
-
//
|
|
13
|
-
// pds-skill --package <package> --location <dir> [--skill <name>...]
|
|
14
|
-
//
|
|
15
|
-
// This is the canonical source copied into all four wrapper package distributions by their
|
|
16
|
-
// `build:subPackages:skill:bin` steps.
|
|
3
|
+
// Canonical installer copied into every wrapper package. It creates portable relative links to
|
|
4
|
+
// locally installed skills; Windows junctions require absolute targets.
|
|
17
5
|
|
|
18
6
|
const fs = require('node:fs');
|
|
19
7
|
const path = require('node:path');
|
|
@@ -89,7 +77,6 @@ const readPackageManifest = (packageJsonPath) => {
|
|
|
89
77
|
}
|
|
90
78
|
};
|
|
91
79
|
|
|
92
|
-
/** Parse the frontmatter `name:` value from SKILL.md content. Returns null if not found. */
|
|
93
80
|
const parseFrontmatterName = (content) => {
|
|
94
81
|
const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
95
82
|
if (!fmMatch) {
|
|
@@ -99,10 +86,7 @@ const parseFrontmatterName = (content) => {
|
|
|
99
86
|
return nameMatch ? nameMatch[1] : null;
|
|
100
87
|
};
|
|
101
88
|
|
|
102
|
-
/**
|
|
103
|
-
* Validate that the SKILL.md at skillMdPath is a readable regular file with a frontmatter name
|
|
104
|
-
* matching expectedName. Calls fail() on any violation.
|
|
105
|
-
*/
|
|
89
|
+
/** Fails unless a skill has a readable SKILL.md whose frontmatter name matches its directory. */
|
|
106
90
|
const validateSkillMd = (skillMdPath, expectedName) => {
|
|
107
91
|
let stats;
|
|
108
92
|
try {
|
|
@@ -158,7 +142,7 @@ const preflightDestLink = (linkPath, show) => {
|
|
|
158
142
|
}
|
|
159
143
|
};
|
|
160
144
|
|
|
161
|
-
/**
|
|
145
|
+
/** Finds the nearest installed wrapper and its owning project root. */
|
|
162
146
|
const resolvePackageDir = (packageName, cwd) => {
|
|
163
147
|
if (!SUPPORTED_PACKAGES.includes(packageName)) {
|
|
164
148
|
fail(`Unsupported package: ${packageName}\n${USAGE}`);
|
|
@@ -174,7 +158,7 @@ const resolvePackageDir = (packageName, cwd) => {
|
|
|
174
158
|
if (installedName !== packageName) {
|
|
175
159
|
fail(`Expected ${packageName} at ${packageDir}, but found ${installedName || 'a package without a name'}.`);
|
|
176
160
|
}
|
|
177
|
-
return packageDir;
|
|
161
|
+
return { packageDir, projectRoot: dir };
|
|
178
162
|
}
|
|
179
163
|
|
|
180
164
|
const parent = path.dirname(dir);
|
|
@@ -185,7 +169,6 @@ const resolvePackageDir = (packageName, cwd) => {
|
|
|
185
169
|
}
|
|
186
170
|
};
|
|
187
171
|
|
|
188
|
-
/** Discover sorted child directory names under skillsDir. Returns empty array if the dir is absent. */
|
|
189
172
|
const discoverSkillNames = (skillsDir) => {
|
|
190
173
|
let entries;
|
|
191
174
|
try {
|
|
@@ -205,6 +188,20 @@ const discoverSkillNames = (skillsDir) => {
|
|
|
205
188
|
.sort();
|
|
206
189
|
};
|
|
207
190
|
|
|
191
|
+
const isInside = (parentDir, target) => {
|
|
192
|
+
const rel = path.relative(parentDir, target);
|
|
193
|
+
return rel === '' || (rel !== '..' && !rel.startsWith(`..${path.sep}`) && !path.isAbsolute(rel));
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
/** Resolves symlinks when possible, otherwise preserves the input path. */
|
|
197
|
+
const resolveRealPath = (target) => {
|
|
198
|
+
try {
|
|
199
|
+
return fs.realpathSync(target);
|
|
200
|
+
} catch {
|
|
201
|
+
return target;
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
208
205
|
const main = () => {
|
|
209
206
|
const options = parseOptions(process.argv.slice(2));
|
|
210
207
|
if (options.help) {
|
|
@@ -228,7 +225,7 @@ const main = () => {
|
|
|
228
225
|
const destArg = options.location;
|
|
229
226
|
const requestedSkills = options.skill ?? [];
|
|
230
227
|
|
|
231
|
-
const packageDir = resolvePackageDir(packageName, cwd);
|
|
228
|
+
const { packageDir, projectRoot } = resolvePackageDir(packageName, cwd);
|
|
232
229
|
const skillsDir = path.join(packageDir, 'skills');
|
|
233
230
|
const discovered = discoverSkillNames(skillsDir);
|
|
234
231
|
|
|
@@ -236,7 +233,6 @@ const main = () => {
|
|
|
236
233
|
fail(`The installed package does not ship any skills at ${skillsDir}. Upgrade the package and re-run.`);
|
|
237
234
|
}
|
|
238
235
|
|
|
239
|
-
// Validate --skill filters; unknown names fail clearly.
|
|
240
236
|
if (requestedSkills.length > 0) {
|
|
241
237
|
const unknown = requestedSkills.filter((s) => !discovered.includes(s));
|
|
242
238
|
if (unknown.length > 0) {
|
|
@@ -247,7 +243,6 @@ const main = () => {
|
|
|
247
243
|
}
|
|
248
244
|
}
|
|
249
245
|
|
|
250
|
-
// Deterministic sorted selection.
|
|
251
246
|
const selected =
|
|
252
247
|
requestedSkills.length > 0
|
|
253
248
|
? [...new Set(requestedSkills)].filter((s) => discovered.includes(s)).sort()
|
|
@@ -255,13 +250,12 @@ const main = () => {
|
|
|
255
250
|
|
|
256
251
|
const destDir = path.isAbsolute(destArg) ? destArg : path.resolve(cwd, destArg);
|
|
257
252
|
|
|
258
|
-
// Prefer
|
|
253
|
+
// Prefer cwd-relative paths in messages.
|
|
259
254
|
const show = (target) => {
|
|
260
255
|
const rel = path.relative(cwd, target);
|
|
261
256
|
return rel && !rel.startsWith('..') && !path.isAbsolute(rel) ? rel : target;
|
|
262
257
|
};
|
|
263
258
|
|
|
264
|
-
// Preflight every selected skill tree before touching the destination at all.
|
|
265
259
|
for (const skillName of selected) {
|
|
266
260
|
validateSkillMd(path.join(skillsDir, skillName, 'SKILL.md'), skillName);
|
|
267
261
|
}
|
|
@@ -278,19 +272,30 @@ const main = () => {
|
|
|
278
272
|
throw error;
|
|
279
273
|
}
|
|
280
274
|
|
|
281
|
-
// Preflight all destination links before any mutation.
|
|
282
275
|
for (const skillName of selected) {
|
|
283
276
|
preflightDestLink(path.join(destDir, skillName), show);
|
|
284
277
|
}
|
|
285
278
|
|
|
286
|
-
//
|
|
279
|
+
// Relative targets must be computed from the destination's resolved path.
|
|
280
|
+
const realDestDir = resolveRealPath(destDir);
|
|
281
|
+
|
|
282
|
+
// Windows junctions require absolute targets. Destinations outside the project do not gain
|
|
283
|
+
// portability from relative targets.
|
|
287
284
|
const linkType = process.platform === 'win32' ? 'junction' : 'dir';
|
|
285
|
+
const useRelativeTarget = linkType !== 'junction' && isInside(projectRoot, realDestDir);
|
|
286
|
+
|
|
287
|
+
// Compare resolved targets so older absolute links remain idempotent.
|
|
288
|
+
const matchesDesiredTarget = (currentTarget, desiredTarget) =>
|
|
289
|
+
useRelativeTarget
|
|
290
|
+
? path.normalize(currentTarget) === path.normalize(desiredTarget)
|
|
291
|
+
: path.resolve(realDestDir, currentTarget) === desiredTarget;
|
|
292
|
+
|
|
288
293
|
for (const skillName of selected) {
|
|
289
294
|
const skillDir = path.join(skillsDir, skillName);
|
|
290
295
|
const linkPath = path.join(destDir, skillName);
|
|
296
|
+
const linkTarget = useRelativeTarget ? path.relative(realDestDir, skillDir) : skillDir;
|
|
291
297
|
|
|
292
|
-
//
|
|
293
|
-
// real directory a user may have hand-maintained — the preflight above already rejected that.
|
|
298
|
+
// Existing symlinks may be replaced; user-managed directories were rejected above.
|
|
294
299
|
let existingLink = null;
|
|
295
300
|
try {
|
|
296
301
|
existingLink = fs.lstatSync(linkPath);
|
|
@@ -301,20 +306,24 @@ const main = () => {
|
|
|
301
306
|
}
|
|
302
307
|
|
|
303
308
|
if (existingLink?.isSymbolicLink()) {
|
|
309
|
+
let currentTarget = null;
|
|
304
310
|
try {
|
|
305
|
-
|
|
306
|
-
console.log(`Porsche Design System skill already linked: ${show(linkPath)} -> ${skillDir}`);
|
|
307
|
-
continue;
|
|
308
|
-
}
|
|
311
|
+
currentTarget = fs.readlinkSync(linkPath);
|
|
309
312
|
} catch (error) {
|
|
310
|
-
if (error
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
313
|
+
if (isPermissionError(error)) {
|
|
314
|
+
fail(`Cannot inspect ${show(linkPath)}: permission denied. Check the destination permissions and re-run.`);
|
|
315
|
+
}
|
|
316
|
+
// Windows reparse points can produce EINVAL despite lstat reporting a symlink.
|
|
317
|
+
if (error.code !== 'ENOENT' && error.code !== 'EINVAL') {
|
|
314
318
|
throw error;
|
|
315
319
|
}
|
|
316
|
-
// Dangling symlink — fall through to replace it.
|
|
317
320
|
}
|
|
321
|
+
|
|
322
|
+
if (currentTarget !== null && matchesDesiredTarget(currentTarget, linkTarget)) {
|
|
323
|
+
console.log(`Porsche Design System skill already linked: ${show(linkPath)} -> ${skillDir}`);
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
|
|
318
327
|
try {
|
|
319
328
|
fs.rmSync(linkPath, { force: true });
|
|
320
329
|
} catch (error) {
|
|
@@ -326,7 +335,7 @@ const main = () => {
|
|
|
326
335
|
}
|
|
327
336
|
|
|
328
337
|
try {
|
|
329
|
-
fs.symlinkSync(
|
|
338
|
+
fs.symlinkSync(linkTarget, linkPath, linkType);
|
|
330
339
|
} catch (error) {
|
|
331
340
|
if (process.platform === 'win32' && error.code === 'EPERM') {
|
|
332
341
|
fail(
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@porsche-design-system/components-angular",
|
|
3
|
-
"version": "4.7.0
|
|
3
|
+
"version": "4.7.0",
|
|
4
4
|
"description": "Porsche Design System is a component library designed to help developers create the best experience for software or services distributed by Dr. Ing. h.c. F. Porsche AG.",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"keywords": [
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"url": "https://github.com/porsche-design-system/porsche-design-system"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@porsche-design-system/components-js": "4.7.0
|
|
25
|
+
"@porsche-design-system/components-js": "4.7.0",
|
|
26
26
|
"tslib": "^2.8.1"
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pds-audit-deprecations-angular
|
|
3
|
+
description: Audit an existing angular project for deprecated Porsche Design System (PDS) API usage — components, props, prop values, events, slots, CSS variables, tokens and styling-package aliases. Produces a JSON report and a Markdown report rendered from it, every finding carrying quoted evidence, a concrete fix and a derived confidence. Read-only apart from its two report files.
|
|
4
|
+
compatibility: Requires the pds-knowledge-angular skill, which ships alongside this one in @porsche-design-system/components-angular@4.7.0. The audited project must depend on that exact version.
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Porsche Design System deprecation audit (`angular`)
|
|
9
|
+
|
|
10
|
+
A static, read-only audit of an existing project's use of deprecated Porsche Design System APIs, producing a machine-readable JSON report and a Markdown report rendered from it.
|
|
11
|
+
|
|
12
|
+
Every deprecated API in this version still works today and is scheduled to break at the next major release. That is the impact of every finding in this report, stated once here so no finding has to repeat it.
|
|
13
|
+
|
|
14
|
+
This skill runs only when a user invokes it, and it depends on `pds-knowledge-angular` — it holds no Porsche Design System facts of its own.
|
|
15
|
+
|
|
16
|
+
## 1. Check the framework first
|
|
17
|
+
|
|
18
|
+
Before anything else, confirm `@porsche-design-system/components-angular` is a project dependency.
|
|
19
|
+
|
|
20
|
+
If it is not, stop and tell the user which PDS wrapper the project actually uses so they can run that audit skill instead. Do not write a report. An audit run against the wrong framework finds none of that framework's usage and reads as a passing audit, which is worse than no audit at all.
|
|
21
|
+
|
|
22
|
+
## 2. Load the deprecation index
|
|
23
|
+
|
|
24
|
+
Read the deprecation index at `../pds-knowledge-angular/references/deprecations.md` — or, if only this skill was linked, `node_modules/@porsche-design-system/components-angular/skills/pds-knowledge-angular/references/deprecations.md`.
|
|
25
|
+
|
|
26
|
+
It is the **only** source of what is deprecated. It is generated from the installed package, enumerates every source category including those that currently have none, and is gated in CI against every deprecation source — so it is complete by construction, and anything absent from it is not deprecated.
|
|
27
|
+
|
|
28
|
+
Its **Coverage** table gives the entry count per source category. Work through every one — components, SCSS, Emotion, vanilla-extract, Tailwind, tokens, icons and stylesheets. The styling categories are the easiest to skip, because they live in `.css` and style-definition files rather than component files.
|
|
29
|
+
|
|
30
|
+
Do not use recalled knowledge, the public documentation site, or a changelog to decide that something is deprecated. If it is not in the index, it is not reported.
|
|
31
|
+
|
|
32
|
+
Each index row also links a reference in `pds-knowledge-angular` documenting its replacement. Open that reference whenever a row gives you less than a concrete fix needs — the component whose prop you are replacing, or the styling integration an alias belongs to. Read that skill from `node_modules/@porsche-design-system/components-angular/skills/pds-knowledge-angular/SKILL.md` if it is not already loaded.
|
|
33
|
+
|
|
34
|
+
If the index cannot be read, write a report with `summary.result: "failed"` and no findings, then stop. An audit that cannot read its own catalog finds nothing, which is indistinguishable from a clean project.
|
|
35
|
+
|
|
36
|
+
## 3. Establish scope
|
|
37
|
+
|
|
38
|
+
Determine the project root from the Git or workspace root, falling back to the current directory. Never read outside the root, and never follow a symlink that leaves it.
|
|
39
|
+
|
|
40
|
+
**Discover the packages before auditing any of them.** Enumerate every `package.json` under the root, skipping ignored paths, and audit each one that declares `@porsche-design-system/components-angular` in `dependencies`, `devDependencies` or `peerDependencies`. Do not take a monorepo’s `workspaces` globs as the list: a directory that declares the dependency without being a workspace member is in scope all the same, and a workspace member that does not declare it is not.
|
|
41
|
+
|
|
42
|
+
Record every discovered package in `scope.includedPaths` — `.` when the project is a single package — and every path you deliberately leave out in `scope.excludedPaths`, each with its reason. That includes a discovered package you decided not to audit. This list is what §9 checks `completed` against, because a package never discovered was never an eligible file either, so no file-level check can catch it.
|
|
43
|
+
|
|
44
|
+
Resolve any user-supplied include and exclude paths against the root and apply them on top of that list, recording them the same way.
|
|
45
|
+
|
|
46
|
+
Audit production source and PDS configuration. These always count: `**/*.ts`, `**/*.html`, `**/*.css`, `**/*.scss`, `**/*.sass`, `**/*.less`, `**/angular.json`, `**/project.json`, `**/workspace.json`.
|
|
47
|
+
|
|
48
|
+
**Templates live in two places** — inline backtick `template:` strings inside `.ts` files and external `templateUrl` `.html` files. Scanning only one silently halves coverage with no error, so scan both. Angular workspace configuration can inject global SCSS and other PDS setup, so audit `angular.json` and workspace/project JSON build configuration too.
|
|
49
|
+
|
|
50
|
+
**The list is a floor, not a definition.** No extension list survives contact with a real project — a component can live in a template language nobody thought of, and a file type absent from the list above is invisible rather than clean. So after the list, find the rest by content: search every non-ignored text file in each discovered package for a PDS root — an import of the wrapper package or one of its styling entry points, a `p-`-prefixed custom element, a `--p-` custom property, or a PDS SCSS `@use`. A file that holds one is in scope whatever it is called.
|
|
51
|
+
|
|
52
|
+
Then audit each of those files, **or** record it in `scope.excludedPaths` with a reason — a changelog, a documentation snippet and a test fixture can all quote PDS markup without being production source, and excluding them is a decision a reader can review. What must not happen is the third option: a file that references PDS appearing in neither place, which is the same silent gap as a package that was never discovered.
|
|
53
|
+
|
|
54
|
+
The list covers where components, styles and PDS configuration are normally written, and deliberately stops there: prose and data formats — `.md`, `.json`, `.yaml` — quote markup often enough that auditing them by default would trade real findings for plausible ones. The search below still reaches them, and excluding one with a reason is a decision a reader can see.
|
|
55
|
+
|
|
56
|
+
Content decides scope; the extension list only makes the common case fast. Search by root marker rather than reading every file: a match is what makes a file eligible, so a repository of any size yields a handful of extra candidates rather than a full-text scan.
|
|
57
|
+
|
|
58
|
+
Respect version-control ignore rules, and exclude dependencies, build output, tests, examples and generated files by default. A default exclusion goes in `scope.excludedPaths` with its reason and **nowhere else** — it is a choice the audit made, not something that stopped it, so repeating it in `coverage.limitations` reports a working decision as a coverage failure.
|
|
59
|
+
|
|
60
|
+
Every eligible file in a discovered package must end up either audited or recorded in `coverage.skippedFiles` — any skipped eligible file makes the run `partial`.
|
|
61
|
+
|
|
62
|
+
## 4. Work outward from PDS
|
|
63
|
+
|
|
64
|
+
Work outward from PDS rather than searching the project and filtering. Anything reached this way is anchored by construction; anything found another way has to earn it.
|
|
65
|
+
|
|
66
|
+
**Roots — where PDS enters the project.**
|
|
67
|
+
|
|
68
|
+
- Components are custom elements in templates, so a `p-` tag is itself the root.
|
|
69
|
+
- `--p-`-prefixed CSS custom properties. A reserved namespace, so they anchor themselves in any stylesheet — the global stylesheet is loaded once and never imported per file.
|
|
70
|
+
- A resolved SCSS `@use` of the PDS entry point, **including one injected by build config** (Angular or Vite `additionalData`) rather than written in the file. A project can use PDS Sass without any file naming it.
|
|
71
|
+
- An import of the PDS Tailwind theme. Its custom properties are unprefixed and generic, so they count only in a project that imports the theme. A project redefinition disqualifies an alias only where that `@theme` block is in effect; the imported alias still counts elsewhere.
|
|
72
|
+
- An import of the Emotion or vanilla-extract entry point, resolving aliases.
|
|
73
|
+
|
|
74
|
+
**Traverse outward.** From each root, follow usage through the project’s own code: a component that renders a PDS component is a wrapper, one that renders a wrapper is also a wrapper, and so on. No hop limit — guard against cycles and stop when nothing new is reached. Wrapping PDS two or three layers deep is normal, and a limit would drop most real usage.
|
|
75
|
+
|
|
76
|
+
Follow the **prop**, not just the component. A wrapper anchors a prop only if it forwards it — a declared input rebound in the template. Wrapper layers often rename or reinterpret an API, so a wrapper that accepts `size` without forwarding it is not PDS usage, and reporting it would be a false positive.
|
|
77
|
+
|
|
78
|
+
**When the graph runs out**, fall back to searching index identifiers and anchoring each match — a tag name assembled at runtime (`'p-' + kind`), an attribute name held in a variable, re-exports you cannot resolve. Anything still unanchored is a manual follow-up. Record the gap in `coverage.limitations`; a fallback you do not disclose looks like a clean project.
|
|
79
|
+
|
|
80
|
+
Never guess. A team that hits two bogus findings stops reading the report, which costs more than the findings were worth.
|
|
81
|
+
|
|
82
|
+
## 5. Decide what counts
|
|
83
|
+
|
|
84
|
+
Each index entry names one deprecated API. Its rule ID carries the usage kind and full context; use the index’s framework-specific locating guide to check every anchored usage. A usage the traversal never reaches is not a finding; it is whatever the fallback makes of it.
|
|
85
|
+
|
|
86
|
+
Most kinds need nothing further: a deprecated component, prop, event, slot, CSS variable or style alias is statically present in the source whatever data flows through it — `<PAccordion heading={anything}>` already proves the deprecated prop is used.
|
|
87
|
+
|
|
88
|
+
For these non-value kinds, the deprecated API is written at exactly one line. A wrapper call site does not add another location, and `wrapper-forwarded` or `wrapper-transformed` applies only to deprecated value locations; the wrapper chain belongs in the location’s `anchor`.
|
|
89
|
+
|
|
90
|
+
A deprecated **value** is the exception. It is a plain string that can come from anywhere, so it has to be resolved before it can be reported, and how it resolved is recorded as the location’s `valueResolution`:
|
|
91
|
+
|
|
92
|
+
| `valueResolution` | Where the value comes from |
|
|
93
|
+
| --- | --- |
|
|
94
|
+
| `literal` | Written in place — at the PDS usage or at a wrapper call site, breakpoint objects included. |
|
|
95
|
+
| `same-file-constant` | A constant declared in the same file as the location. |
|
|
96
|
+
| `imported-constant` | A constant imported from another file, resolved one hop. |
|
|
97
|
+
| — | A prop, state or spread that **no** call site resolves — a manual follow-up, never a finding. |
|
|
98
|
+
|
|
99
|
+
Resolve constants **one hop** — the declaration a value refers to — and no further.
|
|
100
|
+
|
|
101
|
+
**A value arriving through one of the project’s own wrappers is a finding, not a follow-up.** §4 already anchored the prop by checking that every hop forwards it; keep following it in the same direction, to the call sites that supply it. Each call site that resolves — a literal, or a constant one hop away — is an evidence location on the finding, and the route it travelled is what its `detection` records. Reaching a value through a wrapper is what `wrapper-forwarded` and `wrapper-transformed` are *for*; sending those cases to follow-ups instead leaves half of §6’s table unreachable and reports resolved usage as unresolvable. A value is a follow-up only when **no** call site resolves it: genuinely dynamic input, state, or a spread whose contents you cannot see.
|
|
102
|
+
|
|
103
|
+
A value that resolves **inside** a wrapper — a lookup table, a default, a mapped constant — is a finding on the same terms, whether or not any call site selects it. It is written in the source and breaks at the next major release regardless of which branch runs today, so do not weigh up reachability: resolved is the test, reached is not.
|
|
104
|
+
|
|
105
|
+
Such a location is `direct`, not a wrapper detection. The line is the PDS usage itself and the route from this file’s own PDS root to it never leaves the file — a component being a wrapper says nothing about how its own body was reached, and neither does the value having been picked by one of that wrapper’s own props. `wrapper-forwarded` and `wrapper-transformed` describe the other end: a location that **is** a call site of the wrapper. Grading a wrapper’s own body as wrapper-reached lowers confidence on findings nothing was inferred about, and §6 derives confidence precisely so that it cannot be a judgement call.
|
|
106
|
+
|
|
107
|
+
The two are not alternatives. **One finding carries both** — the resolution inside the wrapper and every call site that supplies one — for the reason just given: the wrapper’s own default or lookup entry breaks at the next major release whether or not a caller selects it. Report only the call sites and every branch no caller selects disappears with them, which costs whole rules rather than locations — a default nothing overrides is exactly the one no call site points at. Report only the wrapper and the report cannot show a reader which callers the fix has to reach.
|
|
108
|
+
|
|
109
|
+
That first half is *where the value is written*, not where the PDS element happens to sit. A wrapper earns a location when the value resolves in its own file — a literal on the element or a default. Where the wrapper only forwards a prop, nothing resolves on that line: the call site is the location and the wrapper is the route, which `detection` already records. Listing both counts one flow twice, and inflates the occurrence count §8 sorts by. A `valueResolution` of `literal` on a line holding no literal is the symptom.
|
|
110
|
+
|
|
111
|
+
A call site counts whether it **names** the deprecated value or only **selects** one. Passing the deprecated spelling through a renamed prop names it; passing a variant name that the wrapper maps onto the deprecated value — through a lookup, a condition or a default — selects it. Both are locations, because the test is whether the line has to change for the deprecation to go away, and a selector does have to: the entry it reaches is the one being removed. Its `valueResolution` describes the literal **at that line** — the variant name is written in place, so `literal` — not the deprecated spelling it resolves to, which the in-wrapper location carries. Leave selector call sites out and the report names the wrapper but none of the callers a migration has to visit.
|
|
112
|
+
|
|
113
|
+
**Responsive objects are the easiest thing to miss and the most costly.** Resolve every value inside the object rather than comparing the whole prop value with the deprecated identifier — in both spellings:
|
|
114
|
+
|
|
115
|
+
```text
|
|
116
|
+
size="{'base': 'small', 'l': 'medium'}" string attribute holding single-quoted pseudo-JSON
|
|
117
|
+
[size]="{ base: 'small', l: 'medium' }" property binding
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Missing this does not fail loudly — it silently drops every responsive usage in the project. The first spelling is the one that gets missed: the whole value is one quoted string, so it reads as a plain value rather than an object, and the deprecated identifier is inside it.
|
|
121
|
+
|
|
122
|
+
Dynamic usage recorded as a manual follow-up is the correct outcome, not a gap. It does **not** make the run `partial`, and it does **not** belong in `coverage.limitations` — it was detected and disclosed. Recording it in both places reports a working check as a coverage failure.
|
|
123
|
+
|
|
124
|
+
A follow-up carries a `subject` naming what could not be resolved (`p-text size`). Give it a `ruleId` only when it maps to exactly one index entry; when the value could be any of several, omit the id rather than inventing one — an id that is not in the index cannot be looked up.
|
|
125
|
+
|
|
126
|
+
A rule that appears in `findings` must not also appear in `manualFollowUps`. Unresolvable usage of an already-reported rule belongs with that finding’s evidence when it can be quoted as a usage, or in `coverage.limitations` when it cannot be resolved well enough to be evidence.
|
|
127
|
+
|
|
128
|
+
## 6. Record and grade each finding
|
|
129
|
+
|
|
130
|
+
A finding is one deprecated API, carrying **every** place the project uses it. Split into two findings only when the fix genuinely differs — the same deprecated prop fixed the same way twice is one finding, not two.
|
|
131
|
+
|
|
132
|
+
Every finding carries:
|
|
133
|
+
|
|
134
|
+
- `ruleId` — the index row’s **Rule ID**, copied verbatim, and `usageKind` set to that id’s first segment. Do not reconstruct either from the identifier or infer a kind from what the API looks like. Rule ids are what make findings comparable across runs and releases, and an invented one breaks that silently while looking correct.
|
|
135
|
+
- `evidence` — every location where the project **uses** the API, each with a project-relative path, a line number and the source line **quoted verbatim**. The quote is not decoration: it is what lets a reader, or a later fix, confirm the finding against the file instead of trusting it.
|
|
136
|
+
- `anchor` on a location — the line that proves that usage is PDS, with its own path, line and quoted source. The import, the resolved SCSS `@use` **including one injected by build config**, the Tailwind `@theme` import, or the PDS root at the far end of a wrapper chain. Record it whenever it is not the evidence line itself; it is frequently in another file, and it is the only truthful place to put `vite.config.ts` for a stylesheet that names PDS nowhere. Omit it only where the usage anchors itself, as a `--p-` custom property does.
|
|
137
|
+
- `remediation` — a `replacement` with the exact `from` and `to` spelling whenever the index documents an unambiguous one, plus an `instruction` in words. Where the index documents no replacement, say so plainly in the instruction rather than inventing one.
|
|
138
|
+
- `sources` — the knowledge-skill reference the fact came from, as a path relative to that skill’s root, at version `4.7.0`.
|
|
139
|
+
- the index entry’s message as `deprecationMessage`, verbatim, when it has one. Some say an API has no effect anymore; that wording matters to whoever reads the finding, so do not paraphrase it.
|
|
140
|
+
|
|
141
|
+
An evidence `line` is the **usage** — the attribute, tag, custom property or alias reference itself. Never the `import`, `@use` or `@theme` that anchored it, never the wrapper call it arrived through, and never the declaration line of a constant it resolved from — including a key inside an object that is applied to the element as a whole, which is such a declaration and not a usage. For such an object, the evidence line is the element it is applied to. Where a component is reached through a local binding, the evidence line is the reference to the PDS binding, not the render of the local alias. Those lines are real and they matter, which is exactly why the anchor has a field of its own: counted as locations instead, they inflate a finding by however many anchors it happens to have, and occurrence count is a sort key in §8 — so two runs of an unchanged project stop being comparable.
|
|
142
|
+
|
|
143
|
+
Findings carry no severity. Every deprecation in this version is the same impact — it works today and breaks at the next major release — so a per-finding severity would be one value repeated on every row.
|
|
144
|
+
|
|
145
|
+
**Confidence is derived, not judged.** Record on each evidence location *how you reached it* — the route, not where the API sits:
|
|
146
|
+
|
|
147
|
+
| `detection` | How the location was reached | Confidence |
|
|
148
|
+
| --- | --- | --- |
|
|
149
|
+
| `direct` | Reached from a root in this file, without leaving it. | `high` |
|
|
150
|
+
| `wrapper-forwarded` | Reached at a call site of one of the project's own wrappers, with forwarding explicit at every hop between it and PDS. | `high` |
|
|
151
|
+
| `wrapper-transformed` | Reached at a call site of one of the project's own wrappers, one of which renames, conditions or transforms it on the way to PDS. | `medium` |
|
|
152
|
+
| `fallback-search` | Reached by searching an index identifier after the traversal ran out, then anchored to PDS. | `medium` |
|
|
153
|
+
|
|
154
|
+
All four describe the route. A `p-` tag is itself a root wherever it is written, including one assembled as a string, so `createElement('p-text', …)` and markup built in a template literal are `direct` — the traversal starts there rather than arriving there.
|
|
155
|
+
|
|
156
|
+
For a deprecated value, its `valueResolution` grades the same way — `literal` and `same-file-constant` are `high`, `imported-constant` is `medium`. A location’s confidence is the lower of its two grades, and the finding’s `confidence` is the lowest across its locations.
|
|
157
|
+
|
|
158
|
+
Distance never lowers confidence on its own — passing through a wrapper you followed hop by hop is `high`. **A `medium` finding is a finding**, not a downgrade to a follow-up. Only a candidate you cannot place in the table at all — an unresolvable value, an unanchored match — is a manual follow-up.
|
|
159
|
+
|
|
160
|
+
**Baseline effort is derived too**, from the usage kind and whether the index documents a replacement. Swapping in a documented successor is routine; removing an API with nothing to swap in means designing what replaces it, which is a different job:
|
|
161
|
+
|
|
162
|
+
| Usage kind | Replacement documented | No replacement documented |
|
|
163
|
+
| --- | --- | --- |
|
|
164
|
+
| `component` | `medium` | `large` |
|
|
165
|
+
| `prop` | `small` | `medium` |
|
|
166
|
+
| `propValue` | `trivial` | `small` |
|
|
167
|
+
| `event` | `small` | `medium` |
|
|
168
|
+
| `slot` | `small` | `medium` |
|
|
169
|
+
| `cssCustomProperty` | `trivial` | `small` |
|
|
170
|
+
| `cssClass` | `trivial` | `small` |
|
|
171
|
+
| `scssVariable` | `trivial` | `small` |
|
|
172
|
+
| `scssMixin` | `trivial` | `small` |
|
|
173
|
+
| `jsExport` | `trivial` | `small` |
|
|
174
|
+
|
|
175
|
+
"Documented" means the index row’s **Replacement** column names one, and nothing else counts. Do not derive one from the deprecated identifier, the note or the linked reference. Where the column names a replacement, copy it into `remediation.replacement`; where it does not, the row is one level dearer and the instruction says so.
|
|
176
|
+
|
|
177
|
+
The baseline is what the deprecation costs; this project may cost more or less. A prop threaded through a shared wrapper is harder, a value funnelled through one shared constant is a single edit fixing fifty usages. When that is the case, record `observedEffort` and an `effortRationale` **pointing at evidence already listed on the finding**. A rationale citing nothing in the report is unreviewable, which is the one thing the baseline existed to prevent.
|
|
178
|
+
|
|
179
|
+
## 7. Verify before writing
|
|
180
|
+
|
|
181
|
+
Before writing anything, check every finding against the sources it claims. For each one:
|
|
182
|
+
|
|
183
|
+
1. `ruleId` appears **verbatim** in the deprecation index.
|
|
184
|
+
2. Every evidence `path` exists, and each `snippet` is really the content of the `line` it names — including on an `anchor`, which quotes a second file as often as not.
|
|
185
|
+
3. Every evidence `line` is a usage rather than the import, `@use`, `@theme` or declaration that anchored or resolved it.
|
|
186
|
+
4. `remediation.replacement`, where present, matches what the index and its linked reference actually document.
|
|
187
|
+
|
|
188
|
+
Anything that fails is not a finding. Drop it, or record it as a manual follow-up with the reason — a finding that cannot survive its own check is exactly the kind a fix would apply wrongly.
|
|
189
|
+
|
|
190
|
+
## 8. Write the reports
|
|
191
|
+
|
|
192
|
+
Write exactly two files and nothing else:
|
|
193
|
+
|
|
194
|
+
```text
|
|
195
|
+
.pds/audits/<runId>/
|
|
196
|
+
├── pds-audit-deprecations-angular.json
|
|
197
|
+
└── pds-audit-deprecations-angular.md
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
The `runId` is a filesystem-safe UTC timestamp, e.g. `2026-07-23T09-21-27Z`. The run directory is shared: a future audit skill writes its own report beside this one, so never clear it — write only your two files. Resolve `.pds/audits/<runId>/` against `project.root`, not the current working directory or repository root.
|
|
201
|
+
|
|
202
|
+
The JSON must validate against [`references/report.schema.json`](references/report.schema.json) (schema version `1.0.0`). Build and check it **before** rendering the Markdown, and render the Markdown from that same validated data so the two can never disagree.
|
|
203
|
+
|
|
204
|
+
Order `findings` cheapest first: effective effort ascending (`observedEffort` when present, else `baselineEffort`), then confidence (`high` first), then occurrence count descending, then `ruleId`. That order is the action plan — there is no separate one. The final tiebreak is what makes two runs of an unchanged project produce the same report, so it can be diffed across releases.
|
|
205
|
+
|
|
206
|
+
The Markdown is a rendering of that same validated data, written to the structure in [`references/report-template.md`](references/report-template.md). Open it and follow it — the sections, their order, the per-finding shape and the sentence an empty section carries are all fixed there, so every run produces the same document and a reader, or an agent later asked to apply the report, knows where to look. Compute every number in it — how many findings, how many locations, how many follow-ups — from the arrays you just validated. Never write a count from memory: a number that disagrees with the list under it discredits the whole report.
|
|
207
|
+
|
|
208
|
+
Nothing goes in the Markdown that is not in the JSON. Anything else worth saying belongs in your reply to the user.
|
|
209
|
+
|
|
210
|
+
The template's closing **How to act on this report** section stays in the report, so the file still explains itself when it is shared or read weeks later: it names the version the report is only valid for, sends an agent applying the findings back to the deprecation index for the rule and to the knowledge-skill reference the finding names for the replacement's current API, states that manual follow-ups are for a human and must not be fixed automatically, and that re-running this audit is how the work is verified.
|
|
211
|
+
|
|
212
|
+
Run directories accumulate and this skill must not delete them. Check whether `.pds/` is already ignored (`git check-ignore -q .pds`, read-only) and mention it **only** when it is not — in your reply, never in the report — and mention it as a choice: reports can be tracked to diff findings across releases, or ignored as scratch. Never edit an ignore file yourself.
|
|
213
|
+
|
|
214
|
+
## 9. Report execution state honestly
|
|
215
|
+
|
|
216
|
+
`summary.result` describes execution only, never project quality — the findings do that:
|
|
217
|
+
|
|
218
|
+
| Result | When |
|
|
219
|
+
| --- | --- |
|
|
220
|
+
| `completed` | Every discovered PDS-dependent package was audited, every eligible file in it checked, against every category of the index. |
|
|
221
|
+
| `partial` | A discovered package went unaudited, or some eligible file, requested path or index category could not be checked. Disclose every gap in `coverage`. |
|
|
222
|
+
| `failed` | No meaningful audit was possible — no deprecation index, or no eligible files. |
|
|
223
|
+
|
|
224
|
+
Before writing `completed`, check the claim against `scope.includedPaths` rather than against the walk you happened to run: every package §3 discovered is in that list, every one of them was audited, and every index category was worked through. Re-enumerate eligible files in each included package and confirm every file was visited or appears in `coverage.skippedFiles`; any file in neither place makes the run `partial`. A package you never discovered holds no eligible files either, so file-level eligibility cannot catch it and the package list is the only thing that can. If you cannot say all of that, the answer is `partial`, which is an honest and useful result. `completed` on an audit that skipped things is the one outcome that actively misleads — a short report reads as a clean codebase, and nobody looks again.
|
|
225
|
+
|
|
226
|
+
`coverage.limitations` carries only what the audit **could not** do. Anything it chose to leave out is a decision and belongs in `scope.excludedPaths` with its reason — recording a choice in both places reports it as a failure, and recording it in neither hides the one exclusion a reader most needs to see.
|
|
227
|
+
|
|
228
|
+
Keep the report to what a reader can check: findings with paths and lines they can open, and gaps stated in words. Do not pad `coverage` with self-assessment — nobody can verify it, so it reads as assurance while proving nothing.
|
|
229
|
+
|
|
230
|
+
An audit with nothing to report says so explicitly. Do not pad it with observations to look thorough.
|
|
231
|
+
|
|
232
|
+
If the report files cannot be written, surface the write error directly. Do not pretend a failed report was persisted.
|
|
233
|
+
|
|
234
|
+
## Constraints
|
|
235
|
+
|
|
236
|
+
This audit is read-only apart from its two report files. It must not:
|
|
237
|
+
|
|
238
|
+
- install dependencies, build, test, or start the application
|
|
239
|
+
- modify source, configuration, or ignore files
|
|
240
|
+
- write anything outside `.pds/audits/<runId>/`, or remove anything already in it
|
|
241
|
+
- read or traverse outside the project root
|
|
242
|
+
|
|
243
|
+
Read-only discovery and search commands are fine, including `git check-ignore`.
|
|
244
|
+
|
|
245
|
+
**Fixing is not part of this skill.** Report the findings and stop; applying them is a separate, explicit act the user asks for afterwards. An audit that edits as it goes cannot be re-run to verify itself.
|
|
246
|
+
|
|
247
|
+
Audit deprecated usage only. Anything else — general code quality, security, performance, accessibility, business logic — is out of scope; say so if asked, rather than improvising a check the index cannot ground.
|