Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit 5d3a863

Browse files
Sign In with Apple #1340
1 parent 7064729 commit 5d3a863

18 files changed

+624
-19
lines changed

demo/app/main-page.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@
117117
<Button row="8" col="0" text="phone login" tap="{{ doLoginByPhone }}" class="button"/>
118118
<Button row="8" col="1" text="update profile" tap="{{ doUpdateProfile }}" class="button"/>
119119

120-
<Button row="9" col="0" colSpan="2" text="email sign-in methods" tap="{{ doFetchSignInMethodsForEmail }}" class="button"/>
120+
<Button row="9" col="0" text="Apple login" tap="{{ doSignInWithApple }}" class="button"/>
121+
<Button row="9" col="1" text="sign-in methods" tap="{{ doFetchSignInMethodsForEmail }}" class="button"/>
121122

122123
<Button row="10" col="0" text="re-auth passwd" tap="{{ doReauthenticatePwdUser }}" class="button"/>
123124
<Button row="10" col="1" text="re-auth Facebook" tap="{{ doReauthenticateFacebookUser }}" class="button"/>

demo/app/main-view-model.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { MessagingViewModel } from "./messaging-view-model";
1010

1111
const firebaseWebApi = require("nativescript-plugin-firebase/app");
1212

13-
1413
declare const Crashlytics: any;
1514

1615
export class HelloWorldModel extends Observable {
@@ -1103,6 +1102,26 @@ export class HelloWorldModel extends Observable {
11031102
);
11041103
}
11051104

1105+
public doSignInWithApple(): void {
1106+
firebase.login({
1107+
// note that you need to enable "Sign in with Apple" in your firebase instance
1108+
type: firebase.LoginType.APPLE,
1109+
appleOptions: {
1110+
locale: "nl",
1111+
scopes: ["email"]
1112+
}
1113+
}).then(
1114+
result => console.log("Apple login OK: " + JSON.stringify(result)),
1115+
errorMessage => {
1116+
alert({
1117+
title: "Login error",
1118+
message: errorMessage,
1119+
okButtonText: "OK, pity"
1120+
});
1121+
}
1122+
);
1123+
}
1124+
11061125
public doLoginByGoogle(): void {
11071126
firebase.login({
11081127
// note that you need to enable Google auth in your firebase instance

demo/app_resources/Android/google-services.json

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,42 @@
66
"storage_bucket": "n-plugin-test.appspot.com"
77
},
88
"client": [
9+
{
10+
"client_info": {
11+
"mobilesdk_app_id": "1:1052836194035:android:09546560b4505797",
12+
"android_client_info": {
13+
"package_name": "com.google.firebase.samples.apps.mlkit"
14+
}
15+
},
16+
"oauth_client": [
17+
{
18+
"client_id": "1052836194035-mvghp8j5h3eh17c0n1dl0pkaeum8hjii.apps.googleusercontent.com",
19+
"client_type": 3
20+
}
21+
],
22+
"api_key": [
23+
{
24+
"current_key": "AIzaSyDSMjaKslCCA-U4MZm_ZFQjkGP_mS0RQKM"
25+
}
26+
],
27+
"services": {
28+
"appinvite_service": {
29+
"other_platform_oauth_client": [
30+
{
31+
"client_id": "1052836194035-mvghp8j5h3eh17c0n1dl0pkaeum8hjii.apps.googleusercontent.com",
32+
"client_type": 3
33+
},
34+
{
35+
"client_id": "1052836194035-l81fsjai1u40ocnqjcpnoebnnsltt03b.apps.googleusercontent.com",
36+
"client_type": 2,
37+
"ios_info": {
38+
"bundle_id": "org.nativescript.firebasedemo"
39+
}
40+
}
41+
]
42+
}
43+
}
44+
},
945
{
1046
"client_info": {
1147
"mobilesdk_app_id": "1:1052836194035:android:443e3741d53b6bc3",
@@ -14,6 +50,14 @@
1450
}
1551
},
1652
"oauth_client": [
53+
{
54+
"client_id": "1052836194035-onnou4qukbes6dcpi9tn8btm02nbbnfu.apps.googleusercontent.com",
55+
"client_type": 1,
56+
"android_info": {
57+
"package_name": "org.nativescript.firebasedemo",
58+
"certificate_hash": "2515e2dd22f0cd4988f9e6346f7a2433712fd651"
59+
}
60+
},
1761
{
1862
"client_id": "1052836194035-jtaui0ukukm0o8peubst87stchckm6cu.apps.googleusercontent.com",
1963
"client_type": 1,
@@ -49,15 +93,20 @@
4993
}
5094
],
5195
"services": {
52-
"analytics_service": {
53-
"status": 1
54-
},
5596
"appinvite_service": {
56-
"status": 1,
57-
"other_platform_oauth_client": []
58-
},
59-
"ads_service": {
60-
"status": 2
97+
"other_platform_oauth_client": [
98+
{
99+
"client_id": "1052836194035-mvghp8j5h3eh17c0n1dl0pkaeum8hjii.apps.googleusercontent.com",
100+
"client_type": 3
101+
},
102+
{
103+
"client_id": "1052836194035-l81fsjai1u40ocnqjcpnoebnnsltt03b.apps.googleusercontent.com",
104+
"client_type": 2,
105+
"ios_info": {
106+
"bundle_id": "org.nativescript.firebasedemo"
107+
}
108+
}
109+
]
61110
}
62111
}
63112
}

demo/app_resources/iOS/GoogleService-Info.plist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
<string>1052836194035-l81fsjai1u40ocnqjcpnoebnnsltt03b.apps.googleusercontent.com</string>
1111
<key>REVERSED_CLIENT_ID</key>
1212
<string>com.googleusercontent.apps.1052836194035-l81fsjai1u40ocnqjcpnoebnnsltt03b</string>
13+
<key>ANDROID_CLIENT_ID</key>
14+
<string>1052836194035-onnou4qukbes6dcpi9tn8btm02nbbnfu.apps.googleusercontent.com</string>
1315
<key>API_KEY</key>
1416
<string>AIzaSyDuXPZxKamjttwP_hYpnX7MvDoZWhAVVtk</string>
1517
<key>GCM_SENDER_ID</key>

demo/app_resources/iOS/app.entitlements

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
<dict>
55
<key>aps-environment</key>
66
<string>development</string>
7+
<key>com.apple.developer.applesignin</key>
8+
<array>
9+
<string>Default</string>
10+
</array>
711
<key>com.apple.developer.associated-domains</key>
812
<array>
913
<string>applinks:j4ctx.app.goo.gl</string>

demo/hosting/.firebaserc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"projects": {
3+
"default": "n-plugin-test"
4+
}
5+
}

demo/hosting/.gitignore

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
firebase-debug.log*
8+
9+
# Firebase cache
10+
.firebase/
11+
12+
# Firebase config
13+
14+
# Uncomment this if you'd like others to create their own Firebase project.
15+
# For a team working on the same Firebase project(s), it is recommended to leave
16+
# it commented so all members can deploy to the same project(s) in .firebaserc.
17+
# .firebaserc
18+
19+
# Runtime data
20+
pids
21+
*.pid
22+
*.seed
23+
*.pid.lock
24+
25+
# Directory for instrumented libs generated by jscoverage/JSCover
26+
lib-cov
27+
28+
# Coverage directory used by tools like istanbul
29+
coverage
30+
31+
# nyc test coverage
32+
.nyc_output
33+
34+
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
35+
.grunt
36+
37+
# Bower dependency directory (https://bower.io/)
38+
bower_components
39+
40+
# node-waf configuration
41+
.lock-wscript
42+
43+
# Compiled binary addons (http://nodejs.org/api/addons.html)
44+
build/Release
45+
46+
# Dependency directories
47+
node_modules/
48+
49+
# Optional npm cache directory
50+
.npm
51+
52+
# Optional eslint cache
53+
.eslintcache
54+
55+
# Optional REPL history
56+
.node_repl_history
57+
58+
# Output of 'npm pack'
59+
*.tgz
60+
61+
# Yarn Integrity file
62+
.yarn-integrity
63+
64+
# dotenv environment variables file
65+
.env

demo/hosting/firebase.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"hosting": {
3+
"public": "public",
4+
"ignore": [
5+
"firebase.json",
6+
"**/.*",
7+
"**/node_modules/**"
8+
]
9+
}
10+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
MIIP6gYJKoZIhvcNAQcCoIIP2zCCD9cCAQExCzAJBgUrDgMCGgUAMH8GCSqGSIb3DQEHAaByBHB7
2+
InRlYW1JZCI6IjhRNUY2TTNUTlMiLCJkb21haW4iOiJuLXBsdWdpbi10ZXN0LmZpcmViYXNlYXBw
3+
LmNvbSIsImRhdGVDcmVhdGVkIjoiMjAxOS0xMS0xOCwxMDozNjo1MCIsInZlcnNpb24iOjF9oIIM
4+
sjCCA_MwggLboAMCAQICARcwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoT
5+
CkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYD
6+
VQQDEw1BcHBsZSBSb290IENBMB4XDTA3MDQxMjE3NDMyOFoXDTIyMDQxMjE3NDMyOFoweTELMAkG
7+
A1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRp
8+
b24gQXV0aG9yaXR5MS0wKwYDVQQDEyRBcHBsZSBpUGhvbmUgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
9+
dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCjHr7wR8C0nhBbRqS4IbhPhiFwKEVg
10+
XBzDyApkY4j7_Gnu-FT86Vu3Bk4EL8NrM69ETOpLgAm0h_ZbtP1k3bNy4BOz_RfZvOeo7cKMYcIq
11+
-ezOpV7WaetkC40Ij7igUEYJ3Bnk5bCUbbv3mZjE6JtBTtTxZeMbUnrc6APZbh3aEFWGpClYSQzq
12+
R9cVNDP2wKBESnC-LLUqMDeMLhXr0eRslzhVVrE1K1jqRKMmhe7IZkrkz4nwPWOtKd6tulqz3KWj
13+
mqcJToAWNWWkhQ1jez5jitp9SkbsozkYNLnGKGUYvBNgnH9XrBTJie2htodoUraETrjIg-z5nhmr
14+
s8ELhsefAgMBAAGjgZwwgZkwDgYDVR0PAQH_BAQDAgGGMA8GA1UdEwEB_wQFMAMBAf8wHQYDVR0O
15+
BBYEFOc0Ki4i3jlga7SUzneDYS8xoHw1MB8GA1UdIwQYMBaAFCvQaUeUdgn-9GuNLkCm90dNfwhe
16+
MDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly93d3cuYXBwbGUuY29tL2FwcGxlY2Evcm9vdC5jcmww
17+
DQYJKoZIhvcNAQEFBQADggEBAB3R1XvddE7XF_yCLQyZm15CcvJp3NVrXg0Ma0s-exQl3rOU6KD6
18+
D4CJ8hc9AAKikZG-dFfcr5qfoQp9ML4AKswhWev9SaxudRnomnoD0Yb25_awDktJ-qO3QbrX0eNW
19+
oX2Dq5eu-FFKJsGFQhMmjQNUZhBeYIQFEjEra1TAoMhBvFQe51StEwDSSse7wYqvgQiO8EYKvyem
20+
vtzPOTqAcBkjMqNrZl2eTahHSbJ7RbVRM6d0ZwlOtmxvSPcsuTMFRGtFvnRLb7KGkbQ-JSglnrPC
21+
UYb8T-WvO6q7RCwBSeJ0szT6RO8UwhHyLRkaUYnTCEpBbFhW3ps64QVX5WLP0g8wggP4MIIC4KAD
22+
AgECAgg9ciDjz4zyJTANBgkqhkiG9w0BAQUFADB5MQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBw
23+
bGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLTArBgNVBAMT
24+
JEFwcGxlIGlQaG9uZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNDA3MTEwMTM1MjVaFw0y
25+
MjA0MTIxNzQzMjhaMFkxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMTUwMwYDVQQD
26+
DCxBcHBsZSBpUGhvbmUgT1MgUHJvdmlzaW9uaW5nIFByb2ZpbGUgU2lnbmluZzCCASIwDQYJKoZI
27+
hvcNAQEBBQADggEPADCCAQoCggEBAOfZmsMXo8npB9XHmaS0dSFMEQNoHzAsB5x3iDFIyEQEjYHN
28+
esb40_ZHHG1O7rrmFIVxxO95s0t12miFpnNVosaHUXvXHIG1AWrjjJHueir8z5Ve-XGgKH75q9Th
29+
zg5PlfPK7beVCjL_JZk29pidJItkV7b1_b5FIfmuRHa36rA7aZ9tf37XEZuy6kOi5f0mR87MxAfi
30+
53XG2_x-FrWkk8Z8rz293cAvgHh2Ok582GRPKiVRh0F2Dm7gk6Qhqj5dyl-niwtApS-zs2pKx8ZT
31+
tR9cLIqI7uSQL5_dUj4WQcY4HmgkjzEt22lxz6DzQhooEUp0nKbWeElYDcS8HFvxPXsCAwEAAaOB
32+
ozCBoDAdBgNVHQ4EFgQUpF5rO_x6R3KRcAnBJL0vO8l7oL4wDAYDVR0TAQH_BAIwADAfBgNVHSME
33+
GDAWgBTnNCouIt45YGu0lM53g2EvMaB8NTAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vY3JsLmFw
34+
cGxlLmNvbS9pcGhvbmUuY3JsMAsGA1UdDwQEAwIHgDARBgsqhkiG92NkBgICAQQCBQAwDQYJKoZI
35+
hvcNAQEFBQADggEBAIq2Vk5B0rHzIUOdC9nH_7SYWJntQacw8e_b2oBtIbazXNy-h_E5IbzEodom
36+
0u2m8e3AEZUZrEe4Kg5pmNTm5s5r6iLBK6cBbkFMLB3jI4yGJ6OMF5zMG-7YZDMPRA6LO0hiE2JU
37+
03FNki2BOv-my45cQ3FsiDMiPCA_HXi5_xoqIehzac-boaHhPekMF7ypc9fpUrrCth-hIoU-uFwa
38+
spp7n8zLUDr-lsf8SEf0JKKtPkz7SttnnANxFSc_g1L7svQZFqk-qewU7F7CCqfzTdEwqtStuDKh
39+
UC9NVchCJ6wcznJk8CzgCeRMuQsgNTec1QuRxDEd0CviXIK9fdD-CJkwggS7MIIDo6ADAgECAgEC
40+
MA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYTAlVTMRMwEQYDVQQKEwpBcHBsZSBJbmMuMSYwJAYD
41+
VQQLEx1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEWMBQGA1UEAxMNQXBwbGUgUm9vdCBD
42+
QTAeFw0wNjA0MjUyMTQwMzZaFw0zNTAyMDkyMTQwMzZaMGIxCzAJBgNVBAYTAlVTMRMwEQYDVQQK
43+
EwpBcHBsZSBJbmMuMSYwJAYDVQQLEx1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEWMBQG
44+
A1UEAxMNQXBwbGUgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOSRqQkf
45+
kdseR1DrBe1eeYQt6zaiV0xV7IsZid75S2z1B6siMALoGD74UAnTf0GomPnRymacJGsR0KO75Bsq
46+
wx-VnnoMpEeLW9QWNzPLxA9NzhRp0ckZcvVdDtV_X5vyJQO6VY9NXQ3xZDUjFUsVWR2zlPf2nJ7P
47+
ULrBWFBnjwi0IPfLrCwgb3C2PwEwjLdDzw-dPfMrSSgayP7OtbkO2V4c1ss9tTqt9A8OAJILsSEW
48+
LnTVPA3bYharo3GSR1NVwa8vQbP4--NwzeajTEV-H0xrUJZBicR0YgsQg0GHM4qBsTBY7FoEMoxo
49+
s48d3mVz_2deZbxJ2HafMxRloXeUyS0CAwEAAaOCAXowggF2MA4GA1UdDwEB_wQEAwIBBjAPBgNV
50+
HRMBAf8EBTADAQH_MB0GA1UdDgQWBBQr0GlHlHYJ_vRrjS5ApvdHTX8IXjAfBgNVHSMEGDAWgBQr
51+
0GlHlHYJ_vRrjS5ApvdHTX8IXjCCAREGA1UdIASCAQgwggEEMIIBAAYJKoZIhvdjZAUBMIHyMCoG
52+
CCsGAQUFBwIBFh5odHRwczovL3d3dy5hcHBsZS5jb20vYXBwbGVjYS8wgcMGCCsGAQUFBwICMIG2
53+
GoGzUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2Nl
54+
cHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv
55+
bnMgb2YgdXNlLCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRpZmljYXRpb24gcHJhY3RpY2Ug
56+
c3RhdGVtZW50cy4wDQYJKoZIhvcNAQEFBQADggEBAFw2mUwteLftjJvc83eb8nbSdzBPwR-Fg4Ub
57+
mT1HN_Kpm0COLNSxkBLYvvRzm-7SZA_LeU802KI--Xj_a8gH7H05g4tTINM4xLG_mk8Ka_8r_Fmn
58+
BQl8F0BWER5007eLIztHo9VvJOLr0bdw3w9F4SfK8W147ee1Fxeo3H4iNcol1dkP1mvUoiQjEfeh
59+
rI9zgWDGG1sJL5Ky-ERI8GA4nhX1PSZnIIozavcNgs_e66Mv-VNqW2TAYzN39zoHLFbr2g8hDtq6
60+
cxlPtdk2f8GHVdmnmbkyQvvY1XGefqFStxu9k0IkEirHDx22TZxeY8hLgBdQqorV2uT80AkHN7B1
61+
dSExggKMMIICiAIBATCBhTB5MQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBwbGUgSW5jLjEmMCQG
62+
A1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLTArBgNVBAMTJEFwcGxlIGlQaG9u
63+
ZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQIIPXIg48-M8iUwCQYFKw4DAhoFAKCB3DAYBgkqhkiG
64+
9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xOTExMTgxMDM2NTBaMCMGCSqGSIb3
65+
DQEJBDEWBBTHKvPnCvbCQ1qTFVUswmju5UIDozApBgkqhkiG9w0BCTQxHDAaMAkGBSsOAwIaBQCh
66+
DQYJKoZIhvcNAQEBBQAwUgYJKoZIhvcNAQkPMUUwQzAKBggqhkiG9w0DBzAOBggqhkiG9w0DAgIC
67+
AIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZIhvcNAwICASgwDQYJKoZIhvcNAQEBBQAE
68+
ggEAxVzPObQJuj9zEX3d867UO2sSbytzXfJawKtOJXuhEhfoS0sVsXBk6IpKH6I1ZIYBrt64vjeG
69+
WNXkUOpkX2ZMGpITdmtuivmRKZtLW7VgR26xUaNScJoeDdX4o8ApheebPqq00i0wsurkfuWPxghK
70+
d_RM-1fW5xjSfJ0kl-aKysP0oATSj9LrDbO1cR6kPxNzUFnA1R7Wguq3o6KRJdd43qL9g48jZU6O
71+
UWjlSAGiohCu1i_MbydWjjniBlOFk3mw4LqwadyPk4-er_NHFWv2G0VRoZTZtO1cu2MEbycuPIdv
72+
aBch97v3J8McglXfItgE0aYRxdoPM80nT8JfQ6xJ7g

demo/hosting/public/404.html

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
<title>Page Not Found</title>
7+
8+
<style media="screen">
9+
body { background: #ECEFF1; color: rgba(0,0,0,0.87); font-family: Roboto, Helvetica, Arial, sans-serif; margin: 0; padding: 0; }
10+
#message { background: white; max-width: 360px; margin: 100px auto 16px; padding: 32px 24px 16px; border-radius: 3px; }
11+
#message h3 { color: #888; font-weight: normal; font-size: 16px; margin: 16px 0 12px; }
12+
#message h2 { color: #ffa100; font-weight: bold; font-size: 16px; margin: 0 0 8px; }
13+
#message h1 { font-size: 22px; font-weight: 300; color: rgba(0,0,0,0.6); margin: 0 0 16px;}
14+
#message p { line-height: 140%; margin: 16px 0 24px; font-size: 14px; }
15+
#message a { display: block; text-align: center; background: #039be5; text-transform: uppercase; text-decoration: none; color: white; padding: 16px; border-radius: 4px; }
16+
#message, #message a { box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); }
17+
#load { color: rgba(0,0,0,0.4); text-align: center; font-size: 13px; }
18+
@media (max-width: 600px) {
19+
body, #message { margin-top: 0; background: white; box-shadow: none; }
20+
body { border-top: 16px solid #ffa100; }
21+
}
22+
</style>
23+
</head>
24+
<body>
25+
<div id="message">
26+
<h2>404</h2>
27+
<h1>Page Not Found</h1>
28+
<p>The specified file was not found on this website. Please check the URL for mistakes and try again.</p>
29+
<h3>Why am I seeing this?</h3>
30+
<p>This page was generated by the Firebase Command-Line Interface. To modify it, edit the <code>404.html</code> file in your project's configured <code>public</code> directory.</p>
31+
</div>
32+
</body>
33+
</html>

0 commit comments

Comments
 (0)