@ -0,0 +1,6 @@ |
|||
# Admin DID credentials |
|||
ADMIN_DID=did:ethr:0x0000694B58C2cC69658993A90D3840C560f2F51F |
|||
ADMIN_PRIVATE_KEY=2b6472c026ec2aa2c4235c994a63868fc9212d18b58f6cbfe861b52e71330f5b |
|||
|
|||
# API Configuration |
|||
ENDORSER_API_URL=https://test-api.endorser.ch/api/v2/claim |
@ -0,0 +1,5 @@ |
|||
source "https://rubygems.org" |
|||
|
|||
gem "fastlane" |
|||
gem "cocoapods" |
|||
|
@ -0,0 +1,321 @@ |
|||
GEM |
|||
remote: https://rubygems.org/ |
|||
specs: |
|||
CFPropertyList (3.0.7) |
|||
base64 |
|||
nkf |
|||
rexml |
|||
activesupport (7.2.2.1) |
|||
base64 |
|||
benchmark (>= 0.3) |
|||
bigdecimal |
|||
concurrent-ruby (~> 1.0, >= 1.3.1) |
|||
connection_pool (>= 2.2.5) |
|||
drb |
|||
i18n (>= 1.6, < 2) |
|||
logger (>= 1.4.2) |
|||
minitest (>= 5.1) |
|||
securerandom (>= 0.3) |
|||
tzinfo (~> 2.0, >= 2.0.5) |
|||
addressable (2.8.7) |
|||
public_suffix (>= 2.0.2, < 7.0) |
|||
algoliasearch (1.27.5) |
|||
httpclient (~> 2.8, >= 2.8.3) |
|||
json (>= 1.5.1) |
|||
artifactory (3.0.17) |
|||
atomos (0.1.3) |
|||
aws-eventstream (1.3.2) |
|||
aws-partitions (1.1066.0) |
|||
aws-sdk-core (3.220.1) |
|||
aws-eventstream (~> 1, >= 1.3.0) |
|||
aws-partitions (~> 1, >= 1.992.0) |
|||
aws-sigv4 (~> 1.9) |
|||
base64 |
|||
jmespath (~> 1, >= 1.6.1) |
|||
aws-sdk-kms (1.99.0) |
|||
aws-sdk-core (~> 3, >= 3.216.0) |
|||
aws-sigv4 (~> 1.5) |
|||
aws-sdk-s3 (1.182.0) |
|||
aws-sdk-core (~> 3, >= 3.216.0) |
|||
aws-sdk-kms (~> 1) |
|||
aws-sigv4 (~> 1.5) |
|||
aws-sigv4 (1.11.0) |
|||
aws-eventstream (~> 1, >= 1.0.2) |
|||
babosa (1.0.4) |
|||
base64 (0.2.0) |
|||
benchmark (0.4.0) |
|||
bigdecimal (3.1.9) |
|||
claide (1.1.0) |
|||
cocoapods (1.16.2) |
|||
addressable (~> 2.8) |
|||
claide (>= 1.0.2, < 2.0) |
|||
cocoapods-core (= 1.16.2) |
|||
cocoapods-deintegrate (>= 1.0.3, < 2.0) |
|||
cocoapods-downloader (>= 2.1, < 3.0) |
|||
cocoapods-plugins (>= 1.0.0, < 2.0) |
|||
cocoapods-search (>= 1.0.0, < 2.0) |
|||
cocoapods-trunk (>= 1.6.0, < 2.0) |
|||
cocoapods-try (>= 1.1.0, < 2.0) |
|||
colored2 (~> 3.1) |
|||
escape (~> 0.0.4) |
|||
fourflusher (>= 2.3.0, < 3.0) |
|||
gh_inspector (~> 1.0) |
|||
molinillo (~> 0.8.0) |
|||
nap (~> 1.0) |
|||
ruby-macho (>= 2.3.0, < 3.0) |
|||
xcodeproj (>= 1.27.0, < 2.0) |
|||
cocoapods-core (1.16.2) |
|||
activesupport (>= 5.0, < 8) |
|||
addressable (~> 2.8) |
|||
algoliasearch (~> 1.0) |
|||
concurrent-ruby (~> 1.1) |
|||
fuzzy_match (~> 2.0.4) |
|||
nap (~> 1.0) |
|||
netrc (~> 0.11) |
|||
public_suffix (~> 4.0) |
|||
typhoeus (~> 1.0) |
|||
cocoapods-deintegrate (1.0.5) |
|||
cocoapods-downloader (2.1) |
|||
cocoapods-plugins (1.0.0) |
|||
nap |
|||
cocoapods-search (1.0.1) |
|||
cocoapods-trunk (1.6.0) |
|||
nap (>= 0.8, < 2.0) |
|||
netrc (~> 0.11) |
|||
cocoapods-try (1.2.0) |
|||
colored (1.2) |
|||
colored2 (3.1.2) |
|||
commander (4.6.0) |
|||
highline (~> 2.0.0) |
|||
concurrent-ruby (1.3.5) |
|||
connection_pool (2.5.0) |
|||
declarative (0.0.20) |
|||
digest-crc (0.7.0) |
|||
rake (>= 12.0.0, < 14.0.0) |
|||
domain_name (0.6.20240107) |
|||
dotenv (2.8.1) |
|||
drb (2.2.1) |
|||
emoji_regex (3.2.3) |
|||
escape (0.0.4) |
|||
ethon (0.16.0) |
|||
ffi (>= 1.15.0) |
|||
excon (0.112.0) |
|||
faraday (1.10.4) |
|||
faraday-em_http (~> 1.0) |
|||
faraday-em_synchrony (~> 1.0) |
|||
faraday-excon (~> 1.1) |
|||
faraday-httpclient (~> 1.0) |
|||
faraday-multipart (~> 1.0) |
|||
faraday-net_http (~> 1.0) |
|||
faraday-net_http_persistent (~> 1.0) |
|||
faraday-patron (~> 1.0) |
|||
faraday-rack (~> 1.0) |
|||
faraday-retry (~> 1.0) |
|||
ruby2_keywords (>= 0.0.4) |
|||
faraday-cookie_jar (0.0.7) |
|||
faraday (>= 0.8.0) |
|||
http-cookie (~> 1.0.0) |
|||
faraday-em_http (1.0.0) |
|||
faraday-em_synchrony (1.0.0) |
|||
faraday-excon (1.1.0) |
|||
faraday-httpclient (1.0.1) |
|||
faraday-multipart (1.1.0) |
|||
multipart-post (~> 2.0) |
|||
faraday-net_http (1.0.2) |
|||
faraday-net_http_persistent (1.2.0) |
|||
faraday-patron (1.0.0) |
|||
faraday-rack (1.0.0) |
|||
faraday-retry (1.0.3) |
|||
faraday_middleware (1.2.1) |
|||
faraday (~> 1.0) |
|||
fastimage (2.4.0) |
|||
fastlane (2.227.0) |
|||
CFPropertyList (>= 2.3, < 4.0.0) |
|||
addressable (>= 2.8, < 3.0.0) |
|||
artifactory (~> 3.0) |
|||
aws-sdk-s3 (~> 1.0) |
|||
babosa (>= 1.0.3, < 2.0.0) |
|||
bundler (>= 1.12.0, < 3.0.0) |
|||
colored (~> 1.2) |
|||
commander (~> 4.6) |
|||
dotenv (>= 2.1.1, < 3.0.0) |
|||
emoji_regex (>= 0.1, < 4.0) |
|||
excon (>= 0.71.0, < 1.0.0) |
|||
faraday (~> 1.0) |
|||
faraday-cookie_jar (~> 0.0.6) |
|||
faraday_middleware (~> 1.0) |
|||
fastimage (>= 2.1.0, < 3.0.0) |
|||
fastlane-sirp (>= 1.0.0) |
|||
gh_inspector (>= 1.1.2, < 2.0.0) |
|||
google-apis-androidpublisher_v3 (~> 0.3) |
|||
google-apis-playcustomapp_v1 (~> 0.1) |
|||
google-cloud-env (>= 1.6.0, < 2.0.0) |
|||
google-cloud-storage (~> 1.31) |
|||
highline (~> 2.0) |
|||
http-cookie (~> 1.0.5) |
|||
json (< 3.0.0) |
|||
jwt (>= 2.1.0, < 3) |
|||
mini_magick (>= 4.9.4, < 5.0.0) |
|||
multipart-post (>= 2.0.0, < 3.0.0) |
|||
naturally (~> 2.2) |
|||
optparse (>= 0.1.1, < 1.0.0) |
|||
plist (>= 3.1.0, < 4.0.0) |
|||
rubyzip (>= 2.0.0, < 3.0.0) |
|||
security (= 0.1.5) |
|||
simctl (~> 1.6.3) |
|||
terminal-notifier (>= 2.0.0, < 3.0.0) |
|||
terminal-table (~> 3) |
|||
tty-screen (>= 0.6.3, < 1.0.0) |
|||
tty-spinner (>= 0.8.0, < 1.0.0) |
|||
word_wrap (~> 1.0.0) |
|||
xcodeproj (>= 1.13.0, < 2.0.0) |
|||
xcpretty (~> 0.4.0) |
|||
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) |
|||
fastlane-sirp (1.0.0) |
|||
sysrandom (~> 1.0) |
|||
ffi (1.17.1) |
|||
ffi (1.17.1-aarch64-linux-gnu) |
|||
ffi (1.17.1-aarch64-linux-musl) |
|||
ffi (1.17.1-arm-linux-gnu) |
|||
ffi (1.17.1-arm-linux-musl) |
|||
ffi (1.17.1-arm64-darwin) |
|||
ffi (1.17.1-x86-linux-gnu) |
|||
ffi (1.17.1-x86-linux-musl) |
|||
ffi (1.17.1-x86_64-darwin) |
|||
ffi (1.17.1-x86_64-linux-gnu) |
|||
ffi (1.17.1-x86_64-linux-musl) |
|||
fourflusher (2.3.1) |
|||
fuzzy_match (2.0.4) |
|||
gh_inspector (1.1.3) |
|||
google-apis-androidpublisher_v3 (0.54.0) |
|||
google-apis-core (>= 0.11.0, < 2.a) |
|||
google-apis-core (0.11.3) |
|||
addressable (~> 2.5, >= 2.5.1) |
|||
googleauth (>= 0.16.2, < 2.a) |
|||
httpclient (>= 2.8.1, < 3.a) |
|||
mini_mime (~> 1.0) |
|||
representable (~> 3.0) |
|||
retriable (>= 2.0, < 4.a) |
|||
rexml |
|||
google-apis-iamcredentials_v1 (0.17.0) |
|||
google-apis-core (>= 0.11.0, < 2.a) |
|||
google-apis-playcustomapp_v1 (0.13.0) |
|||
google-apis-core (>= 0.11.0, < 2.a) |
|||
google-apis-storage_v1 (0.31.0) |
|||
google-apis-core (>= 0.11.0, < 2.a) |
|||
google-cloud-core (1.8.0) |
|||
google-cloud-env (>= 1.0, < 3.a) |
|||
google-cloud-errors (~> 1.0) |
|||
google-cloud-env (1.6.0) |
|||
faraday (>= 0.17.3, < 3.0) |
|||
google-cloud-errors (1.5.0) |
|||
google-cloud-storage (1.47.0) |
|||
addressable (~> 2.8) |
|||
digest-crc (~> 0.4) |
|||
google-apis-iamcredentials_v1 (~> 0.1) |
|||
google-apis-storage_v1 (~> 0.31.0) |
|||
google-cloud-core (~> 1.6) |
|||
googleauth (>= 0.16.2, < 2.a) |
|||
mini_mime (~> 1.0) |
|||
googleauth (1.8.1) |
|||
faraday (>= 0.17.3, < 3.a) |
|||
jwt (>= 1.4, < 3.0) |
|||
multi_json (~> 1.11) |
|||
os (>= 0.9, < 2.0) |
|||
signet (>= 0.16, < 2.a) |
|||
highline (2.0.3) |
|||
http-cookie (1.0.8) |
|||
domain_name (~> 0.5) |
|||
httpclient (2.9.0) |
|||
mutex_m |
|||
i18n (1.14.7) |
|||
concurrent-ruby (~> 1.0) |
|||
jmespath (1.6.2) |
|||
json (2.10.2) |
|||
jwt (2.10.1) |
|||
base64 |
|||
logger (1.6.6) |
|||
mini_magick (4.13.2) |
|||
mini_mime (1.1.5) |
|||
minitest (5.25.5) |
|||
molinillo (0.8.0) |
|||
multi_json (1.15.0) |
|||
multipart-post (2.4.1) |
|||
mutex_m (0.3.0) |
|||
nanaimo (0.4.0) |
|||
nap (1.1.0) |
|||
naturally (2.2.1) |
|||
netrc (0.11.0) |
|||
nkf (0.2.0) |
|||
optparse (0.6.0) |
|||
os (1.1.4) |
|||
plist (3.7.2) |
|||
public_suffix (4.0.7) |
|||
rake (13.2.1) |
|||
representable (3.2.0) |
|||
declarative (< 0.1.0) |
|||
trailblazer-option (>= 0.1.1, < 0.2.0) |
|||
uber (< 0.2.0) |
|||
retriable (3.1.2) |
|||
rexml (3.4.1) |
|||
rouge (3.28.0) |
|||
ruby-macho (2.5.1) |
|||
ruby2_keywords (0.0.5) |
|||
rubyzip (2.4.1) |
|||
securerandom (0.4.1) |
|||
security (0.1.5) |
|||
signet (0.19.0) |
|||
addressable (~> 2.8) |
|||
faraday (>= 0.17.5, < 3.a) |
|||
jwt (>= 1.5, < 3.0) |
|||
multi_json (~> 1.10) |
|||
simctl (1.6.10) |
|||
CFPropertyList |
|||
naturally |
|||
sysrandom (1.0.5) |
|||
terminal-notifier (2.0.0) |
|||
terminal-table (3.0.2) |
|||
unicode-display_width (>= 1.1.1, < 3) |
|||
trailblazer-option (0.1.2) |
|||
tty-cursor (0.7.1) |
|||
tty-screen (0.8.2) |
|||
tty-spinner (0.9.3) |
|||
tty-cursor (~> 0.7) |
|||
typhoeus (1.4.1) |
|||
ethon (>= 0.9.0) |
|||
tzinfo (2.0.6) |
|||
concurrent-ruby (~> 1.0) |
|||
uber (0.1.0) |
|||
unicode-display_width (2.6.0) |
|||
word_wrap (1.0.0) |
|||
xcodeproj (1.27.0) |
|||
CFPropertyList (>= 2.3.3, < 4.0) |
|||
atomos (~> 0.1.3) |
|||
claide (>= 1.0.2, < 2.0) |
|||
colored2 (~> 3.1) |
|||
nanaimo (~> 0.4.0) |
|||
rexml (>= 3.3.6, < 4.0) |
|||
xcpretty (0.4.0) |
|||
rouge (~> 3.28.0) |
|||
xcpretty-travis-formatter (1.0.1) |
|||
xcpretty (~> 0.2, >= 0.0.7) |
|||
|
|||
PLATFORMS |
|||
aarch64-linux-gnu |
|||
aarch64-linux-musl |
|||
arm-linux-gnu |
|||
arm-linux-musl |
|||
arm64-darwin |
|||
ruby |
|||
x86-linux-gnu |
|||
x86-linux-musl |
|||
x86_64-darwin |
|||
x86_64-linux-gnu |
|||
x86_64-linux-musl |
|||
|
|||
DEPENDENCIES |
|||
cocoapods |
|||
fastlane |
|||
|
|||
BUNDLED WITH |
|||
2.6.5 |
@ -0,0 +1,2 @@ |
|||
#Tue Mar 11 10:01:05 UTC 2025 |
|||
gradle.version=8.10.2 |
@ -0,0 +1,3 @@ |
|||
source "https://rubygems.org" |
|||
|
|||
gem "fastlane" |
@ -1,2 +1,3 @@ |
|||
/build/* |
|||
!/build/.npmkeep |
|||
src/main/assets/public/assets/ |
@ -0,0 +1,398 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<issues format="6" by="lint 8.1.0" type="baseline" client="gradle" dependencies="true" name="AGP (8.1.0)" variant="all" version="8.1.0"> |
|||
|
|||
<issue |
|||
id="UnknownIssueId" |
|||
message="Unknown issue id "UnsanitizedFilenameFromContentProvider"" |
|||
errorLine1=" disable 'UnsanitizedFilenameFromContentProvider'" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="26" |
|||
column="18"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnknownIssueId" |
|||
message="Unknown issue id "UnsanitizedFilenameFromContentProvider"" |
|||
errorLine1=" disable 'UnsanitizedFilenameFromContentProvider'" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="26" |
|||
column="18"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnknownIssueId" |
|||
message="Unknown issue id "LintBaselineFixed"" |
|||
errorLine1=" ignore 'LintBaselineFixed'" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="34" |
|||
column="17"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnknownIssueId" |
|||
message="Unknown issue id "LintBaselineFixed"" |
|||
errorLine1=" ignore 'LintBaselineFixed'" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="34" |
|||
column="17"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="DefaultLocale" |
|||
message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead" |
|||
errorLine1=" String msg = String.format(" |
|||
errorLine2=" ^"> |
|||
<location |
|||
file="src/main/java/com/getcapacitor/BridgeWebChromeClient.java" |
|||
line="467" |
|||
column="26"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="DefaultLocale" |
|||
message="Implicitly using the default locale is a common source of bugs: Use `toUpperCase(Locale)` instead. For strings meant to be internal use `Locale.ROOT`, otherwise `Locale.getDefault()`." |
|||
errorLine1=" return mask.toUpperCase().equals(string.toUpperCase());" |
|||
errorLine2=" ~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/java/com/getcapacitor/util/HostMask.java" |
|||
line="110" |
|||
column="29"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="DefaultLocale" |
|||
message="Implicitly using the default locale is a common source of bugs: Use `toUpperCase(Locale)` instead. For strings meant to be internal use `Locale.ROOT`, otherwise `Locale.getDefault()`." |
|||
errorLine1=" return mask.toUpperCase().equals(string.toUpperCase());" |
|||
errorLine2=" ~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/java/com/getcapacitor/util/HostMask.java" |
|||
line="110" |
|||
column="57"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="DefaultLocale" |
|||
message="Implicitly using the default locale is a common source of bugs: Use `toLowerCase(Locale)` instead. For strings meant to be internal use `Locale.ROOT`, otherwise `Locale.getDefault()`." |
|||
errorLine1=" if (header.getKey().equalsIgnoreCase("Accept") && header.getValue().toLowerCase().contains("text/html")) {" |
|||
errorLine2=" ~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/java/com/getcapacitor/WebViewLocalServer.java" |
|||
line="474" |
|||
column="93"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="SimpleDateFormat" |
|||
message="To get local formatting use `getDateInstance()`, `getDateTimeInstance()`, or `getTimeInstance()`, or use `new SimpleDateFormat(String template, Locale locale)` with for example `Locale.US` for ASCII dates." |
|||
errorLine1=" String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/java/com/getcapacitor/BridgeWebChromeClient.java" |
|||
line="504" |
|||
column="28"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="SimpleDateFormat" |
|||
message="To get local formatting use `getDateInstance()`, `getDateTimeInstance()`, or `getTimeInstance()`, or use `new SimpleDateFormat(String template, Locale locale)` with for example `Locale.US` for ASCII dates." |
|||
errorLine1=" DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/java/com/getcapacitor/PluginResult.java" |
|||
line="44" |
|||
column="25"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedAttribute" |
|||
message="Attribute `usesCleartextTraffic` is only used in API level 23 and higher (current min is 22)" |
|||
errorLine1="<application android:usesCleartextTraffic="true">" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/AndroidManifest.xml" |
|||
line="4" |
|||
column="15"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedAttribute" |
|||
message="Attribute `autoVerify` is only used in API level 23 and higher (current min is 22)" |
|||
errorLine1=" <intent-filter android:autoVerify="true">" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/AndroidManifest.xml" |
|||
line="25" |
|||
column="28"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="ManifestOrder" |
|||
message="`<uses-permission>` tag appears after `<application>` tag" |
|||
errorLine1=" <uses-permission android:name="android.permission.INTERNET" />" |
|||
errorLine2=" ~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/AndroidManifest.xml" |
|||
line="47" |
|||
column="6"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="AndroidGradlePluginVersion" |
|||
message="A newer version of com.android.tools.build:gradle than 8.2.1 is available: 8.9.0. (There is also a newer version of 8.2.𝑥 available, if upgrading to 8.9.0 is difficult: 8.2.2)" |
|||
errorLine1=" classpath 'com.android.tools.build:gradle:8.2.1'" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="12" |
|||
column="9"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="AndroidGradlePluginVersion" |
|||
message="A newer version of com.android.tools.build:gradle than 8.2.1 is available: 8.9.0. (There is also a newer version of 8.2.𝑥 available, if upgrading to 8.9.0 is difficult: 8.2.2)" |
|||
errorLine1=" classpath 'com.android.tools.build:gradle:8.2.1'" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="18" |
|||
column="9"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.appcompat:appcompat than 1.6.1 is available: 1.7.0" |
|||
errorLine1=" implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="46" |
|||
column="20"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.appcompat:appcompat than 1.6.1 is available: 1.7.0" |
|||
errorLine1=" implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="46" |
|||
column="20"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.coordinatorlayout:coordinatorlayout than 1.2.0 is available: 1.3.0" |
|||
errorLine1=" implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="47" |
|||
column="20"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.test.ext:junit than 1.1.5 is available: 1.2.1" |
|||
errorLine1=" androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="51" |
|||
column="31"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.test.espresso:espresso-core than 3.5.1 is available: 3.6.1" |
|||
errorLine1=" androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="52" |
|||
column="31"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.appcompat:appcompat than 1.6.1 is available: 1.7.0" |
|||
errorLine1=" implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="75" |
|||
column="20"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.test.ext:junit than 1.1.5 is available: 1.2.1" |
|||
errorLine1=" androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="77" |
|||
column="31"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="GradleDependency" |
|||
message="A newer version of androidx.test.espresso:espresso-core than 3.5.1 is available: 3.6.1" |
|||
errorLine1=" androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="build.gradle" |
|||
line="78" |
|||
column="31"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="Recycle" |
|||
message="This `TypedArray` should be recycled after use with `#recycle()`" |
|||
errorLine1=" TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.bridge_fragment);" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/java/com/getcapacitor/BridgeFragment.java" |
|||
line="99" |
|||
column="32"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="Overdraw" |
|||
message="Possible overdraw: Root element paints background `#F0FF1414` with a theme that also paints a background (inferred theme is `@android:style/Theme.Holo`)" |
|||
errorLine1=" android:background="#F0FF1414"" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/res/layout/fragment_bridge.xml" |
|||
line="5" |
|||
column="5"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedResources" |
|||
message="The resource `R.layout.activity_main` appears to be unused" |
|||
errorLine1="<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"" |
|||
errorLine2="^"> |
|||
<location |
|||
file="src/main/res/layout/activity_main.xml" |
|||
line="2" |
|||
column="1"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedResources" |
|||
message="The resource `R.xml.config` appears to be unused" |
|||
errorLine1="<widget version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">" |
|||
errorLine2="^"> |
|||
<location |
|||
file="src/main/res/xml/config.xml" |
|||
line="2" |
|||
column="1"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedResources" |
|||
message="The resource `R.drawable.ic_launcher_background` appears to be unused" |
|||
errorLine1="<vector xmlns:android="http://schemas.android.com/apk/res/android"" |
|||
errorLine2="^"> |
|||
<location |
|||
file="src/main/res/drawable/ic_launcher_background.xml" |
|||
line="2" |
|||
column="1"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedResources" |
|||
message="The resource `R.drawable.ic_launcher_foreground` appears to be unused" |
|||
errorLine1="<vector xmlns:android="http://schemas.android.com/apk/res/android"" |
|||
errorLine2="^"> |
|||
<location |
|||
file="src/main/res/drawable-v24/ic_launcher_foreground.xml" |
|||
line="1" |
|||
column="1"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedResources" |
|||
message="The resource `R.string.package_name` appears to be unused" |
|||
errorLine1=" <string name="package_name">app.timesafari.app</string>" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/res/values/strings.xml" |
|||
line="5" |
|||
column="13"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="UnusedResources" |
|||
message="The resource `R.string.custom_url_scheme` appears to be unused" |
|||
errorLine1=" <string name="custom_url_scheme">app.timesafari.app</string>" |
|||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~"> |
|||
<location |
|||
file="src/main/res/values/strings.xml" |
|||
line="6" |
|||
column="13"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="MonochromeLauncherIcon" |
|||
message="The application adaptive icon is missing a monochrome tag" |
|||
errorLine1="<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">" |
|||
errorLine2="^"> |
|||
<location |
|||
file="src/main/res/mipmap-anydpi-v26/ic_launcher.xml" |
|||
line="2" |
|||
column="1"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="MonochromeLauncherIcon" |
|||
message="The application adaptive roundIcon is missing a monochrome tag" |
|||
errorLine1="<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">" |
|||
errorLine2="^"> |
|||
<location |
|||
file="src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml" |
|||
line="2" |
|||
column="1"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="IconDipSize" |
|||
message="The image `splash.png` varies significantly in its density-independent (dip) size across the various density versions: drawable-land-hdpi/splash.png: 533x320 dp (800x480 px), drawable-land-mdpi/splash.png: 480x320 dp (480x320 px), drawable-land-xhdpi/splash.png: 640x360 dp (1280x720 px), drawable-land-xxhdpi/splash.png: 533x320 dp (1600x960 px), drawable-land-xxxhdpi/splash.png: 480x320 dp (1920x1280 px)"> |
|||
<location |
|||
file="src/main/res/drawable-land-mdpi/splash.png"/> |
|||
<location |
|||
file="src/main/res/drawable-land-xxxhdpi/splash.png"/> |
|||
<location |
|||
file="src/main/res/drawable-land-hdpi/splash.png"/> |
|||
<location |
|||
file="src/main/res/drawable-land-xxhdpi/splash.png"/> |
|||
<location |
|||
file="src/main/res/drawable-land-xhdpi/splash.png"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="IconDuplicatesConfig" |
|||
message="The `splash.png` icon has identical contents in the following configuration folders: drawable-land-mdpi, drawable"> |
|||
<location |
|||
file="src/main/res/drawable/splash.png"/> |
|||
<location |
|||
file="src/main/res/drawable-land-mdpi/splash.png"/> |
|||
</issue> |
|||
|
|||
<issue |
|||
id="IconLocation" |
|||
message="Found bitmap drawable `res/drawable/splash.png` in densityless folder"> |
|||
<location |
|||
file="src/main/res/drawable/splash.png"/> |
|||
</issue> |
|||
|
|||
</issues> |
@ -1,26 +1,20 @@ |
|||
package com.getcapacitor.myapp; |
|||
|
|||
import static org.junit.Assert.*; |
|||
package app.timesafari.app; |
|||
|
|||
import android.content.Context; |
|||
import androidx.test.ext.junit.runners.AndroidJUnit4; |
|||
import androidx.test.platform.app.InstrumentationRegistry; |
|||
import androidx.test.ext.junit.runners.AndroidJUnit4; |
|||
|
|||
import org.junit.Test; |
|||
import org.junit.runner.RunWith; |
|||
|
|||
/** |
|||
* Instrumented test, which will execute on an Android device. |
|||
* |
|||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a> |
|||
*/ |
|||
import static org.junit.Assert.*; |
|||
|
|||
@RunWith(AndroidJUnit4.class) |
|||
public class ExampleInstrumentedTest { |
|||
|
|||
@Test |
|||
public void useAppContext() throws Exception { |
|||
public void useAppContext() { |
|||
// Context of the app under test.
|
|||
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); |
|||
|
|||
assertEquals("com.getcapacitor.app", appContext.getPackageName()); |
|||
assertEquals("app.timesafari", appContext.getPackageName()); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,21 @@ |
|||
{ |
|||
"appId": "app.timesafari.app", |
|||
"appName": "TimeSafari", |
|||
"webDir": "dist", |
|||
"bundledWebRuntime": false, |
|||
"server": { |
|||
"cleartext": true |
|||
}, |
|||
"plugins": { |
|||
"App": { |
|||
"appUrlOpen": { |
|||
"handlers": [ |
|||
{ |
|||
"url": "timesafari://*", |
|||
"autoVerify": true |
|||
} |
|||
] |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,6 @@ |
|||
[ |
|||
{ |
|||
"pkg": "@capacitor/app", |
|||
"classpath": "com.capacitorjs.plugins.app.AppPlugin" |
|||
} |
|||
] |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 270 KiB |
After Width: | Height: | Size: 332 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 463 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 150 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 9.7 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 7.3 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 5.6 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 705 KiB |
@ -0,0 +1,17 @@ |
|||
<!DOCTYPE html> |
|||
<html lang=""> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
|||
<meta name="viewport" content="width=device-width,initial-scale=1.0"> |
|||
<link rel="icon" href="/favicon.ico"> |
|||
<title>TimeSafari</title> |
|||
<script type="module" crossorigin src="/assets/index-CI0bMoT0.js"></script> |
|||
</head> |
|||
<body> |
|||
<noscript> |
|||
<strong>We're sorry but TimeSafari doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> |
|||
</noscript> |
|||
<div id="app"></div> |
|||
</body> |
|||
</html> |
@ -0,0 +1,11 @@ |
|||
Model Information: |
|||
* title: Lupine Plant |
|||
* source: https://sketchfab.com/3d-models/lupine-plant-bf30f1110c174d4baedda0ed63778439 |
|||
* author: rufusrockwell (https://sketchfab.com/rufusrockwell) |
|||
|
|||
Model License: |
|||
* license type: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/) |
|||
* requirements: Author must be credited. Commercial use is allowed. |
|||
|
|||
If you use this 3D model in your project be sure to copy paste this credit wherever you share it: |
|||
This work is based on "Lupine Plant" (https://sketchfab.com/3d-models/lupine-plant-bf30f1110c174d4baedda0ed63778439) by rufusrockwell (https://sketchfab.com/rufusrockwell) licensed under CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/) |
@ -0,0 +1,229 @@ |
|||
{ |
|||
"accessors": [ |
|||
{ |
|||
"bufferView": 2, |
|||
"componentType": 5126, |
|||
"count": 2759, |
|||
"max": [ |
|||
41.3074951171875, |
|||
40.37548828125, |
|||
87.85917663574219 |
|||
], |
|||
"min": [ |
|||
-35.245540618896484, |
|||
-36.895416259765625, |
|||
-0.9094290137290955 |
|||
], |
|||
"type": "VEC3" |
|||
}, |
|||
{ |
|||
"bufferView": 2, |
|||
"byteOffset": 33108, |
|||
"componentType": 5126, |
|||
"count": 2759, |
|||
"max": [ |
|||
0.9999382495880127, |
|||
0.9986748695373535, |
|||
0.9985831379890442 |
|||
], |
|||
"min": [ |
|||
-0.9998949766159058, |
|||
-0.9975876212120056, |
|||
-0.411094069480896 |
|||
], |
|||
"type": "VEC3" |
|||
}, |
|||
{ |
|||
"bufferView": 3, |
|||
"componentType": 5126, |
|||
"count": 2759, |
|||
"max": [ |
|||
0.9987699389457703, |
|||
0.9998998045921326, |
|||
0.9577858448028564, |
|||
1.0 |
|||
], |
|||
"min": [ |
|||
-0.9987726807594299, |
|||
-0.9990445971488953, |
|||
-0.999801516532898, |
|||
1.0 |
|||
], |
|||
"type": "VEC4" |
|||
}, |
|||
{ |
|||
"bufferView": 1, |
|||
"componentType": 5126, |
|||
"count": 2759, |
|||
"max": [ |
|||
1.0061479806900024, |
|||
0.9993550181388855 |
|||
], |
|||
"min": [ |
|||
0.00279300007969141, |
|||
0.0011620000004768372 |
|||
], |
|||
"type": "VEC2" |
|||
}, |
|||
{ |
|||
"bufferView": 0, |
|||
"componentType": 5125, |
|||
"count": 6378, |
|||
"type": "SCALAR" |
|||
} |
|||
], |
|||
"asset": { |
|||
"extras": { |
|||
"author": "rufusrockwell (https://sketchfab.com/rufusrockwell)", |
|||
"license": "CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)", |
|||
"source": "https://sketchfab.com/3d-models/lupine-plant-bf30f1110c174d4baedda0ed63778439", |
|||
"title": "Lupine Plant" |
|||
}, |
|||
"generator": "Sketchfab-12.68.0", |
|||
"version": "2.0" |
|||
}, |
|||
"bufferViews": [ |
|||
{ |
|||
"buffer": 0, |
|||
"byteLength": 25512, |
|||
"name": "floatBufferViews", |
|||
"target": 34963 |
|||
}, |
|||
{ |
|||
"buffer": 0, |
|||
"byteLength": 22072, |
|||
"byteOffset": 25512, |
|||
"byteStride": 8, |
|||
"name": "floatBufferViews", |
|||
"target": 34962 |
|||
}, |
|||
{ |
|||
"buffer": 0, |
|||
"byteLength": 66216, |
|||
"byteOffset": 47584, |
|||
"byteStride": 12, |
|||
"name": "floatBufferViews", |
|||
"target": 34962 |
|||
}, |
|||
{ |
|||
"buffer": 0, |
|||
"byteLength": 44144, |
|||
"byteOffset": 113800, |
|||
"byteStride": 16, |
|||
"name": "floatBufferViews", |
|||
"target": 34962 |
|||
} |
|||
], |
|||
"buffers": [ |
|||
{ |
|||
"byteLength": 157944, |
|||
"uri": "scene.bin" |
|||
} |
|||
], |
|||
"images": [ |
|||
{ |
|||
"uri": "textures/lambert2SG_baseColor.png" |
|||
}, |
|||
{ |
|||
"uri": "textures/lambert2SG_normal.png" |
|||
} |
|||
], |
|||
"materials": [ |
|||
{ |
|||
"alphaCutoff": 0.2, |
|||
"alphaMode": "MASK", |
|||
"doubleSided": true, |
|||
"name": "lambert2SG", |
|||
"normalTexture": { |
|||
"index": 1 |
|||
}, |
|||
"pbrMetallicRoughness": { |
|||
"baseColorTexture": { |
|||
"index": 0 |
|||
}, |
|||
"metallicFactor": 0.0 |
|||
} |
|||
} |
|||
], |
|||
"meshes": [ |
|||
{ |
|||
"name": "Object_0", |
|||
"primitives": [ |
|||
{ |
|||
"attributes": { |
|||
"NORMAL": 1, |
|||
"POSITION": 0, |
|||
"TANGENT": 2, |
|||
"TEXCOORD_0": 3 |
|||
}, |
|||
"indices": 4, |
|||
"material": 0, |
|||
"mode": 4 |
|||
} |
|||
] |
|||
} |
|||
], |
|||
"nodes": [ |
|||
{ |
|||
"children": [ |
|||
1 |
|||
], |
|||
"matrix": [ |
|||
1.0, |
|||
0.0, |
|||
0.0, |
|||
0.0, |
|||
0.0, |
|||
2.220446049250313e-16, |
|||
-1.0, |
|||
0.0, |
|||
0.0, |
|||
1.0, |
|||
2.220446049250313e-16, |
|||
0.0, |
|||
0.0, |
|||
0.0, |
|||
0.0, |
|||
1.0 |
|||
], |
|||
"name": "Sketchfab_model" |
|||
}, |
|||
{ |
|||
"children": [ |
|||
2 |
|||
], |
|||
"name": "LupineSF.obj.cleaner.materialmerger.gles" |
|||
}, |
|||
{ |
|||
"mesh": 0, |
|||
"name": "Object_2" |
|||
} |
|||
], |
|||
"samplers": [ |
|||
{ |
|||
"magFilter": 9729, |
|||
"minFilter": 9987, |
|||
"wrapS": 10497, |
|||
"wrapT": 10497 |
|||
} |
|||
], |
|||
"scene": 0, |
|||
"scenes": [ |
|||
{ |
|||
"name": "Sketchfab_Scene", |
|||
"nodes": [ |
|||
0 |
|||
] |
|||
} |
|||
], |
|||
"textures": [ |
|||
{ |
|||
"sampler": 0, |
|||
"source": 0 |
|||
}, |
|||
{ |
|||
"sampler": 0, |
|||
"source": 1 |
|||
} |
|||
] |
|||
} |
After Width: | Height: | Size: 3.6 MiB |
After Width: | Height: | Size: 4.7 MiB |
@ -0,0 +1,2 @@ |
|||
User-agent: * |
|||
Disallow: |
@ -0,0 +1,6 @@ |
|||
<?xml version='1.0' encoding='utf-8'?> |
|||
<widget version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"> |
|||
<access origin="*" /> |
|||
|
|||
|
|||
</widget> |
@ -0,0 +1,7 @@ |
|||
android { |
|||
lintOptions { |
|||
disable 'UnsanitizedFilenameFromContentProvider' |
|||
abortOnError false |
|||
baseline file("lint-baseline.xml") |
|||
} |
|||
} |
@ -0,0 +1,59 @@ |
|||
ext { |
|||
androidxAppCompatVersion = project.hasProperty('androidxAppCompatVersion') ? rootProject.ext.androidxAppCompatVersion : '1.6.1' |
|||
cordovaAndroidVersion = project.hasProperty('cordovaAndroidVersion') ? rootProject.ext.cordovaAndroidVersion : '10.1.1' |
|||
} |
|||
|
|||
buildscript { |
|||
repositories { |
|||
google() |
|||
mavenCentral() |
|||
} |
|||
dependencies { |
|||
classpath 'com.android.tools.build:gradle:8.2.1' |
|||
} |
|||
} |
|||
|
|||
apply plugin: 'com.android.library' |
|||
|
|||
android { |
|||
namespace "capacitor.cordova.android.plugins" |
|||
compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 34 |
|||
defaultConfig { |
|||
minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 22 |
|||
targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 34 |
|||
versionCode 1 |
|||
versionName "1.0" |
|||
} |
|||
lintOptions { |
|||
abortOnError false |
|||
} |
|||
compileOptions { |
|||
sourceCompatibility JavaVersion.VERSION_17 |
|||
targetCompatibility JavaVersion.VERSION_17 |
|||
} |
|||
} |
|||
|
|||
repositories { |
|||
google() |
|||
mavenCentral() |
|||
flatDir{ |
|||
dirs 'src/main/libs', 'libs' |
|||
} |
|||
} |
|||
|
|||
dependencies { |
|||
implementation fileTree(dir: 'src/main/libs', include: ['*.jar']) |
|||
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" |
|||
implementation "org.apache.cordova:framework:$cordovaAndroidVersion" |
|||
// SUB-PROJECT DEPENDENCIES START |
|||
|
|||
// SUB-PROJECT DEPENDENCIES END |
|||
} |
|||
|
|||
// PLUGIN GRADLE EXTENSIONS START |
|||
apply from: "cordova.variables.gradle" |
|||
// PLUGIN GRADLE EXTENSIONS END |
|||
|
|||
for (def func : cdvPluginPostBuildExtras) { |
|||
func() |
|||
} |
@ -0,0 +1,7 @@ |
|||
// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN |
|||
ext { |
|||
cdvMinSdkVersion = project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 22 |
|||
// Plugin gradle extensions can append to this to have code run at the end. |
|||
cdvPluginPostBuildExtras = [] |
|||
cordovaConfig = [:] |
|||
} |
@ -0,0 +1,8 @@ |
|||
<?xml version='1.0' encoding='utf-8'?> |
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:amazon="http://schemas.amazon.com/apk/res/android"> |
|||
<application android:usesCleartextTraffic="true"> |
|||
|
|||
</application> |
|||
|
|||
</manifest> |
@ -0,0 +1 @@ |
|||
|
@ -1,3 +1,6 @@ |
|||
// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN |
|||
include ':capacitor-android' |
|||
project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') |
|||
|
|||
include ':capacitor-app' |
|||
project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android') |
|||
|
@ -0,0 +1,2 @@ |
|||
json_key_file("") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one |
|||
package_name("app.timesafari.app") # e.g. com.krausefx.app |
@ -0,0 +1,38 @@ |
|||
# This file contains the fastlane.tools configuration |
|||
# You can find the documentation at https://docs.fastlane.tools |
|||
# |
|||
# For a list of all available actions, check out |
|||
# |
|||
# https://docs.fastlane.tools/actions |
|||
# |
|||
# For a list of all available plugins, check out |
|||
# |
|||
# https://docs.fastlane.tools/plugins/available-plugins |
|||
# |
|||
|
|||
# Uncomment the line if you want fastlane to automatically update itself |
|||
# update_fastlane |
|||
|
|||
default_platform(:android) |
|||
|
|||
platform :android do |
|||
desc "Build and deploy Android app" |
|||
lane :beta do |
|||
gradle( |
|||
task: "clean assembleRelease" |
|||
) |
|||
upload_to_play_store( |
|||
track: 'beta', |
|||
aab: '../app/build/outputs/bundle/release/app-release.aab' |
|||
) |
|||
end |
|||
|
|||
lane :release do |
|||
gradle( |
|||
task: "clean assembleRelease" |
|||
) |
|||
upload_to_play_store( |
|||
aab: '../app/build/outputs/bundle/release/app-release.aab' |
|||
) |
|||
end |
|||
end |
@ -0,0 +1,40 @@ |
|||
fastlane documentation |
|||
---- |
|||
|
|||
# Installation |
|||
|
|||
Make sure you have the latest version of the Xcode command line tools installed: |
|||
|
|||
```sh |
|||
xcode-select --install |
|||
``` |
|||
|
|||
For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) |
|||
|
|||
# Available Actions |
|||
|
|||
## Android |
|||
|
|||
### android beta |
|||
|
|||
```sh |
|||
[bundle exec] fastlane android beta |
|||
``` |
|||
|
|||
Build and deploy Android app |
|||
|
|||
### android release |
|||
|
|||
```sh |
|||
[bundle exec] fastlane android release |
|||
``` |
|||
|
|||
|
|||
|
|||
---- |
|||
|
|||
This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. |
|||
|
|||
More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). |
|||
|
|||
The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). |
@ -0,0 +1,8 @@ |
|||
## This file must *NOT* be checked into Version Control Systems, |
|||
# as it contains information specific to your local configuration. |
|||
# |
|||
# Location of the SDK. This is only used by Gradle. |
|||
# For customization when using a Version Control System, please read the |
|||
# header note. |
|||
#Sun Mar 09 06:14:41 UTC 2025 |
|||
sdk.dir=/opt/android-sdk |
@ -0,0 +1,91 @@ |
|||
# TimeSafari Deep Linking Documentation |
|||
|
|||
## Type System Overview |
|||
|
|||
The deep linking system uses a multi-layered type safety approach: |
|||
|
|||
1. **Runtime Validation (Zod Schemas)** |
|||
- Validates URL structure |
|||
- Enforces parameter requirements |
|||
- Sanitizes input data |
|||
- Provides detailed validation errors |
|||
|
|||
2. **TypeScript Types** |
|||
- Generated from Zod schemas |
|||
- Ensures compile-time type safety |
|||
- Provides IDE autocompletion |
|||
- Catches type errors during development |
|||
|
|||
3. **Router Integration** |
|||
- Type-safe parameter passing |
|||
- Route-specific parameter validation |
|||
- Query parameter type checking |
|||
|
|||
## Implementation Files |
|||
|
|||
- `src/types/deepLinks.ts`: Type definitions and validation schemas |
|||
- `src/services/deepLinks.ts`: Deep link processing service |
|||
- `src/main.capacitor.ts`: Capacitor integration |
|||
|
|||
## Type Safety Examples |
|||
|
|||
```typescript |
|||
// Parameter type safety |
|||
type ClaimParams = DeepLinkParams["claim"]; |
|||
// TypeScript knows this has: |
|||
// - id: string |
|||
// - view?: "details" | "certificate" | "raw" |
|||
// Runtime validation |
|||
const result = deepLinkSchemas.claim.safeParse({ |
|||
id: "123", |
|||
view: "details" |
|||
}); |
|||
// Validates at runtime with detailed error messages |
|||
``` |
|||
|
|||
## Supported URL Schemes |
|||
|
|||
All deep links follow the format: `timesafari://<route>/<param>?<query>` |
|||
|
|||
### Claim Routes |
|||
|
|||
- `timesafari://claim/:id` |
|||
- Query params: |
|||
- `view`: "details" | "certificate" | "raw" |
|||
|
|||
- `timesafari://claim-cert/:id` |
|||
- `timesafari://claim-add-raw/:id` |
|||
- Query params: |
|||
- `claim`: JSON string of claim data |
|||
- `claimJwtId`: JWT ID for claim |
|||
|
|||
### Contact Routes |
|||
|
|||
- `timesafari://contact-edit/:did` |
|||
- `timesafari://contact-import/:jwt` |
|||
- Query params: |
|||
- `contacts`: JSON array of contacts |
|||
|
|||
### Project Routes |
|||
|
|||
- `timesafari://project/:id` |
|||
- Query params: |
|||
- `view`: "details" | "edit" |
|||
|
|||
### Invite Routes |
|||
|
|||
- `timesafari://invite-one-accept/:jwt` |
|||
- Query params: |
|||
- `type`: "one" | "many" |
|||
|
|||
### Gift Routes |
|||
|
|||
- `timesafari://confirm-gift/:id` |
|||
- Query params: |
|||
- `action`: "confirm" | "details" |
|||
|
|||
### Offer Routes |
|||
|
|||
- `timesafari://offer-details/:id` |
|||
- Query params: |
|||
- `view`: "details" |
@ -1,13 +0,0 @@ |
|||
App/build |
|||
App/Pods |
|||
App/output |
|||
App/App/public |
|||
DerivedData |
|||
xcuserdata |
|||
|
|||
# Cordova plugins for Capacitor |
|||
capacitor-cordova-ios-plugins |
|||
|
|||
# Generated Config files |
|||
App/App/capacitor.config.json |
|||
App/App/config.xml |
@ -1,408 +0,0 @@ |
|||
// !$*UTF8*$! |
|||
{ |
|||
archiveVersion = 1; |
|||
classes = { |
|||
}; |
|||
objectVersion = 48; |
|||
objects = { |
|||
|
|||
/* Begin PBXBuildFile section */ |
|||
2FAD9763203C412B000D30F8 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2FAD9762203C412B000D30F8 /* config.xml */; }; |
|||
50379B232058CBB4000EE86E /* capacitor.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 50379B222058CBB4000EE86E /* capacitor.config.json */; }; |
|||
504EC3081FED79650016851F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504EC3071FED79650016851F /* AppDelegate.swift */; }; |
|||
504EC30D1FED79650016851F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30B1FED79650016851F /* Main.storyboard */; }; |
|||
504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; }; |
|||
504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; |
|||
50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; |
|||
A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; }; |
|||
/* End PBXBuildFile section */ |
|||
|
|||
/* Begin PBXFileReference section */ |
|||
2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = "<group>"; }; |
|||
50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = "<group>"; }; |
|||
504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; }; |
|||
504EC3071FED79650016851F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; |
|||
504EC30C1FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; |
|||
504EC30E1FED79650016851F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; |
|||
504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; |
|||
504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; |
|||
50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = "<group>"; }; |
|||
AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; |
|||
AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = "<group>"; }; |
|||
FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = "<group>"; }; |
|||
/* End PBXFileReference section */ |
|||
|
|||
/* Begin PBXFrameworksBuildPhase section */ |
|||
504EC3011FED79650016851F /* Frameworks */ = { |
|||
isa = PBXFrameworksBuildPhase; |
|||
buildActionMask = 2147483647; |
|||
files = ( |
|||
A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */, |
|||
); |
|||
runOnlyForDeploymentPostprocessing = 0; |
|||
}; |
|||
/* End PBXFrameworksBuildPhase section */ |
|||
|
|||
/* Begin PBXGroup section */ |
|||
27E2DDA53C4D2A4D1A88CE4A /* Frameworks */ = { |
|||
isa = PBXGroup; |
|||
children = ( |
|||
AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */, |
|||
); |
|||
name = Frameworks; |
|||
sourceTree = "<group>"; |
|||
}; |
|||
504EC2FB1FED79650016851F = { |
|||
isa = PBXGroup; |
|||
children = ( |
|||
504EC3061FED79650016851F /* App */, |
|||
504EC3051FED79650016851F /* Products */, |
|||
7F8756D8B27F46E3366F6CEA /* Pods */, |
|||
27E2DDA53C4D2A4D1A88CE4A /* Frameworks */, |
|||
); |
|||
sourceTree = "<group>"; |
|||
}; |
|||
504EC3051FED79650016851F /* Products */ = { |
|||
isa = PBXGroup; |
|||
children = ( |
|||
504EC3041FED79650016851F /* App.app */, |
|||
); |
|||
name = Products; |
|||
sourceTree = "<group>"; |
|||
}; |
|||
504EC3061FED79650016851F /* App */ = { |
|||
isa = PBXGroup; |
|||
children = ( |
|||
50379B222058CBB4000EE86E /* capacitor.config.json */, |
|||
504EC3071FED79650016851F /* AppDelegate.swift */, |
|||
504EC30B1FED79650016851F /* Main.storyboard */, |
|||
504EC30E1FED79650016851F /* Assets.xcassets */, |
|||
504EC3101FED79650016851F /* LaunchScreen.storyboard */, |
|||
504EC3131FED79650016851F /* Info.plist */, |
|||
2FAD9762203C412B000D30F8 /* config.xml */, |
|||
50B271D01FEDC1A000F3C39B /* public */, |
|||
); |
|||
path = App; |
|||
sourceTree = "<group>"; |
|||
}; |
|||
7F8756D8B27F46E3366F6CEA /* Pods */ = { |
|||
isa = PBXGroup; |
|||
children = ( |
|||
FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */, |
|||
AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */, |
|||
); |
|||
name = Pods; |
|||
sourceTree = "<group>"; |
|||
}; |
|||
/* End PBXGroup section */ |
|||
|
|||
/* Begin PBXNativeTarget section */ |
|||
504EC3031FED79650016851F /* App */ = { |
|||
isa = PBXNativeTarget; |
|||
buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */; |
|||
buildPhases = ( |
|||
6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */, |
|||
504EC3001FED79650016851F /* Sources */, |
|||
504EC3011FED79650016851F /* Frameworks */, |
|||
504EC3021FED79650016851F /* Resources */, |
|||
9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */, |
|||
); |
|||
buildRules = ( |
|||
); |
|||
dependencies = ( |
|||
); |
|||
name = App; |
|||
productName = App; |
|||
productReference = 504EC3041FED79650016851F /* App.app */; |
|||
productType = "com.apple.product-type.application"; |
|||
}; |
|||
/* End PBXNativeTarget section */ |
|||
|
|||
/* Begin PBXProject section */ |
|||
504EC2FC1FED79650016851F /* Project object */ = { |
|||
isa = PBXProject; |
|||
attributes = { |
|||
LastSwiftUpdateCheck = 0920; |
|||
LastUpgradeCheck = 0920; |
|||
TargetAttributes = { |
|||
504EC3031FED79650016851F = { |
|||
CreatedOnToolsVersion = 9.2; |
|||
LastSwiftMigration = 1100; |
|||
ProvisioningStyle = Automatic; |
|||
}; |
|||
}; |
|||
}; |
|||
buildConfigurationList = 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */; |
|||
compatibilityVersion = "Xcode 8.0"; |
|||
developmentRegion = en; |
|||
hasScannedForEncodings = 0; |
|||
knownRegions = ( |
|||
en, |
|||
Base, |
|||
); |
|||
mainGroup = 504EC2FB1FED79650016851F; |
|||
packageReferences = ( |
|||
); |
|||
productRefGroup = 504EC3051FED79650016851F /* Products */; |
|||
projectDirPath = ""; |
|||
projectRoot = ""; |
|||
targets = ( |
|||
504EC3031FED79650016851F /* App */, |
|||
); |
|||
}; |
|||
/* End PBXProject section */ |
|||
|
|||
/* Begin PBXResourcesBuildPhase section */ |
|||
504EC3021FED79650016851F /* Resources */ = { |
|||
isa = PBXResourcesBuildPhase; |
|||
buildActionMask = 2147483647; |
|||
files = ( |
|||
504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */, |
|||
50B271D11FEDC1A000F3C39B /* public in Resources */, |
|||
504EC30F1FED79650016851F /* Assets.xcassets in Resources */, |
|||
50379B232058CBB4000EE86E /* capacitor.config.json in Resources */, |
|||
504EC30D1FED79650016851F /* Main.storyboard in Resources */, |
|||
2FAD9763203C412B000D30F8 /* config.xml in Resources */, |
|||
); |
|||
runOnlyForDeploymentPostprocessing = 0; |
|||
}; |
|||
/* End PBXResourcesBuildPhase section */ |
|||
|
|||
/* Begin PBXShellScriptBuildPhase section */ |
|||
6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = { |
|||
isa = PBXShellScriptBuildPhase; |
|||
buildActionMask = 2147483647; |
|||
files = ( |
|||
); |
|||
inputPaths = ( |
|||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock", |
|||
"${PODS_ROOT}/Manifest.lock", |
|||
); |
|||
name = "[CP] Check Pods Manifest.lock"; |
|||
outputPaths = ( |
|||
"$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt", |
|||
); |
|||
runOnlyForDeploymentPostprocessing = 0; |
|||
shellPath = /bin/sh; |
|||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; |
|||
showEnvVarsInLog = 0; |
|||
}; |
|||
9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = { |
|||
isa = PBXShellScriptBuildPhase; |
|||
buildActionMask = 2147483647; |
|||
files = ( |
|||
); |
|||
inputPaths = ( |
|||
); |
|||
name = "[CP] Embed Pods Frameworks"; |
|||
outputPaths = ( |
|||
); |
|||
runOnlyForDeploymentPostprocessing = 0; |
|||
shellPath = /bin/sh; |
|||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n"; |
|||
showEnvVarsInLog = 0; |
|||
}; |
|||
/* End PBXShellScriptBuildPhase section */ |
|||
|
|||
/* Begin PBXSourcesBuildPhase section */ |
|||
504EC3001FED79650016851F /* Sources */ = { |
|||
isa = PBXSourcesBuildPhase; |
|||
buildActionMask = 2147483647; |
|||
files = ( |
|||
504EC3081FED79650016851F /* AppDelegate.swift in Sources */, |
|||
); |
|||
runOnlyForDeploymentPostprocessing = 0; |
|||
}; |
|||
/* End PBXSourcesBuildPhase section */ |
|||
|
|||
/* Begin PBXVariantGroup section */ |
|||
504EC30B1FED79650016851F /* Main.storyboard */ = { |
|||
isa = PBXVariantGroup; |
|||
children = ( |
|||
504EC30C1FED79650016851F /* Base */, |
|||
); |
|||
name = Main.storyboard; |
|||
sourceTree = "<group>"; |
|||
}; |
|||
504EC3101FED79650016851F /* LaunchScreen.storyboard */ = { |
|||
isa = PBXVariantGroup; |
|||
children = ( |
|||
504EC3111FED79650016851F /* Base */, |
|||
); |
|||
name = LaunchScreen.storyboard; |
|||
sourceTree = "<group>"; |
|||
}; |
|||
/* End PBXVariantGroup section */ |
|||
|
|||
/* Begin XCBuildConfiguration section */ |
|||
504EC3141FED79650016851F /* Debug */ = { |
|||
isa = XCBuildConfiguration; |
|||
buildSettings = { |
|||
ALWAYS_SEARCH_USER_PATHS = NO; |
|||
CLANG_ANALYZER_NONNULL = YES; |
|||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; |
|||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; |
|||
CLANG_CXX_LIBRARY = "libc++"; |
|||
CLANG_ENABLE_MODULES = YES; |
|||
CLANG_ENABLE_OBJC_ARC = YES; |
|||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; |
|||
CLANG_WARN_BOOL_CONVERSION = YES; |
|||
CLANG_WARN_COMMA = YES; |
|||
CLANG_WARN_CONSTANT_CONVERSION = YES; |
|||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; |
|||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES; |
|||
CLANG_WARN_EMPTY_BODY = YES; |
|||
CLANG_WARN_ENUM_CONVERSION = YES; |
|||
CLANG_WARN_INFINITE_RECURSION = YES; |
|||
CLANG_WARN_INT_CONVERSION = YES; |
|||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; |
|||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; |
|||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; |
|||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; |
|||
CLANG_WARN_STRICT_PROTOTYPES = YES; |
|||
CLANG_WARN_SUSPICIOUS_MOVE = YES; |
|||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; |
|||
CLANG_WARN_UNREACHABLE_CODE = YES; |
|||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; |
|||
CODE_SIGN_IDENTITY = "iPhone Developer"; |
|||
COPY_PHASE_STRIP = NO; |
|||
DEBUG_INFORMATION_FORMAT = dwarf; |
|||
ENABLE_STRICT_OBJC_MSGSEND = YES; |
|||
ENABLE_TESTABILITY = YES; |
|||
GCC_C_LANGUAGE_STANDARD = gnu11; |
|||
GCC_DYNAMIC_NO_PIC = NO; |
|||
GCC_NO_COMMON_BLOCKS = YES; |
|||
GCC_OPTIMIZATION_LEVEL = 0; |
|||
GCC_PREPROCESSOR_DEFINITIONS = ( |
|||
"DEBUG=1", |
|||
"$(inherited)", |
|||
); |
|||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES; |
|||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; |
|||
GCC_WARN_UNDECLARED_SELECTOR = YES; |
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; |
|||
GCC_WARN_UNUSED_FUNCTION = YES; |
|||
GCC_WARN_UNUSED_VARIABLE = YES; |
|||
IPHONEOS_DEPLOYMENT_TARGET = 13.0; |
|||
MTL_ENABLE_DEBUG_INFO = YES; |
|||
ONLY_ACTIVE_ARCH = YES; |
|||
SDKROOT = iphoneos; |
|||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; |
|||
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; |
|||
}; |
|||
name = Debug; |
|||
}; |
|||
504EC3151FED79650016851F /* Release */ = { |
|||
isa = XCBuildConfiguration; |
|||
buildSettings = { |
|||
ALWAYS_SEARCH_USER_PATHS = NO; |
|||
CLANG_ANALYZER_NONNULL = YES; |
|||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; |
|||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; |
|||
CLANG_CXX_LIBRARY = "libc++"; |
|||
CLANG_ENABLE_MODULES = YES; |
|||
CLANG_ENABLE_OBJC_ARC = YES; |
|||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; |
|||
CLANG_WARN_BOOL_CONVERSION = YES; |
|||
CLANG_WARN_COMMA = YES; |
|||
CLANG_WARN_CONSTANT_CONVERSION = YES; |
|||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; |
|||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES; |
|||
CLANG_WARN_EMPTY_BODY = YES; |
|||
CLANG_WARN_ENUM_CONVERSION = YES; |
|||
CLANG_WARN_INFINITE_RECURSION = YES; |
|||
CLANG_WARN_INT_CONVERSION = YES; |
|||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; |
|||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; |
|||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; |
|||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; |
|||
CLANG_WARN_STRICT_PROTOTYPES = YES; |
|||
CLANG_WARN_SUSPICIOUS_MOVE = YES; |
|||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; |
|||
CLANG_WARN_UNREACHABLE_CODE = YES; |
|||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; |
|||
CODE_SIGN_IDENTITY = "iPhone Developer"; |
|||
COPY_PHASE_STRIP = NO; |
|||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; |
|||
ENABLE_NS_ASSERTIONS = NO; |
|||
ENABLE_STRICT_OBJC_MSGSEND = YES; |
|||
GCC_C_LANGUAGE_STANDARD = gnu11; |
|||
GCC_NO_COMMON_BLOCKS = YES; |
|||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES; |
|||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; |
|||
GCC_WARN_UNDECLARED_SELECTOR = YES; |
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; |
|||
GCC_WARN_UNUSED_FUNCTION = YES; |
|||
GCC_WARN_UNUSED_VARIABLE = YES; |
|||
IPHONEOS_DEPLOYMENT_TARGET = 13.0; |
|||
MTL_ENABLE_DEBUG_INFO = NO; |
|||
SDKROOT = iphoneos; |
|||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; |
|||
VALIDATE_PRODUCT = YES; |
|||
}; |
|||
name = Release; |
|||
}; |
|||
504EC3171FED79650016851F /* Debug */ = { |
|||
isa = XCBuildConfiguration; |
|||
baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */; |
|||
buildSettings = { |
|||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; |
|||
CODE_SIGN_STYLE = Automatic; |
|||
CURRENT_PROJECT_VERSION = 1; |
|||
INFOPLIST_FILE = App/Info.plist; |
|||
IPHONEOS_DEPLOYMENT_TARGET = 13.0; |
|||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; |
|||
MARKETING_VERSION = 1.0; |
|||
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; |
|||
PRODUCT_BUNDLE_IDENTIFIER = app.timesafari.app; |
|||
PRODUCT_NAME = "$(TARGET_NAME)"; |
|||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; |
|||
SWIFT_VERSION = 5.0; |
|||
TARGETED_DEVICE_FAMILY = "1,2"; |
|||
}; |
|||
name = Debug; |
|||
}; |
|||
504EC3181FED79650016851F /* Release */ = { |
|||
isa = XCBuildConfiguration; |
|||
baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */; |
|||
buildSettings = { |
|||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; |
|||
CODE_SIGN_STYLE = Automatic; |
|||
CURRENT_PROJECT_VERSION = 1; |
|||
INFOPLIST_FILE = App/Info.plist; |
|||
IPHONEOS_DEPLOYMENT_TARGET = 13.0; |
|||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; |
|||
MARKETING_VERSION = 1.0; |
|||
PRODUCT_BUNDLE_IDENTIFIER = app.timesafari.app; |
|||
PRODUCT_NAME = "$(TARGET_NAME)"; |
|||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; |
|||
SWIFT_VERSION = 5.0; |
|||
TARGETED_DEVICE_FAMILY = "1,2"; |
|||
}; |
|||
name = Release; |
|||
}; |
|||
/* End XCBuildConfiguration section */ |
|||
|
|||
/* Begin XCConfigurationList section */ |
|||
504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = { |
|||
isa = XCConfigurationList; |
|||
buildConfigurations = ( |
|||
504EC3141FED79650016851F /* Debug */, |
|||
504EC3151FED79650016851F /* Release */, |
|||
); |
|||
defaultConfigurationIsVisible = 0; |
|||
defaultConfigurationName = Release; |
|||
}; |
|||
504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */ = { |
|||
isa = XCConfigurationList; |
|||
buildConfigurations = ( |
|||
504EC3171FED79650016851F /* Debug */, |
|||
504EC3181FED79650016851F /* Release */, |
|||
); |
|||
defaultConfigurationIsVisible = 0; |
|||
defaultConfigurationName = Release; |
|||
}; |
|||
/* End XCConfigurationList section */ |
|||
}; |
|||
rootObject = 504EC2FC1FED79650016851F /* Project object */; |
|||
} |
@ -1,8 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
|||
<plist version="1.0"> |
|||
<dict> |
|||
<key>IDEDidComputeMac32BitWarning</key> |
|||
<true/> |
|||
</dict> |
|||
</plist> |
@ -1,49 +0,0 @@ |
|||
import UIKit |
|||
import Capacitor |
|||
|
|||
@UIApplicationMain |
|||
class AppDelegate: UIResponder, UIApplicationDelegate { |
|||
|
|||
var window: UIWindow? |
|||
|
|||
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { |
|||
// Override point for customization after application launch. |
|||
return true |
|||
} |
|||
|
|||
func applicationWillResignActive(_ application: UIApplication) { |
|||
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. |
|||
// Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. |
|||
} |
|||
|
|||
func applicationDidEnterBackground(_ application: UIApplication) { |
|||
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. |
|||
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. |
|||
} |
|||
|
|||
func applicationWillEnterForeground(_ application: UIApplication) { |
|||
// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. |
|||
} |
|||
|
|||
func applicationDidBecomeActive(_ application: UIApplication) { |
|||
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. |
|||
} |
|||
|
|||
func applicationWillTerminate(_ application: UIApplication) { |
|||
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. |
|||
} |
|||
|
|||
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { |
|||
// Called when the app was launched with a url. Feel free to add additional processing here, |
|||
// but if you want the App API to support tracking app url opens, make sure to keep this call |
|||
return ApplicationDelegateProxy.shared.application(app, open: url, options: options) |
|||
} |
|||
|
|||
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { |
|||
// Called when the app was launched with an activity, including Universal Links. |
|||
// Feel free to add additional processing here, but if you want the App API to support |
|||
// tracking app url opens, make sure to keep this call |
|||
return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) |
|||
} |
|||
|
|||
} |
Before Width: | Height: | Size: 108 KiB |
@ -1,14 +0,0 @@ |
|||
{ |
|||
"images" : [ |
|||
{ |
|||
"filename" : "AppIcon-512@2x.png", |
|||
"idiom" : "universal", |
|||
"platform" : "ios", |
|||
"size" : "1024x1024" |
|||
} |
|||
], |
|||
"info" : { |
|||
"author" : "xcode", |
|||
"version" : 1 |
|||
} |
|||
} |
@ -1,6 +0,0 @@ |
|||
{ |
|||
"info" : { |
|||
"version" : 1, |
|||
"author" : "xcode" |
|||
} |
|||
} |
@ -1,23 +0,0 @@ |
|||
{ |
|||
"images" : [ |
|||
{ |
|||
"idiom" : "universal", |
|||
"filename" : "splash-2732x2732-2.png", |
|||
"scale" : "1x" |
|||
}, |
|||
{ |
|||
"idiom" : "universal", |
|||
"filename" : "splash-2732x2732-1.png", |
|||
"scale" : "2x" |
|||
}, |
|||
{ |
|||
"idiom" : "universal", |
|||
"filename" : "splash-2732x2732.png", |
|||
"scale" : "3x" |
|||
} |
|||
], |
|||
"info" : { |
|||
"version" : 1, |
|||
"author" : "xcode" |
|||
} |
|||
} |
Before Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 40 KiB |
@ -1,32 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17132" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> |
|||
<device id="retina4_7" orientation="portrait" appearance="light"/> |
|||
<dependencies> |
|||
<deployment identifier="iOS"/> |
|||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17105"/> |
|||
<capability name="System colors in document resources" minToolsVersion="11.0"/> |
|||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> |
|||
</dependencies> |
|||
<scenes> |
|||
<!--View Controller--> |
|||
<scene sceneID="EHf-IW-A2E"> |
|||
<objects> |
|||
<viewController id="01J-lp-oVM" sceneMemberID="viewController"> |
|||
<imageView key="view" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Splash" id="snD-IY-ifK"> |
|||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/> |
|||
<autoresizingMask key="autoresizingMask"/> |
|||
<color key="backgroundColor" systemColor="systemBackgroundColor"/> |
|||
</imageView> |
|||
</viewController> |
|||
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> |
|||
</objects> |
|||
<point key="canvasLocation" x="53" y="375"/> |
|||
</scene> |
|||
</scenes> |
|||
<resources> |
|||
<image name="Splash" width="1366" height="1366"/> |
|||
<systemColor name="systemBackgroundColor"> |
|||
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> |
|||
</systemColor> |
|||
</resources> |
|||
</document> |
@ -1,19 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14111" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r"> |
|||
<device id="retina4_7" orientation="portrait"> |
|||
<adaptation id="fullscreen"/> |
|||
</device> |
|||
<dependencies> |
|||
<deployment identifier="iOS"/> |
|||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/> |
|||
</dependencies> |
|||
<scenes> |
|||
<!--Bridge View Controller--> |
|||
<scene sceneID="tne-QT-ifu"> |
|||
<objects> |
|||
<viewController id="BYZ-38-t0r" customClass="CAPBridgeViewController" customModule="Capacitor" sceneMemberID="viewController"/> |
|||
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> |
|||
</objects> |
|||
</scene> |
|||
</scenes> |
|||
</document> |
@ -1,49 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
|||
<plist version="1.0"> |
|||
<dict> |
|||
<key>CFBundleDevelopmentRegion</key> |
|||
<string>en</string> |
|||
<key>CFBundleDisplayName</key> |
|||
<string>TimeSafari</string> |
|||
<key>CFBundleExecutable</key> |
|||
<string>$(EXECUTABLE_NAME)</string> |
|||
<key>CFBundleIdentifier</key> |
|||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> |
|||
<key>CFBundleInfoDictionaryVersion</key> |
|||
<string>6.0</string> |
|||
<key>CFBundleName</key> |
|||
<string>$(PRODUCT_NAME)</string> |
|||
<key>CFBundlePackageType</key> |
|||
<string>APPL</string> |
|||
<key>CFBundleShortVersionString</key> |
|||
<string>$(MARKETING_VERSION)</string> |
|||
<key>CFBundleVersion</key> |
|||
<string>$(CURRENT_PROJECT_VERSION)</string> |
|||
<key>LSRequiresIPhoneOS</key> |
|||
<true/> |
|||
<key>UILaunchStoryboardName</key> |
|||
<string>LaunchScreen</string> |
|||
<key>UIMainStoryboardFile</key> |
|||
<string>Main</string> |
|||
<key>UIRequiredDeviceCapabilities</key> |
|||
<array> |
|||
<string>armv7</string> |
|||
</array> |
|||
<key>UISupportedInterfaceOrientations</key> |
|||
<array> |
|||
<string>UIInterfaceOrientationPortrait</string> |
|||
<string>UIInterfaceOrientationLandscapeLeft</string> |
|||
<string>UIInterfaceOrientationLandscapeRight</string> |
|||
</array> |
|||
<key>UISupportedInterfaceOrientations~ipad</key> |
|||
<array> |
|||
<string>UIInterfaceOrientationPortrait</string> |
|||
<string>UIInterfaceOrientationPortraitUpsideDown</string> |
|||
<string>UIInterfaceOrientationLandscapeLeft</string> |
|||
<string>UIInterfaceOrientationLandscapeRight</string> |
|||
</array> |
|||
<key>UIViewControllerBasedStatusBarAppearance</key> |
|||
<true/> |
|||
</dict> |
|||
</plist> |
@ -1,24 +0,0 @@ |
|||
require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers' |
|||
|
|||
platform :ios, '13.0' |
|||
use_frameworks! |
|||
|
|||
# workaround to avoid Xcode caching of Pods that requires |
|||
# Product -> Clean Build Folder after new Cordova plugins installed |
|||
# Requires CocoaPods 1.6 or newer |
|||
install! 'cocoapods', :disable_input_output_paths => true |
|||
|
|||
def capacitor_pods |
|||
pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' |
|||
pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' |
|||
|
|||
end |
|||
|
|||
target 'App' do |
|||
capacitor_pods |
|||
# Add your Pods here |
|||
end |
|||
|
|||
post_install do |installer| |
|||
assertDeploymentTarget(installer) |
|||
end |
@ -0,0 +1,29 @@ |
|||
const { app, BrowserWindow } = require('electron'); |
|||
const path = require('path'); |
|||
|
|||
function createWindow() { |
|||
const win = new BrowserWindow({ |
|||
width: 1200, |
|||
height: 800, |
|||
webPreferences: { |
|||
nodeIntegration: true, |
|||
contextIsolation: false |
|||
} |
|||
}); |
|||
|
|||
win.loadFile(path.join(__dirname, 'dist-electron/www/index.html')); |
|||
} |
|||
|
|||
app.whenReady().then(createWindow); |
|||
|
|||
app.on('window-all-closed', () => { |
|||
if (process.platform !== 'darwin') { |
|||
app.quit(); |
|||
} |
|||
}); |
|||
|
|||
app.on('activate', () => { |
|||
if (BrowserWindow.getAllWindows().length === 0) { |
|||
createWindow(); |
|||
} |
|||
}); |
@ -0,0 +1,5 @@ |
|||
dependencies: |
|||
- gradle |
|||
- java |
|||
|
|||
# other dependencies are discovered via package.json & requirements.txt & Gemfile (I'm guessing). |
@ -1,3 +1,4 @@ |
|||
eth_keys |
|||
pywebview |
|||
pyinstaller>=6.12.0 |
|||
# For development |
|||
|
@ -0,0 +1,185 @@ |
|||
/** |
|||
* @fileoverview Prerequisites checker for mobile development environment |
|||
* |
|||
* This script verifies that all necessary tools and configurations are in place |
|||
* for mobile app development, including both Android and iOS platforms. |
|||
* |
|||
* Features: |
|||
* - Validates development environment setup |
|||
* - Checks required command-line tools |
|||
* - Verifies Android SDK and device connectivity |
|||
* - Confirms iOS development tools and simulator status |
|||
* |
|||
* Prerequisites checked: |
|||
* - Node.js and npm installation |
|||
* - Gradle for Android builds |
|||
* - Xcode and command line tools for iOS |
|||
* - ANDROID_HOME environment variable |
|||
* - Android platform files |
|||
* - Connected Android devices/emulators |
|||
* - iOS platform files |
|||
* - Running iOS simulators |
|||
* |
|||
* Exit codes: |
|||
* - 0: All checks passed |
|||
* - 1: One or more checks failed |
|||
* |
|||
* @example |
|||
* // Run directly
|
|||
* node scripts/check-prerequisites.js |
|||
* |
|||
* // Run via npm script
|
|||
* npm run test:prerequisites |
|||
* |
|||
* @author TimeSafari Team |
|||
* @license MIT |
|||
*/ |
|||
|
|||
const { execSync } = require('child_process'); |
|||
const { existsSync } = require('fs'); |
|||
|
|||
/** |
|||
* Checks if a command-line tool is available by attempting to run its --version command |
|||
* |
|||
* @param {string} command - The command to check (e.g., 'node', 'npm', 'gradle') |
|||
* @param {string} errorMessage - The error message to display if the command is not available |
|||
* @returns {boolean} - True if the command exists and is executable, false otherwise |
|||
* |
|||
* @example |
|||
* checkCommand('node', 'Node.js is required') |
|||
* // Returns true if node is available, false otherwise
|
|||
*/ |
|||
function checkCommand(command, errorMessage) { |
|||
try { |
|||
execSync(command + ' --version', { stdio: 'ignore' }); |
|||
return true; |
|||
} catch (e) { |
|||
console.error(`❌ ${errorMessage}`); |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Verifies Android development environment setup |
|||
* |
|||
* Checks for: |
|||
* 1. ANDROID_HOME environment variable |
|||
* 2. Android platform files in project |
|||
* 3. Connected Android devices or running emulators |
|||
* |
|||
* @returns {boolean} - True if Android setup is complete and valid, false otherwise |
|||
* |
|||
* @example |
|||
* if (!checkAndroidSetup()) { |
|||
* console.error('Android prerequisites not met'); |
|||
* } |
|||
*/ |
|||
function checkAndroidSetup() { |
|||
// Check ANDROID_HOME environment variable
|
|||
// This is required for Android SDK tools access
|
|||
if (!process.env.ANDROID_HOME) { |
|||
console.error('❌ ANDROID_HOME environment variable not set'); |
|||
return false; |
|||
} |
|||
|
|||
// Check if Android platform was added to the project
|
|||
// The 'android' directory should exist if platform was added via 'npx cap add android'
|
|||
if (!existsSync('android')) { |
|||
console.error('❌ Android platform not added. Run: npx cap add android'); |
|||
return false; |
|||
} |
|||
|
|||
// Check for connected devices or running emulators
|
|||
// Uses ADB (Android Debug Bridge) to list connected devices
|
|||
try { |
|||
const devices = execSync('adb devices').toString(); |
|||
// Parse ADB output - looking for lines ending with 'device' (not 'offline' or 'unauthorized')
|
|||
if (!devices.split('\n').slice(1).some(line => line.includes('device'))) { |
|||
console.error('❌ No Android devices connected'); |
|||
return false; |
|||
} |
|||
} catch (e) { |
|||
console.error('❌ ADB not available'); |
|||
return false; |
|||
} |
|||
|
|||
return true; |
|||
} |
|||
|
|||
/** |
|||
* Verifies iOS development environment setup |
|||
* |
|||
* Checks for: |
|||
* 1. iOS platform files in project |
|||
* 2. Running iOS simulators |
|||
* 3. Xcode command line tools availability |
|||
* |
|||
* @returns {boolean} - True if iOS setup is complete and valid, false otherwise |
|||
* |
|||
* @example |
|||
* if (!checkIosSetup()) { |
|||
* console.error('iOS prerequisites not met'); |
|||
* } |
|||
*/ |
|||
function checkIosSetup() { |
|||
// Check if iOS platform was added to the project
|
|||
// The 'ios' directory should exist if platform was added via 'npx cap add ios'
|
|||
if (!existsSync('ios')) { |
|||
console.error('❌ iOS platform not added. Run: npx cap add ios'); |
|||
return false; |
|||
} |
|||
|
|||
// Check for available and running iOS simulators
|
|||
// Uses xcrun simctl to list simulator devices
|
|||
try { |
|||
const simulators = execSync('xcrun simctl list devices available').toString(); |
|||
if (!simulators.includes('Booted')) { |
|||
console.error('❌ No iOS simulator running'); |
|||
return false; |
|||
} |
|||
} catch (e) { |
|||
console.error('❌ Xcode command line tools not available'); |
|||
return false; |
|||
} |
|||
|
|||
return true; |
|||
} |
|||
|
|||
/** |
|||
* Main function to check all prerequisites for mobile development |
|||
* |
|||
* Verifies: |
|||
* 1. Required command line tools (node, npm, gradle, xcodebuild) |
|||
* 2. Android development setup |
|||
* 3. iOS development setup |
|||
* |
|||
* Exits with code 1 if any checks fail |
|||
* |
|||
* @example |
|||
* // Run from package.json script:
|
|||
* // "test:prerequisites": "node scripts/check-prerequisites.js"
|
|||
*/ |
|||
function main() { |
|||
let success = true; |
|||
|
|||
// Check required command line tools
|
|||
// These are essential for building and testing the application
|
|||
success &= checkCommand('node', 'Node.js is required'); |
|||
success &= checkCommand('npm', 'npm is required'); |
|||
success &= checkCommand('gradle', 'Gradle is required for Android builds'); |
|||
success &= checkCommand('xcodebuild', 'Xcode is required for iOS builds'); |
|||
|
|||
// Check platform-specific development environments
|
|||
success &= checkAndroidSetup(); |
|||
success &= checkIosSetup(); |
|||
|
|||
// Exit with error if any checks failed
|
|||
if (!success) { |
|||
process.exit(1); |
|||
} |
|||
|
|||
console.log('✅ All prerequisites met!'); |
|||
} |
|||
|
|||
// Execute the checks
|
|||
main(); |
@ -0,0 +1,132 @@ |
|||
/** |
|||
* @fileoverview Runs mobile tests based on available platforms and devices |
|||
* |
|||
* This script intelligently detects available mobile platforms and their |
|||
* associated devices/simulators, then runs tests only for the available |
|||
* configurations. This allows for flexible testing across different |
|||
* development environments without failing when a platform is unavailable. |
|||
* |
|||
* Platform detection: |
|||
* - Android: Checks for SDK and connected devices/emulators |
|||
* - iOS: Checks for macOS, Xcode, and running simulators |
|||
* |
|||
* Features: |
|||
* - Smart platform detection |
|||
* - Graceful handling of unavailable platforms |
|||
* - Clear logging of test execution |
|||
* - Comprehensive error reporting |
|||
* |
|||
* Exit codes: |
|||
* - 0: Tests completed successfully on available platforms |
|||
* - 1: Tests failed or no platforms available |
|||
* |
|||
* @example |
|||
* // Run directly
|
|||
* node scripts/run-available-mobile-tests.js |
|||
* |
|||
* // Run via npm script
|
|||
* npm run test:mobile:available |
|||
* |
|||
* @requires child_process |
|||
* @requires fs |
|||
* |
|||
* @author TimeSafari Team |
|||
* @license MIT |
|||
*/ |
|||
|
|||
const { execSync } = require('child_process'); |
|||
const { existsSync } = require('fs'); |
|||
|
|||
/** |
|||
* Executes mobile tests on available platforms |
|||
* |
|||
* This function performs the following steps: |
|||
* 1. Checks Android environment and device availability |
|||
* 2. Checks iOS environment and simulator availability (on macOS) |
|||
* 3. Runs tests on available platforms |
|||
* 4. Reports results and handles errors |
|||
* |
|||
* Platform-specific checks: |
|||
* Android: |
|||
* - ANDROID_HOME environment variable |
|||
* - Android platform files existence |
|||
* - Connected devices via ADB |
|||
* |
|||
* iOS: |
|||
* - macOS operating system |
|||
* - iOS platform files existence |
|||
* - Running simulators via xcrun |
|||
* |
|||
* @async |
|||
* @throws {Error} If tests fail or no platforms are available |
|||
* |
|||
* @example |
|||
* runAvailableMobileTests().catch(error => { |
|||
* console.error('Test execution failed:', error); |
|||
* process.exit(1); |
|||
* }); |
|||
*/ |
|||
async function runAvailableMobileTests() { |
|||
try { |
|||
// Check Android availability
|
|||
// Requires both SDK (ANDROID_HOME) and platform files
|
|||
const androidAvailable = existsSync('android') && process.env.ANDROID_HOME; |
|||
let androidDeviceAvailable = false; |
|||
|
|||
if (androidAvailable) { |
|||
try { |
|||
// Check for connected devices using ADB
|
|||
const devices = execSync('adb devices').toString(); |
|||
// Parse ADB output for actually connected devices
|
|||
// Filters out unauthorized or offline devices
|
|||
androidDeviceAvailable = devices.split('\n').slice(1).some(line => line.includes('device')); |
|||
} catch (e) { |
|||
console.log('⚠️ Android SDK available but no devices connected'); |
|||
} |
|||
} |
|||
|
|||
// Check iOS availability
|
|||
// Only possible on macOS with Xcode installed
|
|||
const iosAvailable = process.platform === 'darwin' && existsSync('ios'); |
|||
let iosSimulatorAvailable = false; |
|||
|
|||
if (iosAvailable) { |
|||
try { |
|||
// Check for running simulators using xcrun
|
|||
const simulators = execSync('xcrun simctl list devices available').toString(); |
|||
// Look for 'Booted' state in simulator list
|
|||
iosSimulatorAvailable = simulators.includes('Booted'); |
|||
} catch (e) { |
|||
console.log('⚠️ iOS platform available but no simulator running'); |
|||
} |
|||
} |
|||
|
|||
// Execute tests for available platforms
|
|||
if (androidDeviceAvailable) { |
|||
console.log('🤖 Running Android tests...'); |
|||
// Run Android tests via npm script
|
|||
execSync('npm run test:android', { stdio: 'inherit' }); |
|||
} |
|||
|
|||
if (iosSimulatorAvailable) { |
|||
console.log('🍎 Running iOS tests...'); |
|||
// Run iOS tests via npm script
|
|||
execSync('npm run test:ios', { stdio: 'inherit' }); |
|||
} |
|||
|
|||
// Error if no platforms are available for testing
|
|||
if (!androidDeviceAvailable && !iosSimulatorAvailable) { |
|||
console.error('❌ No mobile platforms available for testing'); |
|||
process.exit(1); |
|||
} |
|||
|
|||
console.log('✅ Available mobile tests completed successfully'); |
|||
} catch (error) { |
|||
// Handle any errors during test execution
|
|||
console.error('❌ Mobile tests failed:', error); |
|||
process.exit(1); |
|||
} |
|||
} |
|||
|
|||
// Execute the test runner
|
|||
runAvailableMobileTests(); |