PageSourceSearch

https://pwabuilder.com/code/google-play-packaging-status-Bs4Zvy0W.js

js pwabuilder.com collected 2026-09-24 09:09:03 UTC 17,421 bytes, 339 lines download raw bytes

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.