Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/purge-fastly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ jobs:
- uses: ./.github/actions/node-npm-setup

- name: Wait for production to match build number
if: github.event_name != 'workflow_dispatch'
run: |
needs=$(git rev-parse HEAD)
start_time=$(date +%s)
Expand Down
6 changes: 3 additions & 3 deletions config/kubernetes/production/deployments/webapp.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -40,18 +40,18 @@ spec:
image: docs-internal
resources:
requests:
cpu: 1250m
cpu: 1500m
# Absolute minimum to start app is 1000m
# Node is single-threaded but we want more CPUs
# for OS and image resizing, and other binary executions
# Better to increase replicas or memory than CPU
memory: 8.0Gi
memory: 5000Mi
# Absolute minimum to start app is 4500Mi
# Would increase with more pages, versions, or languages supported
# The additional memory helps during traffic surges
limits:
cpu: 8000m
memory: 16.0Gi
memory: 14.0Gi
ports:
- name: http
containerPort: 4000
Expand Down
1 change: 1 addition & 0 deletions content/billing/how-tos/set-up-budgets.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,3 +136,4 @@ You can edit or delete a budget at any time, but you cannot change the scope of
1. Navigate to the "Budgets and alerts" view. See [Viewing budgets](#viewing-budgets).
1. In the list of budgets, click {% octicon "kebab-horizontal" aria-label="View actions" %} next to the budget you want to edit, and click **{% octicon "pencil" aria-hidden="true" aria-label="pencil" %} Edit** or **{% octicon "trash" aria-hidden="true" aria-label="trash" %} Delete**.
1. Follow the prompts.

Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,4 @@ If the dev container for the current codespace was built from the default image,

Alternatively, you can check which repositories have prebuilds by reviewing a usage report. See [Understanding your {% data variables.product.prodname_codespaces %} usage](#understanding-your-codespaces-usage) above.
* Storage of containers built from the default dev container image for codespaces is free of charge and does not reduce your included storage. You can therefore avoid your storage allowance being consumed by your dev container by using the default image in your dev container configuration, rather than specifying a more specialized image. See [AUTOTITLE](/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers#using-the-default-dev-container-configuration) and [Storage usage for your base dev container](#storage-usage-for-your-base-dev-container) above.

8 changes: 8 additions & 0 deletions content/graphql/overview/changelog/2017.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: "GraphQL changelog for 2017"
shortTitle: "2017"
intro: 'GraphQL schema changes from 2017.'
versions:
fpt: '*'
autogenerated: graphql
---
8 changes: 8 additions & 0 deletions content/graphql/overview/changelog/2018.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: "GraphQL changelog for 2018"
shortTitle: "2018"
intro: 'GraphQL schema changes from 2018.'
versions:
fpt: '*'
autogenerated: graphql
---
8 changes: 8 additions & 0 deletions content/graphql/overview/changelog/2019.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: "GraphQL changelog for 2019"
shortTitle: "2019"
intro: 'GraphQL schema changes from 2019.'
versions:
fpt: '*'
autogenerated: graphql
---
8 changes: 8 additions & 0 deletions content/graphql/overview/changelog/2020.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: "GraphQL changelog for 2020"
shortTitle: "2020"
intro: 'GraphQL schema changes from 2020.'
versions:
fpt: '*'
autogenerated: graphql
---
8 changes: 8 additions & 0 deletions content/graphql/overview/changelog/2021.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: "GraphQL changelog for 2021"
shortTitle: "2021"
intro: 'GraphQL schema changes from 2021.'
versions:
fpt: '*'
autogenerated: graphql
---
8 changes: 8 additions & 0 deletions content/graphql/overview/changelog/2022.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: "GraphQL changelog for 2022"
shortTitle: "2022"
intro: 'GraphQL schema changes from 2022.'
versions:
fpt: '*'
autogenerated: graphql
---
8 changes: 8 additions & 0 deletions content/graphql/overview/changelog/2023.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: "GraphQL changelog for 2023"
shortTitle: "2023"
intro: 'GraphQL schema changes from 2023.'
versions:
fpt: '*'
autogenerated: graphql
---
8 changes: 8 additions & 0 deletions content/graphql/overview/changelog/2024.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: "GraphQL changelog for 2024"
shortTitle: "2024"
intro: 'GraphQL schema changes from 2024.'
versions:
fpt: '*'
autogenerated: graphql
---
8 changes: 8 additions & 0 deletions content/graphql/overview/changelog/2025.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: "GraphQL changelog for 2025"
shortTitle: "2025"
intro: 'GraphQL schema changes from 2025.'
versions:
fpt: '*'
autogenerated: graphql
---
8 changes: 8 additions & 0 deletions content/graphql/overview/changelog/2026.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: "GraphQL changelog for 2026"
shortTitle: "2026"
intro: 'GraphQL schema changes from 2026.'
versions:
fpt: '*'
autogenerated: graphql
---
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,17 @@ redirect_from:
versions:
fpt: '*'
autogenerated: graphql
children:
- /2026
- /2025
- /2024
- /2023
- /2022
- /2021
- /2020
- /2019
- /2018
- /2017
category:
- Understand API changes and limits
---
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,4 @@ Project admins can also manage write and admin access to their project and contr
## Further reading

* [Allowing project visibility changes in your organization](/organizations/managing-organization-settings/allowing-project-visibility-changes-in-your-organization)

Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,4 @@ Query parameter | Example
`assignees` | `https://github.com/octo-org/octo-repo/compare/main...my-branch?quick_pull=1&assignees=octocat` creates a pull request and assigns it to @octocat.
`projects` | `https://github.com/octo-org/octo-repo/compare/main...my-branch?quick_pull=1&title=Bug+fix&projects=octo-org/1` creates a pull request with the title "Bug fix" and adds it to the organization's project 1.
`template` | `https://github.com/octo-org/octo-repo/compare/main...my-branch?quick_pull=1&template=issue_template.md` creates a pull request with a template in the pull request body. The `template` query parameter works with templates stored in a `PULL_REQUEST_TEMPLATE` subdirectory within the root, `docs/` or `.github/` directory in a repository. For more information, see [AUTOTITLE](/communities/using-templates-to-encourage-useful-issues-and-pull-requests).

Original file line number Diff line number Diff line change
Expand Up @@ -126,3 +126,4 @@ We will interpret our policies and resolve disputes in favor of protecting users
**Enforcement.** GitHub retains full discretion to [take action](/site-policy/github-terms/github-community-guidelines#what-happens-if-someone-violates-githubs-policies) in response to a violation of these policies, including account suspension, account [termination](/site-policy/github-terms/github-terms-of-service#3-github-may-terminate), or [removal](/site-policy/github-terms/github-terms-of-service#2-github-may-remove-content) of content. Please also see our [Community Guidelines](/site-policy/github-terms/github-community-guidelines) for actions you can take if something or someone offends you.

**Reinstatement and appeal.** If your content or account has been disabled or restricted and you seek reinstatement or wish to appeal, please see our [Appeal and Reinstatement page](/site-policy/acceptable-use-policies/github-appeal-and-reinstatement) for information about the process and use our [Appeal and Reinstatement form](https://support.github.com/contact/reinstatement) to submit a request.

Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
> **{% data variables.release-phases.retired_caps %} Notice:** Authenticating to the {% data variables.product.prodname_dotcom %} API is no longer accessible using query parameters. Authenticating to the API should be done with [HTTP basic authentication](/rest/overview/authenticating-to-the-rest-api#using-basic-authentication). For more information, including scheduled brownouts, see the [blog post](https://developer.github.com/changes/2020-02-10-deprecating-auth-through-query-param/).
{% ifversion ghes %}>
> Authentication to the API using query parameters while available is no longer supported due to security concerns. Instead we recommend integrators move their access token, `client_id`, or `client_secret` in the header. {% data variables.product.prodname_dotcom %} will announce the removal of authentication by query parameters with advanced notice. {% endif %}

1 change: 1 addition & 0 deletions data/reusables/enterprise-accounts/emu-cap-validates.md
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
When your enterprise uses OIDC SSO, {% data variables.product.prodname_dotcom %} will automatically use your IdP's conditional access policy (CAP) IP conditions to validate interactions with {% data variables.product.prodname_dotcom %} when members use the web UI or change IP addresses, and for each authentication with a {% data variables.product.pat_generic %} or SSH key associated with a user account.

1 change: 1 addition & 0 deletions data/reusables/user-settings/user-api.md
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
If a request URL does not include a `{username}` parameter then the response will be for the signed-in user (and you must pass [authentication information](/rest/overview/authenticating-to-the-rest-api) with your request). Additional private information, such as whether a user has two-factor authentication enabled, is included when authenticated through{% ifversion ghes %} Basic Authentication or{% endif %} OAuth with the `user` scope.

18 changes: 1 addition & 17 deletions eslint.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -204,32 +204,17 @@ export default [
'src/article-api/transformers/audit-logs-transformer.ts',
'src/article-api/transformers/rest-transformer.ts',
'src/codeql-cli/scripts/convert-markdown-for-docs.ts',
'src/content-linter/lib/init-test.ts',
'src/content-linter/lib/linting-rules/code-annotations.ts',
'src/content-linter/lib/linting-rules/index.ts',
'src/content-linter/lib/linting-rules/journey-tracks-liquid.ts',
'src/content-linter/lib/linting-rules/liquid-ifversion-versions.ts',
'src/content-linter/lib/linting-rules/liquid-versioning.ts',
'src/content-linter/lib/linting-rules/third-party-action-pinning.ts',
'src/content-linter/scripts/lint-content.ts',
'src/content-linter/scripts/pretty-print-results.ts',
'src/content-linter/style/base.ts',
'src/content-linter/tests/integration/lint-cli.ts',
'src/content-linter/tests/lint-files.ts',
'src/content-linter/tests/lint-frontmatter-links.ts',
'src/content-linter/tests/unit/table-column-integrity-simple.ts',

'src/content-render/liquid/engine.ts',
'src/content-render/liquid/index.ts',
'src/content-render/scripts/liquid-tags.ts',
'src/content-render/scripts/move-content.ts',
'src/content-render/tests/link-error-line-numbers.ts',
'src/content-render/unified/annotate.ts',
'src/content-render/unified/index.ts',
'src/data-directory/lib/get-data.ts',
'src/early-access/scripts/migrate-early-access-product.ts',
'src/fixtures/tests/categories-and-subcategory.ts',
'src/fixtures/tests/guides.ts',
'src/fixtures/tests/translations.ts',
'src/frame/components/context/MainContext.tsx',
'src/frame/lib/create-tree.ts',
'src/frame/lib/frontmatter.ts',
Expand Down Expand Up @@ -290,7 +275,6 @@ export default [
'src/types/markdownlint-rule-helpers.d.ts',
'src/types/markdownlint-rule-search-replace.d.ts',
'src/types/primer__octicons.d.ts',
'src/workflows/projects.ts',
],
rules: {
'@typescript-eslint/no-explicit-any': 'off',
Expand Down
2 changes: 2 additions & 0 deletions src/article-api/templates/graphql-changelog.template.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

{{ manualContent }}

{% for navItem in yearNavItems %}{% if navItem.isCurrent %}**{{ navItem.year }}**{% else %}[{{ navItem.year }}]({{ navItem.year }}){% endif %}{% unless forloop.last %} · {% endunless %}{% endfor %}

{% for item in changelogItems %}

## Schema changes for {{ item.date }}
Expand Down
32 changes: 27 additions & 5 deletions src/article-api/tests/graphql-transformer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ describe('GraphQL transformer', { timeout: 10000 }, () => {
})

describe('Overview pages', () => {
test('changelog page renders with changes', async () => {
test('changelog index page renders with latest year changes', async () => {
const res = await getCached('/en/graphql/overview/changelog')
expect(res.statusCode).toBe(200)

Expand All @@ -250,16 +250,38 @@ describe('GraphQL transformer', { timeout: 10000 }, () => {
'Breaking changes include changes that will break existing queries',
)

// Check for date-based changelog sections
expect(res.body).toContain('## Schema changes for 2025-11-30')
// Index page shows latest year (2026) entries only
expect(res.body).toContain('## Schema changes for 2026-')

// Check for change items
expect(res.body).toContain('### The GraphQL schema includes these changes:')
expect(res.body).toContain('Type SuggestedReviewerActor was added')

// Should NOT contain entries from other years
expect(res.body).not.toContain('## Schema changes for 2025-')

// Check for year navigation
expect(res.body).toContain('2026')
expect(res.body).toContain('2025')
})

test('changelog year page renders with that year only', async () => {
const res = await getCached('/en/graphql/overview/changelog/2025')
expect(res.statusCode).toBe(200)

// Check for year-specific heading
expect(res.body).toContain('# GraphQL changelog for 2025')

// Check for date-based changelog sections from 2025
expect(res.body).toContain('## Schema changes for 2025-')

// Should NOT contain entries from other years
expect(res.body).not.toContain('## Schema changes for 2026-')
expect(res.body).not.toContain('## Schema changes for 2024-')
})

test('changelog removes HTML tags from changes', async () => {
const res = await getCached('/en/graphql/overview/changelog')
// Use a year page that has the specific test data
const res = await getCached('/en/graphql/overview/changelog/2025')
expect(res.statusCode).toBe(200)

// Check that HTML tags are removed
Expand Down
25 changes: 23 additions & 2 deletions src/article-api/transformers/graphql-changelog-transformer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,22 @@ export class GraphQLChangelogTransformer implements PageTransformer {
async transform(page: Page, _pathname: string, context: Context): Promise<string> {
const currentVersion = context.currentVersion!

const { getGraphqlChangelog } = await import('@/graphql/lib/index')
const { getGraphqlChangelogByYear, getGraphqlChangelogYears } =
await import('@/graphql/lib/index')

const schema = getGraphqlChangelog(currentVersion) as ChangelogItemT[]
// Determine if this is a year-specific page
const yearMatch = page.relativePath.match(/changelog\/(\d{4})\.md$/)
const year = yearMatch ? Number(yearMatch[1]) : null
const years = getGraphqlChangelogYears(currentVersion)

let schema: ChangelogItemT[]
if (year) {
schema = getGraphqlChangelogByYear(currentVersion, year) as ChangelogItemT[]
} else {
// Index page: show only the latest year
const latestYear = years[0]
schema = getGraphqlChangelogByYear(currentVersion, latestYear) as ChangelogItemT[]
}

const intro = page.intro ? await page.renderProp('intro', context, { textOnly: true }) : ''
const manualContent = await extractManualContent(page, context)
Expand All @@ -51,11 +64,19 @@ export class GraphQLChangelogTransformer implements PageTransformer {
}
})

// Build year navigation links
const displayYear = year || years[0]
const yearNavItems = years.map((y) => ({
year: y,
isCurrent: y === displayYear,
}))

const templateData: Record<string, unknown> = {
pageTitle: page.title,
pageIntro: intro,
manualContent,
changelogItems,
yearNavItems,
}

const templateContent = loadTemplate(this.templateName)
Expand Down
4 changes: 3 additions & 1 deletion src/content-linter/lib/init-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ export async function runRule(
}

const testOptions: Partial<Options> = {
customRules: [module as any],
customRules: [
module as unknown as NonNullable<Extract<Options['customRules'], unknown[]>>[number],
],
config: { ...defaultConfig, ...testConfig },
}
if (strings) testOptions.strings = strings
Expand Down
2 changes: 1 addition & 1 deletion src/content-linter/lib/linting-rules/code-annotations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import type { RuleParams, RuleErrorCallback, MarkdownToken } from '@/content-lin

interface Frontmatter {
layout?: string
[key: string]: any
[key: string]: unknown
}

export const codeAnnotations = {
Expand Down
7 changes: 2 additions & 5 deletions src/content-linter/lib/linting-rules/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,10 @@ import { raiAppCardStructure } from '@/content-linter/lib/linting-rules/rai-app-
import { frontmatterContentType } from '@/content-linter/lib/linting-rules/frontmatter-content-type'
import { frontmatterDocsTeamMetrics } from '@/content-linter/lib/linting-rules/frontmatter-docs-team-metrics'

// Using any type because @github/markdownlint-github doesn't provide TypeScript declarations
// The elements in the array have a 'names' property that contains rule identifiers
const noDefaultAltText = markdownlintGitHub.find((elem: any) =>
const noDefaultAltText = markdownlintGitHub.find((elem: { names: string[] }) =>
elem.names.includes('no-default-alt-text'),
)
// Using any type because @github/markdownlint-github doesn't provide TypeScript declarations
const noGenericLinkText = markdownlintGitHub.find((elem: any) =>
const noGenericLinkText = markdownlintGitHub.find((elem: { names: string[] }) =>
elem.names.includes('no-generic-link-text'),
)

Expand Down
Loading
Loading