Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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
4 changes: 4 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
<!--
Thank you very much for your pull request!

Use a Conventional Commit pull-request title because the squash-merge title
selects the release version. Examples: `fix(core): repair teardown`,
`feat(test): add scheduler helper`, or `feat(api)!: remove legacy behavior`.

If your PR is the addition of a new operator, please make sure all these boxes are ticked with an x:

- [ ] Add the operator to Rx
Expand Down
4 changes: 2 additions & 2 deletions .github/actions/install-dependencies/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ runs:
using: 'composite'
steps:
- name: Install pnpm
uses: pnpm/action-setup@v4
uses: pnpm/action-setup@9fd676a19091d4595eefd76e4bd31c97133911f1 # v4.2.0
with:
version: 10.34.5
run_install: false

- name: Use Node.js ${{ inputs.node-version }}
uses: actions/setup-node@v4
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: ${{ inputs.node-version }}
registry-url: ${{ inputs.registry-url }}
Expand Down
10 changes: 10 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
labels:
- dependencies
- security
open-pull-requests-limit: 5
4 changes: 2 additions & 2 deletions .github/workflows/ci_main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
timeout-minutes: 15

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Install dependencies
uses: ./.github/actions/install-dependencies
Expand Down Expand Up @@ -58,7 +58,7 @@ jobs:
advisory: true

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Fetch the RxJS 7 migration-evidence source
run: git fetch --no-tags --depth=1 origin 7.x:7.x
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci_ts_latest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
name: ts@latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Install Dependencies
uses: ./.github/actions/install-dependencies
Expand Down
28 changes: 28 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: CodeQL

on:
push:
branches: ['master']
pull_request:
branches: ['master']
schedule:
- cron: '23 4 * * 2'

permissions:
contents: read

jobs:
analyze:
name: CodeQL JavaScript and TypeScript
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: { persist-credentials: false }
- uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
with:
languages: javascript-typescript
- uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
with:
category: '/language:javascript-typescript'
25 changes: 25 additions & 0 deletions .github/workflows/conventional-commit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Conventional Commit title

on:
pull_request:
types: [opened, edited, reopened, synchronize]

permissions:
contents: read

jobs:
title:
name: Conventional Commit title
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: '24'
package-manager-cache: false
- name: Validate squash-merge title
env:
PR_TITLE: ${{ github.event.pull_request.title }}
run: node scripts/release/validate-pr-title.mjs "$PR_TITLE"
43 changes: 43 additions & 0 deletions .github/workflows/finalize-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Finalize staged release

on:
schedule:
- cron: '17 * * * *'
workflow_dispatch:

permissions:
contents: write

jobs:
finalize:
name: Finalize fully approved release
runs-on: ubuntu-24.04
permissions:
attestations: read
contents: write
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: { persist-credentials: false }
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with: { node-version: '24.12.0', package-manager-cache: false }
- name: Install checked npm 11.18.0
run: |
npm_bin=$(node scripts/release/install-pinned-npm.mjs "$RUNNER_TEMP/npm-cli")
echo "$(dirname "$npm_bin")" >> "$GITHUB_PATH"
- name: Publish immutable GitHub Releases only after registry, signatures, and attestations verify
env:
GH_TOKEN: ${{ github.token }}
run: |
gh api "repos/$GITHUB_REPOSITORY/releases?per_page=100" --jq '.[] | select(.draft == true) | .tag_name' | while read -r version; do
candidate_dir="$RUNNER_TEMP/$version"
mkdir -p "$candidate_dir"
gh release download "$version" --dir "$candidate_dir"
for tarball in "$candidate_dir"/*.tgz; do gh attestation verify "$tarball" --repo "$GITHUB_REPOSITORY"; done
if node scripts/release/finalize-release.mjs "$candidate_dir"; then
if [[ "$version" == *-* ]]; then
gh release edit "$version" --draft=false --prerelease --latest=false
else
gh release edit "$version" --draft=false --latest
fi
fi
done
26 changes: 26 additions & 0 deletions .github/workflows/fuzz.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Extended property fuzzing

on:
schedule:
- cron: '23 6 * * 3'
workflow_dispatch:

permissions:
contents: read

jobs:
fuzz:
name: Observable and release-policy properties
runs-on: ubuntu-24.04
timeout-minutes: 30
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: { persist-credentials: false }
- name: Install dependencies
uses: ./.github/actions/install-dependencies
with: { node-version: '24.12.0' }
- name: Run extended properties; fast-check reports the reproduction seed on failure
env: { RXJS_FUZZ_RUNS: 5000 }
run: |
pnpm --filter @rxjs/observable-polyfill exec vitest --run src/lifecycle.fuzz.spec.ts
node --test scripts/release/authorize-stage.test.mjs scripts/release/install-pinned-npm.test.mjs scripts/release/release-policy.test.mjs scripts/release/release-candidate.test.mjs scripts/release/stage-release.test.mjs
20 changes: 10 additions & 10 deletions .github/workflows/observable-wpt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,29 +36,29 @@ jobs:
timeout-minutes: 20

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Install JavaScript dependencies
uses: ./.github/actions/install-dependencies
with:
node-version: '24'

- name: Install pinned Python
uses: actions/setup-python@v5
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: ${{ env.WPT_PYTHON }}

- name: Install WPT native build dependencies
run: sudo apt-get update && sudo apt-get install --yes libatspi2.0-dev libcairo2-dev libgirepository1.0-dev pkg-config

- name: Restore pinned WPT runner
uses: actions/cache@v4
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: .cache/rxjs-wpt/runner
key: observable-wpt-runner-${{ runner.os }}-${{ runner.arch }}-python-${{ env.WPT_PYTHON }}-${{ env.WPT_COMMIT }}

- name: Restore pinned browser
uses: actions/cache@v4
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: .cache/rxjs-wpt/browser
key: observable-wpt-browser-${{ runner.os }}-chrome-150.0.7871.126-${{ hashFiles('packages/observable-polyfill/test/wpt/browser-lock.json') }}
Expand All @@ -77,7 +77,7 @@ jobs:

- name: Upload WPT evidence
if: always()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: observable-wpt-pinned-${{ github.run_id }}
if-no-files-found: warn
Expand All @@ -99,30 +99,30 @@ jobs:
continue-on-error: true

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Install JavaScript dependencies
uses: ./.github/actions/install-dependencies
with:
node-version: '24'

- name: Install pinned Python
uses: actions/setup-python@v5
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: ${{ env.WPT_PYTHON }}

- name: Install WPT native build dependencies
run: sudo apt-get update && sudo apt-get install --yes libatspi2.0-dev libcairo2-dev libgirepository1.0-dev pkg-config

- name: Restore pinned WPT runner
uses: actions/cache@v4
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: .cache/rxjs-wpt/runner
key: observable-wpt-runner-${{ runner.os }}-${{ runner.arch }}-python-${{ env.WPT_PYTHON }}-${{ env.WPT_COMMIT }}

- name: Install latest stable Chrome and matching driver
id: chrome
uses: browser-actions/setup-chrome@v2
uses: browser-actions/setup-chrome@2e1d749697dd1612b833dba4a722266286fbefcd # v2.1.2
with:
chrome-version: stable
install-chromedriver: true
Expand Down Expand Up @@ -153,7 +153,7 @@ jobs:

- name: Upload WPT evidence
if: always()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: observable-wpt-latest-chrome-${{ github.run_id }}
if-no-files-found: warn
Expand Down
53 changes: 53 additions & 0 deletions .github/workflows/osv.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: OSV vulnerability policy

on:
pull_request:
branches: ['master']
push:
branches: ['master']
schedule:
- cron: '41 7 * * 1'
workflow_dispatch:

permissions:
contents: read

concurrency:
group: osv-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
scan:
name: No unreviewed release-reachable vulnerabilities
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: { persist-credentials: false }
- uses: pnpm/action-setup@9fd676a19091d4595eefd76e4bd31c97133911f1 # v4.2.0
with: { version: 10.34.5, run_install: false }
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with: { node-version: '24.12.0', package-manager-cache: false }
- run: pnpm install --frozen-lockfile
- name: Reject expired, unowned, untracked, or overlong exceptions
run: node scripts/security/check-osv-exceptions.mjs
- run: mkdir -p .security
- name: Run full OSV scan with only reviewed docs-tooling exceptions
uses: google/osv-scanner-action/osv-scanner-action@9a498708959aeaef5ef730655706c5a1df1edbc2 # v2.3.8
with:
scan-args: |-
--config=osv-scanner.toml
--format=json
--output-file=.security/osv-root.json
--lockfile=pnpm-lock.yaml
- name: Prove every remaining npm advisory path is isolated to apps/rxjs.dev
run: |
pnpm audit --json > .security/pnpm-audit.json || true
node scripts/security/check-osv-exceptions.mjs .security/pnpm-audit.json
- name: Preserve scan evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: osv-evidence-${{ github.run_id }}
path: .security
if-no-files-found: warn
retention-days: 30
48 changes: 0 additions & 48 deletions .github/workflows/publish.yml

This file was deleted.

Loading
Loading