diff --git a/src/CroctProvider.test.tsx b/src/CroctProvider.test.tsx index 7c54dd9..6969a79 100644 --- a/src/CroctProvider.test.tsx +++ b/src/CroctProvider.test.tsx @@ -41,8 +41,9 @@ describe('', () => { process.env.NEXT_PUBLIC_CROCT_APP_ID = ''; expect(() => render()).toThrow( - 'Croct\'s application ID is missing. ' - + 'Did you forget to set the NEXT_PUBLIC_CROCT_APP_ID environment variable?', + 'Croct\'s Application ID is missing. ' + + 'Did you forget to set the `NEXT_PUBLIC_CROCT_APP_ID` environment variable? ' + + 'For help, see: https://croct.help/sdk/nextjs/missing-environment-variable', ); }); diff --git a/src/config/appId.test.ts b/src/config/appId.test.ts index 26feb34..e7f0c8e 100644 --- a/src/config/appId.test.ts +++ b/src/config/appId.test.ts @@ -7,8 +7,9 @@ describe('getAppId', () => { it('should throw an error when the application ID is missing', () => { expect(() => getAppId()).toThrow( - 'Croct\'s application ID is missing. ' - + 'Did you forget to set the NEXT_PUBLIC_CROCT_APP_ID environment variable?', + 'Croct\'s Application ID is missing. ' + + 'Did you forget to set the `NEXT_PUBLIC_CROCT_APP_ID` environment variable? ' + + 'For help, see: https://croct.help/sdk/nextjs/missing-environment-variable', ); }); @@ -16,8 +17,9 @@ describe('getAppId', () => { process.env.NEXT_PUBLIC_CROCT_APP_ID = ''; expect(() => getAppId()).toThrow( - 'Croct\'s application ID is missing. ' - + 'Did you forget to set the NEXT_PUBLIC_CROCT_APP_ID environment variable?', + 'Croct\'s Application ID is missing. ' + + 'Did you forget to set the `NEXT_PUBLIC_CROCT_APP_ID` environment variable? ' + + 'For help, see: https://croct.help/sdk/nextjs/missing-environment-variable', ); }); @@ -25,8 +27,8 @@ describe('getAppId', () => { process.env.NEXT_PUBLIC_CROCT_APP_ID = 'invalid'; expect(() => getAppId()).toThrow( - 'Croct\'s application ID is invalid. ' - + 'Please check the NEXT_PUBLIC_CROCT_APP_ID environment variable.', + 'Croct\'s Application ID is invalid. ' + + 'Please check the `NEXT_PUBLIC_CROCT_APP_ID` environment variable.', ); }); diff --git a/src/config/appId.ts b/src/config/appId.ts index 023706c..67d4eef 100644 --- a/src/config/appId.ts +++ b/src/config/appId.ts @@ -5,15 +5,16 @@ export function getAppId(): string { if (appId === '') { throw new Error( - 'Croct\'s application ID is missing. ' - + 'Did you forget to set the NEXT_PUBLIC_CROCT_APP_ID environment variable?', + 'Croct\'s Application ID is missing. ' + + 'Did you forget to set the `NEXT_PUBLIC_CROCT_APP_ID` environment variable? ' + + 'For help, see: https://croct.help/sdk/nextjs/missing-environment-variable', ); } if (!PATTERN.test(appId)) { throw new Error( - 'Croct\'s application ID is invalid. ' - + 'Please check the NEXT_PUBLIC_CROCT_APP_ID environment variable.', + 'Croct\'s Application ID is invalid. ' + + 'Please check the `NEXT_PUBLIC_CROCT_APP_ID` environment variable.', ); } diff --git a/src/config/context.test.ts b/src/config/context.test.ts index 60ce5aa..d431266 100644 --- a/src/config/context.test.ts +++ b/src/config/context.test.ts @@ -37,8 +37,10 @@ describe('getRequestContext', () => { const appId = '00000000-0000-0000-0000-000000000000'; it('should throw an error when the client ID is missing', () => { - expect(() => getRequestContext(new Headers(), createCookieJar())) - .toThrow('Croct\'s client ID is missing. Did you forget to configure Croct\'s middleware?'); + expect(() => getRequestContext(new Headers(), createCookieJar())).toThrow( + 'Croct\'s Client ID is missing. Did you forget to configure Croct\'s middleware? ' + + 'For help, see: https://croct.help/sdk/nextjs/missing-provider', + ); }); it('should return a full request context', () => { diff --git a/src/config/context.ts b/src/config/context.ts index b83f344..83cefbe 100644 --- a/src/config/context.ts +++ b/src/config/context.ts @@ -22,7 +22,10 @@ export function getRequestContext(headers: HeaderReader, cookies: CookieReader): const clientId = headers.get(Header.CLIENT_ID); if (clientId === null) { - throw new Error('Croct\'s client ID is missing. Did you forget to configure Croct\'s middleware?'); + throw new Error( + 'Croct\'s Client ID is missing. Did you forget to configure Croct\'s middleware? ' + + 'For help, see: https://croct.help/sdk/nextjs/missing-provider', + ); } const context: RequestContext = { diff --git a/src/config/cookie.test.ts b/src/config/cookie.test.ts index 056e69f..9c63a10 100644 --- a/src/config/cookie.test.ts +++ b/src/config/cookie.test.ts @@ -69,7 +69,7 @@ describe('cookie', () => { expect(() => getClientIdCookieOptions()).toThrow( 'Croct\'s cookie duration must be a positive integer, got \'invalid\'. ' - + 'Please check the NEXT_PUBLIC_CROCT_CLIENT_ID_COOKIE_DURATION environment variable.', + + 'Please check the `NEXT_PUBLIC_CROCT_CLIENT_ID_COOKIE_DURATION` environment variable.', ); }); @@ -78,7 +78,7 @@ describe('cookie', () => { expect(() => getClientIdCookieOptions()).toThrow( 'Croct\'s cookie duration must be a positive integer, got \'-1\'. ' - + 'Please check the NEXT_PUBLIC_CROCT_CLIENT_ID_COOKIE_DURATION environment variable.', + + 'Please check the `NEXT_PUBLIC_CROCT_CLIENT_ID_COOKIE_DURATION` environment variable.', ); }); }); @@ -173,7 +173,7 @@ describe('cookie', () => { expect(() => getUserTokenCookieOptions()).toThrow( 'Croct\'s cookie duration must be a positive integer, got \'invalid\'. ' - + 'Please check the NEXT_PUBLIC_CROCT_USER_TOKEN_COOKIE_DURATION environment variable.', + + 'Please check the `NEXT_PUBLIC_CROCT_USER_TOKEN_COOKIE_DURATION` environment variable.', ); }); @@ -182,7 +182,7 @@ describe('cookie', () => { expect(() => getUserTokenCookieOptions()).toThrow( 'Croct\'s cookie duration must be a positive integer, got \'-1\'. ' - + 'Please check the NEXT_PUBLIC_CROCT_USER_TOKEN_COOKIE_DURATION environment variable.', + + 'Please check the `NEXT_PUBLIC_CROCT_USER_TOKEN_COOKIE_DURATION` environment variable.', ); }); }); diff --git a/src/config/cookie.ts b/src/config/cookie.ts index 9f94f46..94ca349 100644 --- a/src/config/cookie.ts +++ b/src/config/cookie.ts @@ -15,7 +15,7 @@ export function getClientIdCookieOptions(): CookieOptions { if (Number.isNaN(parsedDuration) || parsedDuration <= 0) { throw new Error( `Croct's cookie duration must be a positive integer, got '${duration}'. ` - + 'Please check the NEXT_PUBLIC_CROCT_CLIENT_ID_COOKIE_DURATION environment variable.', + + 'Please check the `NEXT_PUBLIC_CROCT_CLIENT_ID_COOKIE_DURATION` environment variable.', ); } @@ -37,7 +37,7 @@ export function getUserTokenCookieOptions(): CookieOptions { if (Number.isNaN(parsedDuration) || parsedDuration <= 0) { throw new Error( `Croct's cookie duration must be a positive integer, got '${duration}'. ` - + 'Please check the NEXT_PUBLIC_CROCT_USER_TOKEN_COOKIE_DURATION environment variable.', + + 'Please check the `NEXT_PUBLIC_CROCT_USER_TOKEN_COOKIE_DURATION` environment variable.', ); } diff --git a/src/config/security.test.ts b/src/config/security.test.ts index cfa76d9..0405c89 100644 --- a/src/config/security.test.ts +++ b/src/config/security.test.ts @@ -31,7 +31,7 @@ describe('security', () => { it('should throw an error if the API key is not set', () => { expect(() => getApiKey()).toThrow( 'Croct\'s API key is missing. ' - + 'Did you forget to set the CROCT_API_KEY environment variable?', + + 'Did you forget to set the `CROCT_API_KEY` environment variable?', ); }); @@ -39,7 +39,7 @@ describe('security', () => { process.env.CROCT_API_KEY = 'invalid'; expect(() => getApiKey()) - .toThrow('Croct\'s API key is invalid. Please check the CROCT_API_KEY environment variable.'); + .toThrow('Croct\'s API key is invalid. Please check the `CROCT_API_KEY` environment variable.'); }); }); @@ -59,21 +59,23 @@ describe('security', () => { expect(() => getAuthenticationKey()).toThrow( 'Croct\'s API key does not have a private key. ' - + 'Please generate an API key with authenticate permissions and update ' - + 'the CROCT_API_KEY environment variable.', + + 'Please generate an API key with authenticate permissions and update ' + + 'the `CROCT_API_KEY` environment variable.', ); }); it('should throw an error if the API key is not set', () => { - expect(() => getAuthenticationKey()) - .toThrow('Croct\'s API key is missing. Did you forget to set the CROCT_API_KEY environment variable?'); + expect(() => getAuthenticationKey()).toThrow( + 'Croct\'s API key is missing. Did you forget to set the `CROCT_API_KEY` environment variable? ' + + 'For help, see: https://croct.help/sdk/nextjs/missing-environment-variable', + ); }); it('should throw an error if the API key is invalid', () => { process.env.CROCT_API_KEY = 'invalid'; expect(() => getAuthenticationKey()) - .toThrow('Croct\'s API key is invalid. Please check the CROCT_API_KEY environment variable.'); + .toThrow('Croct\'s API key is invalid. Please check the `CROCT_API_KEY` environment variable.'); }); }); diff --git a/src/config/security.ts b/src/config/security.ts index 151bf87..e4baa7d 100644 --- a/src/config/security.ts +++ b/src/config/security.ts @@ -7,13 +7,17 @@ export function getApiKey(): ApiKey { const apiKey = process.env.CROCT_API_KEY; if (apiKey === undefined) { - throw new Error('Croct\'s API key is missing. Did you forget to set the CROCT_API_KEY environment variable?'); + throw new Error( + 'Croct\'s API key is missing. ' + + 'Did you forget to set the `CROCT_API_KEY` environment variable? ' + + 'For help, see: https://croct.help/sdk/nextjs/missing-environment-variable', + ); } try { return ApiKey.parse(apiKey); } catch { - throw new Error('Croct\'s API key is invalid. Please check the CROCT_API_KEY environment variable.'); + throw new Error('Croct\'s API key is invalid. Please check the `CROCT_API_KEY` environment variable.'); } } @@ -24,7 +28,7 @@ export function getAuthenticationKey(): ApiKey { throw new Error( 'Croct\'s API key does not have a private key. ' + 'Please generate an API key with authenticate permissions and update ' - + 'the CROCT_API_KEY environment variable.', + + 'the `CROCT_API_KEY` environment variable.', ); } @@ -46,7 +50,10 @@ export function getTokenDuration(): number { const parsedDuration = Number.parseInt(duration, 10); if (Number.isNaN(parsedDuration) || parsedDuration <= 0) { - throw new Error('The token duration must be a positive integer.'); + throw new Error( + 'The token duration must be a positive integer. ' + + 'Please check the `CROCT_TOKEN_DURATION` environment variable.', + ); } return parsedDuration; diff --git a/src/config/timeout.test.ts b/src/config/timeout.test.ts index 1df8817..e32c203 100644 --- a/src/config/timeout.test.ts +++ b/src/config/timeout.test.ts @@ -41,7 +41,7 @@ describe('getDefaultFetchTimeout', () => { expect(() => getDefaultFetchTimeout()).toThrow( "Croct's default fetch timeout must be a non-negative integer, got 'invalid'. " - + 'Please check the environment variable NEXT_PUBLIC_CROCT_DEFAULT_FETCH_TIMEOUT.', + + 'Please check the environment variable `NEXT_PUBLIC_CROCT_DEFAULT_FETCH_TIMEOUT`.', ); }); @@ -50,7 +50,7 @@ describe('getDefaultFetchTimeout', () => { expect(() => getDefaultFetchTimeout()).toThrow( "Croct's default fetch timeout must be a non-negative integer, got '-1'. " - + 'Please check the environment variable NEXT_PUBLIC_CROCT_DEFAULT_FETCH_TIMEOUT.', + + 'Please check the environment variable `NEXT_PUBLIC_CROCT_DEFAULT_FETCH_TIMEOUT`.', ); }); }); diff --git a/src/config/timeout.ts b/src/config/timeout.ts index ea1b005..1fac971 100644 --- a/src/config/timeout.ts +++ b/src/config/timeout.ts @@ -14,7 +14,7 @@ export function getDefaultFetchTimeout(): number | undefined { if (Number.isNaN(milliseconds) || milliseconds < 0) { throw new Error( `Croct's default fetch timeout must be a non-negative integer, got '${timeout}'. ` - + 'Please check the environment variable NEXT_PUBLIC_CROCT_DEFAULT_FETCH_TIMEOUT.', + + 'Please check the environment variable `NEXT_PUBLIC_CROCT_DEFAULT_FETCH_TIMEOUT`.', ); } diff --git a/src/middleware.test.ts b/src/middleware.test.ts index 591848b..869143b 100644 --- a/src/middleware.test.ts +++ b/src/middleware.test.ts @@ -237,7 +237,7 @@ describe('middleware', () => { await expect(withCroct()(request, fetchEvent)).rejects.toThrow( `Croct's cookie duration must be a positive integer, got '${duration}'.` - + ' Please check the NEXT_PUBLIC_CROCT_CLIENT_ID_COOKIE_DURATION environment variable.', + + ' Please check the `NEXT_PUBLIC_CROCT_CLIENT_ID_COOKIE_DURATION` environment variable.', ); }); diff --git a/src/server/anonymize.test.ts b/src/server/anonymize.test.ts index aa5a31a..bfe430e 100644 --- a/src/server/anonymize.test.ts +++ b/src/server/anonymize.test.ts @@ -92,7 +92,7 @@ describe('anonymize', () => { await expect(anonymize).rejects.toThrow( 'anonymize() requires specifying the `route` parameter outside app routes. ' - + 'For help, see: https://croct.help/sdk/nextjs/anonymize-route-context', + + 'For help, see: https://croct.help/sdk/nextjs/missing-route-context', ); }); }); diff --git a/src/server/anonymize.ts b/src/server/anonymize.ts index 81a60ea..8f685b3 100644 --- a/src/server/anonymize.ts +++ b/src/server/anonymize.ts @@ -10,7 +10,7 @@ export async function anonymize(context?: RouteContext): Promise { } catch { throw new Error( 'anonymize() requires specifying the `route` parameter outside app routes. ' - + 'For help, see: https://croct.help/sdk/nextjs/anonymize-route-context', + + 'For help, see: https://croct.help/sdk/nextjs/missing-route-context', ); } diff --git a/src/server/evaluate.test.ts b/src/server/evaluate.test.ts index 6b4c58f..c02bbb8 100644 --- a/src/server/evaluate.test.ts +++ b/src/server/evaluate.test.ts @@ -193,7 +193,7 @@ describe('evaluation', () => { await expect(evaluate('true')).rejects.toThrow( 'evaluate() requires specifying the `route` option outside app routes. ' - + 'For help, see: https://croct.help/sdk/nextjs/evaluate-route-context', + + 'For help, see: https://croct.help/sdk/nextjs/missing-route-context', ); }); @@ -344,8 +344,8 @@ describe('evaluation', () => { }); await expect(cql`true`).rejects.toThrow( - 'The cql tag function can only be used with App Router. ' - + 'For help, see https://croct.help/sdk/nextjs/cql-missing-context', + 'cql() can only be used with App Router. ' + + 'For help, see https://croct.help/sdk/nextjs/missing-route-context', ); }); diff --git a/src/server/evaluate.ts b/src/server/evaluate.ts index eb62cbe..cfd22e0 100644 --- a/src/server/evaluate.ts +++ b/src/server/evaluate.ts @@ -24,7 +24,7 @@ export function evaluate(query: string, options: Evaluation return Promise.reject( new Error( 'evaluate() requires specifying the `route` option outside app routes. ' - + 'For help, see: https://croct.help/sdk/nextjs/evaluate-route-context', + + 'For help, see: https://croct.help/sdk/nextjs/missing-route-context', ), ); } @@ -70,8 +70,8 @@ export function cql(fragments: TemplateStringsArray, ...arg if (!isAppRouter()) { return Promise.reject( new Error( - 'The cql tag function can only be used with App Router. ' - + 'For help, see https://croct.help/sdk/nextjs/cql-missing-context', + 'cql() can only be used with App Router. ' + + 'For help, see https://croct.help/sdk/nextjs/missing-route-context', ), ); } diff --git a/src/server/fetchContent.test.ts b/src/server/fetchContent.test.ts index b1946fc..8b4e52a 100644 --- a/src/server/fetchContent.test.ts +++ b/src/server/fetchContent.test.ts @@ -237,7 +237,7 @@ describe('fetchContent', () => { await expect(fetchContent('slot-id')).rejects.toThrow( 'fetchContent() requires specifying the `route` option outside app routes. ' - + 'For help, see: https://croct.help/sdk/nextjs/fetch-content-route-context', + + 'For help, see: https://croct.help/sdk/nextjs/missing-route-context', ); }); diff --git a/src/server/fetchContent.ts b/src/server/fetchContent.ts index 13903b5..8bf1209 100644 --- a/src/server/fetchContent.ts +++ b/src/server/fetchContent.ts @@ -27,7 +27,7 @@ export function fetchContent( return Promise.reject( new Error( 'fetchContent() requires specifying the `route` option outside app routes. ' - + 'For help, see: https://croct.help/sdk/nextjs/fetch-content-route-context', + + 'For help, see: https://croct.help/sdk/nextjs/missing-route-context', ), ); } diff --git a/src/server/identify.test.ts b/src/server/identify.test.ts index 0580d8f..08d5154 100644 --- a/src/server/identify.test.ts +++ b/src/server/identify.test.ts @@ -93,7 +93,7 @@ describe('identify', () => { await expect(() => identify('foo')).rejects.toThrow( 'identify() requires specifying the `route` parameter outside app routes. ' - + 'For help, see: https://croct.help/sdk/nextjs/identify-route-context', + + 'For help, see: https://croct.help/sdk/nextjs/missing-route-context', ); }); }); diff --git a/src/server/identify.ts b/src/server/identify.ts index 2bd569f..c2e1b00 100644 --- a/src/server/identify.ts +++ b/src/server/identify.ts @@ -10,7 +10,7 @@ export async function identify(userId: string, route?: RouteContext): Promise