PageSourceSearch

https://codellmrunningcrews.vercel.app/_next/static/chunks/990.8ed3e6b3ac649bcd.js

js codellmrunningcrews.vercel.app collected 2026-10-03 05:18:47 UTC 25,831 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[990],{3990:(e,t,r)=>{r.d(t,{airtableService:()=>B});var a,l=r(4599),n=r(6477);r(4431);let i=new Map;var o=r(5364);let u=o.env.AIRTABLE_PERSONAL_ACCESS_TOKEN,s=o.env.AIRTABLE_BASE_ID,c="https://api.airtable.com/v0/".concat(s),d=Number(null!=(a=o.env.AIRTABLE_CACHE_SECONDS)?a:300),w=d>0,m=e=>{if(!e||"string"!=typeof e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:/^[\w.-]+@[\w.-]+$/.test(t)?null:"https://".concat(t):null},C={CREWS:"tbl76VCXwPoucGZxf",CREW_SUBMISSIONS:"tblyDqnnONSu4K1ex",TEAM_MEMBERS:"tbl3bxAbqpwiY3PQm",RUN_SCHEDULES:"tblWVRZImWj8Wx5L1",CREW_MEDIA:"tblZsfIBlCssAzwyZ",RUNNING_EVENTS:"tblGpZHOcRt6RFfUK",RUNNING_ROUTES:"tbl605OnaGj8t0gCd",BLOG:"tblCjQYcLlC3cNB1E"},R=u&&s,f={Authorization:"Bearer ".concat(u),"Content-Type":"application/json"},g="OR({Status}='Approved',{Status}='Published',{Status}='Featured')",h=e=>encodeURIComponent(e),y=e=>(null!=e?e:"").replace(/'/g,"\\'"),p=function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return 1===t.filter(Boolean).length?t[0]:"AND(".concat(t.filter(Boolean).join(","),")")},S=e=>{if(!e)return null;if(Array.isArray(e)){for(let t of e)if("string"==typeof t){let e=t.match(/https?:\/\/[^\s,"']+/i);if(e&&e[0])return e[0]}return null}let t=String(e),r=t.match(/https?:\/\/[^\s,"']+/i);if(r&&r[0])return r[0];for(let e of t.split(/[\n,]+/g).map(e=>e.trim()).filter(Boolean)){let t=e.match(/https?:\/\/[^\s,"']+/i);if(t&&t[0])return t[0];if(/^https?:\/\//i.test(e))return e}return null};async function L(e,t){var r;let a=new URL("".concat(c).concat(e));(null==t?void 0:t.maxRecords)&&a.searchParams.append("maxRecords",String(t.maxRecords)),(null==t?void 0:t.offset)&&a.searchParams.append("offset",t.offset);let l=["airtable",a.toString()].map(e=>String(null!=e?e:"")).join("::");if(w){let e=function(e){let t=i.get(e);if(t)return Date.now()>t.expiresAt?void i.delete(e):t.value}(l);if(e)return e}let n=await fetch(a.toString(),{headers:f});if(!n.ok)throw Error("Airtable API error: ".concat(n.status," ").concat(n.statusText));let o=await n.json();return w&&(r=1e3*d,i.set(l,{value:o,expiresAt:Date.now()+r})),o}async function U(e){let t,r=[];do{let a=await L(e,{offset:t});a.records&&r.push(...a.records),t=a.offset}while(t);return r}let b=e=>!!e&&/^https?:\/\//i.test(e),E=e=>!e||e===(0,n.A8)(),A=e=>!e||e===(0,n.dc)();function I(e){var t,r,a,i,o,u,s,c,d,w,C,R,f,g,h,y,p,L,U,E,A,I,M,v,N,D;let F=(null==e?void 0:e.fields)||{},B=F.CrewName||"Unknown Crew",T=(null!=(r=null!=(t=F.CrewCity)?t:F.City)?r:"")||"",P=(null!=(i=null!=(a=F.CrewCountry)?a:F.Country)?i:"")||"",O=(0,n.A8)(),_=(0,n.dc)(),H=(0,n.dc)(),k=S(F.CrewsPhotosCloudinaryURLs),x=null!=(s=null!=(u=S(null!=(o=F.CrewsLogoCloudinaryURL)?o:null))?u:F.CrewsLogoCloudinaryURL)?s:null;b(k)&&(_=k,H=k),b(x)&&(O=x);let G=null!=(d=null!=(c=F.CrewCityLatitude)?c:F.CityLatitude)?d:null,W=null!=(C=null!=(w=F.CrewCityLongitude)?w:F.CityLongitude)?C:null,q=null!=(f=null!=(R=F.CrewHeadquarterLatitude)?R:F.HeadquarterLatitude)?f:null!=G?G:null,j=null!=(h=null!=(g=F.CrewHeadquarterLongitude)?g:F.HeadquarterLongitude)?h:null!=W?W:null;return{id:e.id,CrewName:B,Slug:(0,l.z9)(B),City:T,Country:P,Continent:F.Continent||null,FoundingDate:null!=(p=null!=(y=F.CrewFoundingDate)?y:F.FoundingDate)?p:null,CrewStory:F.CrewStory||null,CrewStoryLongFinal:F.CrewStoryLongFinal||null,CrewStoryExcerpt:F.CrewStoryExcerpt||null,ContactEmailCrew:null!=(U=null!=(L=F.CrewContactEmail)?L:F.ContactEmailCrew)?U:null,FacebookFanpageURL:m(null!=(E=F.CrewFacebookFanpageURL)?E:F.FacebookFanpageURL)||null,FacebookGroupURL:m(null!=(A=F.CrewFacebookGroupURL)?A:F.FacebookGroupURL)||null,InstagramURL:m(null!=(I=F.CrewInstagramURL)?I:F.InstagramURL)||null,XURL:m(null!=(M=F.CrewXURL)?M:F.XURL)||null,StravaClubURL:m(null!=(v=F.CrewStravaClubURL)?v:F.StravaClubURL)||null,HomepageURL:m(null!=(N=F.CrewHomepageURL)?N:F.HomepageURL)||null,OtherSocialMediaURLs:(D=F.CrewOtherSocialMediaURLs)?Array.isArray(D)?D.map(e=>(null!=e?e:"").trim()).filter(Boolean).join(", ")||null:D.trim()||null:null,HeadquarterName:F.HeadquarterName||null,HeadquarterAddress:F.HeadquarterAddress||null,HeadquarterGoogleMapsLink:m(F.HeadquarterGoogleMapsLink)||null,HeadquarterLatitude:q,HeadquarterLongitude:j,CityLatitude:G,CityLongitude:W,ApproxMemberCount:F.ApproxMemberCount||null,MembershipType:F.MembershipType||null,MembershipFeeInfo:F.MembershipFeeInfo||null,CrewStatus:F.CrewStatus||null,CrewCategory:F.CrewCategory||null,logoUrl:O,heroImageUrl:_,imageUrl:H,teamMembers:null,media:null,schedules:null,events:null,routes:null,CrewCity:F.CrewCity,CrewCountry:F.CrewCountry}}function M(e){let t=(null==e?void 0:e.fields)||{};return{MemberName:t.MemberName||"Unknown Member",Role:Array.isArray(t.Role)?t.Role[0]:t.Role,InstagramURL:t.InstagramURL||null,StravaURL:t.StravaURL||null,Crew
1MemberEmail:t.CrewMemberEmail||null,ProfileImage:null,Bio:t.Bio||null,MemberStatus:t.MemberStatus||"Active"}}function v(e){var t,r,a,l,n,i,o,u,s,c,d,w,m,C,R,f,g;let h=(null==e?void 0:e.fields)||{},y=null!=(r=null!=(t=h.RunSchedulesDayOfWeek)?t:h.DayOfWeek)?r:null,p=null!=(l=null!=(a=h.RunSchedulesTime)?a:h.Time_backup)?l:null,S=null!=(i=null!=(n=h.RunSchedulesMeetingPointName)?n:h.MeetingPointName)?i:null,L=null!=(o=h.RunSchedulesMeetingPointGoogleMapsLink)?o:null,U=null!=(s=null!=(u=h.RunSchedulesDistanceDescription)?u:h.DistanceDescription)?s:null,b=null!=(d=null!=(c=h.RunSchedulesPaceDescription)?c:h.PaceDescription)?d:null,E=null!=(m=null!=(w=h.RunSchedulesRunningType)?w:h.RunningType)?m:null;return{RunName:(null!=(R=null!=(C=h.RunSchedulesRunName)?C:h.RunName)?R:E?String(E):null)||null,DayOfWeek:y||null,Time:p||null,MeetingPointAddress:S||null,MeetingPointGoogleMapsURL:L||null,DistanceDescription:U||null,PaceDescription:b||null,AdditionalInfo:null!=(g=null!=(f=h.RunSchedulesAdditionalInfo)?f:h.AdditionalInfo)?g:null,RunningType:E||null}}function N(e){let t=(null==e?void 0:e.fields)||{},r=t.FileURL||"";!r&&t.MediaFile&&t.MediaFile.length>0&&(r=t.MediaFile[0].url);let a=Array.isArray(t.MediaFile)?t.MediaFile.map(e=>({id:(null==e?void 0:e.id)||"",url:(null==e?void 0:e.url)||"",filename:(null==e?void 0:e.filename)||"",size:(null==e?void 0:e.size)||0,type:(null==e?void 0:e.type)||"",thumbnails:(null==e?void 0:e.thumbnails)?{small:e.thumbnails.small||null,large:e.thumbnails.large||null,full:e.thumbnails.full||null}:null})):[];return{MediaTitle:t.MediaTitle||"",MediaType:t.CrewMediaMediaType||"Other",MediaFile:a.length>0?a:null,FileURL:r||"",Description:t.Description||null,IsFeatured:t.IsFeatured||!1,AltText:t.AltText||null,Caption:t.Caption||null,Tags:t.Tags&&t.Tags.length>0?t.Tags:null}}function D(e){let t=(null==e?void 0:e.fields)||{};return{RouteID:parseInt(e.id.replace("rec",""),36),RouteName:t.RouteName||"Unnamed Route",City:t.City||"",Country:t.Country||"",ApproximateDistance:t.ApproximateDistance||null,DistanceUnit:t.DistanceUnit||null,BriefDescription:t.BriefDescription||null,KeyLandmarks:t.KeyLandmarks||null,StartPoint:t.StartPoint||null,EndPoint:t.EndPoint||null,StartLatitude:t.StartLatitude||null,StartLongitude:t.StartLongitude||null,EndLatitude:t.EndLatitude||null,EndLongitude:t.EndLongitude||null}}let F=new Set(["CrewNameRaw","CrewFoundingDateRaw","CrewStoryRaw","CrewCityRaw","CrewCountryRaw","CrewContinentRaw","CrewCityLatitudeRaw","CrewCityLongitudeRaw","CrewCategoryRaw","CrewContactEmailRaw","ContactPersonFirstNameRaw","ContactPersonEmailRaw","ContactPersonInstagramRaw","ContactPersonStravaRaw","CrewFacebookFanpageURLRaw","CrewFacebookGroupURLRaw","CrewInstagramURLRaw","CrewXURLRaw","CrewStravaClubURLRaw","CrewHomepageURLRaw","CrewOtherSocialMediaURLsRaw","CrewTikTokURLRaw","CrewYouTubeURLRaw","CrewHeadquarterNameRaw","CrewHeadquarterAddressRaw","CrewHeadquarterGoogleMapsLinkRaw","CrewHeadquarterLatitudeRaw","CrewHeadquarterLongitudeRaw","CrewDistanceRaw","CrewPaceGroupsRaw","CrewMemberCountRaw","CrewMembershipTypeRaw","Crew
1MembershipFeeInfoRaw","CrewBrandSupportInfoRaw","CrewFavoriteRunningEventsRaw","CrewOwnEventRaw","CrewShortURLRequestRaw","CrewsLogoCloudinaryURLsRaw","CrewsPhotosCloudinaryURLsRaw","CrewsVideoCloudinaryURLsRaw","TeamMembersRaw","RunSchedulesRaw","RunSchedulesRunNameRaw","RunSchedulesDayOfWeekRaw","RunSchedulesTimeRaw","RunSchedulesRunningTypeRaw","RunSchedulesDistanceDescriptionRaw","RunSchedulesPaceDescriptionRaw","RunSchedulesSeasonalPeriodRaw","RunSchedulesMeetingPointNameRaw","RunSchedulesMeetingPointAddressRaw","RunSchedulesMeetingPointGoogleMapsURLRaw","RunSchedulesMeetingPointLatitudeRaw","RunSchedulesMeetingPointLongitudeRaw","RunSchedulesAdditionalInfoRaw","TeamMembersNameRaw","TeamMembersRoleRaw","TeamMembersStatusRaw","TeamMembersBioRaw","TeamMembersInstagramURLRaw","TeamMembersStravaURLRaw","TeamMembersEmailRaw","TeamMembersProfileImageCloudinaryURLRaw","DataSource","SubmissionDate"]),B={async getTeamMembers(e){if(!R)return[];try{let t=await L("/".concat(C.CREWS,"?filterByFormula=").concat(h(p("{CrewName}='".concat(y(e),"'"),g))));if(0===t.records.length)return[];let r=t.records[0].id;return(await L("/".concat(C.TEAM_MEMBERS,"?filterByFormula=FIND('").concat(r,"',ARRAYJOIN({RunSchedulesLinkToCrew}))"))).records.map(M)}catch(e){return[]}},async getRunSchedules(e){if(!R)return[];try{let t=await L("/".concat(C.CREWS,"?filterByFormula=").concat(h(p("{CrewName}='".concat(y(e),"'"),g))));if(0===t.records.length)return[];let r=t.records[0].id;return(await L("/".concat(C.RUN_SCHEDULES,"?filterByFormula=FIND('").concat(r,"',ARRAYJOIN({RunSchedulesLinkToCrew}))"))).records.map(v)}catch(e){return[]}},async getCrewRecordIdByNumericId(e){try{let t=await L("/".concat(C.CREWS,"?filterByFormula=").concat(h(p("{CrewID}=".concat(e),g))));if(t.records.length>0)return t.records[0].id;return null}catch(e){return null}},async getRunSchedulesById(e){if(!R)return[];try{let t=e;if(/^\d+$/.test(e)){let r=await this.getCrewRecordIdByNumericId(e);if(!r)return[];t=r}return(await U("/".concat(C.RUN_SCHEDULES))).filter(e=>{let r=e.fields.RunSchedulesLinkToCrew;return r&&Array.isArray(r)&&r.includes(t)}).map(v)}catch(e){return[]}},async getCrewMedia(e){try{let t=await L("/".concat(C.CREWS,"?filterByFormula=").concat(h(p("{CrewName}='".concat(y(e),"'"),g))));if(0===t.records.length)return[];let r=t.records[0].id;return(await L("/".concat(C.CREW_MEDIA,"?filterByFormula=FIND('").concat(r,"',ARRAYJOIN({RunSchedulesLinkToCrew}))"))).records.map(N)}catch(e){return[]}},async getCrewMediaById(e,t){try{let r=await L("/".concat(C.CREW_MEDIA,"?filterByFormula=FIND('").concat(e,"',ARRAYJOIN({RunSchedulesLinkToCrew}))")),a=r.records;if(t&&r.records.length<2)try{let e="{CrewName}='".concat(y(t),"'"),r=await L("/".concat(C.CREW_MEDIA,"?filterByFormula=").concat(h(e))),l=new Set(a.map(e=>e.id)),n=r.records.filter(e=>!l.has(e.id));a=[...a,...n]}catch(e){}return a.map(N)}catch(e){return[]}},extractImageUrls(e){let t=(0,n.A8)(),r=(0,n.dc)(),a=e.find(e=>"Logo"===e.MediaType&&e.FileURL);(null==a?void 0:a.FileURL)&&(t=a.FileURL);let l=e.find(e=>"Crew Picture"===e.MediaType&&e.FileURL);return(null==l?void 0:l.FileURL)&&(r=l.FileURL),{logoUrl:t,heroImageUrl:r}},submissionToCrew(e){var t,r,a,l;let i=e.fields||{},o=i.CrewNameRaw||"Unknown Crew";return{id:e.id,CrewName:o,FoundingDate:i.CrewFoundingDateRaw||null,CrewStory:i.CrewStoryRaw||null,CrewCategoryRaw:i.CrewCategoryRaw||null,CrewStoryLongFinal:null,CrewStoryExcerpt:i.CrewStoryRaw?i.CrewStoryRaw.slice(0,180)+(i.CrewStoryRaw.length>180?"…":""):null,City:i.CrewCityRaw||"",Country:i.CrewCountryRaw||"",Continent:i.CrewContinentRaw||null,ContactEmailCrew:i.CrewContactEmailRaw||null,FacebookFanpageURL:i.CrewFacebookFanpageURLRaw||null,FacebookGroupURL:i.CrewFacebookGroupURLRaw||null,InstagramURL:i.CrewInstagramURLRaw||null,XURL:i.CrewXURLRaw||null,StravaClubURL:i.CrewStravaClubURLRaw||null,HomepageURL:i.CrewHomepageURLRaw||null,OtherSocialMediaURLs:i.CrewOtherSocialMediaURLsRaw||null,ApproxMemberCount:null,MembershipType:i.CrewMembershipTypeRaw||null,MembershipFeeInfo:i.CrewMembershipFeeInfoRaw||null,CrewCategory:null,CrewStatus:"Running",logoUrl:(0,n.QE)(o,"logo")||(0,n.A8)(),heroImageUrl:(0,n.QE)(o,"photo")||(0,n.dc)(),imageUrl:(0,n.QE)(o,"photo")||(0,n.dc)(),HeadquarterName:null,HeadquarterAddress:null,HeadquarterGoogleMapsLink:i.CrewHeadquarterGoogleMapsLinkRaw||null,HeadquarterLatitude:null!=(t=i.CrewHeadquarterLatitudeRaw)?t:null,HeadquarterLongitude:null!=(r=i.CrewHeadquarterLongitudeRaw)?r:null,CityLatitude:null!=(a=i.CrewCityLatitudeRaw)?a:null,CityLongitude:null!=(l=i.CrewCityLongitudeRaw)?l:null,teamMembers:null,media:null,schedules:null,events:null,routes:null}},async getApprovedSubmissionsAsCrews(){return R?(await U("/".concat(C.CREW_SUBMISSIONS,"?filterByFormula=").concat(h("OR({ProcessingStatus}='Approved',{ProcessingStatus}='Processed')")))).filter(e=>{var t;return""!==((null==(t=e.fields)?void 0:t.CrewNameRaw)||"").trim()}).map(e=>this.submissionToCrew(e)):[]},async getAllPublicCrews(){let[e,t]=await Promise.allSettled([this.getAllCrews(),this.getApprovedSubmissionsAsCrews()]),r="fulfilled"===e.status?e.value:[],a="fulfilled"===t.status?t.value:[],l=new Set,n=e=>e.toLowerCase().trim(),i=[];for(let e of r){let t=n(e.CrewName||"");l.has(t)||(l.add(t),i.push(e))}for(let e of a){let t=n(e.CrewName||"");l.has(t)||(l.add(t),i.push(e))}return i},async getCrewsWithImages(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!R)throw Error("Airtable not configured. Please set AIRTABLE_PERSONAL_ACCESS_TOKEN and AIRTABLE_BASE_ID environment variables.");try{let{limit:t=50,includeImages:r=!1}=e,a=(await U("/".concat(C.CREWS,"?filterByFormula=").concat(h(g)))).map(I).slice(0,t);if(!r)return a;return await Promise.all(a.map(async e=>{let t=(0,n.QE)(e.CrewName,"logo"),r=(0,n.QE)(e.CrewName,"photo");return{...e,images:{logo:t,crewPicture:r}}}))}catch(e){return[]}},async getAllCrews(){if(!R)throw Error("Airtable not configured. Please set AIRTABLE_PERSONAL_ACCESS_TOKEN and AIRTABLE_BASE_ID environment variables.");try{return(await U("/".concat(C.CREWS,"?filterByFormula=").concat(h(g)))).map(I)}catch(e){throw Error("Unable to fetch crews from Airtable")}},async getAllCrewsWithMedia(){if(!R)return await this.getAllCrews();try{let e=(await U("/".concat(C.CREWS,"?filterByFormula=").concat(h(g)))).map(I);
1for(let t of e)try{let e=await this.getCrewMediaById(t.id,t.CrewName);if(t.media=e,t.media&&t.media.length>0){let e=this.extractImageUrls(t.media);E(t.logoUrl)&&e.logoUrl&&(t.logoUrl=e.logoUrl),A(t.heroImageUrl)&&e.heroImageUrl&&(t.heroImageUrl=e.heroImageUrl)}}catch(e){t.media=[]}return e}catch(e){throw Error("Unable to fetch crews from Airtable")}},async getAllCrewsWithFullData(){try{let e=(await U("/".concat(C.CREWS,"?filterByFormula=").concat(h(g)))).map(I);for(let t of e)try{let[e,r,a]=await Promise.allSettled([this.getTeamMembers(t.CrewName),this.getRunSchedules(t.CrewName),this.getCrewMediaById(t.id,t.CrewName)]);if(t.teamMembers="fulfilled"===e.status?e.value:[],t.schedules="fulfilled"===r.status?r.value:[],t.media="fulfilled"===a.status?a.value:[],t.media&&t.media.length>0){let e=this.extractImageUrls(t.media);E(t.logoUrl)&&e.logoUrl&&(t.logoUrl=e.logoUrl),A(t.heroImageUrl)&&e.heroImageUrl&&(t.heroImageUrl=e.heroImageUrl)}}catch(e){t.teamMembers=[],t.schedules=[],t.media=[]}return e}catch(e){throw Error("Unable to fetch crews from Airtable")}},async getCrewByName(e){let t=!(arguments.length>1)||void 0===arguments[1]||arguments[1];try{let r=await L("/".concat(C.CREWS,"?filterByFormula=").concat(h(p("{CrewName}='".concat(y(e),"'"),g))));if(0===r.records.length)return null;let a=I(r.records[0]);try{let e=[this.getTeamMembers(a.CrewName),this.getRunSchedules(a.CrewName)];t&&e.push(this.getCrewMediaById(a.id,a.CrewName));let r=await Promise.allSettled(e);if(a.teamMembers="fulfilled"===r[0].status?r[0].value:[],a.schedules="fulfilled"===r[1].status?r[1].value:[],t&&r[2]){if(a.media="fulfilled"===r[2].status?r[2].value:[],a.media&&a.media.length>0){let e=this.extractImageUrls(a.media);E(a.logoUrl)&&e.logoUrl&&(a.logoUrl=e.logoUrl),A(a.heroImageUrl)&&e.heroImageUrl&&(a.heroImageUrl=e.heroImageUrl)}}else a.media=[]}catch(e){a.teamMembers=[],a.schedules=[],a.media=[]}return a}catch(t){throw Error("Unable to fetch crew ".concat(e," from Airtable"))}},async getCrewById(e){let t=!(arguments.length>1)||void 0===arguments[1]||arguments[1];try{let r=await L("/".concat(C.CREWS,"?filterByFormula=").concat(h(p("RECORD_ID()='".concat(y(e),"'"),g))));if(0===r.records.length)return null;let a=I(r.records[0]);try{let e=[this.getTeamMembers(a.CrewName),this.getRunSchedules(a.CrewName)];t&&e.push(this.getCrewMediaById(a.id,a.CrewName));let r=await Promise.allSettled(e);if(a.teamMembers="fulfilled"===r[0].status?r[0].value:[],a.schedules="fulfilled"===r[1].status?r[1].value:[],t&&r[2]){if(a.media="fulfilled"===r[2].status?r[2].value:[],a.media&&a.media.length>0){let e=this.extractImageUrls(a.media);E(a.logoUrl)&&e.logoUrl&&(a.logoUrl=e.logoUrl),A(a.heroImageUrl)&&e.heroImageUrl&&(a.heroImageUrl=e.heroImageUrl)}}else a.media=[]}catch(e){a.teamMembers=[],a.schedules=[],a.media=[]}return a}catch(t){throw Error("Unable to fetch crew ".concat(e," from Airtable"))}},async getCrewsByCity(e){try{let t=p("{City}='".concat(y(e),"'"),g);return(await L("/".concat(C.CREWS,"?filterByFormula=").concat(h(t)))).records.map(I)}catch(t){throw Error("Unable to fetch crews in ".concat(e," from Airtable"))}},async getCrewsByCityWithFullData(e){try{let t=p("{City}='".concat(y(e),"'"),g),r=(await L("/".concat(C.CREWS,"?filterByFormula=").concat(h(t)))).records.map(I);for(let e of r)try{let[t,r,a]=await Promise.allSettled([this.getTeamMembers(e.CrewName),this.getRunSchedules(e.CrewName),this.getCrewMediaById(e.id,e.CrewName)]);if(e.teamMembers="fulfilled"===t.status?t.value:[],e.schedules="fulfilled"===r.status?r.value:[],e.media="fulfilled"===a.status?a.value:[],e.media&&e.media.length>0){let t=this.extractImageUrls(e.media);E(e.logoUrl)&&t.logoUrl&&(e.logoUrl=t.logoUrl),A(e.heroImageUrl)&&t.heroImageUrl&&(e.heroImageUrl=t.heroImageUrl)}}catch(t){e.teamMembers=[],e.schedules=[],e.media=[]}return r}catch(t){throw Error("Unable to fetch crews in ".concat(e," from Airtable"))}},async searchCrews(e){try{let t=p("SEARCH('".concat(y(e),"',{CrewName})"),g);return(await L("/".concat(C.CREWS,"?filterByFormula=").concat(h(t)))).records.map(I)}catch(t){throw Error("Unable to search crews with term ".concat(e," from Airtable"))}},async searchCrewsWithFullData(e){try{let t=p("SEARCH('".concat(y(e),"',{CrewName})"),g),r=(await L("/".concat(C.CREWS,"?filterByFormula=").concat(h(t)))).records.map(I);for(let e of r)try{let[t,r,a]=await Promise.allSettled([this.getTeamMembers(e.CrewName),this.getRunSchedules(e.CrewName),this.getCrewMedia
1ById(e.id,e.CrewName)]);if(e.teamMembers="fulfilled"===t.status?t.value:[],e.schedules="fulfilled"===r.status?r.value:[],e.media="fulfilled"===a.status?a.value:[],e.media&&e.media.length>0){let t=this.extractImageUrls(e.media);E(e.logoUrl)&&t.logoUrl&&(e.logoUrl=t.logoUrl),A(e.heroImageUrl)&&t.heroImageUrl&&(e.heroImageUrl=t.heroImageUrl)}}catch(t){e.teamMembers=[],e.schedules=[],e.media=[]}return r}catch(t){throw Error("Unable to search crews with term ".concat(e))}},getCrewBySlug:async()=>null,async getRandomRoutes(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:3;try{let t=await L("/".concat(C.RUNNING_ROUTES));if(0===t.records.length)return[];return t.records.map(D).sort(()=>.5-Math.random()).slice(0,e)}catch(e){return[]}},async getGlobalStatistics(){if(!R)throw Error("Airtable not configured. Please set AIRTABLE_PERSONAL_ACCESS_TOKEN and AIRTABLE_BASE_ID environment variables.");try{let e=(await U("/".concat(C.CREWS,"?filterByFormula=").concat(h(g)))||[]).map(I),t=e.length,r=e.reduce((e,t)=>e+(t.ApproxMemberCount||0),0),a=new Set(e.map(e=>{var t;return null==(t=e.City)?void 0:t.trim().toLowerCase()}).filter(Boolean)),l=new Set(e.map(e=>{var t;return null==(t=e.Country)?void 0:t.trim().toLowerCase()}).filter(Boolean));return{activeCrews:t,totalRunners:r,cities:a.size,countries:l.size,routes:0,events:0}}catch(e){return{activeCrews:150,totalRunners:4500,cities:188,countries:60,routes:0,events:0}}},async getAllRoutes(){if(!R)return[];try{return(await U("/".concat(C.RUNNING_ROUTES))).map(D)}catch(e){return[]}},async getAllEvents(){if(!R)return[];try{return(await U("/".concat(C.RUNNING_EVENTS))).map(e=>({EventID:parseInt(e.id.replace("rec",""),36),EventName:e.fields.EventName,City:e.fields.City,Country:e.fields.Country,EventStartDate:e.fields.EventStartDate||null,EventEndDate:e.fields.EventEndDate||null,Location:e.fields.Location||null,Latitude:e.fields.Latitude||null,Longitude:e.fields.Longitude||null,EventType:e.fields.EventType||null,BriefDescription:e.fields.BriefDescription||null,EventURL:e.fields.EventURL||null,RegistrationURL:e.fields.RegistrationURL||null,EventImage:e.fields.EventImage||null}))}catch(e){return[]}},async getAllBlogs(){if(!R)return[];try{let e="AND({Status} = 'Published')",t=await L("/".concat(C.BLOG,"?filterByFormula=").concat(h(e))),r=t.records||[],a=t.offset;for(;a;){let t=await L("/".concat(C.BLOG,"?filterByFormula=").concat(h(e),"&offset=").concat(a));r=r.concat(t.records||[]),a=t.offset}return r.map(e=>{var t,r;let a={id:e.id,title:e.fields.Title,slug:e.id};return e.fields.Content&&(a.content=e.fields.Content),e.fields.Article&&(a.article=e.fields.Article),e.fields.Excerpt&&(a.excerpt=e.fields.Excerpt),e.fields.PublishDate&&(a.publishDate=e.fields.PublishDate),e.fields.Author&&(a.author=e.fields.Author),(null==(t=e.fields.FeaturedImage)?void 0:t[0])&&(a.featuredImage=e.fields.FeaturedImage[0]),e.fields.Gallery&&(a.gallery=e.fields.Gallery),e.fields.Category&&(a.category=e.fields.Category),e.fields.Tags&&(a.tags=e.fields.Tags),e.fields.Status&&(a.status=e.fields.Status),e.fields.PublishDate&&(a.date=e.fields.PublishDate),e.fields.Excerpt&&(a.snippet=e.fields.Excerpt),(null==(r=e.fields.FeaturedImage)?void 0:r[0])&&(a.image=e.fields.FeaturedImage[0]),e.fields.Author&&(a.subheadline=e.fields.Author),a})}catch(e){return[]}},async getBlogById(e){if(!R)return null;try{var t,r;let a="AND(RECORD_ID()='".concat(y(e),"', {Status} = 'Published')"),l=await L("/".concat(C.BLOG,"?filterByFormula=").concat(h(a)));if(0===l.records.length)return null;let n=l.records[0],i={id:n.id,title:n.fields.Title,slug:n.id};return n.fields.Content&&(i.content=n.fields.Content),n.fields.Article&&(i.article=n.fields.Article),n.fields.Excerpt&&(i.excerpt=n.fields.Excerpt),n.fields.PublishDate&&(i.publishDate=n.fields.PublishDate),n.fields.Author&&(i.author=n.fields.Author),(null==(t=n.fields.FeaturedImage)?void 0:t[0])&&(i.featuredImage=n.fields.FeaturedImage[0]),n.fields.Gallery&&(i.gallery=n.fields.Gallery),n.fields.Category&&(i.category=n.fields.Category),n.fields.Tags&&(i.tags=n.fields.Tags),n.fields.Status&&(i.status=n.fields.Status),n.fields.PublishDate&&(i.date=n.fields.PublishDate),n.fields.Excerpt&&(i.snippet=n.fields.Excerpt),(null==(r=n.fields.FeaturedImage)?void 0:r[0])&&(i.image=n.fields.FeaturedImage[0]),n.fields.Author&&(i.subheadline=n.fields.Author),i}catch(t){throw Error("Unable to fetch blog post ".concat(e," from Airtable"))}},async getCrewsByBounds(e){try{return(await U("/".concat(C.CREWS,"?filterByFormula=").concat(h(g)))).map(I).filter(t=>{var r,a;let l=null!=(r=t.HeadquarterLatitude)?r:t.CityLatitude,n=null!=(a=t.HeadquarterLongitude)?a:t.CityLongitude;if(null==l||null==n)return!1;let i=l>=e.south&&l<=e.north,o=n>=e.west&&n<=e.east;return i&&o})}catch(e){throw Error("Unable to fetch crews by geographic bounds from Airtable")}},async testConnection(){try{return await L("/".concat(C.CREWS),{maxRecords:1}),!0}catch(e){return!1}},async createCrewSubmission(e){if(!R)return{success:!1,error:"Airtable not configured"};try{var t,r,a,l,n,i;let o=function(e){let t={};for(let[r,a]of Object.entries(null!=e?e:{}))F.has(r)&&null!=a&&""!==a&&(t[r]=a);let r=e=>Array.isArray(e)?e:"string"==typeof e?e.split(",").map(e=>
1e.trim()).filter(Boolean):void 0;t.CrewDistanceRaw&&(t.CrewDistanceRaw=r(t.CrewDistanceRaw)),t.CrewPaceGroupsRaw&&(t.CrewPaceGroupsRaw=r(t.CrewPaceGroupsRaw)),Array.isArray(t.CrewDistanceRaw)&&!t.CrewDistanceRaw.length&&delete t.CrewDistanceRaw,Array.isArray(t.CrewPaceGroupsRaw)&&!t.CrewPaceGroupsRaw.length&&delete t.CrewPaceGroupsRaw;let a=new Set(["Mini","Small","Medium","Large","Very Large"]);t.CrewMemberCountRaw&&!a.has(String(t.CrewMemberCountRaw))&&delete t.CrewMemberCountRaw;let l=new Set(["Open to everyone","Members Only","Not mentioned","Pay as you go"]);return t.CrewMembershipTypeRaw&&!l.has(String(t.CrewMembershipTypeRaw))&&delete t.CrewMembershipTypeRaw,["CrewCityLatitudeRaw","CrewCityLongitudeRaw","CrewHeadquarterLatitudeRaw","CrewHeadquarterLongitudeRaw"].forEach(e=>{if(e in t){let r=(e=>{if("number"==typeof e)return e;if("string"==typeof e&&""!==e.trim()){let t=Number(e);return Number.isFinite(t)?t:void 0}})(t[e]);void 0===r?delete t[e]:t[e]=r}}),t.DataSource||(t.DataSource="Website"),t.SubmissionDate||(t.SubmissionDate=new Date().toISOString()),delete t.CrewHeadquarterAddressURLRaw,t}(e),u="".concat(c,"/").concat(C.CREW_SUBMISSIONS,"?typecast=true"),s=await fetch(u,{method:"POST",headers:f,body:JSON.stringify({records:[{fields:o}],typecast:!0})}),d=await s.text();if(!s.ok){let e="Airtable API error: ".concat(s.status," ").concat(s.statusText);try{let t=JSON.parse(d);((null==t||null==(a=t.error)?void 0:a.type)||(null==t||null==(l=t.error)?void 0:l.message))&&(e+=" | ".concat(null!=(n=t.error.type)?n:"",": ").concat(null!=(i=t.error.message)?i:"").trim())}catch(e){}return{success:!1,error:e}}let w=null==(r=JSON.parse(d).records)||null==(t=r[0])?void 0:t.id;return{success:!0,recordId:w}}catch(e){return{success:!1,error:(null==e?void 0:e.message)||"Failed to create crew submission"}}}}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.