Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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
16 changes: 16 additions & 0 deletions .changeset/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"$schema": "https://unpkg.com/@changesets/config@3.0.3/schema.json",
"changelog": [
"@changesets/changelog-github",
{
"repo": "ForgeRock/ping-react-native-sdk"
}
],
"commit": false,
"fixed": [["@ping-identity/*"]],
"linked": [],
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": []
}
37 changes: 36 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,4 +77,39 @@ jobs:
with:
pr_number: ${{ github.event.pull_request.number }}


# Enforce that every PR includes a changeset file.
# changeset version consumes these files on release to bump versions and write CHANGELOGs.
# Controlled by the REQUIRE_CHANGESET repo variable (Settings → Variables → Actions).
# Set REQUIRE_CHANGESET=true to enable. Leave unset or set to any other value to skip.
changeset-check:
if: github.event_name == 'pull_request' && vars.REQUIRE_CHANGESET == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: yarn install
- name: Check for changeset file
run: yarn changeset status --since=origin/main

# Detect manual version drift in package.json files.
# Fails if any @ping-identity/* package version has been edited outside of changeset version.
lockstep-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: yarn install
- name: Check lockstep versions
run: yarn release:check-lockstep


69 changes: 69 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#
# Copyright (c) 2026 Ping Identity Corporation. All rights reserved.
#
# This software may be modified and distributed under the terms
# of the MIT license. See the LICENSE file for details.
#
name: Release

on:
workflow_dispatch:

permissions:
contents: write
id-token: write # required for npm provenance signing

jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
# PAT required — GITHUB_TOKEN cannot push to a branch protected by required status checks.
# Required scopes: contents:write (to push version bump commit and tags).
# Do NOT grant repo-wide admin or workflow scopes — contents:write is sufficient.
token: ${{ secrets.GH_TOKEN }}
Comment thread
tsdamas marked this conversation as resolved.

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'

- name: Install dependencies
run: yarn install

- name: Configure git user
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"

- name: Version packages
run: yarn release:version
env:
# changelog-github uses GITHUB_TOKEN to resolve PR links and author info in CHANGELOG.md
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}

- name: Check lockstep
run: yarn release:check-lockstep

- name: Commit and push version bump
run: |
# Stage only the files changeset version touches — avoids accidentally
# committing build artifacts or install-state changes from yarn install.
git add packages/*/package.json packages/*/CHANGELOG.md .changeset
git commit -m "chore: version packages"
git push

- name: Build and publish
# changeset publish: publishes packages not yet at current version, creates git tags
# NPM_CONFIG_PROVENANCE links each package to this workflow run and source commit
run: yarn release:publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
NPM_CONFIG_PROVENANCE: true

- name: Push tags
# Tags are created by changeset publish — push them after publish succeeds
run: git push --follow-tags
Binary file modified .yarn/install-state.gz
Binary file not shown.
93 changes: 93 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,99 @@ The root `package.json` contains scripts for common tasks:
- `yarn test:device-id`: run device-id package tests.
- `yarn test:device-profile`: run device-profile package tests.

### Release Process

This repo uses [Changesets](https://github.com/changesets/changesets) for versioning and publishing. All 9 `@ping-identity/*` SDK packages are versioned and published together (lockstep) on every release.

#### How it works

```mermaid
sequenceDiagram
participant Dev as Developer
participant Main as main branch
participant npm as npm registry

Note over Dev: work on feature #1
Dev->>Dev: yarn changeset (pick bump + description)
Dev->>Main: PR #1 merged (.changeset/abc.md)

Note over Dev: work on feature #2
Dev->>Dev: yarn changeset (pick bump + description)
Dev->>Main: PR #2 merged (.changeset/def.md)

Note over Dev: work on feature #3
Dev->>Dev: yarn changeset (pick bump + description)
Dev->>Main: PR #3 merged (.changeset/ghi.md)

Note over Main: changeset files accumulate<br/>nothing published yet

Dev->>Main: trigger workflow_dispatch

Note over Main: changeset version<br/>• all 9 packages → 0.1.1<br/>• CHANGELOG.md written<br/>• .changeset/*.md deleted<br/>• version bump committed

Main->>npm: changeset publish
Note over npm: @ping-identity/rn-* @ 0.1.1<br/>git tags created
```

#### Every PR must include a changeset file

Before opening a PR, run:

```sh
yarn changeset
```

The CLI will prompt you to select a bump type (`patch`, `minor`, or `major`) and write a short description of your change. This creates a `.changeset/xyz.md` file — commit it with your PR.

The changeset description becomes the entry in each package's `CHANGELOG.md` on the next release, linked to your PR and commit SHA. CI will fail if no changeset file is present.

**Bump type guidance:**
- `patch` — bug fixes, non-breaking internal changes
- `minor` — new backwards-compatible features
- `major` — breaking API changes

If your PR does not affect any published package (e.g. CI config changes, documentation edits, test-only changes), run:

```sh
yarn changeset --empty
```

This creates a changeset file with no version bump, satisfying the CI check without affecting the next release version.

#### Releases are triggered manually

Releases do **not** happen automatically on merge. Changeset files accumulate in `.changeset/` until a maintainer is ready to ship.

To release, trigger the [Release workflow](../../actions/workflows/release.yml) via `workflow_dispatch` in GitHub Actions. It will:

1. Bump all 9 packages to the same next version
2. Write `CHANGELOG.md` entries from accumulated changeset files
3. Commit the version bump to `main`
4. Publish to npm
5. Create git tags

**Why `workflow_dispatch` instead of the Changesets bot?**
We deliberately chose manual `workflow_dispatch` instead of the Changesets GitHub bot because:
- This is an early-stage SDK where releases should be deliberate, not automatic
- It avoids a permanently-open "Release PR" that creates pressure to ship before the team is ready
- One explicit button-push makes the release boundary clear

We can adopt the bot pattern later once release cadence is established.

#### Checking release status

To see what version would be released from current pending changesets:

```sh
yarn release:status
```

To verify all packages are at the same version (catches accidental manual edits):

```sh
yarn release:check-lockstep
```

### Sending A Pull Request

When you are sending a pull request:
Expand Down
132 changes: 66 additions & 66 deletions PingSampleApp/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3022,80 +3022,80 @@ SPEC CHECKSUMS:
RCTTypeSafety: d877728097547d0a37786cc9130c43ad71739ac3
React: 4b0b9cb962e694611e5e8a697c1b0300a2510c21
React-callinvoker: 70f125c17c7132811a6b473946ac5e7ae93b5e57
React-Core: 7cbc3118df2334b2ef597d9a515938b02c82109f
React-CoreModules: 7d8c14ecb889e7786a04637583b55b7d8f246baf
React-cxxreact: f32be07cba236c2f20f4e05ca200577ba5358e78
React-Core: bab40f5b1f46fe0c5896895a6f333e861a821a81
React-CoreModules: 05647d952e521113c128360633896ba7ba652e82
React-cxxreact: 2b4bac1ec6eecc6288ac8a6caea6afb42585740e
React-debug: deb3a146ef717fa3e8f4c23e0288369fe53199b7
React-defaultsnativemodule: 2c13a4240c5f96c42d069d1ba2392de6b4145bbd
React-domnativemodule: 91349b0b1cb20310cec1341b87cdd461aaa85e57
React-Fabric: bdfc7ec2481f26d7a9b8f59461f29ba4d903c549
React-FabricComponents: 47898469543d1bfb4528a9846419ec5568be89b1
React-FabricImage: ac8fc85ef452e5e9ae935c41118814651bd9e7f3
React-featureflags: 793b911e4c53e680db4a7d9965d0d6dc87b2fa88
React-featureflagsnativemodule: 25c9516d0dd004493c9bbafeb97da20bf9bde7dc
React-graphics: e07281690425dd9eeba3875d1faad28bc1f6da3b
React-hermes: bc1440d0e0662cc813bbf1c5ffbf9e0db2993a0f
React-idlecallbacksnativemodule: a2a3bb4a1793280b34d06d00169153b094be8c16
React-ImageManager: c9fa7461f3cab08e7bc98cbf55455b499e71c8b3
React-jserrorhandler: 15e591702040afed99cfcd088cf2337a8d09d807
React-jsi: 512ab3a1a628bc8824c41de8bcbbb81b2ac6fa8d
React-jsiexecutor: 653ccd2dee1e5ea558eecaf2f27b8bba0f09add8
React-jsinspector: 9121ccd2676a3f7c079ac01c9f90183422e3190e
React-jsinspectorcdp: 5c723ff2a09d73f2fdc496a545fb7003e7fdc079
React-jsinspectornetwork: 9cb0173f69e8405cef33fc79030fad26bbc3c073
React-jsinspectortracing: 65dc04125dc2392d85a82b6916f8cb088ea77566
React-jsitooling: 21af93cc98f760dd88d65b06b9317e0d4849fbbc
React-jsitracing: 4cc1b7de8087ae41c61a0eeee2593bc3362908b6
React-logger: 2f0d40bc8e648fbb1ff3b6580ad54189a8753290
React-Mapbuffer: 9a7c65078c6851397c1999068989e4fc239d0c80
React-microtasksnativemodule: 4f1ef719ba6c7ebbd2d75346ffa2916f9b4771c9
react-native-config: 85858ab5e598762e783a43ac592561ad110c35a9
react-native-safe-area-context: d446989793f96dc2f44c33c42dbfb316d983f24e
React-NativeModulesApple: f6f696e510b9d89c3c06b7764f56947dc13ae922
React-defaultsnativemodule: 11e2948787a15d3cf1b66d7f29f13770a177bff7
React-domnativemodule: 2f4b279acdb2963736fb5de2f585811dd90070b5
React-Fabric: 6f8d1a303c96f1d078c14d74c4005bf457e5b782
React-FabricComponents: b106410970e9a0c4e592da656c7a7e0947306c23
React-FabricImage: 1abaf230dfce9b58fdf53c4128f3f40c6e64af6a
React-featureflags: f7ef58d91079efde3ad223bcca6d197e845d5bcf
React-featureflagsnativemodule: ae5abc9849d1696f4f8f11ee3744bf5715e032cf
React-graphics: b306856c6ed9aac32f717a229550406a53b28a6d
React-hermes: b6edce8fa19388654b1aea30844497cbeade83bc
React-idlecallbacksnativemodule: cb386712842cb9e479c89311edb234d529b64db4
React-ImageManager: 8ce94417853eaa22faaad1f4cc1952dd3f8e2275
React-jserrorhandler: ab827d67dc270a9c8703eef524230baeafaf6876
React-jsi: 545342ec5c78ab1277af5f0dbe8d489e7e73db14
React-jsiexecutor: 20210891c7c77255c16dec6762faf68b373f9f74
React-jsinspector: 4e73460e488132d70d2b4894e5578cc856f2cb74
React-jsinspectorcdp: 8b2bcb5779289cb2b9ca517f2965ed23eb2fd3e0
React-jsinspectornetwork: b5e0cb9e488d294eed2d8209dc3dc0f9587210c1
React-jsinspectortracing: f3c4036e7b984405ac910f878576d325dd9f2834
React-jsitooling: 75bbfd221b6173a5e848ca5a6680506bac064a56
React-jsitracing: 11ed7d821864dd988c159d4943e0a1e0937c11b1
React-logger: 984ebd897afad067555d081deaf03f57c4315723
React-Mapbuffer: 0c045c844ce6d85cde53e85ab163294c6adad349
React-microtasksnativemodule: d9499269ad1f484ae71319bac1d9231447f2094e
react-native-config: adc7d6e70302363192ed8f2eae027864d218ff71
react-native-safe-area-context: 01f6d357d42395422eed7c3bfe715614728f2989
React-NativeModulesApple: 983f3483ef0a3446b56d490f09d579fba2442e17
React-oscompat: 114036cd8f064558c9c1a0c04fc9ae5e1453706a
React-perflogger: 4b2f88ae059b600daf268528a4a83366338eef05
React-performancetimeline: e15fd9798123436f99e46898422fe921fecf506b
React-perflogger: e7287fee27c16e3c8bd4d470f2361572b63be16b
React-performancetimeline: 8ebbaa31d2d0cea680b0a2a567500d3cab8954fc
React-RCTActionSheet: 68c68b0a7a5d2b0cfc255c64889b6e485974e988
React-RCTAnimation: 6bf502c89c53076f92cd1a254f5ec8d63ee263de
React-RCTAppDelegate: c90f5732784684c3dd226d812eccb578cd954ad7
React-RCTBlob: d2905f01749b80efd6d3b86fb15e30ed26d5450b
React-RCTFabric: 435b3ffaad113fb1f274c2f2a677c9fcc9b5cf55
React-RCTFBReactNativeSpec: a3178b419f42af196e90ca4bf07710dce5d68301
React-RCTImage: 8f5ffa03461339180a68820ea452af6e20ace2c7
React-RCTLinking: 1151646834d31f97580d8a75d768a84b2533b7f9
React-RCTNetwork: 52008724d0db90a540f4058ed0de0e41c4b7943c
React-RCTRuntime: 10ce9a7cb27ba307544d29a2a04e6202dc7b3e9a
React-RCTSettings: f724cacbd892ee18f985e1aebdd97386e49c76f5
React-RCTText: 6e1b95d9126d808410dfa96e09bc4441ec6f36f7
React-RCTVibration: 862a4e5b36d49e6299c8cbfb86486fc31f86f6fa
React-RCTAnimation: d6c5c728b888a967ce9aff1ff71a8ed71a68d069
React-RCTAppDelegate: 0fc048666bda159cd469a6fb9befb04b3fa62be4
React-RCTBlob: 12d8c699a1f906840113ee8d8bb575e69a05509f
React-RCTFabric: 01e815845ebc185f44205dcbf50eeb712fec23fe
React-RCTFBReactNativeSpec: f57927fb0af6ce2f25c19f8b894e2986138aa89f
React-RCTImage: a82518168f4ee407913b23ca749ca79ef51959f3
React-RCTLinking: 7f343b584c36f024f390fea563483568fe763ef6
React-RCTNetwork: 3165eb757ceb62a7cde4cdad043d63314122e8a3
React-RCTRuntime: feee590c459c4cb6aaa7a00f3abc8c04709b536f
React-RCTSettings: 6bad0ae45d8d872c873059f332f586f99875621f
React-RCTText: 657d60f35983062de8f0cea67c279aa7a3ea9858
React-RCTVibration: 78f4770515141efb7f55f9b27c49dda95319c3a8
React-rendererconsistency: f7baab26c6d0cd5b2eb7afcecfd2d8b957017b18
React-renderercss: 62acb8f010a062309e3bd0e203aa14636162e3b3
React-rendererdebug: 3a89ac44f15c7160735264d585a29525655238d2
React-renderercss: bdd2f83a4a054c3e4321fd61305c202b848e471b
React-rendererdebug: 9f8865ee038127a9d99d4b034c9da4935d204993
React-rncore: f7438473c4c71ee1963fb06a8635bb96013c9e1c
React-RuntimeApple: 81f0a9ba81ce7eb203529b0471dc69bf18f5f637
React-RuntimeCore: 6356e89b2518ba66a989c39a2adb18122a5e3b7b
React-RuntimeApple: 4d2ab9f72b9193da86eceded128a67254fc18aeb
React-RuntimeCore: 5fd73030438d094975ca0f549d162dd97746ae38
React-runtimeexecutor: 17c70842d5e611130cb66f91e247bc4a609c3508
React-RuntimeHermes: 0a1d7ce2fe08cf182235de1a9330b51aa6b935cd
React-runtimescheduler: 10ae98e1417eff159be5df8fdc8fcdaac557aba6
React-RuntimeHermes: 3c88e6e1ea7ea0899dcffc77c10d61ea46688cfd
React-runtimescheduler: 024500621c7c93d65371498abb4ee26d34f5d47d
React-timing: c3c923df2b86194e1682e01167717481232f1dc7
React-utils: 7791a96e194eec85cb41dc98a2045b5f07839598
ReactAppDependencyProvider: ba631a31783569c13056dd57ff39e19764abdd6f
ReactCodegen: 1e9f3e8a3f56fa25fbf39ecd37b708a4838d9032
ReactCommon: 96684b90b235d6ae340d126141edd4563b7a446a
RNCAsyncStorage: 767abb068db6ad28b5f59a129fbc9fab18b377e2
RNPingBrowser: ee98bfb8ab8f803dd29deb04ae74f64d0dc9f911
RNPingCore: f41b28de7c94d2e2af7fae663531d0d0341d2775
RNPingDeviceId: fd74c58f4eb179de3052adad1c1345bd402c10f5
RNPingDeviceProfile: 4f7d48210c1f7929db4f0a15b1bd091d4e5c64c9
RNPingJourney: 6f38c0a4ae2ca523541ce1950bd40440f085f2a7
RNPingLogger: 92fd0e87739f7fabf9c16883827b450b13a512f2
RNPingOidc: e522fcc12a6ed3e6e4ed8688db18e191aa1e1db1
RNPingStorage: bddf2eac79587794f1f4928efe81637f163ee8eb
RNScreens: 846d53087db560ed5fbc34feb0643adb5f9602c5
RNVectorIcons: 54df27a2e90ddeb674c7237d76060ec9762d0bc5
React-utils: 9154a037543147e1c24098f1a48fc8472602c092
ReactAppDependencyProvider: afd905e84ee36e1678016ae04d7370c75ed539be
ReactCodegen: 62690fdeb185860673cb78e3d9b049c7e1d40531
ReactCommon: 17fd88849a174bf9ce45461912291aca711410fc
RNCAsyncStorage: 1f04c8d56558e533277beda29187f571cf7eecb2
RNPingBrowser: d1950a9759dae413abaf726f9e8302bf415d2caf
RNPingCore: b021483f6c69a2c59ef6d51df70d58c9974e9ffc
RNPingDeviceId: 84920677cc5e43ba79595151c1c3d71f350267de
RNPingDeviceProfile: bca907b80c6ff5c9d508a27bd8ffc47bdee60c8c
RNPingJourney: 775d5e28dd5e840d379fdb7c96a29dedacc9e300
RNPingLogger: 827f7ba91e361824cd4d1c1b2f1f55b8444680dd
RNPingOidc: 487b3e206978406dbf98e885e0c04e5dd0d36c3d
RNPingStorage: 9b69b37c2f943126e04fbcfb1a36eff497e159e1
RNScreens: f35bcc83b6e3a871635b1c28728e63c9560f159a
RNVectorIcons: be4d047a76ad307ffe54732208fb0498fcb8477f
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
Yoga: 703055a9f39562521cdb8657162dfd80f8c174c3
Yoga: daa1e4de4b971b977b23bc842aaa3e135324f1f3

PODFILE CHECKSUM: 75ad62a53ebca2cac224cdae8a311d87aefae9af

COCOAPODS: 1.15.2
COCOAPODS: 1.16.2
8 changes: 7 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,11 @@
"storage:test": "yarn workspace @ping-identity/rn-storage run test",
"docs:journey": "typedoc --options typedoc.journey.json",
"prettier": "turbo run prettier",
"typecheck": "turbo run typecheck"
"typecheck": "turbo run typecheck",
"release:status": "changeset status",
"release:version": "changeset version",
"release:publish": "yarn packages:build && changeset publish",
"release:check-lockstep": "node scripts/check-lockstep.mjs"
},
"workspaces": {
"packages": [
Expand All @@ -52,6 +56,8 @@
]
},
"devDependencies": {
"@changesets/changelog-github": "^0.6.0",
"@changesets/cli": "^2.30.0",
"@eslint/js": "^10.0.1",
"@react-native/codegen": "^0.82.1",
"@types/jest": "^29.5.14",
Expand Down
Loading
Loading