Skip to content

Commit 9a3fe5e

Browse files
committed
Add new Quickstart samples
1 parent fe15a52 commit 9a3fe5e

94 files changed

Lines changed: 9975 additions & 127 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
name: Pack Sample App
2+
description: >
3+
Packages a sample app into a standalone zip using pnpm pack, which
4+
rewrites workspace:* and catalog: references to real npm versions.
5+
Requires the pnpm workspace to be installed before this action runs.
6+
7+
inputs:
8+
sdk:
9+
description: SDK slug matching the samples/ subdirectory (e.g. react, browser, node)
10+
required: true
11+
version:
12+
description: Version being released (e.g. 1.2.3), used to name the zip file
13+
required: true
14+
15+
outputs:
16+
archive:
17+
description: Filename of the produced zip (relative to the workspace root)
18+
value: ${{ steps.pack.outputs.archive }}
19+
20+
runs:
21+
using: composite
22+
steps:
23+
- name: Pack
24+
id: pack
25+
shell: bash
26+
run: |
27+
SDK="${{ inputs.sdk }}"
28+
VERSION="${{ inputs.version }}"
29+
DEST_DIR="$(pwd)"
30+
FOLDER="thunderid-${SDK}-sdk-sample-v${VERSION}"
31+
ARCHIVE="${FOLDER}.zip"
32+
33+
PACK_DIR="$(mktemp -d)"
34+
trap 'rm -rf "$PACK_DIR"' EXIT
35+
36+
cd "samples/${SDK}/quickstart"
37+
pnpm pack --pack-destination "${PACK_DIR}"
38+
cd "${DEST_DIR}"
39+
40+
tgz=$(ls "${PACK_DIR}"/*.tgz | head -1)
41+
if [ -z "$tgz" ]; then
42+
echo "Error: pnpm pack did not produce a .tgz for ${SDK}"
43+
exit 1
44+
fi
45+
46+
tar xzf "$tgz"
47+
mv package "${FOLDER}"
48+
(find "${FOLDER}" | sort | zip "${ARCHIVE}" -@)
49+
rm -rf "${FOLDER}"
50+
51+
echo "archive=${ARCHIVE}" >> "$GITHUB_OUTPUT"

.github/workflows/release.yml

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,14 @@ jobs:
163163
env:
164164
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
165165

166+
- name: 🚀 Create GitHub Release
167+
env:
168+
GH_TOKEN: ${{ secrets.THUNDERID_AUTOMATION_BOT }}
169+
run: |
170+
gh release create "sdk/javascript/v${{ steps.bump.outputs.version }}" \
171+
--title "ThunderID JavaScript SDK v${{ steps.bump.outputs.version }}" \
172+
--generate-notes
173+
166174
# ── Level 1: depends on javascript ─────────────────────────────────────────
167175
release-browser:
168176
name: 🌐 Release @thunderid/browser
@@ -221,6 +229,22 @@ jobs:
221229
env:
222230
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
223231

232+
- name: 📦 Pack Sample
233+
id: pack
234+
uses: ./.github/actions/pack-sample
235+
with:
236+
sdk: browser
237+
version: ${{ steps.bump.outputs.version }}
238+
239+
- name: 🚀 Create GitHub Release
240+
env:
241+
GH_TOKEN: ${{ secrets.THUNDERID_AUTOMATION_BOT }}
242+
run: |
243+
gh release create "sdk/browser/v${{ steps.bump.outputs.version }}" \
244+
--title "ThunderID Browser SDK v${{ steps.bump.outputs.version }}" \
245+
--generate-notes \
246+
"${{ steps.pack.outputs.archive }}"
247+
224248
release-node:
225249
name: 🟢 Release @thunderid/node
226250
needs: [validate, release-javascript]
@@ -278,6 +302,22 @@ jobs:
278302
env:
279303
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
280304

305+
- name: 📦 Pack Sample
306+
id: pack
307+
uses: ./.github/actions/pack-sample
308+
with:
309+
sdk: node
310+
version: ${{ steps.bump.outputs.version }}
311+
312+
- name: 🚀 Create GitHub Release
313+
env:
314+
GH_TOKEN: ${{ secrets.THUNDERID_AUTOMATION_BOT }}
315+
run: |
316+
gh release create "sdk/node/v${{ steps.bump.outputs.version }}" \
317+
--title "ThunderID Node SDK v${{ steps.bump.outputs.version }}" \
318+
--generate-notes \
319+
"${{ steps.pack.outputs.archive }}"
320+
281321
# ── Level 2: depends on browser / node ─────────────────────────────────────
282322
release-express:
283323
name: 🚂 Release @thunderid/express
@@ -336,6 +376,22 @@ jobs:
336376
env:
337377
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
338378

379+
- name: 📦 Pack Sample
380+
id: pack
381+
uses: ./.github/actions/pack-sample
382+
with:
383+
sdk: express
384+
version: ${{ steps.bump.outputs.version }}
385+
386+
- name: 🚀 Create GitHub Release
387+
env:
388+
GH_TOKEN: ${{ secrets.THUNDERID_AUTOMATION_BOT }}
389+
run: |
390+
gh release create "sdk/express/v${{ steps.bump.outputs.version }}" \
391+
--title "ThunderID Express SDK v${{ steps.bump.outputs.version }}" \
392+
--generate-notes \
393+
"${{ steps.pack.outputs.archive }}"
394+
339395
release-react:
340396
name: ⚛️ Release @thunderid/react
341397
needs: [validate, release-browser]
@@ -393,6 +449,22 @@ jobs:
393449
env:
394450
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
395451

452+
- name: 📦 Pack Sample
453+
id: pack
454+
uses: ./.github/actions/pack-sample
455+
with:
456+
sdk: react
457+
version: ${{ steps.bump.outputs.version }}
458+
459+
- name: 🚀 Create GitHub Release
460+
env:
461+
GH_TOKEN: ${{ secrets.THUNDERID_AUTOMATION_BOT }}
462+
run: |
463+
gh release create "sdk/react/v${{ steps.bump.outputs.version }}" \
464+
--title "ThunderID React SDK v${{ steps.bump.outputs.version }}" \
465+
--generate-notes \
466+
"${{ steps.pack.outputs.archive }}"
467+
396468
release-vue:
397469
name: 🟩 Release @thunderid/vue
398470
needs: [validate, release-browser]
@@ -450,6 +522,22 @@ jobs:
450522
env:
451523
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
452524

525+
- name: 📦 Pack Sample
526+
id: pack
527+
uses: ./.github/actions/pack-sample
528+
with:
529+
sdk: vue
530+
version: ${{ steps.bump.outputs.version }}
531+
532+
- name: 🚀 Create GitHub Release
533+
env:
534+
GH_TOKEN: ${{ secrets.THUNDERID_AUTOMATION_BOT }}
535+
run: |
536+
gh release create "sdk/vue/v${{ steps.bump.outputs.version }}" \
537+
--title "ThunderID Vue SDK v${{ steps.bump.outputs.version }}" \
538+
--generate-notes \
539+
"${{ steps.pack.outputs.archive }}"
540+
453541
# ── Level 3: depends on react / node+react / browser+node+vue ──────────────
454542
release-react-router:
455543
name: 🔀 Release @thunderid/react-router
@@ -508,6 +596,14 @@ jobs:
508596
env:
509597
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
510598

599+
- name: 🚀 Create GitHub Release
600+
env:
601+
GH_TOKEN: ${{ secrets.THUNDERID_AUTOMATION_BOT }}
602+
run: |
603+
gh release create "sdk/react-router/v${{ steps.bump.outputs.version }}" \
604+
--title "ThunderID React Router SDK v${{ steps.bump.outputs.version }}" \
605+
--generate-notes
606+
511607
release-tanstack-router:
512608
name: 🔱 Release @thunderid/tanstack-router
513609
needs: [validate, release-react]
@@ -565,6 +661,14 @@ jobs:
565661
env:
566662
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
567663

664+
- name: 🚀 Create GitHub Release
665+
env:
666+
GH_TOKEN: ${{ secrets.THUNDERID_AUTOMATION_BOT }}
667+
run: |
668+
gh release create "sdk/tanstack-router/v${{ steps.bump.outputs.version }}" \
669+
--title "ThunderID TanStack Router SDK v${{ steps.bump.outputs.version }}" \
670+
--generate-notes
671+
568672
release-nextjs:
569673
name: ▲ Release @thunderid/nextjs
570674
needs: [validate, release-node, release-react]
@@ -622,6 +726,22 @@ jobs:
622726
env:
623727
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
624728

729+
- name: 📦 Pack Sample
730+
id: pack
731+
uses: ./.github/actions/pack-sample
732+
with:
733+
sdk: nextjs
734+
version: ${{ steps.bump.outputs.version }}
735+
736+
- name: 🚀 Create GitHub Release
737+
env:
738+
GH_TOKEN: ${{ secrets.THUNDERID_AUTOMATION_BOT }}
739+
run: |
740+
gh release create "sdk/nextjs/v${{ steps.bump.outputs.version }}" \
741+
--title "ThunderID Next.js SDK v${{ steps.bump.outputs.version }}" \
742+
--generate-notes \
743+
"${{ steps.pack.outputs.archive }}"
744+
625745
release-nuxt:
626746
name: 💚 Release @thunderid/nuxt
627747
needs: [validate, release-browser, release-node, release-vue]
@@ -678,3 +798,19 @@ jobs:
678798
working-directory: packages/nuxt
679799
env:
680800
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
801+
802+
- name: 📦 Pack Sample
803+
id: pack
804+
uses: ./.github/actions/pack-sample
805+
with:
806+
sdk: nuxt
807+
version: ${{ steps.bump.outputs.version }}
808+
809+
- name: 🚀 Create GitHub Release
810+
env:
811+
GH_TOKEN: ${{ secrets.THUNDERID_AUTOMATION_BOT }}
812+
run: |
813+
gh release create "sdk/nuxt/v${{ steps.bump.outputs.version }}" \
814+
--title "ThunderID Nuxt SDK v${{ steps.bump.outputs.version }}" \
815+
--generate-notes \
816+
"${{ steps.pack.outputs.archive }}"

eslint.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,10 @@ export default [
2323
ignores: ['dist/**', 'build/**', 'node_modules/**', 'coverage/**'],
2424
},
2525
...thunderIdPlugin.configs.typescript,
26+
{
27+
files: ['samples/**'],
28+
rules: {
29+
'@thunderid/copyright-header': 'off',
30+
},
31+
},
2632
];

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
},
3434
"devDependencies": {
3535
"nx": "22.7.5",
36+
"@thunderid/eslint-plugin": "catalog:",
3637
"eslint": "catalog:",
3738
"prettier": "catalog:",
3839
"rimraf": "catalog:",

packages/javascript/src/api/getOrganizationUnitChildren.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,7 @@ const getOrganizationUnitChildren = async ({
116116
if (offset !== undefined) queryParams.set('offset', String(offset));
117117
const query = queryParams.toString();
118118

119-
const resolvedBase =
120-
url ?? `${baseUrl}/api/server/v1/organization-units/${organizationUnitId}/children`;
119+
const resolvedBase = url ?? `${baseUrl}/api/server/v1/organization-units/${organizationUnitId}/children`;
121120
const resolvedUrl = query ? `${resolvedBase}?${query}` : resolvedBase;
122121

123122
const requestInit: RequestInit = {

packages/nextjs/rolldown.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import {defineConfig} from 'rolldown';
2323
const pkg = JSON.parse(readFileSync('./package.json', 'utf8'));
2424

2525
const externalPackages = [...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.peerDependencies || {})];
26-
const external = id => externalPackages.some(name => id === name || id.startsWith(`${name}/`));
26+
const external = (id) => externalPackages.some((name) => id === name || id.startsWith(`${name}/`));
2727

2828
const commonOptions = {
2929
input: [join('src', 'index.ts'), join('src', 'server', 'index.ts')],

packages/nextjs/src/client/components/actions/SignInButton/SignInButton.tsx

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {ThunderIDRuntimeError} from '@thunderid/node';
2222
import {BaseSignInButton, BaseSignInButtonProps, useTranslation} from '@thunderid/react';
2323
import {AppRouterInstance} from 'next/dist/shared/lib/app-router-context.shared-runtime';
2424
import {useRouter} from 'next/navigation';
25-
import {forwardRef, ForwardRefExoticComponent, ReactElement, Ref, RefAttributes, MouseEvent} from 'react';
25+
import {forwardRef, ForwardRefExoticComponent, ReactElement, Ref, RefAttributes, MouseEvent, useState} from 'react';
2626
import useThunderID from '../../../contexts/ThunderID/useThunderID';
2727

2828
/**
@@ -71,25 +71,34 @@ const SignInButton: ForwardRefExoticComponent<SignInButtonProps & RefAttributes<
7171
const router: AppRouterInstance = useRouter();
7272
const {t} = useTranslation(preferences?.i18n);
7373

74-
const handleOnClick = async (e: MouseEvent<HTMLButtonElement>): Promise<void> => {
74+
const [isLoading, setIsLoading] = useState(false);
75+
76+
const handleSignIn = async (): Promise<void> => {
7577
try {
78+
setIsLoading(true);
79+
7680
// If a custom `signInUrl` is provided, use it for navigation.
7781
if (signInUrl) {
7882
router.push(signInUrl);
7983
} else if (signIn) {
8084
await signIn(signInOptions);
8185
}
82-
83-
if (onClick) {
84-
onClick(e);
85-
}
8686
} catch (error) {
8787
throw new ThunderIDRuntimeError(
8888
`Sign in failed: ${error instanceof Error ? error.message : String(error)}`,
8989
'SignInButton-handleSignIn-RuntimeError-001',
9090
'nextjs',
9191
'Something went wrong while trying to sign in. Please try again later.',
9292
);
93+
} finally {
94+
setIsLoading(false);
95+
}
96+
};
97+
98+
const handleOnClick = async (e: MouseEvent<HTMLButtonElement>): Promise<void> => {
99+
await handleSignIn();
100+
if (onClick) {
101+
onClick(e);
93102
}
94103
};
95104

@@ -99,6 +108,8 @@ const SignInButton: ForwardRefExoticComponent<SignInButtonProps & RefAttributes<
99108
style={style}
100109
ref={ref}
101110
preferences={preferences}
111+
isLoading={isLoading}
112+
signIn={handleSignIn}
102113
onClick={handleOnClick}
103114
{...rest}
104115
>

packages/nextjs/src/client/contexts/ThunderID/ThunderIDProvider.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -302,10 +302,7 @@ const ThunderIDClientProvider: FC<PropsWithChildren<ThunderIDClientProviderProps
302302
<ThunderIDContext.Provider value={contextValue}>
303303
<I18nProvider preferences={preferences?.i18n}>
304304
<FlowMetaProvider enabled={preferences?.resolveFromMeta !== false}>
305-
<ThemeProvider
306-
theme={preferences?.theme?.overrides}
307-
mode={getActiveTheme(preferences?.theme?.mode as any)}
308-
>
305+
<ThemeProvider theme={preferences?.theme?.overrides} mode={getActiveTheme(preferences?.theme?.mode as any)}>
309306
<FlowProvider>
310307
<UserProvider profile={userProfile} onUpdateProfile={handleProfileUpdate} updateProfile={updateProfile}>
311308
{children}

packages/nextjs/src/server/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,3 @@ export {default as thunderIDProxy} from './proxy/thunderIDProxy';
2727
export * from './proxy/thunderIDProxy';
2828

2929
export {default as createRouteMatcher} from './proxy/createRouteMatcher';
30-

packages/nextjs/src/server/proxy/thunderIDProxy.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,7 @@ const thunderIDProxy =
146146
options?: ThunderIDProxyOptions | ((req: NextRequest) => ThunderIDProxyOptions),
147147
): ((request: NextRequest) => Promise<NextResponse>) =>
148148
async (request: NextRequest): Promise<NextResponse> => {
149-
const resolvedOptions: ThunderIDProxyOptions =
150-
typeof options === 'function' ? options(request) : options || {};
149+
const resolvedOptions: ThunderIDProxyOptions = typeof options === 'function' ? options(request) : options || {};
151150

152151
// Resolve full config from passed options + environment variable fallbacks.
153152
const resolvedConfig: ThunderIDNextConfig = decorateConfigWithNextEnv(resolvedOptions as ThunderIDNextConfig);

0 commit comments

Comments
 (0)