@fourtwelvelabs/fetch-contentful 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,59 @@
1
1
  # @fourtwelvelabs/fetch-contentful
2
2
 
3
+ ## 0.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 73b5ec2: Separate `deliveryToken` and `previewToken`, and stop reading the preview
8
+ token from a `NEXT_PUBLIC_` variable.
9
+
10
+ ### The preview token can no longer leak into a client bundle
11
+
12
+ `readEnvSettings` used to fall back to
13
+ `NEXT_PUBLIC_CONTENTFUL_PREVIEW_ACCESS_TOKEN`. Next.js inlines
14
+ `NEXT_PUBLIC_` variables into client bundles by string-replacing the literal
15
+ `process.env.NEXT_PUBLIC_…` accesses this package ships, so a project that
16
+ set that variable had its preview token baked into public JavaScript —
17
+ whether or not any client code ever requested preview content. Importing the
18
+ library was enough.
19
+
20
+ The preview token is now resolved **only** from the unprefixed
21
+ `CONTENTFUL_PREVIEW_ACCESS_TOKEN`. In Next.js that name is still readable on
22
+ the server, so server-side preview keeps working; the migration is to drop
23
+ the `NEXT_PUBLIC_` prefix from that one variable. The space, environment and
24
+ delivery token keep their client-safe names — a delivery token is read-only
25
+ and commonly public.
26
+
27
+ If your app genuinely needs preview in the browser, pass `previewToken`
28
+ explicitly.
29
+
30
+ ### `deliveryToken` and `previewToken`
31
+
32
+ A single `token` could not serve both modes: it applied to whichever mode was
33
+ active, so a factory configured with one sent the wrong token as soon as a
34
+ call passed `preview: true` — and there was no way to configure both
35
+ explicitly at all.
36
+
37
+ ```ts
38
+ export const fetchContentful = createFetchContentful({
39
+ deliveryToken: process.env.CONTENTFUL_ACCESS_TOKEN,
40
+ previewToken: process.env.CONTENTFUL_PREVIEW_ACCESS_TOKEN,
41
+ });
42
+
43
+ await fetchContentful(QUERY); // → deliveryToken
44
+ await fetchContentful(QUERY, { preview: true }); // → previewToken
45
+ ```
46
+
47
+ `token` still works and still applies to the active mode, so existing code is
48
+ unaffected, but it is deprecated in favour of the two specific options.
49
+ `readEnvSettings()` gains `deliveryToken`; its `token` field remains as a
50
+ deprecated alias of the same value.
51
+
52
+ The GraphQL endpoint is unchanged — unlike Contentful's REST APIs, preview
53
+ uses the same `graphql.contentful.com` host and is selected by the token plus
54
+ the injected `preview: true` argument. (The REST locale lookup already
55
+ switched between `cdn.` and `preview.` hosts correctly.)
56
+
3
57
  ## 0.3.0
4
58
 
5
59
  ### Minor Changes
package/README.md CHANGED
@@ -22,7 +22,7 @@ yarn add @fourtwelvelabs/fetch-contentful graphql
22
22
 
23
23
  Settings resolve in this order — first hit wins, per setting:
24
24
 
25
- 1. **Per-call options** — `fetchContentful(query, { space, token, ... })`
25
+ 1. **Per-call options** — `fetchContentful(query, { space, deliveryToken, ... })`
26
26
  2. **Factory defaults** — set once with `createFetchContentful` (below)
27
27
  3. **Environment variables** — framework-neutral names first, then `NEXT_PUBLIC_`-prefixed equivalents
28
28
 
@@ -34,14 +34,22 @@ If `space` or the appropriate token can't be resolved, the promise rejects with
34
34
  | --- | --- | --- |
35
35
  | `space` | `CONTENTFUL_SPACE_ID` | `NEXT_PUBLIC_CONTENTFUL_SPACE_ID` |
36
36
  | `environment` | `CONTENTFUL_ENVIRONMENT` | `NEXT_PUBLIC_CONTENTFUL_ENVIRONMENT` |
37
- | Delivery token | `CONTENTFUL_ACCESS_TOKEN` | `NEXT_PUBLIC_CONTENTFUL_ACCESS_TOKEN` |
38
- | Preview token | `CONTENTFUL_PREVIEW_ACCESS_TOKEN` | `NEXT_PUBLIC_CONTENTFUL_PREVIEW_ACCESS_TOKEN` |
37
+ | `deliveryToken` | `CONTENTFUL_ACCESS_TOKEN` | `NEXT_PUBLIC_CONTENTFUL_ACCESS_TOKEN` |
38
+ | `previewToken` | `CONTENTFUL_PREVIEW_ACCESS_TOKEN` | **none, by design** |
39
39
 
40
40
  There is no environment variable for the locale: it defaults to **`en-US`**, and a project that wants a different one sets it once with `createFetchContentful` (below).
41
41
 
42
42
  The library reads the already-populated `process.env`; loading `.env` / `.env.local` files from disk is your platform's job (Next.js, Vite, dotenv all do this), so precedence between those files always matches your framework's rules.
43
43
 
44
- **In a Next.js project you don't need both names.** Set only the `NEXT_PUBLIC_` variant and it works everywhere: the server reads it like any other env var (the prefix only controls *client* exposure), and client bundles get it because the library reads these variables with literal `process.env.NEXT_PUBLIC_...` accesses — the exact pattern Next's build-time inliner string-replaces. Server-only projects (or any other framework) should use the neutral names. Think twice before exposing tokens to the browser at all: Contentful delivery tokens are read-only and commonly made public, but preview tokens should stay server-side.
44
+ **In a Next.js project you don't need both names.** Set only the `NEXT_PUBLIC_` variant and it works everywhere: the server reads it like any other env var (the prefix only controls *client* exposure), and client bundles get it because the library reads these variables with literal `process.env.NEXT_PUBLIC_...` accesses — the exact pattern Next's build-time inliner string-replaces. Server-only projects (or any other framework) should use the neutral names. This applies to the space, the environment and the delivery token; the preview token has no client-safe name, for the reason below.
45
+
46
+ ### The preview token is never read from a `NEXT_PUBLIC_` variable
47
+
48
+ Next.js exposes `NEXT_PUBLIC_` variables to the browser by string-replacing literal `process.env.NEXT_PUBLIC_…` accesses at build time. This library contains such accesses, so if it read the preview token from a prefixed name, setting that variable would bake the token into your public JavaScript — whether or not any client code ever asked for preview content. Importing the library would be enough.
49
+
50
+ A delivery token is read-only and commonly public. A **preview token reads unpublished content**, so it is resolved only from the unprefixed `CONTENTFUL_PREVIEW_ACCESS_TOKEN`. In Next.js that name is still readable on the server — the prefix only controls *client* exposure — so server-side preview (Draft Mode, route handlers, server components) works unchanged.
51
+
52
+ If you have decided that your app genuinely needs preview in the browser, pass `previewToken` explicitly. Shipping it is then your deliberate choice rather than something the library did on your behalf.
45
53
 
46
54
  ### Project-level defaults with `createFetchContentful`
47
55
 
@@ -56,6 +64,10 @@ export const fetchContentful = createFetchContentful({
56
64
  locale: 'de-DE', // override the 'en-US' default for the whole project
57
65
  retries: 3,
58
66
  });
67
+
68
+ // Configure both tokens once, and every call picks the right one:
69
+ // fetchContentful(QUERY) → deliveryToken
70
+ // fetchContentful(QUERY, { preview: true }) → previewToken
59
71
  ```
60
72
 
61
73
  ```ts
@@ -209,7 +221,8 @@ fetchContentful(query, {
209
221
  preview: false, // default: false
210
222
  locale: 'en-US', // default: 'en-US'. null sends no locale at all
211
223
  validateLocale: true, // reject with LOCALE if locale isn't configured
212
- token: '...', // override the env-derived token
224
+ deliveryToken: '...', // CDA token, used when preview is false
225
+ previewToken: '...', // CPA token, used when preview is true
213
226
 
214
227
  // Request behavior
215
228
  variables: { slug: 'home' },
@@ -12,10 +12,14 @@ function readEnvSettings() {
12
12
  return {
13
13
  space: void 0,
14
14
  environment: void 0,
15
+ deliveryToken: void 0,
15
16
  token: void 0,
16
17
  previewToken: void 0
17
18
  };
18
19
  }
20
+ const deliveryToken = orUndefined(
21
+ process.env.CONTENTFUL_ACCESS_TOKEN || process.env.NEXT_PUBLIC_CONTENTFUL_ACCESS_TOKEN
22
+ );
19
23
  return {
20
24
  space: orUndefined(
21
25
  process.env.CONTENTFUL_SPACE_ID || process.env.NEXT_PUBLIC_CONTENTFUL_SPACE_ID
@@ -23,12 +27,10 @@ function readEnvSettings() {
23
27
  environment: orUndefined(
24
28
  process.env.CONTENTFUL_ENVIRONMENT || process.env.NEXT_PUBLIC_CONTENTFUL_ENVIRONMENT
25
29
  ),
26
- token: orUndefined(
27
- process.env.CONTENTFUL_ACCESS_TOKEN || process.env.NEXT_PUBLIC_CONTENTFUL_ACCESS_TOKEN
28
- ),
29
- previewToken: orUndefined(
30
- process.env.CONTENTFUL_PREVIEW_ACCESS_TOKEN || process.env.NEXT_PUBLIC_CONTENTFUL_PREVIEW_ACCESS_TOKEN
31
- )
30
+ deliveryToken,
31
+ token: deliveryToken,
32
+ // No `NEXT_PUBLIC_` fallback: see the note at the top of this file.
33
+ previewToken: orUndefined(process.env.CONTENTFUL_PREVIEW_ACCESS_TOKEN)
32
34
  };
33
35
  }
34
36
 
@@ -673,7 +675,7 @@ the library reads them at runtime.`;
673
675
  function resolveConfig(args) {
674
676
  const env = readEnvSettings();
675
677
  const space = args.values.space ?? env.space;
676
- const token = args.values.token ?? env.token;
678
+ const token = args.values.token ?? env.deliveryToken;
677
679
  const environment = args.values.environment ?? env.environment ?? "master";
678
680
  const missing = [];
679
681
  if (!space) {
@@ -916,7 +918,10 @@ async function dispatch(argv, io) {
916
918
  }
917
919
  function knownTokens(argv) {
918
920
  const env = readEnvSettings();
919
- const tokens = [env.token, env.previewToken];
921
+ const tokens = [
922
+ env.deliveryToken,
923
+ env.previewToken
924
+ ];
920
925
  for (const [index, argument] of argv.entries()) {
921
926
  if (argument.startsWith("--token=")) tokens.push(argument.slice(8));
922
927
  else if (argument === "--token") tokens.push(argv[index + 1]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/env.ts","../../src/cli/errors.ts","../../src/cli/args.ts","../../src/cli/diff.ts","../../src/cli/graphql-module.ts","../../src/client.ts","../../src/cli/introspect.ts","../../src/cli/package-manager.ts","../../src/cli/jsonc.ts","../../src/cli/tsconfig.ts","../../src/cli/run.ts","../../src/cli/index.ts"],"names":["indent","relative","existsSync","readFileSync","dirname"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Environment-derived configuration.\n *\n * Two families of variable names are supported, checked in this order:\n *\n * 1. Framework-neutral names — `CONTENTFUL_SPACE_ID`, `CONTENTFUL_ENVIRONMENT`,\n * `CONTENTFUL_ACCESS_TOKEN`, `CONTENTFUL_PREVIEW_ACCESS_TOKEN`.\n * 2. `NEXT_PUBLIC_`-prefixed equivalents for Next.js projects that call\n * Contentful from the browser.\n *\n * IMPORTANT: every lookup below is written as a literal\n * `process.env.SOME_NAME` property access, never a dynamic `process.env[x]`.\n * Next.js exposes `NEXT_PUBLIC_` variables to client bundles by\n * string-replacing those literal expressions at build time — dynamic access\n * is invisible to the inliner and resolves to `undefined` in the browser.\n * Do not \"refactor\" these into a loop or a name table.\n *\n * This module reads the already-populated `process.env`; loading `.env`\n * files from disk is deliberately left to the platform (Next.js, Vite,\n * dotenv, ...), whose precedence rules would otherwise be duplicated here.\n */\n\n/*\n * These variables are read at runtime inside the consuming application, not\n * while this package is built — the bundle ships the literal `process.env.X`\n * accesses untouched. Declaring them in turbo.json would therefore be\n * inaccurate and would invalidate the build cache for no reason.\n */\n/* eslint-disable turbo/no-undeclared-env-vars */\n\nexport interface EnvSettings {\n space: string | undefined;\n environment: string | undefined;\n token: string | undefined;\n previewToken: string | undefined;\n}\n\nfunction orUndefined(value: string | undefined): string | undefined {\n return value || undefined;\n}\n\n/** Reads Contentful settings from `process.env` (neutral names first). */\nexport function readEnvSettings(): EnvSettings {\n /* v8 ignore next 9 -- process always exists in the test runtime */\n if (typeof process === 'undefined' || !process.env) {\n return {\n space: undefined,\n environment: undefined,\n token: undefined,\n previewToken: undefined,\n };\n }\n return {\n space: orUndefined(\n process.env.CONTENTFUL_SPACE_ID ||\n process.env.NEXT_PUBLIC_CONTENTFUL_SPACE_ID,\n ),\n environment: orUndefined(\n process.env.CONTENTFUL_ENVIRONMENT ||\n process.env.NEXT_PUBLIC_CONTENTFUL_ENVIRONMENT,\n ),\n token: orUndefined(\n process.env.CONTENTFUL_ACCESS_TOKEN ||\n process.env.NEXT_PUBLIC_CONTENTFUL_ACCESS_TOKEN,\n ),\n previewToken: orUndefined(\n process.env.CONTENTFUL_PREVIEW_ACCESS_TOKEN ||\n process.env.NEXT_PUBLIC_CONTENTFUL_PREVIEW_ACCESS_TOKEN,\n ),\n };\n}\n","/**\n * An expected CLI failure: printed as a plain message with exit code 1,\n * never as a stack trace.\n */\nexport class CliError extends Error {\n override name = 'CliError';\n}\n\n/**\n * Removes an access token from text that is about to be printed.\n *\n * Contentful echoes request details in some error bodies, and a token\n * pasted into a bug report is a token that has to be rotated.\n */\nexport function redact(text: string, token: string | undefined): string {\n if (!token) return text;\n return text.split(token).join('[redacted]');\n}\n","/**\n * A tiny `process.argv` parser.\n *\n * `node:util`'s `parseArgs` would do, but it prints an experimental warning\n * on Node 18 — which this package still supports — and that warning would\n * land in the middle of the CLI's output.\n */\n\nimport { CliError } from './errors.js';\n\n/** Flags that take no value. */\nexport const BOOLEAN_FLAGS = ['dry-run', 'force', 'help'] as const;\n\n/** Flags that take a value. */\nexport const VALUE_FLAGS = [\n 'space',\n 'environment',\n 'token',\n 'schema-path',\n 'tada-output',\n 'graphql-file',\n 'tsconfig',\n 'cwd',\n] as const;\n\nexport interface ParsedArgs {\n /** Positional arguments, e.g. `['tada-init']`. */\n positionals: string[];\n values: Partial<Record<(typeof VALUE_FLAGS)[number], string>>;\n flags: Set<(typeof BOOLEAN_FLAGS)[number]>;\n}\n\nfunction isBooleanFlag(name: string): name is (typeof BOOLEAN_FLAGS)[number] {\n return (BOOLEAN_FLAGS as readonly string[]).includes(name);\n}\n\nfunction isValueFlag(name: string): name is (typeof VALUE_FLAGS)[number] {\n return (VALUE_FLAGS as readonly string[]).includes(name);\n}\n\n/** Parses `argv` (already stripped of `node` and the script path). */\nexport function parseArgs(argv: string[]): ParsedArgs {\n const parsed: ParsedArgs = {\n positionals: [],\n values: {},\n flags: new Set(),\n };\n\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index] as string;\n\n if (argument === '-h') {\n parsed.flags.add('help');\n continue;\n }\n\n if (!argument.startsWith('--')) {\n parsed.positionals.push(argument);\n continue;\n }\n\n const equals = argument.indexOf('=');\n const name = argument.slice(2, equals === -1 ? undefined : equals);\n const inlineValue = equals === -1 ? undefined : argument.slice(equals + 1);\n\n if (isBooleanFlag(name)) {\n if (inlineValue !== undefined) {\n throw new CliError(`--${name} does not take a value.`);\n }\n parsed.flags.add(name);\n continue;\n }\n\n if (!isValueFlag(name)) {\n throw new CliError(`Unknown option \"--${name}\".`);\n }\n\n const value = inlineValue ?? argv[++index];\n if (value === undefined) {\n throw new CliError(`--${name} needs a value.`);\n }\n parsed.values[name] = value;\n }\n\n return parsed;\n}\n","/**\n * A line diff for `--dry-run` output.\n *\n * Only ever used on hand-sized files (a tsconfig, a generated module), so a\n * plain quadratic LCS is the right trade for having no dependency.\n */\n\nconst MAX_LINES = 400;\n\n/** Length of the longest common subsequence, as a DP table. */\nfunction lcsTable(before: string[], after: string[]): number[][] {\n const table: number[][] = Array.from({ length: before.length + 1 }, () =>\n new Array<number>(after.length + 1).fill(0),\n );\n for (let i = before.length - 1; i >= 0; i -= 1) {\n for (let j = after.length - 1; j >= 0; j -= 1) {\n const row = table[i] as number[];\n const next = table[i + 1] as number[];\n row[j] =\n before[i] === after[j]\n ? (next[j + 1] as number) + 1\n : Math.max(next[j] as number, row[j + 1] as number);\n }\n }\n return table;\n}\n\n/**\n * Renders `before` → `after` as `-`/`+`/` `-prefixed lines.\n *\n * Not a `patch(1)`-compatible unified diff — there are no hunk headers, and\n * unchanged lines are all kept — but it reads the same way and is enough to\n * see exactly what a run would change.\n */\nexport function lineDiff(before: string, after: string): string[] {\n if (before === after) return [];\n\n const beforeLines = before.split('\\n');\n const afterLines = after.split('\\n');\n\n if (beforeLines.length + afterLines.length > MAX_LINES * 2) {\n return [\n ` (${String(beforeLines.length)} lines → ${String(\n afterLines.length,\n )} lines; too large to diff)`,\n ];\n }\n\n const table = lcsTable(beforeLines, afterLines);\n const output: string[] = [];\n let i = 0;\n let j = 0;\n\n while (i < beforeLines.length && j < afterLines.length) {\n if (beforeLines[i] === afterLines[j]) {\n output.push(` ${beforeLines[i] as string}`);\n i += 1;\n j += 1;\n } else if (\n ((table[i + 1] as number[])[j] as number) >=\n ((table[i] as number[])[j + 1] as number)\n ) {\n output.push(` - ${beforeLines[i] as string}`);\n i += 1;\n } else {\n output.push(` + ${afterLines[j] as string}`);\n j += 1;\n }\n }\n while (i < beforeLines.length) {\n output.push(` - ${beforeLines[i] as string}`);\n i += 1;\n }\n while (j < afterLines.length) {\n output.push(` + ${afterLines[j] as string}`);\n j += 1;\n }\n\n return output;\n}\n\n/** Formats a byte count for humans. */\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${String(bytes)} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} kB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","/**\n * Renders the `graphql.ts` module that binds gql.tada to the space's\n * introspection output and Contentful's scalar map.\n */\n\nimport { dirname, relative, sep } from 'node:path';\n\n/** The published package name, used in the generated import. */\nexport const PACKAGE_NAME = '@fourtwelvelabs/fetch-contentful';\n\n/**\n * The path of `toFile` as seen from the directory holding `fromFile`,\n * always relative and always POSIX-separated — the form both an `import`\n * specifier and a tsconfig plugin path want.\n */\nexport function relativeSpecifier(fromFile: string, toFile: string): string {\n const path = relative(dirname(fromFile), toFile).split(sep).join('/');\n return path.startsWith('.') ? path : `./${path}`;\n}\n\n/**\n * The contents of the generated `graphql.ts`.\n *\n * `introspectionImport` is the specifier for gql.tada's generated types —\n * kept with its `.d.ts` extension, which is gql.tada's own convention.\n */\nexport function renderGraphqlModule(introspectionImport: string): string {\n return `/**\n * gql.tada, bound to this space's schema.\n *\n * Generated by \\`fetch-contentful tada-init\\`. Safe to edit and to commit;\n * re-running \\`tada-init\\` will not overwrite it without \\`--force\\`.\n *\n * Refresh the schema after a content-model change with:\n * fetch-contentful tada-refresh\n */\nimport { initGraphQLTada } from 'gql.tada';\nimport type { ContentfulScalars } from '${PACKAGE_NAME}/tada';\nimport type { introspection } from '${introspectionImport}';\n\nexport const graphql = initGraphQLTada<{\n introspection: introspection;\n scalars: ContentfulScalars;\n}>();\n\nexport { readFragment } from 'gql.tada';\nexport type { FragmentOf, ResultOf, VariablesOf } from 'gql.tada';\n`;\n}\n","import { print, type DocumentNode } from 'graphql';\nimport { FetchContentfulError } from './errors.js';\nimport { withRetries, type RetryConfig } from './retry.js';\nimport { getOperation, stripInternalDirectives } from './split.js';\nimport type {\n ContentfulGraphQLError,\n GraphQLVariables,\n NextFetchOptions,\n} from './types.js';\n\nexport interface RequestContext {\n space: string;\n environment: string;\n token: string;\n fetch: typeof fetch;\n retry: RetryConfig;\n signal?: AbortSignal;\n next?: NextFetchOptions;\n cache?: RequestCache;\n}\n\nexport function graphqlEndpoint(space: string, environment: string): string {\n return `https://graphql.contentful.com/content/v1/spaces/${encodeURIComponent(\n space,\n )}/environments/${encodeURIComponent(environment)}`;\n}\n\n/** Parse a Retry-After header (seconds or HTTP date) into milliseconds. */\nexport function parseRetryAfter(header: string | null): number | undefined {\n if (!header) return undefined;\n const seconds = Number(header);\n if (Number.isFinite(seconds)) {\n return Math.max(0, seconds * 1000);\n }\n const date = Date.parse(header);\n if (Number.isFinite(date)) {\n return Math.max(0, date - Date.now());\n }\n return undefined;\n}\n\n/** Keep only the variables the document actually declares. */\nexport function pickDeclaredVariables(\n document: DocumentNode,\n variables: GraphQLVariables,\n): GraphQLVariables {\n const declared = new Set(\n (getOperation(document).variableDefinitions ?? []).map(\n (definition) => definition.variable.name.value,\n ),\n );\n const picked: GraphQLVariables = {};\n for (const [name, value] of Object.entries(variables)) {\n if (declared.has(name)) {\n picked[name] = value;\n }\n }\n return picked;\n}\n\nfunction isRetryableStatus(status: number): boolean {\n return status === 408 || status === 429 || status >= 500;\n}\n\n/**\n * Sends one GraphQL request (with retries) and returns `data`.\n * Rejects with a {@link FetchContentfulError} on any HTTP, network, or\n * GraphQL error — including partial responses that contain errors.\n */\nexport async function rawRequest(\n document: DocumentNode,\n variables: GraphQLVariables,\n context: RequestContext,\n): Promise<Record<string, unknown>> {\n const query = print(stripInternalDirectives(document));\n const body = JSON.stringify({\n query,\n variables: pickDeclaredVariables(document, variables),\n });\n const url = graphqlEndpoint(context.space, context.environment);\n\n return withRetries(async () => {\n let response: Response;\n try {\n const init: RequestInit & { next?: NextFetchOptions } = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${context.token}`,\n },\n body,\n };\n if (context.signal) init.signal = context.signal;\n if (context.cache) init.cache = context.cache;\n if (context.next) init.next = context.next;\n response = await context.fetch(url, init);\n } catch (cause) {\n throw new FetchContentfulError(\n `Network error while contacting Contentful: ${String(cause)}`,\n { code: 'NETWORK', retryable: true, cause },\n );\n }\n\n if (!response.ok) {\n const retryable = isRetryableStatus(response.status);\n throw new FetchContentfulError(\n `Contentful responded with HTTP ${response.status}.`,\n {\n code: 'HTTP',\n status: response.status,\n retryable,\n retryAfterMs: retryable\n ? parseRetryAfter(response.headers.get('Retry-After'))\n : undefined,\n },\n );\n }\n\n let payload: {\n data?: Record<string, unknown> | null;\n errors?: ContentfulGraphQLError[];\n };\n try {\n payload = (await response.json()) as typeof payload;\n } catch (cause) {\n throw new FetchContentfulError(\n 'Contentful returned an unreadable response body.',\n { code: 'NETWORK', retryable: true, cause },\n );\n }\n\n if (payload.errors && payload.errors.length > 0) {\n throw new FetchContentfulError(\n `Contentful returned GraphQL errors: ${payload.errors\n .map((error) => error.message)\n .join('; ')}`,\n { code: 'GRAPHQL', errors: payload.errors },\n );\n }\n\n if (!payload.data || typeof payload.data !== 'object') {\n throw new FetchContentfulError(\n 'Contentful returned no data and no errors.',\n { code: 'GRAPHQL' },\n );\n }\n\n return payload.data;\n }, context.retry);\n}\n","/**\n * Downloads a space's GraphQL schema as SDL.\n *\n * This is the one network operation the CLI performs, and the only step\n * `tada-refresh` runs.\n */\n\nimport {\n buildClientSchema,\n getIntrospectionQuery,\n printSchema,\n type IntrospectionQuery,\n} from 'graphql';\nimport { graphqlEndpoint } from '../client.js';\nimport { CliError, redact } from './errors.js';\n\nexport interface IntrospectOptions {\n space: string;\n environment: string;\n token: string;\n fetch: typeof fetch;\n}\n\n/** Trims a response body down to something safe to show in a terminal. */\nfunction bodySnippet(body: string, token: string): string {\n const cleaned = redact(body, token).trim();\n if (cleaned === '') return '(empty response body)';\n return cleaned.length > 300 ? `${cleaned.slice(0, 300)}…` : cleaned;\n}\n\n/**\n * Runs an introspection query against Contentful and returns the schema\n * printed as SDL, with a trailing newline.\n */\nexport async function fetchSchemaSdl(\n options: IntrospectOptions,\n): Promise<string> {\n const url = graphqlEndpoint(options.space, options.environment);\n\n let response: Response;\n try {\n response = await options.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${options.token}`,\n },\n body: JSON.stringify({ query: getIntrospectionQuery() }),\n });\n } catch (cause) {\n throw new CliError(\n `Could not reach Contentful at ${url}: ${redact(\n String(cause),\n options.token,\n )}`,\n );\n }\n\n if (response.status === 401 || response.status === 403) {\n throw new CliError(\n `Contentful rejected the access token (HTTP ${String(\n response.status,\n )}).\\n` +\n ` Check that the token is a Content Delivery API token for space ` +\n `\"${options.space}\", and that it has access to environment ` +\n `\"${options.environment}\".`,\n );\n }\n\n if (!response.ok) {\n const body = bodySnippet(await response.text().catch(() => ''), options.token);\n throw new CliError(\n `Contentful responded with HTTP ${String(response.status)}.\\n ${body}`,\n );\n }\n\n let payload: {\n data?: IntrospectionQuery;\n errors?: Array<{ message?: string }>;\n };\n try {\n payload = (await response.json()) as typeof payload;\n } catch {\n throw new CliError('Contentful returned an unreadable response body.');\n }\n\n if (payload.errors && payload.errors.length > 0) {\n const messages = payload.errors\n .map((error) => error.message ?? 'unknown error')\n .join('; ');\n throw new CliError(\n `Contentful returned GraphQL errors during introspection: ${redact(\n messages,\n options.token,\n )}`,\n );\n }\n\n if (!payload.data) {\n throw new CliError(\n 'Contentful returned no introspection data. Check the space and environment ids.',\n );\n }\n\n try {\n return `${printSchema(buildClientSchema(payload.data))}\\n`;\n } catch (cause) {\n throw new CliError(\n `Could not build a schema from Contentful's introspection response: ${String(\n cause,\n )}`,\n );\n }\n}\n","/**\n * Detects the consumer's package manager so the CLI can print an install\n * command they can paste as-is.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport type PackageManager = 'bun' | 'pnpm' | 'yarn' | 'npm';\n\n/** Lockfiles in the order they are checked. */\nconst LOCKFILES: Array<[PackageManager, string]> = [\n ['bun', 'bun.lock'],\n ['bun', 'bun.lockb'],\n ['pnpm', 'pnpm-lock.yaml'],\n ['yarn', 'yarn.lock'],\n ['npm', 'package-lock.json'],\n];\n\n/** Identifies the package manager from the lockfile in `cwd`. */\nexport function detectPackageManager(cwd: string): PackageManager {\n for (const [manager, lockfile] of LOCKFILES) {\n if (existsSync(join(cwd, lockfile))) return manager;\n }\n return 'npm';\n}\n\n/** The command that adds `packages` as dev dependencies. */\nexport function installCommand(\n manager: PackageManager,\n packages: string[],\n): string {\n const list = packages.join(' ');\n switch (manager) {\n case 'bun':\n return `bun add -d ${list}`;\n case 'pnpm':\n return `pnpm add -D ${list}`;\n case 'yarn':\n return `yarn add -D ${list}`;\n case 'npm':\n return `npm install -D ${list}`;\n }\n}\n\n/**\n * Returns the packages that are not declared anywhere in the consumer's\n * `package.json`. An unreadable or absent manifest means \"declare all of\n * them\" — printing an install command the user may not need is harmless,\n * silently skipping a required one is not.\n */\nexport function missingDependencies(\n cwd: string,\n packages: string[],\n): string[] {\n let manifest: Record<string, unknown>;\n try {\n manifest = JSON.parse(\n readFileSync(join(cwd, 'package.json'), 'utf8'),\n ) as Record<string, unknown>;\n } catch {\n return [...packages];\n }\n\n const declared = new Set<string>();\n for (const field of [\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies',\n ]) {\n const section = manifest[field];\n if (typeof section === 'object' && section !== null) {\n for (const name of Object.keys(section)) declared.add(name);\n }\n }\n return packages.filter((name) => !declared.has(name));\n}\n","/**\n * A minimal JSONC scanner that records source offsets.\n *\n * `tsconfig.json` files are JSON with comments and trailing commas, and are\n * hand-maintained — reading one with a comment-stripping parser and writing\n * it back would destroy the author's comments and formatting. So instead of\n * parsing to a value and re-serializing, this scanner produces a tree of\n * nodes annotated with their offsets in the original text, which the patcher\n * uses to make surgical string edits.\n *\n * It is deliberately not a general JSON validator: it accepts the shapes it\n * needs to locate and rejects everything else, so the caller can fall back\n * to printing manual instructions rather than mangling a file it did not\n * understand.\n */\n\nexport class JsoncError extends Error {\n override name = 'JsoncError';\n}\n\nexport interface JsoncMember {\n /** The parsed key, e.g. `compilerOptions`. */\n key: string;\n /** Offset of the member's first character (the key's opening quote). */\n start: number;\n /** Offset just past the member's value. */\n end: number;\n value: JsoncNode;\n}\n\nexport type JsoncNode =\n | { kind: 'object'; start: number; end: number; members: JsoncMember[] }\n | { kind: 'array'; start: number; end: number; elements: JsoncNode[] }\n | { kind: 'string'; start: number; end: number; value: string }\n | { kind: 'literal'; start: number; end: number };\n\nconst WHITESPACE = ' \\t\\n\\r';\n\nclass Scanner {\n private index = 0;\n\n constructor(private readonly source: string) {}\n\n /** Skips whitespace, `//` line comments and `/* *\\/` block comments. */\n private skipTrivia(): void {\n for (;;) {\n while (\n this.index < this.source.length &&\n WHITESPACE.includes(this.source[this.index] as string)\n ) {\n this.index += 1;\n }\n if (this.source.startsWith('//', this.index)) {\n const newline = this.source.indexOf('\\n', this.index);\n this.index = newline === -1 ? this.source.length : newline + 1;\n continue;\n }\n if (this.source.startsWith('/*', this.index)) {\n const close = this.source.indexOf('*/', this.index + 2);\n if (close === -1) {\n throw new JsoncError('Unterminated block comment.');\n }\n this.index = close + 2;\n continue;\n }\n return;\n }\n }\n\n private peek(): string {\n this.skipTrivia();\n if (this.index >= this.source.length) {\n throw new JsoncError('Unexpected end of input.');\n }\n return this.source[this.index] as string;\n }\n\n private expect(character: string): void {\n if (this.peek() !== character) {\n throw new JsoncError(\n `Expected \"${character}\" at offset ${String(this.index)}.`,\n );\n }\n this.index += 1;\n }\n\n parseRoot(): JsoncNode {\n const node = this.parseValue();\n this.skipTrivia();\n if (this.index !== this.source.length) {\n throw new JsoncError(\n `Unexpected trailing content at offset ${String(this.index)}.`,\n );\n }\n return node;\n }\n\n private parseValue(): JsoncNode {\n const character = this.peek();\n if (character === '{') return this.parseObject();\n if (character === '[') return this.parseArray();\n if (character === '\"') return this.parseString();\n return this.parseLiteral();\n }\n\n private parseObject(): JsoncNode {\n const start = this.index;\n this.expect('{');\n const members: JsoncMember[] = [];\n for (;;) {\n if (this.peek() === '}') {\n this.index += 1;\n return { kind: 'object', start, end: this.index, members };\n }\n const memberStart = this.index;\n const key = this.parseString();\n this.expect(':');\n const value = this.parseValue();\n members.push({\n key: key.value,\n start: memberStart,\n end: value.end,\n value,\n });\n if (this.peek() === ',') {\n this.index += 1;\n }\n }\n }\n\n private parseArray(): JsoncNode {\n const start = this.index;\n this.expect('[');\n const elements: JsoncNode[] = [];\n for (;;) {\n if (this.peek() === ']') {\n this.index += 1;\n return { kind: 'array', start, end: this.index, elements };\n }\n elements.push(this.parseValue());\n if (this.peek() === ',') {\n this.index += 1;\n }\n }\n }\n\n private parseString(): JsoncNode & { kind: 'string' } {\n this.skipTrivia();\n const start = this.index;\n if (this.source[start] !== '\"') {\n throw new JsoncError(`Expected a string at offset ${String(start)}.`);\n }\n this.index += 1;\n while (this.index < this.source.length) {\n const character = this.source[this.index];\n if (character === '\\\\') {\n this.index += 2;\n continue;\n }\n this.index += 1;\n if (character === '\"') {\n const end = this.index;\n return {\n kind: 'string',\n start,\n end,\n value: JSON.parse(this.source.slice(start, end)) as string,\n };\n }\n }\n throw new JsoncError(`Unterminated string at offset ${String(start)}.`);\n }\n\n /** Numbers, `true`, `false` and `null` — read as an opaque token. */\n private parseLiteral(): JsoncNode {\n this.skipTrivia();\n const start = this.index;\n while (\n this.index < this.source.length &&\n !',]}'.includes(this.source[this.index] as string) &&\n !WHITESPACE.includes(this.source[this.index] as string)\n ) {\n this.index += 1;\n }\n if (this.index === start) {\n throw new JsoncError(`Unexpected character at offset ${String(start)}.`);\n }\n return { kind: 'literal', start, end: this.index };\n }\n}\n\n/** Parses JSONC into an offset-annotated tree. Throws {@link JsoncError}. */\nexport function parseJsonc(source: string): JsoncNode {\n return new Scanner(source).parseRoot();\n}\n\n/** Finds a member by key, or `undefined`. */\nexport function findMember(\n node: JsoncNode,\n key: string,\n): JsoncMember | undefined {\n if (node.kind !== 'object') return undefined;\n return node.members.find((member) => member.key === key);\n}\n","/**\n * Idempotent, comment-preserving patching of a consumer's `tsconfig.json`.\n *\n * Every change is a surgical string edit computed from source offsets, so\n * comments, trailing commas and the author's formatting all survive. When\n * the file's shape isn't understood, nothing is written and the caller is\n * told to insert the block by hand — a mangled tsconfig is far worse than a\n * manual step.\n */\n\nimport { findMember, JsoncError, parseJsonc, type JsoncNode } from './jsonc.js';\n\n/** The TypeScript language-service plugin gql.tada drives. */\nexport const GRAPHQLSP_PLUGIN = '@0no-co/graphqlsp';\n\nexport interface TsconfigPluginConfig {\n /** Path to the SDL file, relative to the tsconfig. */\n schema: string;\n /** Path gql.tada writes its generated types to, relative to the tsconfig. */\n tadaOutputLocation: string;\n}\n\nexport type TsconfigPatchResult =\n /** The plugin was already configured exactly as requested. */\n | { status: 'unchanged' }\n /** `source` is the patched file content. */\n | { status: 'patched'; source: string }\n /** The file could not be patched safely; `reason` says why. */\n | { status: 'manual'; reason: string };\n\ninterface Edit {\n start: number;\n end: number;\n text: string;\n}\n\nfunction applyEdits(source: string, edits: Edit[]): string {\n let result = source;\n for (const edit of [...edits].sort((a, b) => b.start - a.start)) {\n result = result.slice(0, edit.start) + edit.text + result.slice(edit.end);\n }\n return result;\n}\n\n/** The leading whitespace of the line containing `offset`. */\nfunction indentAt(source: string, offset: number): string {\n const lineStart = source.lastIndexOf('\\n', offset - 1) + 1;\n const line = source.slice(lineStart, offset);\n return line.slice(0, line.length - line.trimStart().length);\n}\n\n/** The file's own indentation unit, falling back to two spaces. */\nexport function detectIndentUnit(source: string): string {\n const match = /\\n([ \\t]+)\\S/.exec(source);\n return match?.[1] ?? ' ';\n}\n\n/** Renders the plugin entry, with `indent` as the entry's own indentation. */\nfunction renderPluginEntry(\n indent: string,\n unit: string,\n config: TsconfigPluginConfig,\n): string {\n return [\n '{',\n `${indent}${unit}\"name\": ${JSON.stringify(GRAPHQLSP_PLUGIN)},`,\n `${indent}${unit}\"schema\": ${JSON.stringify(config.schema)},`,\n `${indent}${unit}\"tadaOutputLocation\": ${JSON.stringify(\n config.tadaOutputLocation,\n )}`,\n `${indent}}`,\n ].join('\\n');\n}\n\n/**\n * An edit that adds `\"key\": <value>` to an object node, matching the\n * object's existing layout.\n */\nfunction insertMember(\n source: string,\n object: JsoncNode & { kind: 'object' },\n key: string,\n renderValue: (indent: string) => string,\n unit: string,\n): Edit {\n const last = object.members[object.members.length - 1];\n if (last) {\n const indent = indentAt(source, last.start);\n return {\n start: last.end,\n end: last.end,\n text: `,\\n${indent}\"${key}\": ${renderValue(indent)}`,\n };\n }\n // `{}` — open it up onto its own lines.\n const closeIndent = indentAt(source, object.start);\n const indent = `${closeIndent}${unit}`;\n return {\n start: object.start + 1,\n end: object.end - 1,\n text: `\\n${indent}\"${key}\": ${renderValue(indent)}\\n${closeIndent}`,\n };\n}\n\n/** Renders a `plugins` array containing only the graphqlsp entry. */\nfunction renderPluginsArray(\n indent: string,\n unit: string,\n config: TsconfigPluginConfig,\n): string {\n const entryIndent = `${indent}${unit}`;\n return `[\\n${entryIndent}${renderPluginEntry(\n entryIndent,\n unit,\n config,\n )}\\n${indent}]`;\n}\n\n/**\n * Adds — or updates in place — the `@0no-co/graphqlsp` entry in\n * `compilerOptions.plugins`.\n *\n * Running this twice with the same configuration is a no-op: the second run\n * reports `unchanged`.\n */\nexport function patchTsconfig(\n source: string,\n config: TsconfigPluginConfig,\n): TsconfigPatchResult {\n let root: JsoncNode;\n try {\n root = parseJsonc(source);\n } catch (cause) {\n /* v8 ignore next 3 -- defensive: only JsoncError can be thrown here */\n const reason =\n cause instanceof JsoncError ? cause.message : String(cause);\n return { status: 'manual', reason: `could not be parsed (${reason})` };\n }\n\n if (root.kind !== 'object') {\n return { status: 'manual', reason: 'its root is not an object' };\n }\n\n const unit = detectIndentUnit(source);\n const compilerOptions = findMember(root, 'compilerOptions');\n\n // No `compilerOptions` at all — add it, with the plugin inside.\n if (!compilerOptions) {\n const edit = insertMember(\n source,\n root,\n 'compilerOptions',\n (indent) =>\n `{\\n${indent}${unit}\"plugins\": ${renderPluginsArray(\n `${indent}${unit}`,\n unit,\n config,\n )}\\n${indent}}`,\n unit,\n );\n return { status: 'patched', source: applyEdits(source, [edit]) };\n }\n\n if (compilerOptions.value.kind !== 'object') {\n return { status: 'manual', reason: '\"compilerOptions\" is not an object' };\n }\n\n const plugins = findMember(compilerOptions.value, 'plugins');\n\n // `compilerOptions` without `plugins` — add the array.\n if (!plugins) {\n const edit = insertMember(\n source,\n compilerOptions.value,\n 'plugins',\n (indent) => renderPluginsArray(indent, unit, config),\n unit,\n );\n return { status: 'patched', source: applyEdits(source, [edit]) };\n }\n\n if (plugins.value.kind !== 'array') {\n return { status: 'manual', reason: '\"compilerOptions.plugins\" is not an array' };\n }\n\n const existing = plugins.value.elements.find((element) => {\n const name = findMember(element, 'name');\n return (\n name?.value.kind === 'string' && name.value.value === GRAPHQLSP_PLUGIN\n );\n });\n\n // A graphqlsp entry is already there — update its fields in place rather\n // than appending a second, conflicting one.\n if (existing) {\n /* v8 ignore next 3 -- `findMember` only matches object elements */\n if (existing.kind !== 'object') {\n return { status: 'manual', reason: 'its graphqlsp plugin entry is not an object' };\n }\n const edits: Edit[] = [];\n for (const [key, value] of [\n ['schema', config.schema],\n ['tadaOutputLocation', config.tadaOutputLocation],\n ] as const) {\n const member = findMember(existing, key);\n if (member) {\n edits.push({\n start: member.value.start,\n end: member.value.end,\n text: JSON.stringify(value),\n });\n } else {\n edits.push(\n insertMember(source, existing, key, () => JSON.stringify(value), unit),\n );\n }\n }\n const patched = applyEdits(source, edits);\n return patched === source\n ? { status: 'unchanged' }\n : { status: 'patched', source: patched };\n }\n\n // Unrelated plugins are configured — append, never replace.\n const last = plugins.value.elements[plugins.value.elements.length - 1];\n if (last) {\n const indent = indentAt(source, last.start);\n return {\n status: 'patched',\n source: applyEdits(source, [\n {\n start: last.end,\n end: last.end,\n text: `,\\n${indent}${renderPluginEntry(indent, unit, config)}`,\n },\n ]),\n };\n }\n\n // An empty `plugins: []`.\n const closeIndent = indentAt(source, plugins.value.start);\n const entryIndent = `${closeIndent}${unit}`;\n return {\n status: 'patched',\n source: applyEdits(source, [\n {\n start: plugins.value.start + 1,\n end: plugins.value.end - 1,\n text: `\\n${entryIndent}${renderPluginEntry(\n entryIndent,\n unit,\n config,\n )}\\n${closeIndent}`,\n },\n ]),\n };\n}\n\n/** The block to print when the caller has to edit the file by hand. */\nexport function manualPluginBlock(config: TsconfigPluginConfig): string {\n return renderPluginEntry('', ' ', config);\n}\n","/**\n * The `fetch-contentful` CLI: `tada-init` and `tada-refresh`.\n *\n * Everything is driven through {@link CliIo} so the whole command surface is\n * testable without spawning a process — including the guarantee that a\n * `--dry-run` writes nothing and that the access token never reaches the\n * terminal.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, relative, resolve } from 'node:path';\nimport { readEnvSettings } from '../env.js';\nimport { parseArgs, type ParsedArgs } from './args.js';\nimport { formatBytes, lineDiff } from './diff.js';\nimport { CliError, redact } from './errors.js';\nimport {\n PACKAGE_NAME,\n relativeSpecifier,\n renderGraphqlModule,\n} from './graphql-module.js';\nimport { fetchSchemaSdl } from './introspect.js';\nimport {\n detectPackageManager,\n installCommand,\n missingDependencies,\n} from './package-manager.js';\nimport {\n GRAPHQLSP_PLUGIN,\n manualPluginBlock,\n patchTsconfig,\n} from './tsconfig.js';\n\nexport interface CliIo {\n /** Directory the command runs against. */\n cwd: string;\n fetch: typeof fetch;\n stdout: (line: string) => void;\n stderr: (line: string) => void;\n}\n\n/** Packages the generated setup needs the consumer to install. */\nconst REQUIRED_PEERS = ['gql.tada', GRAPHQLSP_PLUGIN];\n\nconst DEFAULTS = {\n schemaPath: './contentful-schema.graphql',\n tadaOutput: './src/contentful-env.d.ts',\n graphqlFile: './src/graphql.ts',\n tsconfig: './tsconfig.json',\n} as const;\n\n/** Width of the verb column in the action log. */\nconst VERB_WIDTH = 12;\n\nconst HELP = `fetch-contentful — gql.tada setup for a Contentful space\n\nUsage:\n fetch-contentful tada-init [options] Set up gql.tada in this project\n fetch-contentful tada-refresh [options] Re-download the schema only\n\nConfiguration (flags win over environment variables):\n --space <id> CONTENTFUL_SPACE_ID\n --environment <id> CONTENTFUL_ENVIRONMENT (default \"master\")\n --token <token> CONTENTFUL_ACCESS_TOKEN (Content Delivery API)\n\nPaths (relative to the working directory):\n --schema-path <path> default ${DEFAULTS.schemaPath}\n --tada-output <path> default ${DEFAULTS.tadaOutput}\n --graphql-file <path> default ${DEFAULTS.graphqlFile}\n --tsconfig <path> default ${DEFAULTS.tsconfig}\n\nOther:\n --dry-run Show what would change; write nothing\n --force Overwrite an existing graphql file (tada-init)\n --cwd <path> Run against another directory\n -h, --help Show this help\n\nThe NEXT_PUBLIC_-prefixed variable names are read as fallbacks, exactly as\nthe library reads them at runtime.`;\n\n/* ------------------------------------------------------------------ */\n/* Configuration */\n/* ------------------------------------------------------------------ */\n\ninterface Config {\n space: string;\n environment: string;\n token: string;\n}\n\nfunction resolveConfig(args: ParsedArgs): Config {\n const env = readEnvSettings();\n const space = args.values.space ?? env.space;\n const token = args.values.token ?? env.token;\n const environment = args.values.environment ?? env.environment ?? 'master';\n\n const missing: string[] = [];\n if (!space) {\n missing.push(\n 'space (pass --space, or set CONTENTFUL_SPACE_ID / NEXT_PUBLIC_CONTENTFUL_SPACE_ID)',\n );\n }\n if (!token) {\n missing.push(\n 'access token (pass --token, or set CONTENTFUL_ACCESS_TOKEN / NEXT_PUBLIC_CONTENTFUL_ACCESS_TOKEN)',\n );\n }\n if (!space || !token) {\n throw new CliError(\n `Missing required Contentful configuration:\\n - ${missing.join(\n '\\n - ',\n )}`,\n );\n }\n return { space, environment, token };\n}\n\ninterface Paths {\n root: string;\n schema: string;\n tadaOutput: string;\n graphqlFile: string;\n tsconfig: string;\n}\n\nfunction resolvePaths(args: ParsedArgs, io: CliIo): Paths {\n const root = resolve(io.cwd, args.values.cwd ?? '.');\n const at = (value: string | undefined, fallback: string): string =>\n resolve(root, value ?? fallback);\n return {\n root,\n schema: at(args.values['schema-path'], DEFAULTS.schemaPath),\n tadaOutput: at(args.values['tada-output'], DEFAULTS.tadaOutput),\n graphqlFile: at(args.values['graphql-file'], DEFAULTS.graphqlFile),\n tsconfig: at(args.values.tsconfig, DEFAULTS.tsconfig),\n };\n}\n\n/** A path as the user would type it, for display. */\nfunction display(root: string, path: string): string {\n const shown = relative(root, path);\n return shown === '' || shown.startsWith('..') || isAbsolute(shown)\n ? path\n : shown;\n}\n\nfunction readIfExists(path: string): string | undefined {\n return existsSync(path) ? readFileSync(path, 'utf8') : undefined;\n}\n\n/* ------------------------------------------------------------------ */\n/* Planned changes */\n/* ------------------------------------------------------------------ */\n\ntype Preview = 'size' | 'diff' | 'content';\n\ntype Action =\n | {\n kind: 'write';\n path: string;\n before: string | undefined;\n after: string;\n preview: Preview;\n }\n | { kind: 'unchanged'; path: string }\n | { kind: 'skip'; path: string; reason: string }\n | { kind: 'manual'; path: string; reason: string; block: string };\n\n/** Plans the schema download, shared by both commands. */\nfunction planSchema(sdl: string, paths: Paths): Action {\n const before = readIfExists(paths.schema);\n if (before === sdl) return { kind: 'unchanged', path: paths.schema };\n return {\n kind: 'write',\n path: paths.schema,\n before,\n after: sdl,\n preview: 'size',\n };\n}\n\nfunction planTsconfig(paths: Paths): Action {\n const before = readIfExists(paths.tsconfig);\n if (before === undefined) {\n throw new CliError(\n `No tsconfig at ${display(paths.root, paths.tsconfig)}. ` +\n 'Pass --tsconfig if it lives elsewhere.',\n );\n }\n const config = {\n schema: relativeSpecifier(paths.tsconfig, paths.schema),\n tadaOutputLocation: relativeSpecifier(paths.tsconfig, paths.tadaOutput),\n };\n const result = patchTsconfig(before, config);\n if (result.status === 'unchanged') {\n return { kind: 'unchanged', path: paths.tsconfig };\n }\n if (result.status === 'manual') {\n return {\n kind: 'manual',\n path: paths.tsconfig,\n reason: result.reason,\n block: manualPluginBlock(config),\n };\n }\n return {\n kind: 'write',\n path: paths.tsconfig,\n before,\n after: result.source,\n preview: 'diff',\n };\n}\n\nfunction planGraphqlModule(paths: Paths, force: boolean): Action {\n const before = readIfExists(paths.graphqlFile);\n const after = renderGraphqlModule(\n relativeSpecifier(paths.graphqlFile, paths.tadaOutput),\n );\n if (before !== undefined && !force) {\n return {\n kind: 'skip',\n path: paths.graphqlFile,\n reason: 'already exists; pass --force to overwrite',\n };\n }\n if (before === after) return { kind: 'unchanged', path: paths.graphqlFile };\n return {\n kind: 'write',\n path: paths.graphqlFile,\n before,\n after,\n preview: 'content',\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Reporting and applying */\n/* ------------------------------------------------------------------ */\n\nfunction logAction(io: CliIo, verb: string, detail: string): void {\n io.stdout(` ${verb.padEnd(VERB_WIDTH)} ${detail}`);\n}\n\nfunction report(\n action: Action,\n paths: Paths,\n dryRun: boolean,\n io: CliIo,\n): void {\n const name = display(paths.root, action.path);\n if (action.kind === 'unchanged') {\n logAction(io, 'unchanged', name);\n return;\n }\n if (action.kind === 'skip') {\n logAction(io, 'skipped', `${name} (${action.reason})`);\n return;\n }\n if (action.kind === 'manual') {\n logAction(io, 'manual', `${name} (${action.reason})`);\n return;\n }\n\n const created = action.before === undefined;\n const verb = dryRun\n ? created\n ? 'would create'\n : 'would update'\n : created\n ? 'created'\n : 'updated';\n const size =\n action.preview === 'size'\n ? ` (${formatBytes(Buffer.byteLength(action.after))})`\n : '';\n logAction(io, verb, `${name}${size}`);\n\n if (!dryRun) return;\n\n if (action.preview === 'content') {\n for (const line of action.after.replace(/\\n$/, '').split('\\n')) {\n io.stdout(` + ${line}`);\n }\n return;\n }\n\n // Everything below compares against the file already on disk.\n if (action.before === undefined) return;\n\n if (action.preview === 'diff') {\n for (const line of lineDiff(action.before, action.after)) {\n io.stdout(` ${line}`);\n }\n return;\n }\n\n // Exact counts, not rounded ones: two files that both format as\n // \"23.1 kB\" would otherwise look identical.\n const beforeBytes = Buffer.byteLength(action.before);\n const afterBytes = Buffer.byteLength(action.after);\n const delta = afterBytes - beforeBytes;\n io.stdout(\n ` ${String(beforeBytes)} → ${String(afterBytes)} bytes (${\n delta >= 0 ? '+' : ''\n }${String(delta)})`,\n );\n}\n\nfunction apply(action: Action): void {\n if (action.kind !== 'write') return;\n mkdirSync(dirname(action.path), { recursive: true });\n writeFileSync(action.path, action.after, 'utf8');\n}\n\n/** Prints the manual tsconfig block, when patching was not safe. */\nfunction reportManual(action: Action, paths: Paths, io: CliIo): void {\n if (action.kind !== 'manual') return;\n io.stdout('');\n io.stdout(\n `${display(paths.root, action.path)} was left untouched because ${\n action.reason\n }.`,\n );\n io.stdout('Add this entry to \"compilerOptions.plugins\" by hand:');\n io.stdout('');\n for (const line of action.block.split('\\n')) io.stdout(` ${line}`);\n}\n\nfunction reportPeers(paths: Paths, io: CliIo): void {\n const missing = missingDependencies(paths.root, REQUIRED_PEERS);\n if (missing.length === 0) return;\n io.stdout('');\n io.stdout(`Install the packages the generated setup needs:`);\n io.stdout(` ${installCommand(detectPackageManager(paths.root), missing)}`);\n}\n\n/* ------------------------------------------------------------------ */\n/* Commands */\n/* ------------------------------------------------------------------ */\n\nasync function tadaInit(args: ParsedArgs, io: CliIo): Promise<number> {\n const config = resolveConfig(args);\n const paths = resolvePaths(args, io);\n const dryRun = args.flags.has('dry-run');\n\n // Planned before the network call, so a missing tsconfig fails fast.\n const tsconfigAction = planTsconfig(paths);\n const sdl = await fetchSchemaSdl({ ...config, fetch: io.fetch });\n\n // Everything is planned before anything is written, so a failure part-way\n // through cannot leave a half-configured project behind.\n const actions = [\n planSchema(sdl, paths),\n tsconfigAction,\n planGraphqlModule(paths, args.flags.has('force')),\n ];\n\n io.stdout(\n dryRun\n ? `Dry run — nothing will be written (space ${config.space}, environment ${config.environment}).`\n : `Configuring gql.tada for space ${config.space}, environment ${config.environment}.`,\n );\n for (const action of actions) {\n if (!dryRun) apply(action);\n report(action, paths, dryRun, io);\n }\n for (const action of actions) reportManual(action, paths, io);\n\n reportPeers(paths, io);\n\n // A dry run changed nothing, so there is nothing to do next.\n if (dryRun) return 0;\n\n io.stdout('');\n io.stdout('Next steps:');\n io.stdout(` 1. Restart the TypeScript server so ${GRAPHQLSP_PLUGIN} loads.`);\n io.stdout(\n ` 2. Write a query with the \\`graphql\\` helper from ${display(\n paths.root,\n paths.graphqlFile,\n )},`,\n );\n io.stdout(\n ` then pass it to fetchContentful from ${PACKAGE_NAME}.`,\n );\n io.stdout(' Result and variable types are inferred from the document.');\n io.stdout(\n ' 3. After a content-model change, run `fetch-contentful tada-refresh`.',\n );\n return 0;\n}\n\nasync function tadaRefresh(args: ParsedArgs, io: CliIo): Promise<number> {\n const config = resolveConfig(args);\n const paths = resolvePaths(args, io);\n const dryRun = args.flags.has('dry-run');\n\n const sdl = await fetchSchemaSdl({ ...config, fetch: io.fetch });\n const action = planSchema(sdl, paths);\n\n if (action.kind === 'unchanged') {\n // Leave the file's mtime alone: an unchanged schema should not show up\n // in `git status`, and should not invalidate a build cache.\n io.stdout(\n `Schema is already up to date — ${display(\n paths.root,\n paths.schema,\n )} left untouched.`,\n );\n return 0;\n }\n\n if (!dryRun) apply(action);\n report(action, paths, dryRun, io);\n return 0;\n}\n\n/* ------------------------------------------------------------------ */\n/* Entry point */\n/* ------------------------------------------------------------------ */\n\nasync function dispatch(argv: string[], io: CliIo): Promise<number> {\n const args = parseArgs(argv);\n // Accept both `tada-init` and `tada init`.\n const command = args.positionals.join('-');\n\n if (args.flags.has('help') || command === '' || command === 'help') {\n io.stdout(HELP);\n return 0;\n }\n if (command === 'tada-init') return tadaInit(args, io);\n if (command === 'tada-refresh') return tadaRefresh(args, io);\n\n throw new CliError(\n `Unknown command \"${args.positionals.join(\n ' ',\n )}\". Run with --help to see the available commands.`,\n );\n}\n\n/** Any token reachable from the environment or the command line. */\nfunction knownTokens(argv: string[]): Array<string | undefined> {\n const env = readEnvSettings();\n const tokens: Array<string | undefined> = [env.token, env.previewToken];\n for (const [index, argument] of argv.entries()) {\n if (argument.startsWith('--token=')) tokens.push(argument.slice(8));\n else if (argument === '--token') tokens.push(argv[index + 1]);\n }\n return tokens;\n}\n\n/**\n * Runs the CLI and resolves with the process exit code. Never rejects, and\n * never prints the access token.\n */\nexport async function run(argv: string[], io: CliIo): Promise<number> {\n try {\n return await dispatch(argv, io);\n } catch (error) {\n const raw =\n error instanceof CliError\n ? error.message\n : `Unexpected failure: ${String(error)}`;\n let message = raw;\n for (const token of knownTokens(argv)) message = redact(message, token);\n io.stderr(`error: ${message}`);\n return 1;\n }\n}\n","#!/usr/bin/env node\n/**\n * The `fetch-contentful` binary.\n *\n * A thin shell around {@link run}: everything worth testing lives there,\n * reached without spawning a process.\n */\n\nimport { run } from './run.js';\n\nconst code = await run(process.argv.slice(2), {\n cwd: process.cwd(),\n fetch: globalThis.fetch,\n stdout: (line) => process.stdout.write(`${line}\\n`),\n stderr: (line) => process.stderr.write(`${line}\\n`),\n});\nprocess.exitCode = code;\n"]}
1
+ {"version":3,"sources":["../../src/env.ts","../../src/cli/errors.ts","../../src/cli/args.ts","../../src/cli/diff.ts","../../src/cli/graphql-module.ts","../../src/client.ts","../../src/cli/introspect.ts","../../src/cli/package-manager.ts","../../src/cli/jsonc.ts","../../src/cli/tsconfig.ts","../../src/cli/run.ts","../../src/cli/index.ts"],"names":["indent","relative","existsSync","readFileSync","dirname"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Environment-derived configuration.\n *\n * Two families of variable names are supported, checked in this order:\n *\n * 1. Framework-neutral names — `CONTENTFUL_SPACE_ID`, `CONTENTFUL_ENVIRONMENT`,\n * `CONTENTFUL_ACCESS_TOKEN`, `CONTENTFUL_PREVIEW_ACCESS_TOKEN`.\n * 2. `NEXT_PUBLIC_`-prefixed equivalents for Next.js projects that call\n * Contentful from the browser — for the space, the environment and the\n * **delivery** token only.\n *\n * The preview token is deliberately absent from that second family. Next.js\n * inlines `NEXT_PUBLIC_` variables into client bundles by string-replacing\n * the literal accesses below, so merely importing this module in a project\n * that set `NEXT_PUBLIC_CONTENTFUL_PREVIEW_ACCESS_TOKEN` would bake the\n * token into public JavaScript — whether or not any client code ever asks\n * for preview content. A delivery token is read-only and commonly public; a\n * preview token reads unpublished content and must not leak. Callers that\n * genuinely need preview in the browser pass `previewToken` explicitly, so\n * the exposure is their deliberate choice rather than this module's.\n *\n * IMPORTANT: every lookup below is written as a literal\n * `process.env.SOME_NAME` property access, never a dynamic `process.env[x]`.\n * Next.js exposes `NEXT_PUBLIC_` variables to client bundles by\n * string-replacing those literal expressions at build time — dynamic access\n * is invisible to the inliner and resolves to `undefined` in the browser.\n * Do not \"refactor\" these into a loop or a name table.\n *\n * This module reads the already-populated `process.env`; loading `.env`\n * files from disk is deliberately left to the platform (Next.js, Vite,\n * dotenv, ...), whose precedence rules would otherwise be duplicated here.\n */\n\n/*\n * These variables are read at runtime inside the consuming application, not\n * while this package is built — the bundle ships the literal `process.env.X`\n * accesses untouched. Declaring them in turbo.json would therefore be\n * inaccurate and would invalidate the build cache for no reason.\n */\n/* eslint-disable turbo/no-undeclared-env-vars */\n\nexport interface EnvSettings {\n space: string | undefined;\n environment: string | undefined;\n /** Content Delivery API token, for published content. */\n deliveryToken: string | undefined;\n /**\n * Content Delivery API token.\n *\n * @deprecated Renamed to {@link EnvSettings.deliveryToken}, which says\n * which of the two tokens it is. Kept as an alias; same value.\n */\n token: string | undefined;\n /** Content Preview API token, for draft content. Server-side only. */\n previewToken: string | undefined;\n}\n\nfunction orUndefined(value: string | undefined): string | undefined {\n return value || undefined;\n}\n\n/** Reads Contentful settings from `process.env` (neutral names first). */\nexport function readEnvSettings(): EnvSettings {\n /* v8 ignore next 10 -- process always exists in the test runtime */\n if (typeof process === 'undefined' || !process.env) {\n return {\n space: undefined,\n environment: undefined,\n deliveryToken: undefined,\n token: undefined,\n previewToken: undefined,\n };\n }\n const deliveryToken = orUndefined(\n process.env.CONTENTFUL_ACCESS_TOKEN ||\n process.env.NEXT_PUBLIC_CONTENTFUL_ACCESS_TOKEN,\n );\n return {\n space: orUndefined(\n process.env.CONTENTFUL_SPACE_ID ||\n process.env.NEXT_PUBLIC_CONTENTFUL_SPACE_ID,\n ),\n environment: orUndefined(\n process.env.CONTENTFUL_ENVIRONMENT ||\n process.env.NEXT_PUBLIC_CONTENTFUL_ENVIRONMENT,\n ),\n deliveryToken,\n token: deliveryToken,\n // No `NEXT_PUBLIC_` fallback: see the note at the top of this file.\n previewToken: orUndefined(process.env.CONTENTFUL_PREVIEW_ACCESS_TOKEN),\n };\n}\n","/**\n * An expected CLI failure: printed as a plain message with exit code 1,\n * never as a stack trace.\n */\nexport class CliError extends Error {\n override name = 'CliError';\n}\n\n/**\n * Removes an access token from text that is about to be printed.\n *\n * Contentful echoes request details in some error bodies, and a token\n * pasted into a bug report is a token that has to be rotated.\n */\nexport function redact(text: string, token: string | undefined): string {\n if (!token) return text;\n return text.split(token).join('[redacted]');\n}\n","/**\n * A tiny `process.argv` parser.\n *\n * `node:util`'s `parseArgs` would do, but it prints an experimental warning\n * on Node 18 — which this package still supports — and that warning would\n * land in the middle of the CLI's output.\n */\n\nimport { CliError } from './errors.js';\n\n/** Flags that take no value. */\nexport const BOOLEAN_FLAGS = ['dry-run', 'force', 'help'] as const;\n\n/** Flags that take a value. */\nexport const VALUE_FLAGS = [\n 'space',\n 'environment',\n 'token',\n 'schema-path',\n 'tada-output',\n 'graphql-file',\n 'tsconfig',\n 'cwd',\n] as const;\n\nexport interface ParsedArgs {\n /** Positional arguments, e.g. `['tada-init']`. */\n positionals: string[];\n values: Partial<Record<(typeof VALUE_FLAGS)[number], string>>;\n flags: Set<(typeof BOOLEAN_FLAGS)[number]>;\n}\n\nfunction isBooleanFlag(name: string): name is (typeof BOOLEAN_FLAGS)[number] {\n return (BOOLEAN_FLAGS as readonly string[]).includes(name);\n}\n\nfunction isValueFlag(name: string): name is (typeof VALUE_FLAGS)[number] {\n return (VALUE_FLAGS as readonly string[]).includes(name);\n}\n\n/** Parses `argv` (already stripped of `node` and the script path). */\nexport function parseArgs(argv: string[]): ParsedArgs {\n const parsed: ParsedArgs = {\n positionals: [],\n values: {},\n flags: new Set(),\n };\n\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index] as string;\n\n if (argument === '-h') {\n parsed.flags.add('help');\n continue;\n }\n\n if (!argument.startsWith('--')) {\n parsed.positionals.push(argument);\n continue;\n }\n\n const equals = argument.indexOf('=');\n const name = argument.slice(2, equals === -1 ? undefined : equals);\n const inlineValue = equals === -1 ? undefined : argument.slice(equals + 1);\n\n if (isBooleanFlag(name)) {\n if (inlineValue !== undefined) {\n throw new CliError(`--${name} does not take a value.`);\n }\n parsed.flags.add(name);\n continue;\n }\n\n if (!isValueFlag(name)) {\n throw new CliError(`Unknown option \"--${name}\".`);\n }\n\n const value = inlineValue ?? argv[++index];\n if (value === undefined) {\n throw new CliError(`--${name} needs a value.`);\n }\n parsed.values[name] = value;\n }\n\n return parsed;\n}\n","/**\n * A line diff for `--dry-run` output.\n *\n * Only ever used on hand-sized files (a tsconfig, a generated module), so a\n * plain quadratic LCS is the right trade for having no dependency.\n */\n\nconst MAX_LINES = 400;\n\n/** Length of the longest common subsequence, as a DP table. */\nfunction lcsTable(before: string[], after: string[]): number[][] {\n const table: number[][] = Array.from({ length: before.length + 1 }, () =>\n new Array<number>(after.length + 1).fill(0),\n );\n for (let i = before.length - 1; i >= 0; i -= 1) {\n for (let j = after.length - 1; j >= 0; j -= 1) {\n const row = table[i] as number[];\n const next = table[i + 1] as number[];\n row[j] =\n before[i] === after[j]\n ? (next[j + 1] as number) + 1\n : Math.max(next[j] as number, row[j + 1] as number);\n }\n }\n return table;\n}\n\n/**\n * Renders `before` → `after` as `-`/`+`/` `-prefixed lines.\n *\n * Not a `patch(1)`-compatible unified diff — there are no hunk headers, and\n * unchanged lines are all kept — but it reads the same way and is enough to\n * see exactly what a run would change.\n */\nexport function lineDiff(before: string, after: string): string[] {\n if (before === after) return [];\n\n const beforeLines = before.split('\\n');\n const afterLines = after.split('\\n');\n\n if (beforeLines.length + afterLines.length > MAX_LINES * 2) {\n return [\n ` (${String(beforeLines.length)} lines → ${String(\n afterLines.length,\n )} lines; too large to diff)`,\n ];\n }\n\n const table = lcsTable(beforeLines, afterLines);\n const output: string[] = [];\n let i = 0;\n let j = 0;\n\n while (i < beforeLines.length && j < afterLines.length) {\n if (beforeLines[i] === afterLines[j]) {\n output.push(` ${beforeLines[i] as string}`);\n i += 1;\n j += 1;\n } else if (\n ((table[i + 1] as number[])[j] as number) >=\n ((table[i] as number[])[j + 1] as number)\n ) {\n output.push(` - ${beforeLines[i] as string}`);\n i += 1;\n } else {\n output.push(` + ${afterLines[j] as string}`);\n j += 1;\n }\n }\n while (i < beforeLines.length) {\n output.push(` - ${beforeLines[i] as string}`);\n i += 1;\n }\n while (j < afterLines.length) {\n output.push(` + ${afterLines[j] as string}`);\n j += 1;\n }\n\n return output;\n}\n\n/** Formats a byte count for humans. */\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${String(bytes)} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} kB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","/**\n * Renders the `graphql.ts` module that binds gql.tada to the space's\n * introspection output and Contentful's scalar map.\n */\n\nimport { dirname, relative, sep } from 'node:path';\n\n/** The published package name, used in the generated import. */\nexport const PACKAGE_NAME = '@fourtwelvelabs/fetch-contentful';\n\n/**\n * The path of `toFile` as seen from the directory holding `fromFile`,\n * always relative and always POSIX-separated — the form both an `import`\n * specifier and a tsconfig plugin path want.\n */\nexport function relativeSpecifier(fromFile: string, toFile: string): string {\n const path = relative(dirname(fromFile), toFile).split(sep).join('/');\n return path.startsWith('.') ? path : `./${path}`;\n}\n\n/**\n * The contents of the generated `graphql.ts`.\n *\n * `introspectionImport` is the specifier for gql.tada's generated types —\n * kept with its `.d.ts` extension, which is gql.tada's own convention.\n */\nexport function renderGraphqlModule(introspectionImport: string): string {\n return `/**\n * gql.tada, bound to this space's schema.\n *\n * Generated by \\`fetch-contentful tada-init\\`. Safe to edit and to commit;\n * re-running \\`tada-init\\` will not overwrite it without \\`--force\\`.\n *\n * Refresh the schema after a content-model change with:\n * fetch-contentful tada-refresh\n */\nimport { initGraphQLTada } from 'gql.tada';\nimport type { ContentfulScalars } from '${PACKAGE_NAME}/tada';\nimport type { introspection } from '${introspectionImport}';\n\nexport const graphql = initGraphQLTada<{\n introspection: introspection;\n scalars: ContentfulScalars;\n}>();\n\nexport { readFragment } from 'gql.tada';\nexport type { FragmentOf, ResultOf, VariablesOf } from 'gql.tada';\n`;\n}\n","import { print, type DocumentNode } from 'graphql';\nimport { FetchContentfulError } from './errors.js';\nimport { withRetries, type RetryConfig } from './retry.js';\nimport { getOperation, stripInternalDirectives } from './split.js';\nimport type {\n ContentfulGraphQLError,\n GraphQLVariables,\n NextFetchOptions,\n} from './types.js';\n\nexport interface RequestContext {\n space: string;\n environment: string;\n token: string;\n fetch: typeof fetch;\n retry: RetryConfig;\n signal?: AbortSignal;\n next?: NextFetchOptions;\n cache?: RequestCache;\n}\n\nexport function graphqlEndpoint(space: string, environment: string): string {\n return `https://graphql.contentful.com/content/v1/spaces/${encodeURIComponent(\n space,\n )}/environments/${encodeURIComponent(environment)}`;\n}\n\n/** Parse a Retry-After header (seconds or HTTP date) into milliseconds. */\nexport function parseRetryAfter(header: string | null): number | undefined {\n if (!header) return undefined;\n const seconds = Number(header);\n if (Number.isFinite(seconds)) {\n return Math.max(0, seconds * 1000);\n }\n const date = Date.parse(header);\n if (Number.isFinite(date)) {\n return Math.max(0, date - Date.now());\n }\n return undefined;\n}\n\n/** Keep only the variables the document actually declares. */\nexport function pickDeclaredVariables(\n document: DocumentNode,\n variables: GraphQLVariables,\n): GraphQLVariables {\n const declared = new Set(\n (getOperation(document).variableDefinitions ?? []).map(\n (definition) => definition.variable.name.value,\n ),\n );\n const picked: GraphQLVariables = {};\n for (const [name, value] of Object.entries(variables)) {\n if (declared.has(name)) {\n picked[name] = value;\n }\n }\n return picked;\n}\n\nfunction isRetryableStatus(status: number): boolean {\n return status === 408 || status === 429 || status >= 500;\n}\n\n/**\n * Sends one GraphQL request (with retries) and returns `data`.\n * Rejects with a {@link FetchContentfulError} on any HTTP, network, or\n * GraphQL error — including partial responses that contain errors.\n */\nexport async function rawRequest(\n document: DocumentNode,\n variables: GraphQLVariables,\n context: RequestContext,\n): Promise<Record<string, unknown>> {\n const query = print(stripInternalDirectives(document));\n const body = JSON.stringify({\n query,\n variables: pickDeclaredVariables(document, variables),\n });\n const url = graphqlEndpoint(context.space, context.environment);\n\n return withRetries(async () => {\n let response: Response;\n try {\n const init: RequestInit & { next?: NextFetchOptions } = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${context.token}`,\n },\n body,\n };\n if (context.signal) init.signal = context.signal;\n if (context.cache) init.cache = context.cache;\n if (context.next) init.next = context.next;\n response = await context.fetch(url, init);\n } catch (cause) {\n throw new FetchContentfulError(\n `Network error while contacting Contentful: ${String(cause)}`,\n { code: 'NETWORK', retryable: true, cause },\n );\n }\n\n if (!response.ok) {\n const retryable = isRetryableStatus(response.status);\n throw new FetchContentfulError(\n `Contentful responded with HTTP ${response.status}.`,\n {\n code: 'HTTP',\n status: response.status,\n retryable,\n retryAfterMs: retryable\n ? parseRetryAfter(response.headers.get('Retry-After'))\n : undefined,\n },\n );\n }\n\n let payload: {\n data?: Record<string, unknown> | null;\n errors?: ContentfulGraphQLError[];\n };\n try {\n payload = (await response.json()) as typeof payload;\n } catch (cause) {\n throw new FetchContentfulError(\n 'Contentful returned an unreadable response body.',\n { code: 'NETWORK', retryable: true, cause },\n );\n }\n\n if (payload.errors && payload.errors.length > 0) {\n throw new FetchContentfulError(\n `Contentful returned GraphQL errors: ${payload.errors\n .map((error) => error.message)\n .join('; ')}`,\n { code: 'GRAPHQL', errors: payload.errors },\n );\n }\n\n if (!payload.data || typeof payload.data !== 'object') {\n throw new FetchContentfulError(\n 'Contentful returned no data and no errors.',\n { code: 'GRAPHQL' },\n );\n }\n\n return payload.data;\n }, context.retry);\n}\n","/**\n * Downloads a space's GraphQL schema as SDL.\n *\n * This is the one network operation the CLI performs, and the only step\n * `tada-refresh` runs.\n */\n\nimport {\n buildClientSchema,\n getIntrospectionQuery,\n printSchema,\n type IntrospectionQuery,\n} from 'graphql';\nimport { graphqlEndpoint } from '../client.js';\nimport { CliError, redact } from './errors.js';\n\nexport interface IntrospectOptions {\n space: string;\n environment: string;\n token: string;\n fetch: typeof fetch;\n}\n\n/** Trims a response body down to something safe to show in a terminal. */\nfunction bodySnippet(body: string, token: string): string {\n const cleaned = redact(body, token).trim();\n if (cleaned === '') return '(empty response body)';\n return cleaned.length > 300 ? `${cleaned.slice(0, 300)}…` : cleaned;\n}\n\n/**\n * Runs an introspection query against Contentful and returns the schema\n * printed as SDL, with a trailing newline.\n */\nexport async function fetchSchemaSdl(\n options: IntrospectOptions,\n): Promise<string> {\n const url = graphqlEndpoint(options.space, options.environment);\n\n let response: Response;\n try {\n response = await options.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${options.token}`,\n },\n body: JSON.stringify({ query: getIntrospectionQuery() }),\n });\n } catch (cause) {\n throw new CliError(\n `Could not reach Contentful at ${url}: ${redact(\n String(cause),\n options.token,\n )}`,\n );\n }\n\n if (response.status === 401 || response.status === 403) {\n throw new CliError(\n `Contentful rejected the access token (HTTP ${String(\n response.status,\n )}).\\n` +\n ` Check that the token is a Content Delivery API token for space ` +\n `\"${options.space}\", and that it has access to environment ` +\n `\"${options.environment}\".`,\n );\n }\n\n if (!response.ok) {\n const body = bodySnippet(await response.text().catch(() => ''), options.token);\n throw new CliError(\n `Contentful responded with HTTP ${String(response.status)}.\\n ${body}`,\n );\n }\n\n let payload: {\n data?: IntrospectionQuery;\n errors?: Array<{ message?: string }>;\n };\n try {\n payload = (await response.json()) as typeof payload;\n } catch {\n throw new CliError('Contentful returned an unreadable response body.');\n }\n\n if (payload.errors && payload.errors.length > 0) {\n const messages = payload.errors\n .map((error) => error.message ?? 'unknown error')\n .join('; ');\n throw new CliError(\n `Contentful returned GraphQL errors during introspection: ${redact(\n messages,\n options.token,\n )}`,\n );\n }\n\n if (!payload.data) {\n throw new CliError(\n 'Contentful returned no introspection data. Check the space and environment ids.',\n );\n }\n\n try {\n return `${printSchema(buildClientSchema(payload.data))}\\n`;\n } catch (cause) {\n throw new CliError(\n `Could not build a schema from Contentful's introspection response: ${String(\n cause,\n )}`,\n );\n }\n}\n","/**\n * Detects the consumer's package manager so the CLI can print an install\n * command they can paste as-is.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport type PackageManager = 'bun' | 'pnpm' | 'yarn' | 'npm';\n\n/** Lockfiles in the order they are checked. */\nconst LOCKFILES: Array<[PackageManager, string]> = [\n ['bun', 'bun.lock'],\n ['bun', 'bun.lockb'],\n ['pnpm', 'pnpm-lock.yaml'],\n ['yarn', 'yarn.lock'],\n ['npm', 'package-lock.json'],\n];\n\n/** Identifies the package manager from the lockfile in `cwd`. */\nexport function detectPackageManager(cwd: string): PackageManager {\n for (const [manager, lockfile] of LOCKFILES) {\n if (existsSync(join(cwd, lockfile))) return manager;\n }\n return 'npm';\n}\n\n/** The command that adds `packages` as dev dependencies. */\nexport function installCommand(\n manager: PackageManager,\n packages: string[],\n): string {\n const list = packages.join(' ');\n switch (manager) {\n case 'bun':\n return `bun add -d ${list}`;\n case 'pnpm':\n return `pnpm add -D ${list}`;\n case 'yarn':\n return `yarn add -D ${list}`;\n case 'npm':\n return `npm install -D ${list}`;\n }\n}\n\n/**\n * Returns the packages that are not declared anywhere in the consumer's\n * `package.json`. An unreadable or absent manifest means \"declare all of\n * them\" — printing an install command the user may not need is harmless,\n * silently skipping a required one is not.\n */\nexport function missingDependencies(\n cwd: string,\n packages: string[],\n): string[] {\n let manifest: Record<string, unknown>;\n try {\n manifest = JSON.parse(\n readFileSync(join(cwd, 'package.json'), 'utf8'),\n ) as Record<string, unknown>;\n } catch {\n return [...packages];\n }\n\n const declared = new Set<string>();\n for (const field of [\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies',\n ]) {\n const section = manifest[field];\n if (typeof section === 'object' && section !== null) {\n for (const name of Object.keys(section)) declared.add(name);\n }\n }\n return packages.filter((name) => !declared.has(name));\n}\n","/**\n * A minimal JSONC scanner that records source offsets.\n *\n * `tsconfig.json` files are JSON with comments and trailing commas, and are\n * hand-maintained — reading one with a comment-stripping parser and writing\n * it back would destroy the author's comments and formatting. So instead of\n * parsing to a value and re-serializing, this scanner produces a tree of\n * nodes annotated with their offsets in the original text, which the patcher\n * uses to make surgical string edits.\n *\n * It is deliberately not a general JSON validator: it accepts the shapes it\n * needs to locate and rejects everything else, so the caller can fall back\n * to printing manual instructions rather than mangling a file it did not\n * understand.\n */\n\nexport class JsoncError extends Error {\n override name = 'JsoncError';\n}\n\nexport interface JsoncMember {\n /** The parsed key, e.g. `compilerOptions`. */\n key: string;\n /** Offset of the member's first character (the key's opening quote). */\n start: number;\n /** Offset just past the member's value. */\n end: number;\n value: JsoncNode;\n}\n\nexport type JsoncNode =\n | { kind: 'object'; start: number; end: number; members: JsoncMember[] }\n | { kind: 'array'; start: number; end: number; elements: JsoncNode[] }\n | { kind: 'string'; start: number; end: number; value: string }\n | { kind: 'literal'; start: number; end: number };\n\nconst WHITESPACE = ' \\t\\n\\r';\n\nclass Scanner {\n private index = 0;\n\n constructor(private readonly source: string) {}\n\n /** Skips whitespace, `//` line comments and `/* *\\/` block comments. */\n private skipTrivia(): void {\n for (;;) {\n while (\n this.index < this.source.length &&\n WHITESPACE.includes(this.source[this.index] as string)\n ) {\n this.index += 1;\n }\n if (this.source.startsWith('//', this.index)) {\n const newline = this.source.indexOf('\\n', this.index);\n this.index = newline === -1 ? this.source.length : newline + 1;\n continue;\n }\n if (this.source.startsWith('/*', this.index)) {\n const close = this.source.indexOf('*/', this.index + 2);\n if (close === -1) {\n throw new JsoncError('Unterminated block comment.');\n }\n this.index = close + 2;\n continue;\n }\n return;\n }\n }\n\n private peek(): string {\n this.skipTrivia();\n if (this.index >= this.source.length) {\n throw new JsoncError('Unexpected end of input.');\n }\n return this.source[this.index] as string;\n }\n\n private expect(character: string): void {\n if (this.peek() !== character) {\n throw new JsoncError(\n `Expected \"${character}\" at offset ${String(this.index)}.`,\n );\n }\n this.index += 1;\n }\n\n parseRoot(): JsoncNode {\n const node = this.parseValue();\n this.skipTrivia();\n if (this.index !== this.source.length) {\n throw new JsoncError(\n `Unexpected trailing content at offset ${String(this.index)}.`,\n );\n }\n return node;\n }\n\n private parseValue(): JsoncNode {\n const character = this.peek();\n if (character === '{') return this.parseObject();\n if (character === '[') return this.parseArray();\n if (character === '\"') return this.parseString();\n return this.parseLiteral();\n }\n\n private parseObject(): JsoncNode {\n const start = this.index;\n this.expect('{');\n const members: JsoncMember[] = [];\n for (;;) {\n if (this.peek() === '}') {\n this.index += 1;\n return { kind: 'object', start, end: this.index, members };\n }\n const memberStart = this.index;\n const key = this.parseString();\n this.expect(':');\n const value = this.parseValue();\n members.push({\n key: key.value,\n start: memberStart,\n end: value.end,\n value,\n });\n if (this.peek() === ',') {\n this.index += 1;\n }\n }\n }\n\n private parseArray(): JsoncNode {\n const start = this.index;\n this.expect('[');\n const elements: JsoncNode[] = [];\n for (;;) {\n if (this.peek() === ']') {\n this.index += 1;\n return { kind: 'array', start, end: this.index, elements };\n }\n elements.push(this.parseValue());\n if (this.peek() === ',') {\n this.index += 1;\n }\n }\n }\n\n private parseString(): JsoncNode & { kind: 'string' } {\n this.skipTrivia();\n const start = this.index;\n if (this.source[start] !== '\"') {\n throw new JsoncError(`Expected a string at offset ${String(start)}.`);\n }\n this.index += 1;\n while (this.index < this.source.length) {\n const character = this.source[this.index];\n if (character === '\\\\') {\n this.index += 2;\n continue;\n }\n this.index += 1;\n if (character === '\"') {\n const end = this.index;\n return {\n kind: 'string',\n start,\n end,\n value: JSON.parse(this.source.slice(start, end)) as string,\n };\n }\n }\n throw new JsoncError(`Unterminated string at offset ${String(start)}.`);\n }\n\n /** Numbers, `true`, `false` and `null` — read as an opaque token. */\n private parseLiteral(): JsoncNode {\n this.skipTrivia();\n const start = this.index;\n while (\n this.index < this.source.length &&\n !',]}'.includes(this.source[this.index] as string) &&\n !WHITESPACE.includes(this.source[this.index] as string)\n ) {\n this.index += 1;\n }\n if (this.index === start) {\n throw new JsoncError(`Unexpected character at offset ${String(start)}.`);\n }\n return { kind: 'literal', start, end: this.index };\n }\n}\n\n/** Parses JSONC into an offset-annotated tree. Throws {@link JsoncError}. */\nexport function parseJsonc(source: string): JsoncNode {\n return new Scanner(source).parseRoot();\n}\n\n/** Finds a member by key, or `undefined`. */\nexport function findMember(\n node: JsoncNode,\n key: string,\n): JsoncMember | undefined {\n if (node.kind !== 'object') return undefined;\n return node.members.find((member) => member.key === key);\n}\n","/**\n * Idempotent, comment-preserving patching of a consumer's `tsconfig.json`.\n *\n * Every change is a surgical string edit computed from source offsets, so\n * comments, trailing commas and the author's formatting all survive. When\n * the file's shape isn't understood, nothing is written and the caller is\n * told to insert the block by hand — a mangled tsconfig is far worse than a\n * manual step.\n */\n\nimport { findMember, JsoncError, parseJsonc, type JsoncNode } from './jsonc.js';\n\n/** The TypeScript language-service plugin gql.tada drives. */\nexport const GRAPHQLSP_PLUGIN = '@0no-co/graphqlsp';\n\nexport interface TsconfigPluginConfig {\n /** Path to the SDL file, relative to the tsconfig. */\n schema: string;\n /** Path gql.tada writes its generated types to, relative to the tsconfig. */\n tadaOutputLocation: string;\n}\n\nexport type TsconfigPatchResult =\n /** The plugin was already configured exactly as requested. */\n | { status: 'unchanged' }\n /** `source` is the patched file content. */\n | { status: 'patched'; source: string }\n /** The file could not be patched safely; `reason` says why. */\n | { status: 'manual'; reason: string };\n\ninterface Edit {\n start: number;\n end: number;\n text: string;\n}\n\nfunction applyEdits(source: string, edits: Edit[]): string {\n let result = source;\n for (const edit of [...edits].sort((a, b) => b.start - a.start)) {\n result = result.slice(0, edit.start) + edit.text + result.slice(edit.end);\n }\n return result;\n}\n\n/** The leading whitespace of the line containing `offset`. */\nfunction indentAt(source: string, offset: number): string {\n const lineStart = source.lastIndexOf('\\n', offset - 1) + 1;\n const line = source.slice(lineStart, offset);\n return line.slice(0, line.length - line.trimStart().length);\n}\n\n/** The file's own indentation unit, falling back to two spaces. */\nexport function detectIndentUnit(source: string): string {\n const match = /\\n([ \\t]+)\\S/.exec(source);\n return match?.[1] ?? ' ';\n}\n\n/** Renders the plugin entry, with `indent` as the entry's own indentation. */\nfunction renderPluginEntry(\n indent: string,\n unit: string,\n config: TsconfigPluginConfig,\n): string {\n return [\n '{',\n `${indent}${unit}\"name\": ${JSON.stringify(GRAPHQLSP_PLUGIN)},`,\n `${indent}${unit}\"schema\": ${JSON.stringify(config.schema)},`,\n `${indent}${unit}\"tadaOutputLocation\": ${JSON.stringify(\n config.tadaOutputLocation,\n )}`,\n `${indent}}`,\n ].join('\\n');\n}\n\n/**\n * An edit that adds `\"key\": <value>` to an object node, matching the\n * object's existing layout.\n */\nfunction insertMember(\n source: string,\n object: JsoncNode & { kind: 'object' },\n key: string,\n renderValue: (indent: string) => string,\n unit: string,\n): Edit {\n const last = object.members[object.members.length - 1];\n if (last) {\n const indent = indentAt(source, last.start);\n return {\n start: last.end,\n end: last.end,\n text: `,\\n${indent}\"${key}\": ${renderValue(indent)}`,\n };\n }\n // `{}` — open it up onto its own lines.\n const closeIndent = indentAt(source, object.start);\n const indent = `${closeIndent}${unit}`;\n return {\n start: object.start + 1,\n end: object.end - 1,\n text: `\\n${indent}\"${key}\": ${renderValue(indent)}\\n${closeIndent}`,\n };\n}\n\n/** Renders a `plugins` array containing only the graphqlsp entry. */\nfunction renderPluginsArray(\n indent: string,\n unit: string,\n config: TsconfigPluginConfig,\n): string {\n const entryIndent = `${indent}${unit}`;\n return `[\\n${entryIndent}${renderPluginEntry(\n entryIndent,\n unit,\n config,\n )}\\n${indent}]`;\n}\n\n/**\n * Adds — or updates in place — the `@0no-co/graphqlsp` entry in\n * `compilerOptions.plugins`.\n *\n * Running this twice with the same configuration is a no-op: the second run\n * reports `unchanged`.\n */\nexport function patchTsconfig(\n source: string,\n config: TsconfigPluginConfig,\n): TsconfigPatchResult {\n let root: JsoncNode;\n try {\n root = parseJsonc(source);\n } catch (cause) {\n /* v8 ignore next 3 -- defensive: only JsoncError can be thrown here */\n const reason =\n cause instanceof JsoncError ? cause.message : String(cause);\n return { status: 'manual', reason: `could not be parsed (${reason})` };\n }\n\n if (root.kind !== 'object') {\n return { status: 'manual', reason: 'its root is not an object' };\n }\n\n const unit = detectIndentUnit(source);\n const compilerOptions = findMember(root, 'compilerOptions');\n\n // No `compilerOptions` at all — add it, with the plugin inside.\n if (!compilerOptions) {\n const edit = insertMember(\n source,\n root,\n 'compilerOptions',\n (indent) =>\n `{\\n${indent}${unit}\"plugins\": ${renderPluginsArray(\n `${indent}${unit}`,\n unit,\n config,\n )}\\n${indent}}`,\n unit,\n );\n return { status: 'patched', source: applyEdits(source, [edit]) };\n }\n\n if (compilerOptions.value.kind !== 'object') {\n return { status: 'manual', reason: '\"compilerOptions\" is not an object' };\n }\n\n const plugins = findMember(compilerOptions.value, 'plugins');\n\n // `compilerOptions` without `plugins` — add the array.\n if (!plugins) {\n const edit = insertMember(\n source,\n compilerOptions.value,\n 'plugins',\n (indent) => renderPluginsArray(indent, unit, config),\n unit,\n );\n return { status: 'patched', source: applyEdits(source, [edit]) };\n }\n\n if (plugins.value.kind !== 'array') {\n return { status: 'manual', reason: '\"compilerOptions.plugins\" is not an array' };\n }\n\n const existing = plugins.value.elements.find((element) => {\n const name = findMember(element, 'name');\n return (\n name?.value.kind === 'string' && name.value.value === GRAPHQLSP_PLUGIN\n );\n });\n\n // A graphqlsp entry is already there — update its fields in place rather\n // than appending a second, conflicting one.\n if (existing) {\n /* v8 ignore next 3 -- `findMember` only matches object elements */\n if (existing.kind !== 'object') {\n return { status: 'manual', reason: 'its graphqlsp plugin entry is not an object' };\n }\n const edits: Edit[] = [];\n for (const [key, value] of [\n ['schema', config.schema],\n ['tadaOutputLocation', config.tadaOutputLocation],\n ] as const) {\n const member = findMember(existing, key);\n if (member) {\n edits.push({\n start: member.value.start,\n end: member.value.end,\n text: JSON.stringify(value),\n });\n } else {\n edits.push(\n insertMember(source, existing, key, () => JSON.stringify(value), unit),\n );\n }\n }\n const patched = applyEdits(source, edits);\n return patched === source\n ? { status: 'unchanged' }\n : { status: 'patched', source: patched };\n }\n\n // Unrelated plugins are configured — append, never replace.\n const last = plugins.value.elements[plugins.value.elements.length - 1];\n if (last) {\n const indent = indentAt(source, last.start);\n return {\n status: 'patched',\n source: applyEdits(source, [\n {\n start: last.end,\n end: last.end,\n text: `,\\n${indent}${renderPluginEntry(indent, unit, config)}`,\n },\n ]),\n };\n }\n\n // An empty `plugins: []`.\n const closeIndent = indentAt(source, plugins.value.start);\n const entryIndent = `${closeIndent}${unit}`;\n return {\n status: 'patched',\n source: applyEdits(source, [\n {\n start: plugins.value.start + 1,\n end: plugins.value.end - 1,\n text: `\\n${entryIndent}${renderPluginEntry(\n entryIndent,\n unit,\n config,\n )}\\n${closeIndent}`,\n },\n ]),\n };\n}\n\n/** The block to print when the caller has to edit the file by hand. */\nexport function manualPluginBlock(config: TsconfigPluginConfig): string {\n return renderPluginEntry('', ' ', config);\n}\n","/**\n * The `fetch-contentful` CLI: `tada-init` and `tada-refresh`.\n *\n * Everything is driven through {@link CliIo} so the whole command surface is\n * testable without spawning a process — including the guarantee that a\n * `--dry-run` writes nothing and that the access token never reaches the\n * terminal.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, relative, resolve } from 'node:path';\nimport { readEnvSettings } from '../env.js';\nimport { parseArgs, type ParsedArgs } from './args.js';\nimport { formatBytes, lineDiff } from './diff.js';\nimport { CliError, redact } from './errors.js';\nimport {\n PACKAGE_NAME,\n relativeSpecifier,\n renderGraphqlModule,\n} from './graphql-module.js';\nimport { fetchSchemaSdl } from './introspect.js';\nimport {\n detectPackageManager,\n installCommand,\n missingDependencies,\n} from './package-manager.js';\nimport {\n GRAPHQLSP_PLUGIN,\n manualPluginBlock,\n patchTsconfig,\n} from './tsconfig.js';\n\nexport interface CliIo {\n /** Directory the command runs against. */\n cwd: string;\n fetch: typeof fetch;\n stdout: (line: string) => void;\n stderr: (line: string) => void;\n}\n\n/** Packages the generated setup needs the consumer to install. */\nconst REQUIRED_PEERS = ['gql.tada', GRAPHQLSP_PLUGIN];\n\nconst DEFAULTS = {\n schemaPath: './contentful-schema.graphql',\n tadaOutput: './src/contentful-env.d.ts',\n graphqlFile: './src/graphql.ts',\n tsconfig: './tsconfig.json',\n} as const;\n\n/** Width of the verb column in the action log. */\nconst VERB_WIDTH = 12;\n\nconst HELP = `fetch-contentful — gql.tada setup for a Contentful space\n\nUsage:\n fetch-contentful tada-init [options] Set up gql.tada in this project\n fetch-contentful tada-refresh [options] Re-download the schema only\n\nConfiguration (flags win over environment variables):\n --space <id> CONTENTFUL_SPACE_ID\n --environment <id> CONTENTFUL_ENVIRONMENT (default \"master\")\n --token <token> CONTENTFUL_ACCESS_TOKEN (Content Delivery API)\n\nPaths (relative to the working directory):\n --schema-path <path> default ${DEFAULTS.schemaPath}\n --tada-output <path> default ${DEFAULTS.tadaOutput}\n --graphql-file <path> default ${DEFAULTS.graphqlFile}\n --tsconfig <path> default ${DEFAULTS.tsconfig}\n\nOther:\n --dry-run Show what would change; write nothing\n --force Overwrite an existing graphql file (tada-init)\n --cwd <path> Run against another directory\n -h, --help Show this help\n\nThe NEXT_PUBLIC_-prefixed variable names are read as fallbacks, exactly as\nthe library reads them at runtime.`;\n\n/* ------------------------------------------------------------------ */\n/* Configuration */\n/* ------------------------------------------------------------------ */\n\ninterface Config {\n space: string;\n environment: string;\n token: string;\n}\n\nfunction resolveConfig(args: ParsedArgs): Config {\n const env = readEnvSettings();\n const space = args.values.space ?? env.space;\n // Introspection is a Content Delivery API operation, so there is only one\n // token in play here and the flag stays plain `--token`.\n const token = args.values.token ?? env.deliveryToken;\n const environment = args.values.environment ?? env.environment ?? 'master';\n\n const missing: string[] = [];\n if (!space) {\n missing.push(\n 'space (pass --space, or set CONTENTFUL_SPACE_ID / NEXT_PUBLIC_CONTENTFUL_SPACE_ID)',\n );\n }\n if (!token) {\n missing.push(\n 'access token (pass --token, or set CONTENTFUL_ACCESS_TOKEN / NEXT_PUBLIC_CONTENTFUL_ACCESS_TOKEN)',\n );\n }\n if (!space || !token) {\n throw new CliError(\n `Missing required Contentful configuration:\\n - ${missing.join(\n '\\n - ',\n )}`,\n );\n }\n return { space, environment, token };\n}\n\ninterface Paths {\n root: string;\n schema: string;\n tadaOutput: string;\n graphqlFile: string;\n tsconfig: string;\n}\n\nfunction resolvePaths(args: ParsedArgs, io: CliIo): Paths {\n const root = resolve(io.cwd, args.values.cwd ?? '.');\n const at = (value: string | undefined, fallback: string): string =>\n resolve(root, value ?? fallback);\n return {\n root,\n schema: at(args.values['schema-path'], DEFAULTS.schemaPath),\n tadaOutput: at(args.values['tada-output'], DEFAULTS.tadaOutput),\n graphqlFile: at(args.values['graphql-file'], DEFAULTS.graphqlFile),\n tsconfig: at(args.values.tsconfig, DEFAULTS.tsconfig),\n };\n}\n\n/** A path as the user would type it, for display. */\nfunction display(root: string, path: string): string {\n const shown = relative(root, path);\n return shown === '' || shown.startsWith('..') || isAbsolute(shown)\n ? path\n : shown;\n}\n\nfunction readIfExists(path: string): string | undefined {\n return existsSync(path) ? readFileSync(path, 'utf8') : undefined;\n}\n\n/* ------------------------------------------------------------------ */\n/* Planned changes */\n/* ------------------------------------------------------------------ */\n\ntype Preview = 'size' | 'diff' | 'content';\n\ntype Action =\n | {\n kind: 'write';\n path: string;\n before: string | undefined;\n after: string;\n preview: Preview;\n }\n | { kind: 'unchanged'; path: string }\n | { kind: 'skip'; path: string; reason: string }\n | { kind: 'manual'; path: string; reason: string; block: string };\n\n/** Plans the schema download, shared by both commands. */\nfunction planSchema(sdl: string, paths: Paths): Action {\n const before = readIfExists(paths.schema);\n if (before === sdl) return { kind: 'unchanged', path: paths.schema };\n return {\n kind: 'write',\n path: paths.schema,\n before,\n after: sdl,\n preview: 'size',\n };\n}\n\nfunction planTsconfig(paths: Paths): Action {\n const before = readIfExists(paths.tsconfig);\n if (before === undefined) {\n throw new CliError(\n `No tsconfig at ${display(paths.root, paths.tsconfig)}. ` +\n 'Pass --tsconfig if it lives elsewhere.',\n );\n }\n const config = {\n schema: relativeSpecifier(paths.tsconfig, paths.schema),\n tadaOutputLocation: relativeSpecifier(paths.tsconfig, paths.tadaOutput),\n };\n const result = patchTsconfig(before, config);\n if (result.status === 'unchanged') {\n return { kind: 'unchanged', path: paths.tsconfig };\n }\n if (result.status === 'manual') {\n return {\n kind: 'manual',\n path: paths.tsconfig,\n reason: result.reason,\n block: manualPluginBlock(config),\n };\n }\n return {\n kind: 'write',\n path: paths.tsconfig,\n before,\n after: result.source,\n preview: 'diff',\n };\n}\n\nfunction planGraphqlModule(paths: Paths, force: boolean): Action {\n const before = readIfExists(paths.graphqlFile);\n const after = renderGraphqlModule(\n relativeSpecifier(paths.graphqlFile, paths.tadaOutput),\n );\n if (before !== undefined && !force) {\n return {\n kind: 'skip',\n path: paths.graphqlFile,\n reason: 'already exists; pass --force to overwrite',\n };\n }\n if (before === after) return { kind: 'unchanged', path: paths.graphqlFile };\n return {\n kind: 'write',\n path: paths.graphqlFile,\n before,\n after,\n preview: 'content',\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Reporting and applying */\n/* ------------------------------------------------------------------ */\n\nfunction logAction(io: CliIo, verb: string, detail: string): void {\n io.stdout(` ${verb.padEnd(VERB_WIDTH)} ${detail}`);\n}\n\nfunction report(\n action: Action,\n paths: Paths,\n dryRun: boolean,\n io: CliIo,\n): void {\n const name = display(paths.root, action.path);\n if (action.kind === 'unchanged') {\n logAction(io, 'unchanged', name);\n return;\n }\n if (action.kind === 'skip') {\n logAction(io, 'skipped', `${name} (${action.reason})`);\n return;\n }\n if (action.kind === 'manual') {\n logAction(io, 'manual', `${name} (${action.reason})`);\n return;\n }\n\n const created = action.before === undefined;\n const verb = dryRun\n ? created\n ? 'would create'\n : 'would update'\n : created\n ? 'created'\n : 'updated';\n const size =\n action.preview === 'size'\n ? ` (${formatBytes(Buffer.byteLength(action.after))})`\n : '';\n logAction(io, verb, `${name}${size}`);\n\n if (!dryRun) return;\n\n if (action.preview === 'content') {\n for (const line of action.after.replace(/\\n$/, '').split('\\n')) {\n io.stdout(` + ${line}`);\n }\n return;\n }\n\n // Everything below compares against the file already on disk.\n if (action.before === undefined) return;\n\n if (action.preview === 'diff') {\n for (const line of lineDiff(action.before, action.after)) {\n io.stdout(` ${line}`);\n }\n return;\n }\n\n // Exact counts, not rounded ones: two files that both format as\n // \"23.1 kB\" would otherwise look identical.\n const beforeBytes = Buffer.byteLength(action.before);\n const afterBytes = Buffer.byteLength(action.after);\n const delta = afterBytes - beforeBytes;\n io.stdout(\n ` ${String(beforeBytes)} → ${String(afterBytes)} bytes (${\n delta >= 0 ? '+' : ''\n }${String(delta)})`,\n );\n}\n\nfunction apply(action: Action): void {\n if (action.kind !== 'write') return;\n mkdirSync(dirname(action.path), { recursive: true });\n writeFileSync(action.path, action.after, 'utf8');\n}\n\n/** Prints the manual tsconfig block, when patching was not safe. */\nfunction reportManual(action: Action, paths: Paths, io: CliIo): void {\n if (action.kind !== 'manual') return;\n io.stdout('');\n io.stdout(\n `${display(paths.root, action.path)} was left untouched because ${\n action.reason\n }.`,\n );\n io.stdout('Add this entry to \"compilerOptions.plugins\" by hand:');\n io.stdout('');\n for (const line of action.block.split('\\n')) io.stdout(` ${line}`);\n}\n\nfunction reportPeers(paths: Paths, io: CliIo): void {\n const missing = missingDependencies(paths.root, REQUIRED_PEERS);\n if (missing.length === 0) return;\n io.stdout('');\n io.stdout(`Install the packages the generated setup needs:`);\n io.stdout(` ${installCommand(detectPackageManager(paths.root), missing)}`);\n}\n\n/* ------------------------------------------------------------------ */\n/* Commands */\n/* ------------------------------------------------------------------ */\n\nasync function tadaInit(args: ParsedArgs, io: CliIo): Promise<number> {\n const config = resolveConfig(args);\n const paths = resolvePaths(args, io);\n const dryRun = args.flags.has('dry-run');\n\n // Planned before the network call, so a missing tsconfig fails fast.\n const tsconfigAction = planTsconfig(paths);\n const sdl = await fetchSchemaSdl({ ...config, fetch: io.fetch });\n\n // Everything is planned before anything is written, so a failure part-way\n // through cannot leave a half-configured project behind.\n const actions = [\n planSchema(sdl, paths),\n tsconfigAction,\n planGraphqlModule(paths, args.flags.has('force')),\n ];\n\n io.stdout(\n dryRun\n ? `Dry run — nothing will be written (space ${config.space}, environment ${config.environment}).`\n : `Configuring gql.tada for space ${config.space}, environment ${config.environment}.`,\n );\n for (const action of actions) {\n if (!dryRun) apply(action);\n report(action, paths, dryRun, io);\n }\n for (const action of actions) reportManual(action, paths, io);\n\n reportPeers(paths, io);\n\n // A dry run changed nothing, so there is nothing to do next.\n if (dryRun) return 0;\n\n io.stdout('');\n io.stdout('Next steps:');\n io.stdout(` 1. Restart the TypeScript server so ${GRAPHQLSP_PLUGIN} loads.`);\n io.stdout(\n ` 2. Write a query with the \\`graphql\\` helper from ${display(\n paths.root,\n paths.graphqlFile,\n )},`,\n );\n io.stdout(\n ` then pass it to fetchContentful from ${PACKAGE_NAME}.`,\n );\n io.stdout(' Result and variable types are inferred from the document.');\n io.stdout(\n ' 3. After a content-model change, run `fetch-contentful tada-refresh`.',\n );\n return 0;\n}\n\nasync function tadaRefresh(args: ParsedArgs, io: CliIo): Promise<number> {\n const config = resolveConfig(args);\n const paths = resolvePaths(args, io);\n const dryRun = args.flags.has('dry-run');\n\n const sdl = await fetchSchemaSdl({ ...config, fetch: io.fetch });\n const action = planSchema(sdl, paths);\n\n if (action.kind === 'unchanged') {\n // Leave the file's mtime alone: an unchanged schema should not show up\n // in `git status`, and should not invalidate a build cache.\n io.stdout(\n `Schema is already up to date — ${display(\n paths.root,\n paths.schema,\n )} left untouched.`,\n );\n return 0;\n }\n\n if (!dryRun) apply(action);\n report(action, paths, dryRun, io);\n return 0;\n}\n\n/* ------------------------------------------------------------------ */\n/* Entry point */\n/* ------------------------------------------------------------------ */\n\nasync function dispatch(argv: string[], io: CliIo): Promise<number> {\n const args = parseArgs(argv);\n // Accept both `tada-init` and `tada init`.\n const command = args.positionals.join('-');\n\n if (args.flags.has('help') || command === '' || command === 'help') {\n io.stdout(HELP);\n return 0;\n }\n if (command === 'tada-init') return tadaInit(args, io);\n if (command === 'tada-refresh') return tadaRefresh(args, io);\n\n throw new CliError(\n `Unknown command \"${args.positionals.join(\n ' ',\n )}\". Run with --help to see the available commands.`,\n );\n}\n\n/** Any token reachable from the environment or the command line. */\nfunction knownTokens(argv: string[]): Array<string | undefined> {\n const env = readEnvSettings();\n const tokens: Array<string | undefined> = [\n env.deliveryToken,\n env.previewToken,\n ];\n for (const [index, argument] of argv.entries()) {\n if (argument.startsWith('--token=')) tokens.push(argument.slice(8));\n else if (argument === '--token') tokens.push(argv[index + 1]);\n }\n return tokens;\n}\n\n/**\n * Runs the CLI and resolves with the process exit code. Never rejects, and\n * never prints the access token.\n */\nexport async function run(argv: string[], io: CliIo): Promise<number> {\n try {\n return await dispatch(argv, io);\n } catch (error) {\n const raw =\n error instanceof CliError\n ? error.message\n : `Unexpected failure: ${String(error)}`;\n let message = raw;\n for (const token of knownTokens(argv)) message = redact(message, token);\n io.stderr(`error: ${message}`);\n return 1;\n }\n}\n","#!/usr/bin/env node\n/**\n * The `fetch-contentful` binary.\n *\n * A thin shell around {@link run}: everything worth testing lives there,\n * reached without spawning a process.\n */\n\nimport { run } from './run.js';\n\nconst code = await run(process.argv.slice(2), {\n cwd: process.cwd(),\n fetch: globalThis.fetch,\n stdout: (line) => process.stdout.write(`${line}\\n`),\n stderr: (line) => process.stderr.write(`${line}\\n`),\n});\nprocess.exitCode = code;\n"]}