[{"data":1,"prerenderedAt":2349},["ShallowReactive",2],{"docs-\u002Fcore":3},{"id":4,"title":5,"body":6,"description":2342,"extension":2343,"meta":2344,"navigation":154,"path":2345,"seo":2346,"stem":2347,"__hash__":2348},"docs\u002Fdocs\u002Fcore.md","Cachely JavaScript SDK",{"type":7,"value":8,"toc":2311},"minimark",[9,14,18,21,32,35,40,65,80,82,86,89,97,102,104,108,113,315,319,443,447,566,568,572,579,720,722,726,732,739,839,844,944,946,952,963,1069,1071,1077,1091,1182,1184,1190,1196,1298,1300,1306,1309,1407,1420,1422,1428,1435,1569,1587,1590,1596,1598,1604,1610,1648,1650,1654,1657,1709,1717,1755,1757,1760,1794,1816,1836,1843,1845,1849,1852,1932,1934,1938,1945,1948,2104,2110,2113,2291,2293,2297,2307],[10,11,13],"h1",{"id":12},"synchronized-studiocmsassets-core","@synchronized-studio\u002Fcmsassets-core",[15,16,17],"p",{},"Universal JavaScript SDK for Cachely. Routes CMS API and asset requests through your tenant's proxy — adding edge caching, image optimization, and server-side token injection without changing your application logic.",[15,19,20],{},"Works in any JavaScript environment: Node.js 18+, browsers, Cloudflare Workers, Deno.",[15,22,23,27,28],{},[24,25,26],"strong",{},"Built-in providers:"," Contentful, Prismic — plus any CMS via ",[29,30,31],"code",{},"createGenericProvider",[33,34],"hr",{},[36,37,39],"h2",{"id":38},"install","Install",[41,42,47],"pre",{"className":43,"code":44,"language":45,"meta":46,"style":46},"language-bash shiki shiki-themes github-dark","npm install @synchronized-studio\u002Fcmsassets-core\n","bash","",[29,48,49],{"__ignoreMap":46},[50,51,54,58,62],"span",{"class":52,"line":53},"line",1,[50,55,57],{"class":56},"svObZ","npm",[50,59,61],{"class":60},"sU2Wk"," install",[50,63,64],{"class":60}," @synchronized-studio\u002Fcmsassets-core\n",[41,66,68],{"className":43,"code":67,"language":45,"meta":46,"style":46},"pnpm add @synchronized-studio\u002Fcmsassets-core\n",[29,69,70],{"__ignoreMap":46},[50,71,72,75,78],{"class":52,"line":53},[50,73,74],{"class":56},"pnpm",[50,76,77],{"class":60}," add",[50,79,64],{"class":60},[33,81],{},[36,83,85],{"id":84},"how-it-works","How it works",[15,87,88],{},"Instead of calling Contentful or Prismic directly, requests go through your tenant's proxy endpoint:",[41,90,95],{"className":91,"code":93,"language":94},[92],"language-text","Your app\n  → Cachely edge (tenant.cmsassets.com)\n    → Contentful \u002F Prismic \u002F ...\n","text",[29,96,93],{"__ignoreMap":46},[15,98,99,101],{},[29,100,13],{}," handles the URL rewriting at the transport layer. You configure it once and drop it into your CMS SDK — no other code changes needed.",[33,103],{},[36,105,107],{"id":106},"quick-start","Quick start",[109,110,112],"h3",{"id":111},"contentful","Contentful",[41,114,118],{"className":115,"code":116,"language":117,"meta":46,"style":46},"language-ts shiki shiki-themes github-dark","import { createCmsAssetsFetch } from '@synchronized-studio\u002Fcmsassets-core'\nimport { createClient } from 'contentful'\n\nconst cmsFetch = createCmsAssetsFetch({\n  tenant: 'my-site',          \u002F\u002F your Cachely tenant slug\n  provider: 'contentful',\n  providerConfig: {\n    spaceId: 'abc123xyz',     \u002F\u002F your Contentful space ID\n  },\n})\n\nconst client = createClient({\n  space: 'abc123xyz',\n  accessToken: '',            \u002F\u002F leave empty — injected server-side by the proxy\n  adapter: cmsFetch,\n})\n\n\u002F\u002F All API calls go through the proxy automatically:\n\u002F\u002F https:\u002F\u002Fcdn.contentful.com\u002Fspaces\u002Fabc123xyz\u002Fentries\n\u002F\u002F → https:\u002F\u002Fmy-site.cmsassets.com\u002F~api\u002Fspaces\u002Fabc123xyz\u002Fentries\n","ts",[29,119,120,136,149,156,175,191,203,209,224,230,236,241,256,266,281,287,292,297,303,309],{"__ignoreMap":46},[50,121,122,126,130,133],{"class":52,"line":53},[50,123,125],{"class":124},"snl16","import",[50,127,129],{"class":128},"s95oV"," { createCmsAssetsFetch } ",[50,131,132],{"class":124},"from",[50,134,135],{"class":60}," '@synchronized-studio\u002Fcmsassets-core'\n",[50,137,139,141,144,146],{"class":52,"line":138},2,[50,140,125],{"class":124},[50,142,143],{"class":128}," { createClient } ",[50,145,132],{"class":124},[50,147,148],{"class":60}," 'contentful'\n",[50,150,152],{"class":52,"line":151},3,[50,153,155],{"emptyLinePlaceholder":154},true,"\n",[50,157,159,162,166,169,172],{"class":52,"line":158},4,[50,160,161],{"class":124},"const",[50,163,165],{"class":164},"sDLfK"," cmsFetch",[50,167,168],{"class":124}," =",[50,170,171],{"class":56}," createCmsAssetsFetch",[50,173,174],{"class":128},"({\n",[50,176,178,181,184,187],{"class":52,"line":177},5,[50,179,180],{"class":128},"  tenant: ",[50,182,183],{"class":60},"'my-site'",[50,185,186],{"class":128},",          ",[50,188,190],{"class":189},"sAwPA","\u002F\u002F your Cachely tenant slug\n",[50,192,194,197,200],{"class":52,"line":193},6,[50,195,196],{"class":128},"  provider: ",[50,198,199],{"class":60},"'contentful'",[50,201,202],{"class":128},",\n",[50,204,206],{"class":52,"line":205},7,[50,207,208],{"class":128},"  providerConfig: {\n",[50,210,212,215,218,221],{"class":52,"line":211},8,[50,213,214],{"class":128},"    spaceId: ",[50,216,217],{"class":60},"'abc123xyz'",[50,219,220],{"class":128},",     ",[50,222,223],{"class":189},"\u002F\u002F your Contentful space ID\n",[50,225,227],{"class":52,"line":226},9,[50,228,229],{"class":128},"  },\n",[50,231,233],{"class":52,"line":232},10,[50,234,235],{"class":128},"})\n",[50,237,239],{"class":52,"line":238},11,[50,240,155],{"emptyLinePlaceholder":154},[50,242,244,246,249,251,254],{"class":52,"line":243},12,[50,245,161],{"class":124},[50,247,248],{"class":164}," client",[50,250,168],{"class":124},[50,252,253],{"class":56}," createClient",[50,255,174],{"class":128},[50,257,259,262,264],{"class":52,"line":258},13,[50,260,261],{"class":128},"  space: ",[50,263,217],{"class":60},[50,265,202],{"class":128},[50,267,269,272,275,278],{"class":52,"line":268},14,[50,270,271],{"class":128},"  accessToken: ",[50,273,274],{"class":60},"''",[50,276,277],{"class":128},",            ",[50,279,280],{"class":189},"\u002F\u002F leave empty — injected server-side by the proxy\n",[50,282,284],{"class":52,"line":283},15,[50,285,286],{"class":128},"  adapter: cmsFetch,\n",[50,288,290],{"class":52,"line":289},16,[50,291,235],{"class":128},[50,293,295],{"class":52,"line":294},17,[50,296,155],{"emptyLinePlaceholder":154},[50,298,300],{"class":52,"line":299},18,[50,301,302],{"class":189},"\u002F\u002F All API calls go through the proxy automatically:\n",[50,304,306],{"class":52,"line":305},19,[50,307,308],{"class":189},"\u002F\u002F https:\u002F\u002Fcdn.contentful.com\u002Fspaces\u002Fabc123xyz\u002Fentries\n",[50,310,312],{"class":52,"line":311},20,[50,313,314],{"class":189},"\u002F\u002F → https:\u002F\u002Fmy-site.cmsassets.com\u002F~api\u002Fspaces\u002Fabc123xyz\u002Fentries\n",[109,316,318],{"id":317},"prismic","Prismic",[41,320,322],{"className":115,"code":321,"language":117,"meta":46,"style":46},"import { createCmsAssetsFetch } from '@synchronized-studio\u002Fcmsassets-core'\nimport * as prismic from '@prismicio\u002Fclient'\n\nconst cmsFetch = createCmsAssetsFetch({\n  tenant: 'my-site',\n  provider: 'prismic',\n})\n\nconst client = prismic.createClient('my-repo', {\n  fetch: cmsFetch,\n})\n\n\u002F\u002F All API calls go through the proxy automatically:\n\u002F\u002F https:\u002F\u002Fmy-repo.cdn.prismic.io\u002Fapi\u002Fv2\u002Fdocuments\u002Fsearch?ref=...\n\u002F\u002F → https:\u002F\u002Fmy-site.cmsassets.com\u002F~api\u002Fapi\u002Fv2\u002Fdocuments\u002Fsearch?ref=...\n",[29,323,324,334,352,356,368,376,385,389,393,416,421,425,429,433,438],{"__ignoreMap":46},[50,325,326,328,330,332],{"class":52,"line":53},[50,327,125],{"class":124},[50,329,129],{"class":128},[50,331,132],{"class":124},[50,333,135],{"class":60},[50,335,336,338,341,344,347,349],{"class":52,"line":138},[50,337,125],{"class":124},[50,339,340],{"class":164}," *",[50,342,343],{"class":124}," as",[50,345,346],{"class":128}," prismic ",[50,348,132],{"class":124},[50,350,351],{"class":60}," '@prismicio\u002Fclient'\n",[50,353,354],{"class":52,"line":151},[50,355,155],{"emptyLinePlaceholder":154},[50,357,358,360,362,364,366],{"class":52,"line":158},[50,359,161],{"class":124},[50,361,165],{"class":164},[50,363,168],{"class":124},[50,365,171],{"class":56},[50,367,174],{"class":128},[50,369,370,372,374],{"class":52,"line":177},[50,371,180],{"class":128},[50,373,183],{"class":60},[50,375,202],{"class":128},[50,377,378,380,383],{"class":52,"line":193},[50,379,196],{"class":128},[50,381,382],{"class":60},"'prismic'",[50,384,202],{"class":128},[50,386,387],{"class":52,"line":205},[50,388,235],{"class":128},[50,390,391],{"class":52,"line":211},[50,392,155],{"emptyLinePlaceholder":154},[50,394,395,397,399,401,404,407,410,413],{"class":52,"line":226},[50,396,161],{"class":124},[50,398,248],{"class":164},[50,400,168],{"class":124},[50,402,403],{"class":128}," prismic.",[50,405,406],{"class":56},"createClient",[50,408,409],{"class":128},"(",[50,411,412],{"class":60},"'my-repo'",[50,414,415],{"class":128},", {\n",[50,417,418],{"class":52,"line":232},[50,419,420],{"class":128},"  fetch: cmsFetch,\n",[50,422,423],{"class":52,"line":238},[50,424,235],{"class":128},[50,426,427],{"class":52,"line":243},[50,428,155],{"emptyLinePlaceholder":154},[50,430,431],{"class":52,"line":258},[50,432,302],{"class":189},[50,434,435],{"class":52,"line":268},[50,436,437],{"class":189},"\u002F\u002F https:\u002F\u002Fmy-repo.cdn.prismic.io\u002Fapi\u002Fv2\u002Fdocuments\u002Fsearch?ref=...\n",[50,439,440],{"class":52,"line":283},[50,441,442],{"class":189},"\u002F\u002F → https:\u002F\u002Fmy-site.cmsassets.com\u002F~api\u002Fapi\u002Fv2\u002Fdocuments\u002Fsearch?ref=...\n",[109,444,446],{"id":445},"any-cms-via-generic-provider","Any CMS via generic provider",[41,448,450],{"className":115,"code":449,"language":117,"meta":46,"style":46},"import { createGenericProvider, createCmsAssetsFetch } from '@synchronized-studio\u002Fcmsassets-core'\n\nconst storyblok = createGenericProvider({\n  id: 'storyblok',\n  apiHosts: ['api.storyblok.com'],\n  assetHosts: ['a.storyblok.com'],\n})\n\nconst cmsFetch = createCmsAssetsFetch({\n  tenant: 'my-site',\n  provider: storyblok,   \u002F\u002F pass ProviderDefinition directly — no registry needed\n})\n\n\u002F\u002F https:\u002F\u002Fapi.storyblok.com\u002Fv2\u002Fstories → https:\u002F\u002Fmy-site.cmsassets.com\u002F~api\u002Fv2\u002Fstories\n\u002F\u002F https:\u002F\u002Fa.storyblok.com\u002Ff\u002F123\u002Fhero.jpg → https:\u002F\u002Fmy-site.cmsassets.com\u002Ff\u002F123\u002Fhero.jpg\n",[29,451,452,463,467,481,491,502,512,516,520,532,540,548,552,556,561],{"__ignoreMap":46},[50,453,454,456,459,461],{"class":52,"line":53},[50,455,125],{"class":124},[50,457,458],{"class":128}," { createGenericProvider, createCmsAssetsFetch } ",[50,460,132],{"class":124},[50,462,135],{"class":60},[50,464,465],{"class":52,"line":138},[50,466,155],{"emptyLinePlaceholder":154},[50,468,469,471,474,476,479],{"class":52,"line":151},[50,470,161],{"class":124},[50,472,473],{"class":164}," storyblok",[50,475,168],{"class":124},[50,477,478],{"class":56}," createGenericProvider",[50,480,174],{"class":128},[50,482,483,486,489],{"class":52,"line":158},[50,484,485],{"class":128},"  id: ",[50,487,488],{"class":60},"'storyblok'",[50,490,202],{"class":128},[50,492,493,496,499],{"class":52,"line":177},[50,494,495],{"class":128},"  apiHosts: [",[50,497,498],{"class":60},"'api.storyblok.com'",[50,500,501],{"class":128},"],\n",[50,503,504,507,510],{"class":52,"line":193},[50,505,506],{"class":128},"  assetHosts: [",[50,508,509],{"class":60},"'a.storyblok.com'",[50,511,501],{"class":128},[50,513,514],{"class":52,"line":205},[50,515,235],{"class":128},[50,517,518],{"class":52,"line":211},[50,519,155],{"emptyLinePlaceholder":154},[50,521,522,524,526,528,530],{"class":52,"line":226},[50,523,161],{"class":124},[50,525,165],{"class":164},[50,527,168],{"class":124},[50,529,171],{"class":56},[50,531,174],{"class":128},[50,533,534,536,538],{"class":52,"line":232},[50,535,180],{"class":128},[50,537,183],{"class":60},[50,539,202],{"class":128},[50,541,542,545],{"class":52,"line":238},[50,543,544],{"class":128},"  provider: storyblok,   ",[50,546,547],{"class":189},"\u002F\u002F pass ProviderDefinition directly — no registry needed\n",[50,549,550],{"class":52,"line":243},[50,551,235],{"class":128},[50,553,554],{"class":52,"line":258},[50,555,155],{"emptyLinePlaceholder":154},[50,557,558],{"class":52,"line":268},[50,559,560],{"class":189},"\u002F\u002F https:\u002F\u002Fapi.storyblok.com\u002Fv2\u002Fstories → https:\u002F\u002Fmy-site.cmsassets.com\u002F~api\u002Fv2\u002Fstories\n",[50,562,563],{"class":52,"line":283},[50,564,565],{"class":189},"\u002F\u002F https:\u002F\u002Fa.storyblok.com\u002Ff\u002F123\u002Fhero.jpg → https:\u002F\u002Fmy-site.cmsassets.com\u002Ff\u002F123\u002Fhero.jpg\n",[33,567],{},[36,569,571],{"id":570},"url-rewriting-without-fetch","URL rewriting without fetch",[15,573,574,575,578],{},"Use ",[29,576,577],{},"createUrlRewriter"," when you need to transform URLs without intercepting fetch — useful for server-side response body processing, logging, or building custom adapters.",[41,580,582],{"className":115,"code":581,"language":117,"meta":46,"style":46},"import { createUrlRewriter } from '@synchronized-studio\u002Fcmsassets-core'\n\nconst rewrite = createUrlRewriter({\n  tenant: 'my-site',\n  provider: 'contentful',\n  providerConfig: { spaceId: 'abc123xyz' },\n})\n\n\u002F\u002F API URL\nrewrite('https:\u002F\u002Fcdn.contentful.com\u002Fspaces\u002Fabc123xyz\u002Fentries?locale=en')\n\u002F\u002F → { url: 'https:\u002F\u002Fmy-site.cmsassets.com\u002F~api\u002Fspaces\u002Fabc123xyz\u002Fentries?locale=en', kind: 'api', rewritten: true }\n\n\u002F\u002F Asset URL — image optimization params are preserved\nrewrite('https:\u002F\u002Fimages.ctfassets.net\u002Fabc123xyz\u002FassetId\u002Ftoken\u002Fhero.jpg?w=1200&fm=webp')\n\u002F\u002F → { url: 'https:\u002F\u002Fmy-site.cmsassets.com\u002FassetId\u002Ftoken\u002Fhero.jpg?w=1200&fm=webp', kind: 'asset', rewritten: true }\n\n\u002F\u002F Non-CMS URL — passes through unchanged\nrewrite('https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter')\n\u002F\u002F → { url: 'https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter', kind: 'unknown', rewritten: false }\n",[29,583,584,595,599,613,621,629,639,643,647,652,665,670,674,679,690,695,699,704,715],{"__ignoreMap":46},[50,585,586,588,591,593],{"class":52,"line":53},[50,587,125],{"class":124},[50,589,590],{"class":128}," { createUrlRewriter } ",[50,592,132],{"class":124},[50,594,135],{"class":60},[50,596,597],{"class":52,"line":138},[50,598,155],{"emptyLinePlaceholder":154},[50,600,601,603,606,608,611],{"class":52,"line":151},[50,602,161],{"class":124},[50,604,605],{"class":164}," rewrite",[50,607,168],{"class":124},[50,609,610],{"class":56}," createUrlRewriter",[50,612,174],{"class":128},[50,614,615,617,619],{"class":52,"line":158},[50,616,180],{"class":128},[50,618,183],{"class":60},[50,620,202],{"class":128},[50,622,623,625,627],{"class":52,"line":177},[50,624,196],{"class":128},[50,626,199],{"class":60},[50,628,202],{"class":128},[50,630,631,634,636],{"class":52,"line":193},[50,632,633],{"class":128},"  providerConfig: { spaceId: ",[50,635,217],{"class":60},[50,637,638],{"class":128}," },\n",[50,640,641],{"class":52,"line":205},[50,642,235],{"class":128},[50,644,645],{"class":52,"line":211},[50,646,155],{"emptyLinePlaceholder":154},[50,648,649],{"class":52,"line":226},[50,650,651],{"class":189},"\u002F\u002F API URL\n",[50,653,654,657,659,662],{"class":52,"line":232},[50,655,656],{"class":56},"rewrite",[50,658,409],{"class":128},[50,660,661],{"class":60},"'https:\u002F\u002Fcdn.contentful.com\u002Fspaces\u002Fabc123xyz\u002Fentries?locale=en'",[50,663,664],{"class":128},")\n",[50,666,667],{"class":52,"line":238},[50,668,669],{"class":189},"\u002F\u002F → { url: 'https:\u002F\u002Fmy-site.cmsassets.com\u002F~api\u002Fspaces\u002Fabc123xyz\u002Fentries?locale=en', kind: 'api', rewritten: true }\n",[50,671,672],{"class":52,"line":243},[50,673,155],{"emptyLinePlaceholder":154},[50,675,676],{"class":52,"line":258},[50,677,678],{"class":189},"\u002F\u002F Asset URL — image optimization params are preserved\n",[50,680,681,683,685,688],{"class":52,"line":268},[50,682,656],{"class":56},[50,684,409],{"class":128},[50,686,687],{"class":60},"'https:\u002F\u002Fimages.ctfassets.net\u002Fabc123xyz\u002FassetId\u002Ftoken\u002Fhero.jpg?w=1200&fm=webp'",[50,689,664],{"class":128},[50,691,692],{"class":52,"line":283},[50,693,694],{"class":189},"\u002F\u002F → { url: 'https:\u002F\u002Fmy-site.cmsassets.com\u002FassetId\u002Ftoken\u002Fhero.jpg?w=1200&fm=webp', kind: 'asset', rewritten: true }\n",[50,696,697],{"class":52,"line":289},[50,698,155],{"emptyLinePlaceholder":154},[50,700,701],{"class":52,"line":294},[50,702,703],{"class":189},"\u002F\u002F Non-CMS URL — passes through unchanged\n",[50,705,706,708,710,713],{"class":52,"line":299},[50,707,656],{"class":56},[50,709,409],{"class":128},[50,711,712],{"class":60},"'https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter'",[50,714,664],{"class":128},[50,716,717],{"class":52,"line":305},[50,718,719],{"class":189},"\u002F\u002F → { url: 'https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter', kind: 'unknown', rewritten: false }\n",[33,721],{},[36,723,725],{"id":724},"api-reference","API reference",[109,727,729],{"id":728},"createcmsassetsfetchoptions",[29,730,731],{},"createCmsAssetsFetch(options)",[15,733,734,735,738],{},"Returns a ",[29,736,737],{},"fetch","-compatible function that rewrites CMS URLs through the proxy. Safe to use as a global fetch replacement — non-CMS requests pass through unchanged.",[41,740,742],{"className":115,"code":741,"language":117,"meta":46,"style":46},"const cmsFetch = createCmsAssetsFetch({\n  tenant: 'my-site',          \u002F\u002F required — Cachely tenant slug\n  provider: 'contentful',     \u002F\u002F required — provider id string OR a ProviderDefinition object\n  providerConfig: {           \u002F\u002F optional — provider-specific config\n    spaceId: 'abc123xyz',     \u002F\u002F   Contentful: spaceId\n  },\n  enableApiProxy: true,       \u002F\u002F optional — rewrite API requests (default: true)\n  enableAssetProxy: true,     \u002F\u002F optional — rewrite asset requests (default: true)\n  registry: myRegistry,       \u002F\u002F optional — custom provider registry (used when provider is a string)\n})\n",[29,743,744,756,767,778,786,797,801,815,827,835],{"__ignoreMap":46},[50,745,746,748,750,752,754],{"class":52,"line":53},[50,747,161],{"class":124},[50,749,165],{"class":164},[50,751,168],{"class":124},[50,753,171],{"class":56},[50,755,174],{"class":128},[50,757,758,760,762,764],{"class":52,"line":138},[50,759,180],{"class":128},[50,761,183],{"class":60},[50,763,186],{"class":128},[50,765,766],{"class":189},"\u002F\u002F required — Cachely tenant slug\n",[50,768,769,771,773,775],{"class":52,"line":151},[50,770,196],{"class":128},[50,772,199],{"class":60},[50,774,220],{"class":128},[50,776,777],{"class":189},"\u002F\u002F required — provider id string OR a ProviderDefinition object\n",[50,779,780,783],{"class":52,"line":158},[50,781,782],{"class":128},"  providerConfig: {           ",[50,784,785],{"class":189},"\u002F\u002F optional — provider-specific config\n",[50,787,788,790,792,794],{"class":52,"line":177},[50,789,214],{"class":128},[50,791,217],{"class":60},[50,793,220],{"class":128},[50,795,796],{"class":189},"\u002F\u002F   Contentful: spaceId\n",[50,798,799],{"class":52,"line":193},[50,800,229],{"class":128},[50,802,803,806,809,812],{"class":52,"line":205},[50,804,805],{"class":128},"  enableApiProxy: ",[50,807,808],{"class":164},"true",[50,810,811],{"class":128},",       ",[50,813,814],{"class":189},"\u002F\u002F optional — rewrite API requests (default: true)\n",[50,816,817,820,822,824],{"class":52,"line":211},[50,818,819],{"class":128},"  enableAssetProxy: ",[50,821,808],{"class":164},[50,823,220],{"class":128},[50,825,826],{"class":189},"\u002F\u002F optional — rewrite asset requests (default: true)\n",[50,828,829,832],{"class":52,"line":226},[50,830,831],{"class":128},"  registry: myRegistry,       ",[50,833,834],{"class":189},"\u002F\u002F optional — custom provider registry (used when provider is a string)\n",[50,836,837],{"class":52,"line":232},[50,838,235],{"class":128},[15,840,841],{},[24,842,843],{},"Selective proxying:",[41,845,847],{"className":115,"code":846,"language":117,"meta":46,"style":46},"\u002F\u002F Asset proxy only — API calls go directly to Contentful\nconst cmsFetch = createCmsAssetsFetch({\n  tenant: 'my-site',\n  provider: 'contentful',\n  enableApiProxy: false,\n})\n\n\u002F\u002F API proxy only — images are not proxied\nconst cmsFetch = createCmsAssetsFetch({\n  tenant: 'my-site',\n  provider: 'prismic',\n  enableAssetProxy: false,\n})\n",[29,848,849,854,866,874,882,891,895,899,904,916,924,932,940],{"__ignoreMap":46},[50,850,851],{"class":52,"line":53},[50,852,853],{"class":189},"\u002F\u002F Asset proxy only — API calls go directly to Contentful\n",[50,855,856,858,860,862,864],{"class":52,"line":138},[50,857,161],{"class":124},[50,859,165],{"class":164},[50,861,168],{"class":124},[50,863,171],{"class":56},[50,865,174],{"class":128},[50,867,868,870,872],{"class":52,"line":151},[50,869,180],{"class":128},[50,871,183],{"class":60},[50,873,202],{"class":128},[50,875,876,878,880],{"class":52,"line":158},[50,877,196],{"class":128},[50,879,199],{"class":60},[50,881,202],{"class":128},[50,883,884,886,889],{"class":52,"line":177},[50,885,805],{"class":128},[50,887,888],{"class":164},"false",[50,890,202],{"class":128},[50,892,893],{"class":52,"line":193},[50,894,235],{"class":128},[50,896,897],{"class":52,"line":205},[50,898,155],{"emptyLinePlaceholder":154},[50,900,901],{"class":52,"line":211},[50,902,903],{"class":189},"\u002F\u002F API proxy only — images are not proxied\n",[50,905,906,908,910,912,914],{"class":52,"line":226},[50,907,161],{"class":124},[50,909,165],{"class":164},[50,911,168],{"class":124},[50,913,171],{"class":56},[50,915,174],{"class":128},[50,917,918,920,922],{"class":52,"line":232},[50,919,180],{"class":128},[50,921,183],{"class":60},[50,923,202],{"class":128},[50,925,926,928,930],{"class":52,"line":238},[50,927,196],{"class":128},[50,929,382],{"class":60},[50,931,202],{"class":128},[50,933,934,936,938],{"class":52,"line":243},[50,935,819],{"class":128},[50,937,888],{"class":164},[50,939,202],{"class":128},[50,941,942],{"class":52,"line":258},[50,943,235],{"class":128},[33,945],{},[109,947,949],{"id":948},"createurlrewriteroptions",[29,950,951],{},"createUrlRewriter(options)",[15,953,954,955,958,959,962],{},"Returns a bound ",[29,956,957],{},"(url: string | URL) => RewriteResult"," function. Same options as ",[29,960,961],{},"createCmsAssetsFetch",".",[41,964,966],{"className":115,"code":965,"language":117,"meta":46,"style":46},"import { createUrlRewriter } from '@synchronized-studio\u002Fcmsassets-core'\n\nconst rewrite = createUrlRewriter({\n  tenant: 'my-site',\n  provider: 'prismic',\n})\n\nconst { url, kind, rewritten } = rewrite('https:\u002F\u002Fimages.prismic.io\u002Fmy-repo\u002Fhero.jpg?w=800&fm=webp')\n\u002F\u002F url:       'https:\u002F\u002Fmy-site.cmsassets.com\u002Fmy-repo\u002Fhero.jpg?w=800&fm=webp'\n\u002F\u002F kind:      'asset'\n\u002F\u002F rewritten: true\n",[29,967,968,978,982,994,1002,1010,1014,1018,1054,1059,1064],{"__ignoreMap":46},[50,969,970,972,974,976],{"class":52,"line":53},[50,971,125],{"class":124},[50,973,590],{"class":128},[50,975,132],{"class":124},[50,977,135],{"class":60},[50,979,980],{"class":52,"line":138},[50,981,155],{"emptyLinePlaceholder":154},[50,983,984,986,988,990,992],{"class":52,"line":151},[50,985,161],{"class":124},[50,987,605],{"class":164},[50,989,168],{"class":124},[50,991,610],{"class":56},[50,993,174],{"class":128},[50,995,996,998,1000],{"class":52,"line":158},[50,997,180],{"class":128},[50,999,183],{"class":60},[50,1001,202],{"class":128},[50,1003,1004,1006,1008],{"class":52,"line":177},[50,1005,196],{"class":128},[50,1007,382],{"class":60},[50,1009,202],{"class":128},[50,1011,1012],{"class":52,"line":193},[50,1013,235],{"class":128},[50,1015,1016],{"class":52,"line":205},[50,1017,155],{"emptyLinePlaceholder":154},[50,1019,1020,1022,1025,1028,1031,1034,1036,1039,1042,1045,1047,1049,1052],{"class":52,"line":211},[50,1021,161],{"class":124},[50,1023,1024],{"class":128}," { ",[50,1026,1027],{"class":164},"url",[50,1029,1030],{"class":128},", ",[50,1032,1033],{"class":164},"kind",[50,1035,1030],{"class":128},[50,1037,1038],{"class":164},"rewritten",[50,1040,1041],{"class":128}," } ",[50,1043,1044],{"class":124},"=",[50,1046,605],{"class":56},[50,1048,409],{"class":128},[50,1050,1051],{"class":60},"'https:\u002F\u002Fimages.prismic.io\u002Fmy-repo\u002Fhero.jpg?w=800&fm=webp'",[50,1053,664],{"class":128},[50,1055,1056],{"class":52,"line":226},[50,1057,1058],{"class":189},"\u002F\u002F url:       'https:\u002F\u002Fmy-site.cmsassets.com\u002Fmy-repo\u002Fhero.jpg?w=800&fm=webp'\n",[50,1060,1061],{"class":52,"line":232},[50,1062,1063],{"class":189},"\u002F\u002F kind:      'asset'\n",[50,1065,1066],{"class":52,"line":238},[50,1067,1068],{"class":189},"\u002F\u002F rewritten: true\n",[33,1070],{},[109,1072,1074],{"id":1073},"classifyurlurl-provider",[29,1075,1076],{},"classifyUrl(url, provider)",[15,1078,1079,1080,1030,1083,1086,1087,1090],{},"Classify a URL as ",[29,1081,1082],{},"'api'",[29,1084,1085],{},"'asset'",", or ",[29,1088,1089],{},"'unknown'"," based on its hostname.",[41,1092,1094],{"className":115,"code":1093,"language":117,"meta":46,"style":46},"import { classifyUrl, contentful, prismic } from '@synchronized-studio\u002Fcmsassets-core'\n\nclassifyUrl('https:\u002F\u002Fcdn.contentful.com\u002Fspaces\u002Fabc\u002Fentries', contentful)  \u002F\u002F 'api'\nclassifyUrl('https:\u002F\u002Fimages.ctfassets.net\u002Fabc\u002FassetId\u002Ftoken\u002Fimg.jpg', contentful)  \u002F\u002F 'asset'\nclassifyUrl('https:\u002F\u002Fmy-repo.cdn.prismic.io\u002Fapi\u002Fv2\u002Fdocuments\u002Fsearch', prismic)  \u002F\u002F 'api'\nclassifyUrl('https:\u002F\u002Fimages.prismic.io\u002Fmy-repo\u002Fphoto.jpg', prismic)  \u002F\u002F 'asset'\nclassifyUrl('https:\u002F\u002Fexample.com\u002Flogo.svg', contentful)  \u002F\u002F 'unknown'\n",[29,1095,1096,1107,1111,1127,1141,1155,1168],{"__ignoreMap":46},[50,1097,1098,1100,1103,1105],{"class":52,"line":53},[50,1099,125],{"class":124},[50,1101,1102],{"class":128}," { classifyUrl, contentful, prismic } ",[50,1104,132],{"class":124},[50,1106,135],{"class":60},[50,1108,1109],{"class":52,"line":138},[50,1110,155],{"emptyLinePlaceholder":154},[50,1112,1113,1116,1118,1121,1124],{"class":52,"line":151},[50,1114,1115],{"class":56},"classifyUrl",[50,1117,409],{"class":128},[50,1119,1120],{"class":60},"'https:\u002F\u002Fcdn.contentful.com\u002Fspaces\u002Fabc\u002Fentries'",[50,1122,1123],{"class":128},", contentful)  ",[50,1125,1126],{"class":189},"\u002F\u002F 'api'\n",[50,1128,1129,1131,1133,1136,1138],{"class":52,"line":158},[50,1130,1115],{"class":56},[50,1132,409],{"class":128},[50,1134,1135],{"class":60},"'https:\u002F\u002Fimages.ctfassets.net\u002Fabc\u002FassetId\u002Ftoken\u002Fimg.jpg'",[50,1137,1123],{"class":128},[50,1139,1140],{"class":189},"\u002F\u002F 'asset'\n",[50,1142,1143,1145,1147,1150,1153],{"class":52,"line":177},[50,1144,1115],{"class":56},[50,1146,409],{"class":128},[50,1148,1149],{"class":60},"'https:\u002F\u002Fmy-repo.cdn.prismic.io\u002Fapi\u002Fv2\u002Fdocuments\u002Fsearch'",[50,1151,1152],{"class":128},", prismic)  ",[50,1154,1126],{"class":189},[50,1156,1157,1159,1161,1164,1166],{"class":52,"line":193},[50,1158,1115],{"class":56},[50,1160,409],{"class":128},[50,1162,1163],{"class":60},"'https:\u002F\u002Fimages.prismic.io\u002Fmy-repo\u002Fphoto.jpg'",[50,1165,1152],{"class":128},[50,1167,1140],{"class":189},[50,1169,1170,1172,1174,1177,1179],{"class":52,"line":205},[50,1171,1115],{"class":56},[50,1173,409],{"class":128},[50,1175,1176],{"class":60},"'https:\u002F\u002Fexample.com\u002Flogo.svg'",[50,1178,1123],{"class":128},[50,1180,1181],{"class":189},"\u002F\u002F 'unknown'\n",[33,1183],{},[109,1185,1187],{"id":1186},"rewriteurlurl-kind-provider-tenant-config",[29,1188,1189],{},"rewriteUrl(url, kind, provider, tenant, config?)",[15,1191,1192,1193,962],{},"Low-level rewrite — takes a pre-classified URL and returns a ",[29,1194,1195],{},"RewriteResult",[41,1197,1199],{"className":115,"code":1198,"language":117,"meta":46,"style":46},"import { classifyUrl, rewriteUrl, contentful } from '@synchronized-studio\u002Fcmsassets-core'\n\nconst url = new URL('https:\u002F\u002Fcdn.contentful.com\u002Fspaces\u002Fabc\u002Fentries?locale=en')\nconst kind = classifyUrl(url, contentful)\nconst result = rewriteUrl(url, kind, contentful, 'my-site', { spaceId: 'abc' })\n\n\u002F\u002F result.url       → 'https:\u002F\u002Fmy-site.cmsassets.com\u002F~api\u002Fspaces\u002Fabc\u002Fentries?locale=en'\n\u002F\u002F result.kind      → 'api'\n\u002F\u002F result.rewritten → true\n",[29,1200,1201,1212,1216,1238,1253,1279,1283,1288,1293],{"__ignoreMap":46},[50,1202,1203,1205,1208,1210],{"class":52,"line":53},[50,1204,125],{"class":124},[50,1206,1207],{"class":128}," { classifyUrl, rewriteUrl, contentful } ",[50,1209,132],{"class":124},[50,1211,135],{"class":60},[50,1213,1214],{"class":52,"line":138},[50,1215,155],{"emptyLinePlaceholder":154},[50,1217,1218,1220,1223,1225,1228,1231,1233,1236],{"class":52,"line":151},[50,1219,161],{"class":124},[50,1221,1222],{"class":164}," url",[50,1224,168],{"class":124},[50,1226,1227],{"class":124}," new",[50,1229,1230],{"class":56}," URL",[50,1232,409],{"class":128},[50,1234,1235],{"class":60},"'https:\u002F\u002Fcdn.contentful.com\u002Fspaces\u002Fabc\u002Fentries?locale=en'",[50,1237,664],{"class":128},[50,1239,1240,1242,1245,1247,1250],{"class":52,"line":158},[50,1241,161],{"class":124},[50,1243,1244],{"class":164}," kind",[50,1246,168],{"class":124},[50,1248,1249],{"class":56}," classifyUrl",[50,1251,1252],{"class":128},"(url, contentful)\n",[50,1254,1255,1257,1260,1262,1265,1268,1270,1273,1276],{"class":52,"line":177},[50,1256,161],{"class":124},[50,1258,1259],{"class":164}," result",[50,1261,168],{"class":124},[50,1263,1264],{"class":56}," rewriteUrl",[50,1266,1267],{"class":128},"(url, kind, contentful, ",[50,1269,183],{"class":60},[50,1271,1272],{"class":128},", { spaceId: ",[50,1274,1275],{"class":60},"'abc'",[50,1277,1278],{"class":128}," })\n",[50,1280,1281],{"class":52,"line":193},[50,1282,155],{"emptyLinePlaceholder":154},[50,1284,1285],{"class":52,"line":205},[50,1286,1287],{"class":189},"\u002F\u002F result.url       → 'https:\u002F\u002Fmy-site.cmsassets.com\u002F~api\u002Fspaces\u002Fabc\u002Fentries?locale=en'\n",[50,1289,1290],{"class":52,"line":211},[50,1291,1292],{"class":189},"\u002F\u002F result.kind      → 'api'\n",[50,1294,1295],{"class":52,"line":226},[50,1296,1297],{"class":189},"\u002F\u002F result.rewritten → true\n",[33,1299],{},[109,1301,1303],{"id":1302},"providerregistry",[29,1304,1305],{},"ProviderRegistry",[15,1307,1308],{},"Register custom or extended provider definitions.",[41,1310,1312],{"className":115,"code":1311,"language":117,"meta":46,"style":46},"import { ProviderRegistry, contentful, prismic } from '@synchronized-studio\u002Fcmsassets-core'\n\nconst registry = new ProviderRegistry()\n  .register(contentful)\n  .register(prismic)\n\nconst cmsFetch = createCmsAssetsFetch({\n  tenant: 'my-site',\n  provider: 'contentful',\n  registry,\n})\n",[29,1313,1314,1325,1329,1346,1357,1366,1370,1382,1390,1398,1403],{"__ignoreMap":46},[50,1315,1316,1318,1321,1323],{"class":52,"line":53},[50,1317,125],{"class":124},[50,1319,1320],{"class":128}," { ProviderRegistry, contentful, prismic } ",[50,1322,132],{"class":124},[50,1324,135],{"class":60},[50,1326,1327],{"class":52,"line":138},[50,1328,155],{"emptyLinePlaceholder":154},[50,1330,1331,1333,1336,1338,1340,1343],{"class":52,"line":151},[50,1332,161],{"class":124},[50,1334,1335],{"class":164}," registry",[50,1337,168],{"class":124},[50,1339,1227],{"class":124},[50,1341,1342],{"class":56}," ProviderRegistry",[50,1344,1345],{"class":128},"()\n",[50,1347,1348,1351,1354],{"class":52,"line":158},[50,1349,1350],{"class":128},"  .",[50,1352,1353],{"class":56},"register",[50,1355,1356],{"class":128},"(contentful)\n",[50,1358,1359,1361,1363],{"class":52,"line":177},[50,1360,1350],{"class":128},[50,1362,1353],{"class":56},[50,1364,1365],{"class":128},"(prismic)\n",[50,1367,1368],{"class":52,"line":193},[50,1369,155],{"emptyLinePlaceholder":154},[50,1371,1372,1374,1376,1378,1380],{"class":52,"line":205},[50,1373,161],{"class":124},[50,1375,165],{"class":164},[50,1377,168],{"class":124},[50,1379,171],{"class":56},[50,1381,174],{"class":128},[50,1383,1384,1386,1388],{"class":52,"line":211},[50,1385,180],{"class":128},[50,1387,183],{"class":60},[50,1389,202],{"class":128},[50,1391,1392,1394,1396],{"class":52,"line":226},[50,1393,196],{"class":128},[50,1395,199],{"class":60},[50,1397,202],{"class":128},[50,1399,1400],{"class":52,"line":232},[50,1401,1402],{"class":128},"  registry,\n",[50,1404,1405],{"class":52,"line":238},[50,1406,235],{"class":128},[15,1408,1409,1410,1413,1414,1416,1417,1419],{},"The ",[29,1411,1412],{},"defaultRegistry"," is a shared singleton pre-populated with ",[29,1415,111],{}," and ",[29,1418,317],{},". You only need a custom registry if you want to override a built-in provider or register your own.",[33,1421],{},[109,1423,1425],{"id":1424},"creategenericproviderconfig",[29,1426,1427],{},"createGenericProvider(config)",[15,1429,1430,1431,1434],{},"Create a ",[29,1432,1433],{},"ProviderDefinition"," from a config object — use any CMS or API origin without writing a custom provider from scratch.",[41,1436,1438],{"className":115,"code":1437,"language":117,"meta":46,"style":46},"import { createGenericProvider } from '@synchronized-studio\u002Fcmsassets-core'\n\nconst provider = createGenericProvider({\n  id: 'storyblok',                        \u002F\u002F unique provider id\n  apiHosts: ['api.storyblok.com'],        \u002F\u002F API hostnames (exact or wildcard)\n  assetHosts: ['a.storyblok.com'],        \u002F\u002F asset hostnames\n\n  \u002F\u002F Optional — stored for future Worker-side support, not yet processed by proxy\n  auth: {\n    header: 'Authorization',\n    format: 'Bearer {token}',\n  },\n  previewBypass: {\n    queryParams: ['preview', 'draft'],\n  },\n})\n",[29,1439,1440,1451,1455,1468,1480,1492,1503,1507,1512,1517,1527,1537,1541,1546,1561,1565],{"__ignoreMap":46},[50,1441,1442,1444,1447,1449],{"class":52,"line":53},[50,1443,125],{"class":124},[50,1445,1446],{"class":128}," { createGenericProvider } ",[50,1448,132],{"class":124},[50,1450,135],{"class":60},[50,1452,1453],{"class":52,"line":138},[50,1454,155],{"emptyLinePlaceholder":154},[50,1456,1457,1459,1462,1464,1466],{"class":52,"line":151},[50,1458,161],{"class":124},[50,1460,1461],{"class":164}," provider",[50,1463,168],{"class":124},[50,1465,478],{"class":56},[50,1467,174],{"class":128},[50,1469,1470,1472,1474,1477],{"class":52,"line":158},[50,1471,485],{"class":128},[50,1473,488],{"class":60},[50,1475,1476],{"class":128},",                        ",[50,1478,1479],{"class":189},"\u002F\u002F unique provider id\n",[50,1481,1482,1484,1486,1489],{"class":52,"line":177},[50,1483,495],{"class":128},[50,1485,498],{"class":60},[50,1487,1488],{"class":128},"],        ",[50,1490,1491],{"class":189},"\u002F\u002F API hostnames (exact or wildcard)\n",[50,1493,1494,1496,1498,1500],{"class":52,"line":193},[50,1495,506],{"class":128},[50,1497,509],{"class":60},[50,1499,1488],{"class":128},[50,1501,1502],{"class":189},"\u002F\u002F asset hostnames\n",[50,1504,1505],{"class":52,"line":205},[50,1506,155],{"emptyLinePlaceholder":154},[50,1508,1509],{"class":52,"line":211},[50,1510,1511],{"class":189},"  \u002F\u002F Optional — stored for future Worker-side support, not yet processed by proxy\n",[50,1513,1514],{"class":52,"line":226},[50,1515,1516],{"class":128},"  auth: {\n",[50,1518,1519,1522,1525],{"class":52,"line":232},[50,1520,1521],{"class":128},"    header: ",[50,1523,1524],{"class":60},"'Authorization'",[50,1526,202],{"class":128},[50,1528,1529,1532,1535],{"class":52,"line":238},[50,1530,1531],{"class":128},"    format: ",[50,1533,1534],{"class":60},"'Bearer {token}'",[50,1536,202],{"class":128},[50,1538,1539],{"class":52,"line":243},[50,1540,229],{"class":128},[50,1542,1543],{"class":52,"line":258},[50,1544,1545],{"class":128},"  previewBypass: {\n",[50,1547,1548,1551,1554,1556,1559],{"class":52,"line":268},[50,1549,1550],{"class":128},"    queryParams: [",[50,1552,1553],{"class":60},"'preview'",[50,1555,1030],{"class":128},[50,1557,1558],{"class":60},"'draft'",[50,1560,501],{"class":128},[50,1562,1563],{"class":52,"line":283},[50,1564,229],{"class":128},[50,1566,1567],{"class":52,"line":289},[50,1568,235],{"class":128},[15,1570,1571,1572,1574,1575,1030,1577,1030,1579,1030,1581,1584,1585,962],{},"The returned ",[29,1573,1433],{}," plugs directly into ",[29,1576,961],{},[29,1578,577],{},[29,1580,1115],{},[29,1582,1583],{},"rewriteUrl",", and ",[29,1586,1305],{},[15,1588,1589],{},"URL rewriting follows standard Cachely conventions:",[41,1591,1594],{"className":1592,"code":1593,"language":94},[92],"API:   https:\u002F\u002Fapi.storyblok.com\u002Fv2\u002Fstories → https:\u002F\u002F{tenant}.cmsassets.com\u002F~api\u002Fv2\u002Fstories\nAsset: https:\u002F\u002Fa.storyblok.com\u002Ff\u002F123\u002Fimg.jpg → https:\u002F\u002F{tenant}.cmsassets.com\u002Ff\u002F123\u002Fimg.jpg\n",[29,1595,1593],{"__ignoreMap":46},[33,1597],{},[109,1599,1601],{"id":1600},"api_prefix",[29,1602,1603],{},"API_PREFIX",[15,1605,1409,1606,1609],{},[29,1607,1608],{},"\u002F~api"," path prefix used by the Cachely API proxy.",[41,1611,1613],{"className":115,"code":1612,"language":117,"meta":46,"style":46},"import { API_PREFIX } from '@synchronized-studio\u002Fcmsassets-core'\n\nconsole.log(API_PREFIX) \u002F\u002F '\u002F~api'\n",[29,1614,1615,1626,1630],{"__ignoreMap":46},[50,1616,1617,1619,1622,1624],{"class":52,"line":53},[50,1618,125],{"class":124},[50,1620,1621],{"class":128}," { API_PREFIX } ",[50,1623,132],{"class":124},[50,1625,135],{"class":60},[50,1627,1628],{"class":52,"line":138},[50,1629,155],{"emptyLinePlaceholder":154},[50,1631,1632,1635,1638,1640,1642,1645],{"class":52,"line":151},[50,1633,1634],{"class":128},"console.",[50,1636,1637],{"class":56},"log",[50,1639,409],{"class":128},[50,1641,1603],{"class":164},[50,1643,1644],{"class":128},") ",[50,1646,1647],{"class":189},"\u002F\u002F '\u002F~api'\n",[33,1649],{},[36,1651,1653],{"id":1652},"providers","Providers",[109,1655,112],{"id":1656},"contentful-1",[1658,1659,1660,1673],"table",{},[1661,1662,1663],"thead",{},[1664,1665,1666,1670],"tr",{},[1667,1668,1669],"th",{},"Kind",[1667,1671,1672],{},"Hosts",[1674,1675,1676,1690],"tbody",{},[1664,1677,1678,1682],{},[1679,1680,1681],"td",{},"API",[1679,1683,1684,1030,1687],{},[29,1685,1686],{},"cdn.contentful.com",[29,1688,1689],{},"preview.contentful.com",[1664,1691,1692,1695],{},[1679,1693,1694],{},"Assets",[1679,1696,1697,1030,1700,1030,1703,1030,1706],{},[29,1698,1699],{},"images.ctfassets.net",[29,1701,1702],{},"videos.ctfassets.net",[29,1704,1705],{},"assets.ctfassets.net",[29,1707,1708],{},"downloads.ctfassets.net",[15,1710,1711,1716],{},[24,1712,1713],{},[29,1714,1715],{},"providerConfig.spaceId"," — Required for correct asset path stripping. When provided, the space ID segment is removed from the proxy URL path.",[41,1718,1720],{"className":115,"code":1719,"language":117,"meta":46,"style":46},"\u002F\u002F Without spaceId:\n\u002F\u002F https:\u002F\u002Fimages.ctfassets.net\u002Fabc\u002FassetId\u002Ftoken\u002Fimg.jpg\n\u002F\u002F → https:\u002F\u002Fmy-site.cmsassets.com\u002Fabc\u002FassetId\u002Ftoken\u002Fimg.jpg\n\n\u002F\u002F With spaceId: 'abc':\n\u002F\u002F https:\u002F\u002Fimages.ctfassets.net\u002Fabc\u002FassetId\u002Ftoken\u002Fimg.jpg\n\u002F\u002F → https:\u002F\u002Fmy-site.cmsassets.com\u002FassetId\u002Ftoken\u002Fimg.jpg  ← spaceId stripped\n",[29,1721,1722,1727,1732,1737,1741,1746,1750],{"__ignoreMap":46},[50,1723,1724],{"class":52,"line":53},[50,1725,1726],{"class":189},"\u002F\u002F Without spaceId:\n",[50,1728,1729],{"class":52,"line":138},[50,1730,1731],{"class":189},"\u002F\u002F https:\u002F\u002Fimages.ctfassets.net\u002Fabc\u002FassetId\u002Ftoken\u002Fimg.jpg\n",[50,1733,1734],{"class":52,"line":151},[50,1735,1736],{"class":189},"\u002F\u002F → https:\u002F\u002Fmy-site.cmsassets.com\u002Fabc\u002FassetId\u002Ftoken\u002Fimg.jpg\n",[50,1738,1739],{"class":52,"line":158},[50,1740,155],{"emptyLinePlaceholder":154},[50,1742,1743],{"class":52,"line":177},[50,1744,1745],{"class":189},"\u002F\u002F With spaceId: 'abc':\n",[50,1747,1748],{"class":52,"line":193},[50,1749,1731],{"class":189},[50,1751,1752],{"class":52,"line":205},[50,1753,1754],{"class":189},"\u002F\u002F → https:\u002F\u002Fmy-site.cmsassets.com\u002FassetId\u002Ftoken\u002Fimg.jpg  ← spaceId stripped\n",[33,1756],{},[109,1758,318],{"id":1759},"prismic-1",[1658,1761,1762,1770],{},[1661,1763,1764],{},[1664,1765,1766,1768],{},[1667,1767,1669],{},[1667,1769,1672],{},[1674,1771,1772,1782],{},[1664,1773,1774,1776],{},[1679,1775,1681],{},[1679,1777,1778,1781],{},[29,1779,1780],{},"*.cdn.prismic.io"," (wildcard — matches any repo subdomain)",[1664,1783,1784,1786],{},[1679,1785,1694],{},[1679,1787,1788,1030,1791],{},[29,1789,1790],{},"images.prismic.io",[29,1792,1793],{},"prismic-io.imgix.net",[15,1795,1796,1797,1030,1800,1030,1803,1030,1806,1030,1809,1030,1812,1815],{},"Prismic image optimization params (",[29,1798,1799],{},"w",[29,1801,1802],{},"h",[29,1804,1805],{},"q",[29,1807,1808],{},"fm",[29,1810,1811],{},"auto",[29,1813,1814],{},"fit",") are preserved end-to-end.",[41,1817,1819],{"className":115,"code":1818,"language":117,"meta":46,"style":46},"\u002F\u002F Image optimization is preserved:\n\u002F\u002F https:\u002F\u002Fimages.prismic.io\u002Fmy-repo\u002Fhero.jpg?auto=format,compress&w=920&fm=webp&q=80\n\u002F\u002F → https:\u002F\u002Fmy-site.cmsassets.com\u002Fmy-repo\u002Fhero.jpg?auto=format,compress&w=920&fm=webp&q=80\n",[29,1820,1821,1826,1831],{"__ignoreMap":46},[50,1822,1823],{"class":52,"line":53},[50,1824,1825],{"class":189},"\u002F\u002F Image optimization is preserved:\n",[50,1827,1828],{"class":52,"line":138},[50,1829,1830],{"class":189},"\u002F\u002F https:\u002F\u002Fimages.prismic.io\u002Fmy-repo\u002Fhero.jpg?auto=format,compress&w=920&fm=webp&q=80\n",[50,1832,1833],{"class":52,"line":151},[50,1834,1835],{"class":189},"\u002F\u002F → https:\u002F\u002Fmy-site.cmsassets.com\u002Fmy-repo\u002Fhero.jpg?auto=format,compress&w=920&fm=webp&q=80\n",[15,1837,1838,1839,1842],{},"Prismic's ",[29,1840,1841],{},"ref"," parameter changes on every content publish, making each published version a distinct cache key — no manual cache invalidation needed.",[33,1844],{},[36,1846,1848],{"id":1847},"typescript","TypeScript",[15,1850,1851],{},"All types are exported from the package root:",[41,1853,1855],{"className":115,"code":1854,"language":117,"meta":46,"style":46},"import type {\n  RequestKind,           \u002F\u002F 'api' | 'asset' | 'unknown'\n  ProviderDefinition,    \u002F\u002F shape of a provider\n  ProviderConfig,        \u002F\u002F Record\u003Cstring, string | undefined>\n  RewriteResult,         \u002F\u002F { url, kind, rewritten }\n  CmsAssetsFetchOptions, \u002F\u002F options for createCmsAssetsFetch\n  UrlRewriterOptions,    \u002F\u002F options for createUrlRewriter\n  GenericProviderConfig, \u002F\u002F config shape for createGenericProvider\n} from '@synchronized-studio\u002Fcmsassets-core'\n",[29,1856,1857,1867,1875,1883,1891,1899,1907,1915,1923],{"__ignoreMap":46},[50,1858,1859,1861,1864],{"class":52,"line":53},[50,1860,125],{"class":124},[50,1862,1863],{"class":124}," type",[50,1865,1866],{"class":128}," {\n",[50,1868,1869,1872],{"class":52,"line":138},[50,1870,1871],{"class":128},"  RequestKind,           ",[50,1873,1874],{"class":189},"\u002F\u002F 'api' | 'asset' | 'unknown'\n",[50,1876,1877,1880],{"class":52,"line":151},[50,1878,1879],{"class":128},"  ProviderDefinition,    ",[50,1881,1882],{"class":189},"\u002F\u002F shape of a provider\n",[50,1884,1885,1888],{"class":52,"line":158},[50,1886,1887],{"class":128},"  ProviderConfig,        ",[50,1889,1890],{"class":189},"\u002F\u002F Record\u003Cstring, string | undefined>\n",[50,1892,1893,1896],{"class":52,"line":177},[50,1894,1895],{"class":128},"  RewriteResult,         ",[50,1897,1898],{"class":189},"\u002F\u002F { url, kind, rewritten }\n",[50,1900,1901,1904],{"class":52,"line":193},[50,1902,1903],{"class":128},"  CmsAssetsFetchOptions, ",[50,1905,1906],{"class":189},"\u002F\u002F options for createCmsAssetsFetch\n",[50,1908,1909,1912],{"class":52,"line":205},[50,1910,1911],{"class":128},"  UrlRewriterOptions,    ",[50,1913,1914],{"class":189},"\u002F\u002F options for createUrlRewriter\n",[50,1916,1917,1920],{"class":52,"line":211},[50,1918,1919],{"class":128},"  GenericProviderConfig, ",[50,1921,1922],{"class":189},"\u002F\u002F config shape for createGenericProvider\n",[50,1924,1925,1928,1930],{"class":52,"line":226},[50,1926,1927],{"class":128},"} ",[50,1929,132],{"class":124},[50,1931,135],{"class":60},[33,1933],{},[36,1935,1937],{"id":1936},"custom-providers","Custom providers",[109,1939,1941,1942,1944],{"id":1940},"using-creategenericprovider-recommended","Using ",[29,1943,31],{}," (recommended)",[15,1946,1947],{},"The easiest way to add support for any CMS:",[41,1949,1951],{"className":115,"code":1950,"language":117,"meta":46,"style":46},"import { createGenericProvider, createCmsAssetsFetch } from '@synchronized-studio\u002Fcmsassets-core'\n\nconst sanity = createGenericProvider({\n  id: 'sanity',\n  apiHosts: ['*.api.sanity.io'],\n  assetHosts: ['cdn.sanity.io'],\n  auth: { header: 'Authorization', format: 'Bearer {token}' },\n})\n\n\u002F\u002F Pass directly — no registry needed\nconst cmsFetch = createCmsAssetsFetch({ tenant: 'my-site', provider: sanity })\n\n\u002F\u002F Or register and use by id string\nimport { defaultRegistry } from '@synchronized-studio\u002Fcmsassets-core'\ndefaultRegistry.register(sanity)\nconst cmsFetch2 = createCmsAssetsFetch({ tenant: 'my-site', provider: 'sanity' })\n",[29,1952,1953,1963,1967,1980,1989,1998,2007,2021,2025,2029,2034,2052,2056,2061,2072,2082],{"__ignoreMap":46},[50,1954,1955,1957,1959,1961],{"class":52,"line":53},[50,1956,125],{"class":124},[50,1958,458],{"class":128},[50,1960,132],{"class":124},[50,1962,135],{"class":60},[50,1964,1965],{"class":52,"line":138},[50,1966,155],{"emptyLinePlaceholder":154},[50,1968,1969,1971,1974,1976,1978],{"class":52,"line":151},[50,1970,161],{"class":124},[50,1972,1973],{"class":164}," sanity",[50,1975,168],{"class":124},[50,1977,478],{"class":56},[50,1979,174],{"class":128},[50,1981,1982,1984,1987],{"class":52,"line":158},[50,1983,485],{"class":128},[50,1985,1986],{"class":60},"'sanity'",[50,1988,202],{"class":128},[50,1990,1991,1993,1996],{"class":52,"line":177},[50,1992,495],{"class":128},[50,1994,1995],{"class":60},"'*.api.sanity.io'",[50,1997,501],{"class":128},[50,1999,2000,2002,2005],{"class":52,"line":193},[50,2001,506],{"class":128},[50,2003,2004],{"class":60},"'cdn.sanity.io'",[50,2006,501],{"class":128},[50,2008,2009,2012,2014,2017,2019],{"class":52,"line":205},[50,2010,2011],{"class":128},"  auth: { header: ",[50,2013,1524],{"class":60},[50,2015,2016],{"class":128},", format: ",[50,2018,1534],{"class":60},[50,2020,638],{"class":128},[50,2022,2023],{"class":52,"line":211},[50,2024,235],{"class":128},[50,2026,2027],{"class":52,"line":226},[50,2028,155],{"emptyLinePlaceholder":154},[50,2030,2031],{"class":52,"line":232},[50,2032,2033],{"class":189},"\u002F\u002F Pass directly — no registry needed\n",[50,2035,2036,2038,2040,2042,2044,2047,2049],{"class":52,"line":238},[50,2037,161],{"class":124},[50,2039,165],{"class":164},[50,2041,168],{"class":124},[50,2043,171],{"class":56},[50,2045,2046],{"class":128},"({ tenant: ",[50,2048,183],{"class":60},[50,2050,2051],{"class":128},", provider: sanity })\n",[50,2053,2054],{"class":52,"line":243},[50,2055,155],{"emptyLinePlaceholder":154},[50,2057,2058],{"class":52,"line":258},[50,2059,2060],{"class":189},"\u002F\u002F Or register and use by id string\n",[50,2062,2063,2065,2068,2070],{"class":52,"line":268},[50,2064,125],{"class":124},[50,2066,2067],{"class":128}," { defaultRegistry } ",[50,2069,132],{"class":124},[50,2071,135],{"class":60},[50,2073,2074,2077,2079],{"class":52,"line":283},[50,2075,2076],{"class":128},"defaultRegistry.",[50,2078,1353],{"class":56},[50,2080,2081],{"class":128},"(sanity)\n",[50,2083,2084,2086,2089,2091,2093,2095,2097,2100,2102],{"class":52,"line":289},[50,2085,161],{"class":124},[50,2087,2088],{"class":164}," cmsFetch2",[50,2090,168],{"class":124},[50,2092,171],{"class":56},[50,2094,2046],{"class":128},[50,2096,183],{"class":60},[50,2098,2099],{"class":128},", provider: ",[50,2101,1986],{"class":60},[50,2103,1278],{"class":128},[109,2105,1941,2107,2109],{"id":2106},"using-providerdefinition-directly-advanced",[29,2108,1433],{}," directly (advanced)",[15,2111,2112],{},"For full control over rewrite logic, implement the interface manually:",[41,2114,2116],{"className":115,"code":2115,"language":117,"meta":46,"style":46},"import { ProviderDefinition, defaultRegistry } from '@synchronized-studio\u002Fcmsassets-core'\n\nconst sanity: ProviderDefinition = {\n  id: 'sanity',\n  apiHosts: ['*.api.sanity.io'],\n  assetHosts: ['cdn.sanity.io'],\n  rewriteApiUrl(url, tenant) {\n    return `https:\u002F\u002F${tenant}.cmsassets.com\u002F~api${url.pathname}${url.search}`\n  },\n  rewriteAssetUrl(url, tenant) {\n    return `https:\u002F\u002F${tenant}.cmsassets.com${url.pathname}${url.search}`\n  },\n}\n\ndefaultRegistry.register(sanity)\n",[29,2117,2118,2129,2133,2149,2157,2165,2173,2191,2224,2228,2243,2270,2274,2279,2283],{"__ignoreMap":46},[50,2119,2120,2122,2125,2127],{"class":52,"line":53},[50,2121,125],{"class":124},[50,2123,2124],{"class":128}," { ProviderDefinition, defaultRegistry } ",[50,2126,132],{"class":124},[50,2128,135],{"class":60},[50,2130,2131],{"class":52,"line":138},[50,2132,155],{"emptyLinePlaceholder":154},[50,2134,2135,2137,2139,2142,2145,2147],{"class":52,"line":151},[50,2136,161],{"class":124},[50,2138,1973],{"class":164},[50,2140,2141],{"class":124},":",[50,2143,2144],{"class":56}," ProviderDefinition",[50,2146,168],{"class":124},[50,2148,1866],{"class":128},[50,2150,2151,2153,2155],{"class":52,"line":158},[50,2152,485],{"class":128},[50,2154,1986],{"class":60},[50,2156,202],{"class":128},[50,2158,2159,2161,2163],{"class":52,"line":177},[50,2160,495],{"class":128},[50,2162,1995],{"class":60},[50,2164,501],{"class":128},[50,2166,2167,2169,2171],{"class":52,"line":193},[50,2168,506],{"class":128},[50,2170,2004],{"class":60},[50,2172,501],{"class":128},[50,2174,2175,2178,2180,2183,2185,2188],{"class":52,"line":205},[50,2176,2177],{"class":56},"  rewriteApiUrl",[50,2179,409],{"class":128},[50,2181,1027],{"class":2182},"s9osk",[50,2184,1030],{"class":128},[50,2186,2187],{"class":2182},"tenant",[50,2189,2190],{"class":128},") {\n",[50,2192,2193,2196,2199,2201,2204,2206,2208,2211,2214,2216,2218,2221],{"class":52,"line":211},[50,2194,2195],{"class":124},"    return",[50,2197,2198],{"class":60}," `https:\u002F\u002F${",[50,2200,2187],{"class":128},[50,2202,2203],{"class":60},"}.cmsassets.com\u002F~api${",[50,2205,1027],{"class":128},[50,2207,962],{"class":60},[50,2209,2210],{"class":128},"pathname",[50,2212,2213],{"class":60},"}${",[50,2215,1027],{"class":128},[50,2217,962],{"class":60},[50,2219,2220],{"class":128},"search",[50,2222,2223],{"class":60},"}`\n",[50,2225,2226],{"class":52,"line":226},[50,2227,229],{"class":128},[50,2229,2230,2233,2235,2237,2239,2241],{"class":52,"line":232},[50,2231,2232],{"class":56},"  rewriteAssetUrl",[50,2234,409],{"class":128},[50,2236,1027],{"class":2182},[50,2238,1030],{"class":128},[50,2240,2187],{"class":2182},[50,2242,2190],{"class":128},[50,2244,2245,2247,2249,2251,2254,2256,2258,2260,2262,2264,2266,2268],{"class":52,"line":238},[50,2246,2195],{"class":124},[50,2248,2198],{"class":60},[50,2250,2187],{"class":128},[50,2252,2253],{"class":60},"}.cmsassets.com${",[50,2255,1027],{"class":128},[50,2257,962],{"class":60},[50,2259,2210],{"class":128},[50,2261,2213],{"class":60},[50,2263,1027],{"class":128},[50,2265,962],{"class":60},[50,2267,2220],{"class":128},[50,2269,2223],{"class":60},[50,2271,2272],{"class":52,"line":243},[50,2273,229],{"class":128},[50,2275,2276],{"class":52,"line":258},[50,2277,2278],{"class":128},"}\n",[50,2280,2281],{"class":52,"line":268},[50,2282,155],{"emptyLinePlaceholder":154},[50,2284,2285,2287,2289],{"class":52,"line":283},[50,2286,2076],{"class":128},[50,2288,1353],{"class":56},[50,2290,2081],{"class":128},[33,2292],{},[36,2294,2296],{"id":2295},"requirements","Requirements",[2298,2299,2300,2304],"ul",{},[2301,2302,2303],"li",{},"Node.js 18+ (or any runtime with the Fetch API)",[2301,2305,2306],{},"No dependencies",[2308,2309,2310],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}",{"title":46,"searchDepth":138,"depth":138,"links":2312},[2313,2314,2315,2320,2321,2330,2334,2335,2341],{"id":38,"depth":138,"text":39},{"id":84,"depth":138,"text":85},{"id":106,"depth":138,"text":107,"children":2316},[2317,2318,2319],{"id":111,"depth":151,"text":112},{"id":317,"depth":151,"text":318},{"id":445,"depth":151,"text":446},{"id":570,"depth":138,"text":571},{"id":724,"depth":138,"text":725,"children":2322},[2323,2324,2325,2326,2327,2328,2329],{"id":728,"depth":151,"text":731},{"id":948,"depth":151,"text":951},{"id":1073,"depth":151,"text":1076},{"id":1186,"depth":151,"text":1189},{"id":1302,"depth":151,"text":1305},{"id":1424,"depth":151,"text":1427},{"id":1600,"depth":151,"text":1603},{"id":1652,"depth":138,"text":1653,"children":2331},[2332,2333],{"id":1656,"depth":151,"text":112},{"id":1759,"depth":151,"text":318},{"id":1847,"depth":138,"text":1848},{"id":1936,"depth":138,"text":1937,"children":2336},[2337,2339],{"id":1940,"depth":151,"text":2338},"Using createGenericProvider (recommended)",{"id":2106,"depth":151,"text":2340},"Using ProviderDefinition directly (advanced)",{"id":2295,"depth":138,"text":2296},"Universal JavaScript SDK for routing CMS API requests and asset URLs through the edge proxy. Works in Node.js, the browser, Cloudflare Workers, and Deno.","md",{},"\u002Fdocs\u002Fcore",{"title":5,"description":2342},"docs\u002Fcore","7QN67KdZunuzAU4Y0C3QK1HlEBPfQn_9tt0cmc7BUsQ",1777579477854]