1import{B as e,C as t,G as n,K as r,L as i,R as a,U as o,W as s,X as c,Y as l,Z as u,c as d,f,g as p,r as m,z as h}from"./index-BRHgluvl.js";import"./app-header-qlxInHpk.js";import"./platformTrackingHeaders-CnvtUgIo.js";import{t as g}from"./spinner-VfVbRZNi.js";import{c as _,d as v,i as y,r as b,u as x}from"./app-report.api-BuJJ0J_z.js";var S=c` 2 :host { 3 display: block; 4 background-image: url("/assets/new/Hero1920_withmani.webp"); 5 background-size: contain; 6 background-repeat: no-repeat; 7 background-position: center top; 8 @media (max-width: 535px) { 9 background-position-y: 70px; 10 } 11 } 12 13 .page-title { 14 display: flex; 15 align-items: center; 16 gap: 16px; 17 padding: 0 6px; 18 wa-icon[name="check-circle-fill"] { 19 color: var(--wa-color-success-50); 20 } 21 22 wa-icon[name="exclamation-octagon"] { 23 color: var(--wa-color-danger-50); 24 } 25 } 26 27 .content { 28 max-width: 1300px; 29 margin-left: auto; 30 margin-right: auto; 31 margin-top: 100px; 32 padding: 16px; 33 @media (max-width: 535px) { 34 padding: 0; 35 } 36 } 37 38 wa-card { 39 width: 100%; 40 } 41 42 .card-footer { 43 display: flex; 44 justify-content: flex-end; 45 align-items: center; 46 gap: 16px; 47 } 48 49 .pwa-header { 50 display: flex; 51 align-items: center; 52 gap: 16px; 53 overflow: clip; 54 .pwa-icon { 55 max-width: 92px; 56 max-height: 92px; 57 height: auto; 58 } 59 60 .pwa-title { 61 margin: 0; 62 } 63 64 p { 65 margin: 0; 66 color: var(--wa-color-neutral-40); 67 font-size: 0.8em; 68 @media (max-width: 535px) { 69 display: block; 70 white-space: nowrap; 71 overflow: hidden; 72 text-overflow: ellipsis; 73 max-width: 200px; 74 } 75 } 76 } 77 78 .logs { 79 display: flex; 80 flex-direction: column; 81 gap: 4px; 82 background-color: var(--wa-color-neutral-90); 83 max-height: 400px; 84 height: 400px; 85 overflow: auto; 86 padding: 16px; 87 .log { 88 display: block; 89 padding: 4px; 90 color: rgb(31, 35, 40); 91 font-size: 0.8em; 92 font-family: monospace; 93 &:hover { 94 background-color: var(--wa-color-neutral-80); 95 } 96 97 &.warn { 98 color: var(--wa-color-warning-50); 99 } 100 101 &.error { 102 color: var(--wa-color-danger-50); 103 } 104 } 105 } 106`,C=c` 107 :host { 108 --spacing: var(--wa-space-l); 109 110 /* Internal calculated properties */ 111 --inner-border-radius: calc(var(--wa-panel-border-radius) - var(--wa-panel-border-width)); 112 113 display: flex; 114 flex-direction: column; 115 background-color: var(--wa-color-surface-default); 116 border-color: var(--wa-color-surface-border); 117 border-radius: var(--wa-panel-border-radius); 118 border-style: var(--wa-panel-border-style); 119 box-shadow: var(--wa-shadow-s); 120 border-width: var(--wa-panel-border-width); 121 color: var(--wa-color-text-normal); 122 } 123 124 /* Appearance modifiers */ 125 :host([appearance='plain']) { 126 background-color: transparent; 127 border-color: transparent; 128 box-shadow: none; 129 } 130 131 :host([appearance='outlined']) { 132 background-color: var(--wa-color-surface-default); 133 border-color: var(--wa-color-surface-border); 134 } 135 136 :host([appearance='filled']) { 137 background-color: var(--wa-color-neutral-fill-quiet); 138 border-color: transparent; 139 } 140 141 :host([appearance='filled-outlined']) { 142 background-color: var(--wa-color-neutral-fill-quiet); 143 border-color: var(--wa-color-surface-border); 144 } 145 146 :host([appearance='accent']) { 147 color: var(--wa-color-neutral-on-loud); 148 background-color: var(--wa-color-neutral-fill-loud); 149 border-color: transparent; 150 } 151 152 /* Take care of top and bottom radii */ 153 .media, 154 :host(:not([with-media])) .header, 155 :host(:not([with-media], [with-header])) .body { 156 border-start-start-radius: var(--inner-border-radius); 157 border-start-end-radius: var(--inner-border-radius); 158 } 159 160 :host(:not([with-footer])) .body, 161 .footer { 162 border-end-start-radius: var(--inner-border-radius); 163 border-end-end-radius: var(--inner-border-radius); 164 } 165 166 .media { 167 display: flex; 168 overflow: hidden; 169 170 &::slotted(*) { 171 display: block; 172 width: 100%; 173 border-radius: 0 !important; 174 } 175 } 176 177 /* Round all corners for plain appearance */ 178 :host([appearance='plain']) .media { 179 border-radius: var(--inner-border-radius); 180 181 &::slotted(*) { 182 border-radius: inherit !important; 183 } 184 } 185 186 .header { 187 display: block; 188 border-block-end-style: inherit; 189 border-block-end-color: var(--wa-color-surface-border); 190 border-block-end-width: var(--wa-panel-border-width); 191 padding: calc(var(--spacing) / 2) var(--spacing); 192 } 193 194 .body { 195 display: block; 196 padding: var(--spacing); 197 } 198 199 .footer { 200 display: block; 201 border-block-start-style: inherit; 202 border-block-start-color: var(--wa-color-surface-border); 203 border-block-start-width: var(--wa-panel-border-width); 204 padding: var(--spacing); 205 } 206 207 /* Push slots to sides when the action slots renders */ 208 .has-actions { 209 display: flex; 210 align-items: center; 211 justify-content: space-between; 212 } 213 214 :host(:not([with-header])) .header, 215 :host(:not([with-footer])) .footer, 216 :host(:not([with-media])) .media { 217 display: none; 218 } 219 220 /* Orientation Styles */ 221 :host([orientation='horizontal']) { 222 flex-direction: row; 223 224 .media { 225 border-start-start-radius: var(--inner-border-radius); 226 border-end-start-radius: var(--inner-border-radius); 227 border-start-end-radius: 0; 228 229 &::slotted(*) { 230 block-size: 100%; 231 inline-size: 100%; 232 object-fit: cover; 233 } 234 } 235 } 236 237 :host([orientation='horizontal']) .body slot::slotted(*) { 238 display: block; 239 height: 100%; 240 margin: 0; 241 } 242 243 :host([orientation='horizontal']) slot[name='actions']::slotted(*) { 244 display: flex; 245 align-items: center; 246 padding: var(--spacing); 247 } 248`,w=class extends t{constructor(){super(...arguments),this.hasSlotController=new m(this,`footer`,`header`,`media`,`header-actions`,`footer-actions`,`actions`),this.appearance=`outlined`,this.withHeader=!1,this.withMedia=!1,this.withFooter=!1,this.withHeaderActions=!1,this.withFooterActions=!1,this.orientation=`vertical`}willUpdate(e){this.withHeader=this.hasSlotController.test(`header`,`withHeader`),this.withMedia=this.hasSlotController.test(`media`,`withMedia`),this.withFooter=this.hasSlotController.test(`footer`,`withF
248ooter`),super.willUpdate(e)}render(){if(this.orientation===`horizontal`)return l` 249 <slot name="media" part="media" class="media"></slot> 250 <div part="body" class="body"><slot></slot></div> 251 <slot name="actions" part="actions" class="actions"></slot> 252 `;let e=this.hasSlotController.test(`header-actions`,`withHeaderActions`),t=this.hasSlotController.test(`footer-actions`,`withFooterActions`);return l` 253 <slot name="media" part="media" class="media"></slot> 254 255 <header 256 part="header" 257 class=${f({header:!0,"has-actions":e})} 258 > 259 <slot name="header"></slot> 260 <slot name="header-actions"></slot> 261 </header> 262 263 <div part="body" class="body"><slot></slot></div> 264 265 <footer 266 part="footer" 267 class=${f({footer:!0,"has-actions":t})} 268 > 269 <slot name="footer"></slot> 270 <slot name="footer-actions"></slot> 271 </footer> 272 `}};w.css=[d,C],u([s({reflect:!0})],w.prototype,`appearance`,2),u([s({attribute:`with-header`,type:Boolean,reflect:!0})],w.prototype,`withHeader`,2),u([s({attribute:`with-media`,type:Boolean,reflect:!0})],w.prototype,`withMedia`,2),u([s({attribute:`with-footer`,type:Boolean,reflect:!0})],w.prototype,`withFooter`,2),u([s({attribute:`with-header-actions`,type:Boolean,reflect:!0})],w.prototype,`withHeaderActions`,2),u([s({attribute:`with-footer-actions`,type:Boolean,reflect:!0})],w.prototype,`withFooterActions`,2),u([s({reflect:!0})],w.prototype,`orientation`,2),w=u([n(`wa-card`)],w),w.disableWarning?.(`change-in-update`);function T(e){return e&&e.replace(/(--(?:ks-key-alias|ks-pass|key-pass|ks-key-pass)[=\s]+(?:(?:pass|file|env):)?)("[^"]*"|'[^']*'|\S+)/gi,(e,t,n)=>{let r=n.startsWith(`"`)?`"`:n.startsWith(`'`)?`'`:``;return`${t}${r}****${r}`})}var E=class extends r{constructor(...e){super(...e),this.forbiddenAnalysisHelpUrl=`https://docs.pwabuilder.com/#/builder/faq?id=error-403-forbidden-during-analysis-or-packaging`,this.forbiddenAnalysisFailureMessage=`Your web app is blocking PWABuilder from accessing your app's images, serving 403 Forbidden errors to PWABuilder. If the problem persists, please temporarily disable your firewall, CDN, or Cloudflare while packaging with PWABuilder. For more help, see https://docs.pwabuilder.com/#/builder/faq?id=error-403-forbidden-during-analysis-or-packaging`,this.jobId=null,this.hasFailed=!1,this.logs=[],this.job=null,this.isRetrying=!1,this.pollIntervalMs=3e3,this.maxWaitTimeMs=1800*1e3,this.pollQueryRetryDelayMs=1e4,this.jobTimeoutHandle=0,this.hasRecordedCompletion=!1,this.hasRecordedFailure=!1,this.pollQueryErrorCount=0}static{this.styles=[S]}connectedCallback(){super.connectedCallback();let e=new URLSearchParams(window.location.search.toLowerCase()).get(`jobid`);e&&(this.appendLog(`Querying for job...`),this.jobId=e)}updated(e){if(e.has(`jobId`)&&this.jobId){let e=this.jobId;setTimeout(()=>this.pollJob(e),this.pollIntervalMs),this.jobTimeoutHandle=window.setTimeout(()=>this.jobTimedOut(),this.maxWaitTimeMs)}e.has(`logs`)&&this.logsScrollToBottom()}render(){return l` 273 <app-header page="report"></app-header> 274 <div class="content"> 275 ${this.renderTitle()} 276 <wa-card> 277 ${this.renderHeader()} 278 <div class="logs"> 279 ${g(this.logs,e=>this.renderLog(e))} 280 </div> 281 ${this.renderFooter()} 282 </wa-card> 283 </div> 284 `}renderTitle(){return this.hasFailed?l` 285 <h2 class="page-title"> 286 <wa-icon name="exclamation-octagon"></wa-icon> 287 ${this.hasForbiddenAnalysisFailure()?`Your web host is blocking PWABuilder`:`Unable to create Google Play package`} 288 </h2> 289 `:this.job?this.job.status===`Queued`?l` 290 <h2 class="page-title"> 291 <wa-spinner></wa-spinner> 292 Waiting for agent to pick up job... 293 </h2> 294 `:this.job.status===`Failed`?l` 295 <h2 class="page-title"> 296 <wa-icon name="exclamation-octagon"></wa-icon> 297 ${this.hasForbiddenAnalysisFailure()?`Your web host is blocking PWABuilder`:`Unable to create Google Play package`} 298 </h2> 299 `:this.job.status===`Completed`?l` 300 <h2 class="page-title"> 301 <wa-icon name="check-circle-fill"></wa-icon> 302 Package created successfully 303 </h2> 304 `:l` 305 <h2 class="page-title"> 306 <wa-spinner></wa-spinner> 307 Creating your Google Play package... 308 </h2> 309 `:l` 310 <h2 class="page-title"> 311 <wa-spinner></wa-spinner> 312 Checking Google Play package status... 313 </h2> 314 `}
314renderHeader(){if(!this.job?.packageOptions)return l``;let e=new Date(this.job.createdAt).toLocaleString();return l` 315 <div class="pwa-header" slot="header"> 316 <img class="pwa-icon" src="${this.job.packageOptions.iconUrl}" alt="PWA Icon" /> 317 <div> 318 <h3 class="pwa-title">${this.job.packageOptions.name}</h3> 319 <p><a href="${this.job.packageOptions.webManifestUrl}">${this.job.packageOptions.webManifestUrl}</a></p> 320 <p>Queued for packaging at ${e}</p> 321 </div> 322 </div> 323 `}renderFooter(){if(!this.job&&!this.hasFailed)return l``;if(this.job?.status===`Failed`||this.hasFailed){let e=this.getErrorLogForGitHubIssue(this.logs).replaceAll(` 324`,` 325> `),t=encodeURIComponent(`I received the [following error](https://pwabuilder.com/google-play-packaging-status?jobId=${this.job?.id||this.jobId}) when creating a Google Play package for ${this.job?.packageOptions.pwaUrl||`[empty]`}.\n\n> ${e}`);return this.hasForbiddenAnalysisFailure()?l` 326 <div class="card-footer" slot="footer"> 327 <wa-button @click="${this.retryJob}">Retry</wa-button>
327 328 <wa-button target="_blank" href="${this.forbiddenAnalysisHelpUrl}">Show me how to fix this</wa-button> 329 </div> 330 `:l` 331 <div class="card-footer" slot="footer"> 332 <wa-button @click="${this.retryJob}">Retry</wa-button> 333 <wa-button target="_blank" href="https://github.com/pwa-builder/PWABuilder/issues/new?&labels=bug%20%3Abug%3A,android-platform&title=${`Error%20creating%20Google%20Play%20package`}&body=${t}">Report a bug</wa-button> 334 </div> 335 `}return l``}renderLog(e){let t=`log`;return e.includes(`[error]`)&&(t+=` error`),e.includes(`[warn]`)&&(t+=` warn`),l`<span class="${t}">${e}</span>`}async pollJob(e){let t;try{t=await v(e),this.pollQueryErrorCount=0,this.job=t}catch(t){this.pollQueryErrorCount<1?(this.pollQueryErrorCount++,setTimeout(()=>this.pollJob(e),this.pollQueryRetryDelayMs)):this.pollJobFailed(e,t);return}this.ensureLogContains(t.logs),t.status===`Completed`?await this.jobCompleted(t):t.status===`Failed`?(this.appendForbiddenAnalysisFailureLog(),this.jobFailed(t)):setTimeout(()=>this.pollJob(e),this.pollIntervalMs)}async jobCompleted(e){if(this.recordPackagingCompleted(e.analysisId),new Date(e.createdAt)<new Date(Date.now()-1440*60*1e3)){this.appendLog(`Package was generated over 24 hours ago. Skipping download of package zip file. Old packages are automatically deleted after a period of time, but you may try downloading manually from ${i.androidPackageGeneratorUrl}//downloadPackageZip?id=${e.id}`),clearTimeout(this.jobTimeoutHandle);return}let t;try{t=await _(e.id),clearTimeout(this.jobTimeoutHandle),this.downloadBlob(t,e),this.appendLog(`Package created successfully. Download has begun.`)}catch(t){this.downloadFailed(e,t)}}jobTimedOut(){this.appendLog(`[error] Timed out waiting for Google Play packaging job to complete.`),this.hasFailed=!0,this.recordPackagingFailed(this.job?.analysisId??null,`Timed out waiting for Google Play packaging job to complete.`)}pollJobFailed(e,t){this.appendLog(`[error] Error when querying for Google Play packaging job ${e}.`),this.hasFailed=!0,this.trackPackageFailure(t),this.recordPackagingFailed(this.job?.analysisId??null,t instanceof Error?t:`${t}`)}jobFailed(e){this.hasFailed=!0,console.error(`Google Play packaging job failed.`,e.errors),this.trackPackageFailure(e.errors.join(` 336`)),this.recordPackagingFailed(e.analysisId,e.errors.join(` 337`))}downloadFailed(e,t){let n=`${i.androidPackageGeneratorUrl}/downloadPackageZip?id=${encodeURIComponent(e.id)}`;this.appendLog(`Error download Google Play package from ${n} for job ${e.id}: ${t}`),this.hasFailed=!0,this.trackPackageFailure(t),this.recordPackagingFailed(e.analysisId,t instanceof Error?t:`${t}`)}recordPackagingCompleted(e){!e||this.hasRecordedCompletion||(this.hasRecordedCompletion=!0,b(e,`GooglePlayStore`).catch(e=>{console.warn(`Unable to record packaging completion.`,e)}))}recordPackagingFailed(e,t){!e||this.hasRecordedFailure||(this.hasRecordedFailure=!0,y(e,`GooglePlayStore`,t).catch(e=>{console.warn(`Unable to record packaging failure.`,e)}))}appendLog(e){this.logs=[...this.logs,e]}ensureLogContains(e){e.filter(e=>!this.logs.includes(e)).forEach(e=>this.appendLog(e))}downloadBlob(e,t){let n=window.URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=`${t.packageOptions.launcherName||t.packageOptions.name||`My PWA`} - Google Play package.zip`,document.body.appendChild(r),r.click(),document.body.removeChild(r),window.URL.revokeObjectURL(n)}trackPackageFailure(e){h(`analyze-and-package-pwa`,`create-android-package-failed`,a.CancelProcess,{url:this.job?.packageOptions?.pwaUrl||``,error:e}),h(`pwa-builder`,`create-android-package-failed`,a.CancelProcess,{url:this.job?.packageOptions?.pwaUrl||``,error:e})}logsScrollToBottom(){let e=this.shadowRoot?.querySelector(`.logs`);e&&e.scrollTo({top:e.scrollHeight,behavior:`smooth`})}hasForbiddenAnalysisFailure(){return this.job?.status===`Failed`||this.hasFailed?this.logs.some(e=>e.includes(this.forbiddenAnalysisHelpUrl)):!1}appendForbiddenAnalysisFailureLog(){!this.hasForbiddenAnalysisFailure()||this.logs.some(e=>e.includes(this.forbiddenAnalysisFailureMessage))||this.appendLog(`${new Date().toISOString()} [error]: ${this.forbiddenAnalysisFailureMessage}`)}async retryJob(){if(!this.job?.packageOptions){console.error(`Can't retry job because the job or its package options are missing.`);return}this.isRetrying=!0;try{let t=await x(this.job.packageOptions);e.go(`/google-play-packaging-status?jobId=${t}`)}catch(e){this.appendLog(`Error retrying job: `+e)}}getErrorLogForGitHubIssue(e){let t=[...e].reverse().filter(e=>e.includes(`[error]`));return T(t.find(e=>e.includes(` 338`))||t[0]||`No logs available`)}};p([s({attribute:`job-id`})],E.prototype,`jobId`,void 0),p([o()],E.prototype,`hasFailed`,void 0),p([o()],E.prototype,`logs`,void 0),p([o()],E.prototype,`job`,void 0),p([o()],E.prototype,`isRetrying`,void 0),E=p([n(`google-play-packaging-status`)],E);export{E as GooglePlayPackagingStatus}; 339//# sourceMappingURL=google-play-packaging-status-Bs4Zvy0W.js.map
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.