diff --git a/.prettierignore b/.prettierignore
index 5c6d47147fa4..86cc8b982b45 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,2 +1 @@
data/release-notes/
-src/bookmarklets/
diff --git a/content/actions/how-tos/write-workflows/choose-when-workflows-run/control-jobs-with-conditions.md b/content/actions/how-tos/write-workflows/choose-when-workflows-run/control-jobs-with-conditions.md
index 4e933c9d3ab1..038468cf01f4 100644
--- a/content/actions/how-tos/write-workflows/choose-when-workflows-run/control-jobs-with-conditions.md
+++ b/content/actions/how-tos/write-workflows/choose-when-workflows-run/control-jobs-with-conditions.md
@@ -23,7 +23,9 @@ name: example-workflow
on: [push]
jobs:
production-deploy:
+{% raw %}
if: ${{ github.repository == 'octo-org/octo-repo-prod' }}
+{% endraw %}
runs-on: ubuntu-latest
steps:
- uses: {% data reusables.actions.action-checkout %}
diff --git a/content/actions/tutorials/use-actions-runner-controller/deploy-runner-scale-sets.md b/content/actions/tutorials/use-actions-runner-controller/deploy-runner-scale-sets.md
index 9064e4ef3d9d..58e839247764 100644
--- a/content/actions/tutorials/use-actions-runner-controller/deploy-runner-scale-sets.md
+++ b/content/actions/tutorials/use-actions-runner-controller/deploy-runner-scale-sets.md
@@ -634,6 +634,7 @@ When Kubernetes mode is enabled, workflows that are not configured with a contai
```
To allow jobs without a job container to run, set `ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER` to `false` on your runner container. This instructs the runner to disable this check.
+
> [!WARNING]
>Allowing jobs to run without a container in `kubernetes` or `kubernetes-novolume` mode can give the >runner pod elevated privileges with the Kubernetes API server, including the ability to create pods and access secrets. Before changing this default, we recommend carefully reviewing the potential security implications.
diff --git a/content/code-security/getting-started/quickstart-for-securing-your-repository.md b/content/code-security/getting-started/quickstart-for-securing-your-repository.md
index 4d7fb947c671..63ffd226810a 100644
--- a/content/code-security/getting-started/quickstart-for-securing-your-repository.md
+++ b/content/code-security/getting-started/quickstart-for-securing-your-repository.md
@@ -112,8 +112,10 @@ To enable {% data variables.product.prodname_dependabot_version_updates %}, you
## Configuring {% ifversion ghas-products %}{% data variables.product.prodname_code_security %}{% else %}{% data variables.product.prodname_code_scanning %}{% endif %}
{% ifversion fpt or ghec %}
+
> [!NOTE]
> {% data variables.product.prodname_code_security %} features are available for all public repositories, and for private repositories owned by organizations that are part of a team or an enterprise that uses {% data variables.product.prodname_GH_code_security %} or {% data variables.product.prodname_GHAS %}.
+
{% endif %}
{% ifversion ghas-products %}{% data variables.product.prodname_GH_code_security %} includes {% data variables.product.prodname_code_scanning %}, {% data variables.product.prodname_codeql_cli %} and {% data variables.copilot.copilot_autofix_short %}, as well as other features that find and fix vulnerabilities in your codebase.{% endif %}
@@ -133,8 +135,10 @@ As an alternative to default setup, you can use advanced setup, which generates
## Configuring {% ifversion ghas-products %}{% data variables.product.prodname_secret_protection %}{% else %}{% data variables.product.prodname_secret_scanning %}{% endif %}
{% ifversion fpt or ghec %}
+
> [!NOTE]
> {% data variables.product.prodname_secret_protection %} features are available for all public repositories, and for private repositories owned by organizations that are part of a team or an enterprise that uses {% data variables.product.prodname_GH_secret_protection %} or {% data variables.product.prodname_GHAS %}.
+
{% endif %}
{% ifversion ghas-products %}{% data variables.product.prodname_GH_secret_protection %} includes {% data variables.product.prodname_secret_scanning %} and push protection, as well as other features that help you detect and prevent secret leaks in your repository.{% endif %}
diff --git a/content/contributing/setting-up-your-environment-to-work-on-github-docs/creating-a-local-environment.md b/content/contributing/setting-up-your-environment-to-work-on-github-docs/creating-a-local-environment.md
index 178824fd2b6e..5fa3d6cd934b 100644
--- a/content/contributing/setting-up-your-environment-to-work-on-github-docs/creating-a-local-environment.md
+++ b/content/contributing/setting-up-your-environment-to-work-on-github-docs/creating-a-local-environment.md
@@ -61,10 +61,6 @@ When you're ready to stop your local server, type Ctrl+C i
If you would like to read more about debugging and troubleshooting the {% data variables.product.prodname_docs %} application, see [AUTOTITLE](/contributing/setting-up-your-environment-to-work-on-github-docs/troubleshooting-your-environment) in the github/docs repository.
-### Using browser shortcuts
-
-The [`src/bookmarklets`](https://github.com/github/docs/tree/main/src/bookmarklets) directory in the {% data variables.product.prodname_docs %} repository contains browser shortcuts that can help with reviewing {% data variables.product.company_short %} documentation. For more information, see the directory's [`README`](https://github.com/github/docs/tree/main/src/bookmarklets/README.md).
-
### Enabling different languages
By default, the local server does not run with all supported languages enabled. If you need to run a local server with a particular language, you can temporarily edit the `start` script in `package.json` and update the `ENABLED_LANGUAGES` variable.
diff --git a/content/copilot/reference/ai-models/supported-models.md b/content/copilot/reference/ai-models/supported-models.md
index f868621daaa6..ac9cd08c3f8f 100644
--- a/content/copilot/reference/ai-models/supported-models.md
+++ b/content/copilot/reference/ai-models/supported-models.md
@@ -57,7 +57,7 @@ This table lists the AI models available in {% data variables.product.prodname_c
| {% data variables.copilot.copilot_claude_sonnet_40 %} | Anthropic | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_gemini_25_pro %} | Google | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
| {% data variables.copilot.copilot_gemini_flash %} | Google | {% data variables.release-phases.closing_down_caps %}: 2025-10-23 | {% octicon "x" aria-label="Not included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
-| {% data variables.copilot.copilot_grok_code %} | xAI | {% data variables.release-phases.public_preview_caps %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
+| {% data variables.copilot.copilot_grok_code %} | xAI | GA | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} | {% octicon "check" aria-label="Included" %} |
{% endrowheaders %}
diff --git a/content/organizations/managing-user-access-to-your-organizations-repositories/managing-repository-roles/repository-roles-for-an-organization.md b/content/organizations/managing-user-access-to-your-organizations-repositories/managing-repository-roles/repository-roles-for-an-organization.md
index e2a0dd198f99..f5189fff8f27 100644
--- a/content/organizations/managing-user-access-to-your-organizations-repositories/managing-repository-roles/repository-roles-for-an-organization.md
+++ b/content/organizations/managing-user-access-to-your-organizations-repositories/managing-repository-roles/repository-roles-for-an-organization.md
@@ -186,6 +186,7 @@ In this section, you can find the access required for security features, such as
> [!NOTE]
> Repository writers and maintainers can only directly view secret scanning alert information for their own commits. They cannot access the alert list view.
+
{% rowheaders %}
| Repository action | Read | Triage | Write | Maintain | Admin |
diff --git a/contributing/development.md b/contributing/development.md
index f1f3aa52d2a3..86a51865de83 100644
--- a/contributing/development.md
+++ b/contributing/development.md
@@ -36,9 +36,7 @@ As an alternative, you can simply use [GitHub Codespaces](https://docs.github.co
In a matter of minutes, you will be ready to edit, review and test your changes directly from the comfort of your browser.
-### Using browser shortcuts
-The [`src/bookmarklets`](../src/bookmarklets) directory contains some browser shortcuts that can help with reviewing GitHub documentation. See [`src/bookmarklets/README.md`](../src/bookmarklets/README.md) for details.
### Enabling different languages
diff --git a/eslint.config.js b/eslint.config.js
index 233e34d4d2bc..8fa152a4b420 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -215,7 +215,6 @@ export default [
ignores: [
'tmp/*',
'.next/',
- 'src/bookmarklets/*',
'rest-api-description/',
'docs-internal-data/',
'src/code-scanning/scripts/generate-code-scanning-query-list.ts',
diff --git a/src/bookmarklets/README.md b/src/bookmarklets/README.md
deleted file mode 100644
index 41823b7c9ba7..000000000000
--- a/src/bookmarklets/README.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Bookmarklets
-
-The [bookmarklets](https://en.wikipedia.org/wiki/Bookmarklet) in this directory are browser shortcuts that may help with reviewing GitHub documentation. We may eventually build the functionality they provide into Docs review environments, but these are handy hacks for now.
-
-## Installing bookmarklets
-
-For each bookmarklet described below, create a new bookmark in your browser with a descriptive name, open the JavaScript file and copy its contents, and paste the JavaScript _as the bookmark's URL_.
-
-Clicking the bookmark will then execute the JavaScript.
-
-⚠️ For Safari, you'll need to do the following:
-
-1. Go to **Safari** > **Preferences** > **Advanced** and enable **Show Develop menu in menu bar**.
-2. Go to **Develop** and enable **Allow JavaScript from Smart Search field**.
-
-## "View in development" toggle
-
-[`src/bookmarklets/view-in-development.js`](./view-in-development.js)
-
-When you're looking at a page on docs.github.com, clicking this bookmarklet will load the same path you're viewing but on your local server running at localhost:4000.
-
-## "View in production" toggle
-
-[`src/bookmarklets/view-in-production.js`](./view-in-production.js)
-
-When you're looking at a page on your local server running at localhost:4000, clicking this bookmarklet will load the same path you're viewing but on the live documentation site at docs.github.com.
-
-## Open a docs article in VS Code
-
-[`src/bookmarklets/open-in-vscode.js`](./open-in-vscode.js)
-
-When you're looking at a page on either docs.github.com, review, or localhost:4000, clicking this bookmarklet will open the source Markdown file from your local checkout in VS Code.
-
-The installation requires a few steps:
-
-1. Copy the contents of [`src/bookmarklets/open-in-vscode.js`](./open-in-vscode.js).
-1. Browse to https://chriszarate.github.io/bookmarkleter/ and paste the code into the box.
-1. Find the path of **your local checkout** of the docs repo you want to open files from (for example, `/Users//repos/docs`).
-1. Paste the path in place of where it says `REPLACE_ME` in line 1 (make sure to leave the single quotes around it).
-1. Change the title to something like `Open in VSC`.
-1. Drag the generated link onto your bookmarks bar.
diff --git a/src/bookmarklets/open-in-vscode.js b/src/bookmarklets/open-in-vscode.js
deleted file mode 100644
index f49fca3df8c2..000000000000
--- a/src/bookmarklets/open-in-vscode.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/* The path to your local copy of repo */
-const checkoutPath = 'REPLACE_ME'
-
-const filepath = window.location.pathname.replace(/\/en\/([^@]+?@[^@]+?\/)?/, '/content/')
-const isIndexFile = filepath.split('/').length < 5
-const filename = isIndexFile ? '/index.md' : '.md'
-const fullpath = 'vscode://file' + checkoutPath + filepath + filename
-window.open(fullpath, '_blank')
diff --git a/src/bookmarklets/view-in-development.js b/src/bookmarklets/view-in-development.js
deleted file mode 100644
index 025d74eb04d3..000000000000
--- a/src/bookmarklets/view-in-development.js
+++ /dev/null
@@ -1 +0,0 @@
-javascript:(()=>{window.location.href=window.location.href.replace(/https:\/\/docs\.github\.com/,'http://localhost:4000').replace(/https:\/\/.*\..*\.(com|net|dev|io|org|ms)/,'http://localhost:4000')})()
diff --git a/src/bookmarklets/view-in-production.js b/src/bookmarklets/view-in-production.js
deleted file mode 100644
index a22e139b48cc..000000000000
--- a/src/bookmarklets/view-in-production.js
+++ /dev/null
@@ -1 +0,0 @@
-javascript:(()=>{window.location.href=window.location.href.replace(/http:\/\/localhost:4000/,'https://docs.github.com').replace(/https:\/\/.*\..*\.(com|net|dev|io|org|ms)/,'https://docs.github.com')})()
diff --git a/src/content-linter/lib/linting-rules/liquid-ifversion-versions.js b/src/content-linter/lib/linting-rules/liquid-ifversion-versions.ts
similarity index 86%
rename from src/content-linter/lib/linting-rules/liquid-ifversion-versions.js
rename to src/content-linter/lib/linting-rules/liquid-ifversion-versions.ts
index 2280983f76ca..f5b37395ad2d 100644
--- a/src/content-linter/lib/linting-rules/liquid-ifversion-versions.js
+++ b/src/content-linter/lib/linting-rules/liquid-ifversion-versions.ts
@@ -1,3 +1,4 @@
+// @ts-ignore - markdownlint-rule-helpers doesn't provide TypeScript declarations
import { addError } from 'markdownlint-rule-helpers'
import {
@@ -17,6 +18,7 @@ import {
isInAllGhes,
} from '@/ghes-releases/scripts/version-utils'
import { deprecated, oldestSupported } from '@/versions/lib/enterprise-server-releases'
+import type { RuleParams, RuleErrorCallback } from '@/content-linter/types'
export const liquidIfversionVersions = {
names: ['GHD022', 'liquid-ifversion-versions'],
@@ -24,7 +26,7 @@ export const liquidIfversionVersions = {
'Liquid `ifversion`, `elsif`, and `else` tags should be valid and not contain unsupported versions.',
tags: ['liquid', 'versioning'],
asynchronous: true,
- function: async (params, onError) => {
+ function: async (params: RuleParams, onError: RuleErrorCallback) => {
// The versions frontmatter object or all versions if the file
// being processed is a data file.
const fm = getFrontmatter(params.lines)
@@ -34,7 +36,7 @@ export const liquidIfversionVersions = {
? { ghec: '*', ghes: '*', fpt: '*' }
: fm
? fm.versions
- : getFrontmatter(params.frontMatterLines).versions
+ : getFrontmatter(params.frontMatterLines)?.versions
// This will only contain valid (non-deprecated) and future versions
const fileVersions = getApplicableVersions(fileVersionsFm, '', {
doNotThrow: true,
@@ -45,7 +47,8 @@ export const liquidIfversionVersions = {
// Array of arrays - each array entry is an array of items that
// make up a full if/elsif/else/endif statement.
// [ [ifversion, elsif, else, endif], [nested ifversion, elsif, else, endif] ]
- const condStmtStack = []
+ // Using any[] because these are complex dynamic objects with properties added at runtime
+ const condStmtStack: any[] = []
// Tokens are in the order they are read in file, so we need to iterate
// through and group full if/elsif/else/endif statements together.
@@ -76,10 +79,12 @@ export const liquidIfversionVersions = {
// The versions of an else tag are the set of file versions that are
// not supported by the previous ifversion or elsif tags.
const siblingVersions = condTagItems
- .filter((item) => item.name === 'ifversion' || item.name === 'elsif')
- .map((item) => item.versions)
+ // Using any because condTagItems contains dynamic objects from initTagObject
+ .filter((item: any) => item.name === 'ifversion' || item.name === 'elsif')
+ .map((item: any) => item.versions)
.flat()
- condTagItem.versions = difference(fileVersions, siblingVersions)
+ // Using any because versions property is added dynamically to condTagItem
+ ;(condTagItem as any).versions = difference(fileVersions, siblingVersions)
condTagItems.push(condTagItem)
condStmtStack.push(condTagItems)
} else if (token.name === 'endif') {
@@ -87,14 +92,15 @@ export const liquidIfversionVersions = {
const condTagItems = condStmtStack.pop()
const condTagItem = await initTagObject(token, defaultProps)
condTagItems.push(condTagItem)
- decorateCondTagItems(condTagItems, params.lines)
+ decorateCondTagItems(condTagItems)
setLiquidErrors(condTagItems, onError, params.lines)
}
}
},
}
-function setLiquidErrors(condTagItems, onError, lines) {
+// Using any[] because condTagItems contains dynamic objects with properties added at runtime
+function setLiquidErrors(condTagItems: any[], onError: RuleErrorCallback, lines: string[]) {
for (let i = 0; i < condTagItems.length; i++) {
const item = condTagItems[i]
const tagNameNoCond = item.name === 'endif' || item.name === 'else'
@@ -175,8 +181,9 @@ function setLiquidErrors(condTagItems, onError, lines) {
}
}
-async function getApplicableVersionFromLiquidTag(conditionStr, filename) {
- const newConditionObject = {}
+async function getApplicableVersionFromLiquidTag(conditionStr: string) {
+ // Using Record because version object keys are dynamic (fpt, ghec, ghes, feature, etc.)
+ const newConditionObject: Record = {}
const condition = conditionStr.replace('not ', '')
const liquidTagVersions = condition.split(' or ').map((item) => item.trim())
for (const ver of liquidTagVersions) {
@@ -227,7 +234,8 @@ async function getApplicableVersionFromLiquidTag(conditionStr, filename) {
return newConditionObject
}
-async function initTagObject(token, props) {
+// Using any for token and props because they come from markdownlint library without full type definitions
+async function initTagObject(token: any, props: any) {
const condTagItem = {
name: token.name,
cond: token.content.replace(`${token.name} `, '').trim(),
@@ -245,15 +253,17 @@ async function initTagObject(token, props) {
parent: props.parent,
}
if (token.name === 'ifversion' || token.name === 'elsif') {
- condTagItem.versionsObj = await getApplicableVersionFromLiquidTag(
- condTagItem.cond,
- props.filename,
- )
- condTagItem.featureVersionsObj = condTagItem.versionsObj.feature
- ? getFeatureVersionsObject(condTagItem.versionsObj.feature)
+ // Using any because these properties (versionsObj, featureVersionsObj, versionsObjAll, versions)
+ // are added dynamically to condTagItem and not part of its initial type definition
+ ;(condTagItem as any).versionsObj = await getApplicableVersionFromLiquidTag(condTagItem.cond)
+ ;(condTagItem as any).featureVersionsObj = (condTagItem as any).versionsObj.feature
+ ? getFeatureVersionsObject((condTagItem as any).versionsObj.feature)
: undefined
- condTagItem.versionsObjAll = { ...condTagItem.versionsObj, ...condTagItem.featureVersionsObj }
- condTagItem.versions = getApplicableVersions(condTagItem.versionsObj, '', {
+ ;(condTagItem as any).versionsObjAll = {
+ ...(condTagItem as any).versionsObj,
+ ...(condTagItem as any).featureVersionsObj,
+ }
+ ;(condTagItem as any).versions = getApplicableVersions((condTagItem as any).versionsObj, '', {
doNotThrow: true,
includeNextVersion: true,
})
@@ -270,7 +280,8 @@ async function initTagObject(token, props) {
Then create flaws per stack item.
newCond
*/
-function decorateCondTagItems(condTagItems, lines) {
+// Using any[] because condTagItems contains dynamic objects with action property added at runtime
+function decorateCondTagItems(condTagItems: any[]) {
for (const item of condTagItems) {
item.action = {
type: 'none',
@@ -287,7 +298,8 @@ function decorateCondTagItems(condTagItems, lines) {
return
}
-function updateConditionals(condTagItems) {
+// Using any[] because condTagItems contains dynamic objects with various properties added at runtime
+function updateConditionals(condTagItems: any[]) {
// iterate through the ifversion, elsif, and else
// tags but NOT the endif tag. endif tags have
// no versions associated with them and are handled
@@ -470,7 +482,8 @@ function updateConditionals(condTagItems) {
}
}
-function processConditionals(item, condTagItems, indexOfAllItem) {
+// Using any for item and any[] for condTagItems because they contain dynamic objects with action property
+function processConditionals(item: any, condTagItems: any[], indexOfAllItem: number) {
item.action.type = 'all'
// if any tag in a statement is 'all', the
// remaining tags are obsolete.
diff --git a/src/content-linter/style/github-docs.js b/src/content-linter/style/github-docs.ts
similarity index 100%
rename from src/content-linter/style/github-docs.js
rename to src/content-linter/style/github-docs.ts
diff --git a/src/content-linter/tests/unit/frontmatter-validation.js b/src/content-linter/tests/unit/frontmatter-validation.ts
similarity index 100%
rename from src/content-linter/tests/unit/frontmatter-validation.js
rename to src/content-linter/tests/unit/frontmatter-validation.ts
diff --git a/src/content-linter/tests/unit/frontmatter-versions-whitespace.js b/src/content-linter/tests/unit/frontmatter-versions-whitespace.ts
similarity index 93%
rename from src/content-linter/tests/unit/frontmatter-versions-whitespace.js
rename to src/content-linter/tests/unit/frontmatter-versions-whitespace.ts
index ac2b7c22d99e..8005535d2df9 100644
--- a/src/content-linter/tests/unit/frontmatter-versions-whitespace.js
+++ b/src/content-linter/tests/unit/frontmatter-versions-whitespace.ts
@@ -6,8 +6,20 @@ import { frontmatterVersionsWhitespace } from '@/content-linter/lib/linting-rule
// Configure the test fixture to not split frontmatter and content
const fmOptions = { markdownlintOptions: { frontMatter: null } }
+interface ValidTestCase {
+ name: string
+ content: string
+}
+
+interface InvalidTestCase {
+ name: string
+ content: string
+ expectedErrors: number
+ expectedMessage?: string
+}
+
// Valid cases - should pass
-const validCases = [
+const validCases: ValidTestCase[] = [
{
name: 'valid-simple-versions',
content: `---
@@ -52,7 +64,7 @@ This is a test.
]
// Invalid cases - should fail
-const invalidCases = [
+const invalidCases: InvalidTestCase[] = [
{
name: 'trailing-whitespace',
content: `---
@@ -184,7 +196,7 @@ versions:
})
expect(result.content.length).toBe(1)
expect(result.content[0].fixInfo).toBeDefined()
- expect(result.content[0].fixInfo.insertText).toBe('*')
+ expect(result.content[0].fixInfo?.insertText).toBe('*')
})
test('should provide fix information for leading whitespace', async () => {
@@ -202,7 +214,7 @@ versions:
})
expect(result.content.length).toBe(1)
expect(result.content[0].fixInfo).toBeDefined()
- expect(result.content[0].fixInfo.insertText).toBe('*')
+ expect(result.content[0].fixInfo?.insertText).toBe('*')
})
})
diff --git a/src/content-linter/tests/unit/header-content-requirement.js b/src/content-linter/tests/unit/header-content-requirement.ts
similarity index 100%
rename from src/content-linter/tests/unit/header-content-requirement.js
rename to src/content-linter/tests/unit/header-content-requirement.ts
diff --git a/src/content-linter/tests/unit/note-warning-formatting.js b/src/content-linter/tests/unit/note-warning-formatting.ts
similarity index 89%
rename from src/content-linter/tests/unit/note-warning-formatting.js
rename to src/content-linter/tests/unit/note-warning-formatting.ts
index 7804dfeb98c6..c2451553e0ca 100644
--- a/src/content-linter/tests/unit/note-warning-formatting.js
+++ b/src/content-linter/tests/unit/note-warning-formatting.ts
@@ -46,8 +46,8 @@ describe(noteWarningFormatting.names.join(' - '), () => {
const errors = result.markdown
expect(errors.length).toBe(1)
expect(errors[0].lineNumber).toBe(2)
- if (errors[0].detail) {
- expect(errors[0].detail).toContain('Add a blank line before {% note %}')
+ if (errors[0].errorDetail) {
+ expect(errors[0].errorDetail).toContain('Add a blank line before {% note %}')
}
})
@@ -63,8 +63,8 @@ describe(noteWarningFormatting.names.join(' - '), () => {
const errors = result.markdown
expect(errors.length).toBe(1)
expect(errors[0].lineNumber).toBe(4)
- if (errors[0].detail) {
- expect(errors[0].detail).toContain('Add a blank line after {% endnote %}')
+ if (errors[0].errorDetail) {
+ expect(errors[0].errorDetail).toContain('Add a blank line after {% endnote %}')
}
})
@@ -78,8 +78,8 @@ describe(noteWarningFormatting.names.join(' - '), () => {
const errors = result.markdown
expect(errors.length).toBe(1)
expect(errors[0].lineNumber).toBe(2)
- if (errors[0].detail) {
- expect(errors[0].detail).toContain('Add a blank line before > [!WARNING]')
+ if (errors[0].errorDetail) {
+ expect(errors[0].errorDetail).toContain('Add a blank line before > [!WARNING]')
}
})
@@ -94,8 +94,8 @@ describe(noteWarningFormatting.names.join(' - '), () => {
const errors = result.markdown
expect(errors.length).toBe(1)
expect(errors[0].lineNumber).toBe(4)
- if (errors[0].detail) {
- expect(errors[0].detail).toContain('Add a blank line after > [!DANGER]')
+ if (errors[0].errorDetail) {
+ expect(errors[0].errorDetail).toContain('Add a blank line after > [!DANGER]')
}
})
@@ -117,8 +117,8 @@ describe(noteWarningFormatting.names.join(' - '), () => {
const errors = result.markdown
expect(errors.length).toBe(1)
expect(errors[0].lineNumber).toBe(8)
- if (errors[0].detail) {
- expect(errors[0].detail).toContain('Do not include more than 2 bullet points')
+ if (errors[0].errorDetail) {
+ expect(errors[0].errorDetail).toContain('Do not include more than 2 bullet points')
}
})
@@ -137,8 +137,8 @@ describe(noteWarningFormatting.names.join(' - '), () => {
const errors = result.markdown
expect(errors.length).toBe(1)
expect(errors[0].lineNumber).toBe(7)
- if (errors[0].detail) {
- expect(errors[0].detail).toContain('Do not include more than 2 bullet points')
+ if (errors[0].errorDetail) {
+ expect(errors[0].errorDetail).toContain('Do not include more than 2 bullet points')
}
})
@@ -156,12 +156,12 @@ describe(noteWarningFormatting.names.join(' - '), () => {
const errors = result.markdown
expect(errors.length).toBe(1)
expect(errors[0].lineNumber).toBe(4)
- if (errors[0].detail) {
- expect(errors[0].detail).toContain('should start with **Note:**')
+ if (errors[0].errorDetail) {
+ expect(errors[0].errorDetail).toContain('should start with **Note:**')
}
expect(errors[0].fixInfo).toBeDefined()
if (errors[0].fixInfo) {
- expect(errors[0].fixInfo.insertText).toBe('**Note:** ')
+ expect(errors[0].fixInfo?.insertText).toBe('**Note:** ')
}
})
@@ -177,8 +177,8 @@ describe(noteWarningFormatting.names.join(' - '), () => {
const errors = result.markdown
expect(errors.length).toBe(1)
expect(errors[0].lineNumber).toBe(3)
- if (errors[0].detail) {
- expect(errors[0].detail).toContain('should be inside a callout block')
+ if (errors[0].errorDetail) {
+ expect(errors[0].errorDetail).toContain('should be inside a callout block')
}
})
@@ -194,8 +194,8 @@ describe(noteWarningFormatting.names.join(' - '), () => {
const errors = result.markdown
expect(errors.length).toBe(1)
expect(errors[0].lineNumber).toBe(3)
- if (errors[0].detail) {
- expect(errors[0].detail).toContain('Warning prefix should be inside a callout block')
+ if (errors[0].errorDetail) {
+ expect(errors[0].errorDetail).toContain('Warning prefix should be inside a callout block')
}
})
diff --git a/src/content-linter/tests/unit/third-party-actions-reusable.js b/src/content-linter/tests/unit/third-party-actions-reusable.ts
similarity index 100%
rename from src/content-linter/tests/unit/third-party-actions-reusable.js
rename to src/content-linter/tests/unit/third-party-actions-reusable.ts
diff --git a/src/secret-scanning/data/public-docs.yml b/src/secret-scanning/data/public-docs.yml
index 6c5022f4e407..75fdc4f88731 100644
--- a/src/secret-scanning/data/public-docs.yml
+++ b/src/secret-scanning/data/public-docs.yml
@@ -1322,20 +1322,8 @@
isPrivateWithGhas: true
hasPushProtection: true
hasValidityCheck: false
- base64Supported: false
- isduplicate: true
-- provider: Azure
- supportedSecret: Azure Storage Account Access Key Base64 Encoded
- secretType: azure_storage_account_key_base64
- versions:
- fpt: '*'
- ghec: '*'
- isPublic: true
- isPrivateWithGhas: true
- hasPushProtection: true
- hasValidityCheck: false
base64Supported: true
- isduplicate: false
+ isduplicate: true
- provider: Azure
supportedSecret: Azure Text Analytics Key
secretType: azure_text_analytics_key
@@ -2670,20 +2658,8 @@
isPrivateWithGhas: true
hasPushProtection: true
hasValidityCheck: false
- base64Supported: false
- isduplicate: false
-- provider: GitHub Secret Scanning
- supportedSecret: GitHub Secret Scanning Base64 Encoded
- secretType: secret_scanning_sample_token_base64
- versions:
- fpt: '*'
- ghec: '*'
- isPublic: true
- isPrivateWithGhas: true
- hasPushProtection: true
- hasValidityCheck: false
base64Supported: true
- isduplicate: false
+ isduplicate: true
- provider: GitLab
supportedSecret: GitLab Access Token
secretType: gitlab_access_token
@@ -3206,20 +3182,8 @@
isPrivateWithGhas: true
hasPushProtection: true
hasValidityCheck: '{% ifversion fpt or ghes %}false{% else %}true{% endif %}'
- base64Supported: false
- isduplicate: false
-- provider: Hugging Face
- supportedSecret: Hugging Face User Access Token Base64 Encoded
- secretType: hf_user_access_token_base64
- versions:
- fpt: '*'
- ghec: '*'
- isPublic: true
- isPrivateWithGhas: true
- hasPushProtection: true
- hasValidityCheck: false
base64Supported: true
- isduplicate: false
+ isduplicate: true
- provider: Intercom
supportedSecret: Intercom Access Token
secretType: intercom_access_token
@@ -3939,7 +3903,7 @@
isPublic: true
isPrivateWithGhas: true
hasPushProtection: true
- hasValidityCheck: false
+ hasValidityCheck: '{% ifversion fpt or ghes %}false{% else %}true{% endif %}'
base64Supported: false
isduplicate: false
- provider: Notion
@@ -5535,20 +5499,8 @@
isPrivateWithGhas: true
hasPushProtection: true
hasValidityCheck: false
- base64Supported: false
- isduplicate: false
-- provider: Twilio
- supportedSecret: Twilio Account String Identifier Base64 Encoded
- secretType: twilio_account_sid_base64
- versions:
- fpt: '*'
- ghec: '*'
- isPublic: true
- isPrivateWithGhas: true
- hasPushProtection: true
- hasValidityCheck: false
base64Supported: true
- isduplicate: false
+ isduplicate: true
- provider: Twilio
supportedSecret: Twilio API Key
secretType: twilio_api_key
diff --git a/src/secret-scanning/lib/config.json b/src/secret-scanning/lib/config.json
index 17aff283857f..1853dabff8ea 100644
--- a/src/secret-scanning/lib/config.json
+++ b/src/secret-scanning/lib/config.json
@@ -1,5 +1,5 @@
{
- "sha": "b214c03689c4a14668227cf74dd43936c3b40cf8",
- "blob-sha": "1f146e744760e3642d6570d174f518638bb733d2",
+ "sha": "70891dd9fae3e6f7b3d8930de0ed9355458ccb18",
+ "blob-sha": "ee3d9b3b6e2caab95ce35aaf76059636c0ef9497",
"targetFilename": "code-security/secret-scanning/introduction/supported-secret-scanning-patterns"
}
\ No newline at end of file