@deriv-com/smartcharts-champion 1.9.6 → 1.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/actions/build-and-deploy/action.yml +1 -7
- package/.github/workflows/DocSyncAI.yml +47 -0
- package/.github/workflows/claude.yml +15 -67
- package/.github/workflows/deploy-preview.yml +1 -1
- package/.github/workflows/deploy-production.yml +0 -2
- package/.github/workflows/publish-smart-charts.yml +1 -1
- package/.github/workflows/weekly-workflow-collector.yml +295 -0
- package/CHANGELOG.md +3 -3
- package/dist/assets/NOTICES +0 -31
- package/dist/chart/flutter_bootstrap.js +1 -1
- package/dist/chart/flutter_service_worker.js +1 -1
- package/dist/chart/main.dart.js +1 -1
- package/dist/chart/main.dart.mjs +1 -0
- package/dist/chart/main.dart.wasm +0 -0
- package/dist/flutter-chart-loader-b20830.smartcharts.js +1 -0
- package/dist/flutter-chart-loader-b20830.smartcharts.js.map +1 -0
- package/dist/smartcharts.js +1 -1
- package/dist/smartcharts.js.map +1 -1
- package/package.json +5 -2
- package/.husky/post-commit +0 -8
- package/.husky/pre-commit +0 -7
- package/dist/flutter-chart-adapter-e79e0c.smartcharts.js +0 -1
- package/dist/flutter-chart-adapter-e79e0c.smartcharts.js.map +0 -1
|
@@ -24,10 +24,6 @@ inputs:
|
|
|
24
24
|
description: "Flutter version"
|
|
25
25
|
required: false
|
|
26
26
|
default: "3.24.1"
|
|
27
|
-
flutter_web_renderer:
|
|
28
|
-
description: "Flutter web renderer"
|
|
29
|
-
required: false
|
|
30
|
-
default: "html"
|
|
31
27
|
environment:
|
|
32
28
|
description: "Deployment environment (production/preview)"
|
|
33
29
|
required: false
|
|
@@ -58,12 +54,10 @@ runs:
|
|
|
58
54
|
|
|
59
55
|
- name: Build Flutter chart component
|
|
60
56
|
shell: bash
|
|
61
|
-
env:
|
|
62
|
-
FLUTTER_WEB_RENDERER: ${{ inputs.flutter_web_renderer }}
|
|
63
57
|
run: |
|
|
64
58
|
cd chart_app
|
|
65
59
|
flutter pub get
|
|
66
|
-
flutter build web --
|
|
60
|
+
flutter build web --wasm --release
|
|
67
61
|
cd ..
|
|
68
62
|
|
|
69
63
|
- name: Build application
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: DocSync AI - Documentation Sync
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: "30 6 * * 5" # 10:30 AM GST (6:30 AM UTC) every Friday
|
|
6
|
+
|
|
7
|
+
issue_comment:
|
|
8
|
+
types: [created]
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
docsync-scheduled:
|
|
12
|
+
if: github.event_name == 'schedule'
|
|
13
|
+
permissions:
|
|
14
|
+
contents: write
|
|
15
|
+
pull-requests: write
|
|
16
|
+
issues: write
|
|
17
|
+
uses: deriv-com/shared-actions/.github/workflows/docsync-ai.yml@master
|
|
18
|
+
with:
|
|
19
|
+
trigger_type: "scheduled"
|
|
20
|
+
base_branch: "master"
|
|
21
|
+
secrets:
|
|
22
|
+
DOCSYNC_GITHUB_TOKEN: ${{ secrets.DOCSYNC_GITHUB_TOKEN }}
|
|
23
|
+
DOCSYNC_ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
24
|
+
DOCSYNC_SLACK_TOKEN: ${{ secrets.DOCSYNC_SLACK_TOKEN }}
|
|
25
|
+
DOCSYNC_SLACK_CHANNEL_ID: ${{ secrets.DOCSYNC_SLACK_CHANNEL_ID }}
|
|
26
|
+
DOCSYNC_SLACK_MENTION_USER_IDS: ${{ secrets.DOCSYNC_SLACK_MENTION_USER_IDS }}
|
|
27
|
+
docsync-comment:
|
|
28
|
+
if: |
|
|
29
|
+
github.event_name == 'issue_comment' &&
|
|
30
|
+
github.event.issue.pull_request &&
|
|
31
|
+
startsWith(github.event.comment.body, '@docbot')
|
|
32
|
+
permissions:
|
|
33
|
+
contents: write
|
|
34
|
+
pull-requests: write
|
|
35
|
+
uses: deriv-com/shared-actions/.github/workflows/docsync-ai.yml@master
|
|
36
|
+
with:
|
|
37
|
+
trigger_type: "comment"
|
|
38
|
+
comment_body: ${{ github.event.comment.body }}
|
|
39
|
+
comment_pr_number: ${{ github.event.issue.number }}
|
|
40
|
+
comment_id: ${{ github.event.comment.id }}
|
|
41
|
+
base_branch: "master"
|
|
42
|
+
secrets:
|
|
43
|
+
DOCSYNC_GITHUB_TOKEN: ${{ secrets.DOCSYNC_GITHUB_TOKEN }}
|
|
44
|
+
DOCSYNC_ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
45
|
+
DOCSYNC_SLACK_TOKEN: ${{ secrets.DOCSYNC_SLACK_TOKEN }}
|
|
46
|
+
DOCSYNC_SLACK_CHANNEL_ID: ${{ secrets.DOCSYNC_SLACK_CHANNEL_ID }}
|
|
47
|
+
DOCSYNC_SLACK_MENTION_USER_IDS: ${{ secrets.DOCSYNC_SLACK_MENTION_USER_IDS }}
|
|
@@ -1,71 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
# This GitHub Actions workflow uses the Claude Code Action to review pull requests.
|
|
3
|
-
name: Claude Code Assistant
|
|
1
|
+
name: Claude PR Review
|
|
4
2
|
|
|
5
3
|
on:
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
pull_request_target:
|
|
5
|
+
types: [opened, synchronize, reopened, ready_for_review]
|
|
8
6
|
|
|
9
7
|
jobs:
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
# Cancel older runs when new commits arrive on the same PR
|
|
23
|
-
concurrency:
|
|
24
|
-
group: pr-${{ github.event.pull_request.number }}
|
|
25
|
-
cancel-in-progress: true
|
|
26
|
-
|
|
27
|
-
steps:
|
|
28
|
-
- name: Verify user
|
|
29
|
-
uses: 'deriv-com/shared-actions/.github/actions/verify_user_in_organization@v3'
|
|
30
|
-
with:
|
|
31
|
-
username: ${{ github.event.pull_request.user.login }}
|
|
32
|
-
token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
|
|
33
|
-
|
|
34
|
-
# Ensure we have a real git repo at the PR HEAD (works for forks)
|
|
35
|
-
- name: Checkout PR head
|
|
36
|
-
uses: actions/checkout@v4
|
|
37
|
-
with:
|
|
38
|
-
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
|
39
|
-
ref: ${{ github.event.pull_request.head.ref }}
|
|
40
|
-
fetch-depth: 20
|
|
41
|
-
token: ${{ secrets.GITHUB_TOKEN }}
|
|
42
|
-
|
|
43
|
-
# Sanity check (helps diagnose if anything goes wrong)
|
|
44
|
-
- name: Verify git workspace
|
|
45
|
-
run: |
|
|
46
|
-
pwd
|
|
47
|
-
git rev-parse --is-inside-work-tree
|
|
48
|
-
git log -1 --oneline
|
|
49
|
-
|
|
50
|
-
- name: Run Claude Code Action
|
|
51
|
-
uses: anthropics/claude-code-action@v1
|
|
52
|
-
timeout-minutes: 60
|
|
53
|
-
with:
|
|
54
|
-
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
55
|
-
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
56
|
-
track_progress: true
|
|
57
|
-
prompt: |
|
|
58
|
-
REPO: ${{ github.repository }}
|
|
59
|
-
PR NUMBER: ${{ github.event.pull_request.number }}
|
|
60
|
-
|
|
61
|
-
Please review this pull request with a focus on:
|
|
62
|
-
- Correctness, regressions, and edge cases
|
|
63
|
-
- Code quality & readability (React + TypeScript best practices)
|
|
64
|
-
- Performance (render cost, memoization, effects)
|
|
65
|
-
- Security (XSS, auth flows, secrets)
|
|
66
|
-
- Tests (coverage for new logic)
|
|
67
|
-
|
|
68
|
-
Output:
|
|
69
|
-
- Inline comments for specific issues
|
|
70
|
-
- A summary comment with high/medium/low priority items
|
|
71
|
-
- Concrete fix suggestions and quick patches where safe
|
|
8
|
+
claude-review:
|
|
9
|
+
uses: deriv-com/shared-actions/.github/workflows/claude-pr-review.yml@master
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
pull-requests: write
|
|
13
|
+
issues: write
|
|
14
|
+
id-token: write
|
|
15
|
+
actions: write
|
|
16
|
+
secrets:
|
|
17
|
+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
18
|
+
AGENT_METRICS_API_URL: ${{ secrets.AGENT_METRICS_API_URL }}
|
|
19
|
+
AGENT_METRICS_API_KEY: ${{ secrets.AGENT_METRICS_API_KEY }}
|
|
@@ -16,7 +16,6 @@ concurrency:
|
|
|
16
16
|
|
|
17
17
|
env:
|
|
18
18
|
FLUTTER_VERSION: '3.24.1'
|
|
19
|
-
FLUTTER_WEB_RENDERER: 'html'
|
|
20
19
|
NODE_VERSION: '22.x'
|
|
21
20
|
permissions:
|
|
22
21
|
contents: read
|
|
@@ -37,6 +36,5 @@ jobs:
|
|
|
37
36
|
branch_name: 'master'
|
|
38
37
|
node_version: ${{ env.NODE_VERSION }}
|
|
39
38
|
flutter_version: ${{ env.FLUTTER_VERSION }}
|
|
40
|
-
flutter_web_renderer: ${{ env.FLUTTER_WEB_RENDERER }}
|
|
41
39
|
environment: 'production'
|
|
42
40
|
commit_hash: ${{ github.sha }}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
name: Weekly Workflow Summary Collector
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: '0 10 * * 3' # Every Wednesday at 10:00 UTC (14:00 GST)
|
|
6
|
+
- cron: '0 10 * * 5' # Every Friday at 10:00 UTC (14:00 GST)
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
actions: read
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
env:
|
|
14
|
+
# Prefixes only — run_id suffix is appended by the source workflows
|
|
15
|
+
DOCSYNC_PREFIX: 'docsync-event-log-' # file inside zip: docsync-payload.json (JSON array)
|
|
16
|
+
CLAUDE_PREFIX: 'claude-review-summary-' # file inside zip: click2fix-payload.json (JSON object)
|
|
17
|
+
MAX_RUNS: '30'
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
collect-summaries:
|
|
21
|
+
name: Collect and compile workflow artifacts
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
|
|
24
|
+
steps:
|
|
25
|
+
# ── Step 1: Metadata ─────────────────────────────────────────────────
|
|
26
|
+
- name: Compute metadata
|
|
27
|
+
id: meta
|
|
28
|
+
env:
|
|
29
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
30
|
+
REPO: ${{ github.repository }}
|
|
31
|
+
run: |
|
|
32
|
+
echo "date=$(date -u +%Y-%m-%d)" >> $GITHUB_OUTPUT
|
|
33
|
+
echo "week=$(date -u +%Y-W%V)" >> $GITHUB_OUTPUT
|
|
34
|
+
|
|
35
|
+
# Determine the artifact collection cutoff using the ACTUAL completion time of the
|
|
36
|
+
# last successful run of this workflow (not a hardcoded schedule time).
|
|
37
|
+
# This correctly handles:
|
|
38
|
+
# - Cron delays (15 min, 1 hr, or any amount)
|
|
39
|
+
# - Both directions: Wed→Fri and Fri→next Wed
|
|
40
|
+
# - Manual triggers: also start from where the last run left off
|
|
41
|
+
# The current run is still "in_progress" so querying status=success returns
|
|
42
|
+
# the previous successful run — exactly the cutoff we need.
|
|
43
|
+
LAST_RUN=$(gh api \
|
|
44
|
+
"/repos/$REPO/actions/workflows/weekly-workflow-collector.yml/runs?status=success&per_page=1" \
|
|
45
|
+
--jq '.workflow_runs[0] | {id: .id, completed_at: .updated_at, event: .event}')
|
|
46
|
+
|
|
47
|
+
if [ -n "$LAST_RUN" ] && [ "$(echo "$LAST_RUN" | jq -r '.id')" != "null" ]; then
|
|
48
|
+
SINCE=$(echo "$LAST_RUN" | jq -r '.completed_at')
|
|
49
|
+
SINCE_RUN_ID=$(echo "$LAST_RUN" | jq -r '.id')
|
|
50
|
+
SINCE_RUN_EVENT=$(echo "$LAST_RUN"| jq -r '.event')
|
|
51
|
+
SINCE_FALLBACK="false"
|
|
52
|
+
echo "Cutoff: artifacts created after run #$SINCE_RUN_ID (trigger: $SINCE_RUN_EVENT) completed at $SINCE"
|
|
53
|
+
else
|
|
54
|
+
SINCE=$(date -u -d "7 days ago" +%Y-%m-%dT%H:%M:%SZ)
|
|
55
|
+
SINCE_RUN_ID="none"
|
|
56
|
+
SINCE_RUN_EVENT="none"
|
|
57
|
+
SINCE_FALLBACK="true"
|
|
58
|
+
echo "No previous successful run found — falling back to 7 days ago: $SINCE"
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
echo "since=$SINCE" >> $GITHUB_OUTPUT
|
|
62
|
+
echo "since_run_id=$SINCE_RUN_ID" >> $GITHUB_OUTPUT
|
|
63
|
+
echo "since_run_event=$SINCE_RUN_EVENT" >> $GITHUB_OUTPUT
|
|
64
|
+
echo "since_fallback=$SINCE_FALLBACK" >> $GITHUB_OUTPUT
|
|
65
|
+
|
|
66
|
+
# ── Step 2: Download DocSync artifacts ──────────────────────────────
|
|
67
|
+
# Artifact name: docsync-event-log-<run_id>
|
|
68
|
+
# File inside: docsync-payload.json (JSON array of events)
|
|
69
|
+
# Retention: 90 days
|
|
70
|
+
- name: Download DocSync AI artifacts
|
|
71
|
+
env:
|
|
72
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
73
|
+
REPO: ${{ github.repository }}
|
|
74
|
+
SINCE: ${{ steps.meta.outputs.since }}
|
|
75
|
+
run: |
|
|
76
|
+
mkdir -p downloads/docsync
|
|
77
|
+
|
|
78
|
+
artifact_ids=$(gh api "/repos/$REPO/actions/artifacts?per_page=100" \
|
|
79
|
+
--jq "[.artifacts[]
|
|
80
|
+
| select(.name | startswith(\"$DOCSYNC_PREFIX\"))
|
|
81
|
+
| select(.expired == false)
|
|
82
|
+
| select(.created_at >= \"$SINCE\")]
|
|
83
|
+
| sort_by(.created_at) | reverse | .[:$MAX_RUNS] | .[].id")
|
|
84
|
+
|
|
85
|
+
if [ -z "$artifact_ids" ]; then
|
|
86
|
+
echo "WARNING: No non-expired artifacts found matching prefix '$DOCSYNC_PREFIX'"
|
|
87
|
+
exit 0
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
for id in $artifact_ids; do
|
|
91
|
+
echo "Downloading docsync artifact id=$id"
|
|
92
|
+
curl -sL \
|
|
93
|
+
-H "Authorization: Bearer $GH_TOKEN" \
|
|
94
|
+
-H "Accept: application/vnd.github+json" \
|
|
95
|
+
"https://api.github.com/repos/$REPO/actions/artifacts/$id/zip" \
|
|
96
|
+
-o "downloads/docsync/$id.zip"
|
|
97
|
+
unzip -q "downloads/docsync/$id.zip" -d "downloads/docsync/$id/"
|
|
98
|
+
rm "downloads/docsync/$id.zip"
|
|
99
|
+
done
|
|
100
|
+
|
|
101
|
+
echo "DocSync: downloaded $(ls -d downloads/docsync/*/ 2>/dev/null | wc -l) artifact(s)"
|
|
102
|
+
|
|
103
|
+
# ── Step 3: Download Claude PR Review artifacts ──────────────────────
|
|
104
|
+
# Artifact name: claude-review-summary-<run_id>
|
|
105
|
+
# File inside: click2fix-payload.json (single JSON object)
|
|
106
|
+
# Retention: 7 days ← cron must run before these expire
|
|
107
|
+
- name: Download Claude PR Review artifacts
|
|
108
|
+
env:
|
|
109
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
110
|
+
REPO: ${{ github.repository }}
|
|
111
|
+
SINCE: ${{ steps.meta.outputs.since }}
|
|
112
|
+
run: |
|
|
113
|
+
mkdir -p downloads/claude
|
|
114
|
+
|
|
115
|
+
artifact_ids=$(gh api "/repos/$REPO/actions/artifacts?per_page=100" \
|
|
116
|
+
--jq "[.artifacts[]
|
|
117
|
+
| select(.name | startswith(\"$CLAUDE_PREFIX\"))
|
|
118
|
+
| select(.expired == false)
|
|
119
|
+
| select(.created_at >= \"$SINCE\")]
|
|
120
|
+
| sort_by(.created_at) | reverse | .[:$MAX_RUNS] | .[].id")
|
|
121
|
+
|
|
122
|
+
if [ -z "$artifact_ids" ]; then
|
|
123
|
+
echo "WARNING: No non-expired artifacts found matching prefix '$CLAUDE_PREFIX'"
|
|
124
|
+
echo "NOTE: Claude artifacts expire after 7 days — ensure this cron runs within that window."
|
|
125
|
+
exit 0
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
for id in $artifact_ids; do
|
|
129
|
+
echo "Downloading claude artifact id=$id"
|
|
130
|
+
curl -sL \
|
|
131
|
+
-H "Authorization: Bearer $GH_TOKEN" \
|
|
132
|
+
-H "Accept: application/vnd.github+json" \
|
|
133
|
+
"https://api.github.com/repos/$REPO/actions/artifacts/$id/zip" \
|
|
134
|
+
-o "downloads/claude/$id.zip"
|
|
135
|
+
unzip -q "downloads/claude/$id.zip" -d "downloads/claude/$id/"
|
|
136
|
+
rm "downloads/claude/$id.zip"
|
|
137
|
+
done
|
|
138
|
+
|
|
139
|
+
echo "Claude: downloaded $(ls -d downloads/claude/*/ 2>/dev/null | wc -l) artifact(s)"
|
|
140
|
+
|
|
141
|
+
# ── Step 4: Merge into one structured JSON file ──────────────────────
|
|
142
|
+
- name: Compile into workflow-summaries.json
|
|
143
|
+
env:
|
|
144
|
+
REPO: ${{ github.repository }}
|
|
145
|
+
COLLECTION_WEEK: ${{ steps.meta.outputs.week }}
|
|
146
|
+
COLLECTION_DATE: ${{ steps.meta.outputs.date }}
|
|
147
|
+
run: |
|
|
148
|
+
python3 - <<'PYEOF'
|
|
149
|
+
import json, os
|
|
150
|
+
from datetime import datetime, timezone
|
|
151
|
+
from pathlib import Path
|
|
152
|
+
|
|
153
|
+
REPO = os.environ["REPO"]
|
|
154
|
+
COLLECTION_WEEK = os.environ["COLLECTION_WEEK"]
|
|
155
|
+
COLLECTION_DATE = os.environ["COLLECTION_DATE"]
|
|
156
|
+
|
|
157
|
+
# Describes where to find each workflow's artifacts and how to read them.
|
|
158
|
+
# data_format:
|
|
159
|
+
# "array" -> the JSON file is a list of event objects (DocSync JSONL -> jq -s)
|
|
160
|
+
# "object" -> the JSON file is a single payload object (Claude EVENT_PAYLOAD)
|
|
161
|
+
SOURCES = {
|
|
162
|
+
"DocSync AI - Documentation Sync": {
|
|
163
|
+
"dir": Path("downloads/docsync"),
|
|
164
|
+
"filename": "docsync-payload.json",
|
|
165
|
+
"data_format": "array",
|
|
166
|
+
},
|
|
167
|
+
"Claude PR Review": {
|
|
168
|
+
"dir": Path("downloads/claude"),
|
|
169
|
+
"filename": "click2fix-payload.json",
|
|
170
|
+
"data_format": "object",
|
|
171
|
+
"retention_warning": "Artifacts expire after 7 days",
|
|
172
|
+
},
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
result = {
|
|
176
|
+
"generated_at": datetime.now(timezone.utc).isoformat().replace("+00:00", "Z"),
|
|
177
|
+
"collection_week": COLLECTION_WEEK,
|
|
178
|
+
"collection_date": COLLECTION_DATE,
|
|
179
|
+
"repository": REPO,
|
|
180
|
+
"workflows": {},
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
for wf_name, cfg in SOURCES.items():
|
|
184
|
+
base_dir = cfg["dir"]
|
|
185
|
+
target_file = cfg["filename"]
|
|
186
|
+
fmt = cfg["data_format"]
|
|
187
|
+
runs = []
|
|
188
|
+
|
|
189
|
+
if not base_dir.exists() or not any(base_dir.iterdir()):
|
|
190
|
+
entry = {
|
|
191
|
+
"workflow_name": wf_name,
|
|
192
|
+
"total_runs_collected": 0,
|
|
193
|
+
"warning": "No artifacts downloaded",
|
|
194
|
+
"runs": [],
|
|
195
|
+
}
|
|
196
|
+
if "retention_warning" in cfg:
|
|
197
|
+
entry["retention_note"] = cfg["retention_warning"]
|
|
198
|
+
result["workflows"][wf_name] = entry
|
|
199
|
+
print(f" {wf_name}: 0 runs")
|
|
200
|
+
continue
|
|
201
|
+
|
|
202
|
+
# artifact_id is the folder name (we named folders by GitHub artifact id)
|
|
203
|
+
for artifact_dir in sorted(base_dir.iterdir(), reverse=True):
|
|
204
|
+
if not artifact_dir.is_dir():
|
|
205
|
+
continue
|
|
206
|
+
|
|
207
|
+
payload_file = artifact_dir / target_file
|
|
208
|
+
if not payload_file.exists():
|
|
209
|
+
# Fallback: grab any JSON file present
|
|
210
|
+
candidates = list(artifact_dir.rglob("*.json"))
|
|
211
|
+
if not candidates:
|
|
212
|
+
print(f" WARN: No JSON in {artifact_dir.name}, skipping")
|
|
213
|
+
continue
|
|
214
|
+
payload_file = candidates[0]
|
|
215
|
+
print(f" NOTE: Using fallback file '{payload_file.name}' in {artifact_dir.name}")
|
|
216
|
+
|
|
217
|
+
try:
|
|
218
|
+
raw = json.loads(payload_file.read_text(encoding="utf-8"))
|
|
219
|
+
except json.JSONDecodeError as e:
|
|
220
|
+
print(f" WARN: Could not parse {payload_file}: {e}")
|
|
221
|
+
continue
|
|
222
|
+
|
|
223
|
+
run_entry = {
|
|
224
|
+
"artifact_id": artifact_dir.name,
|
|
225
|
+
"source_file": payload_file.name,
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if fmt == "array":
|
|
229
|
+
# DocSync: JSON array of individual event objects
|
|
230
|
+
events = raw if isinstance(raw, list) else [raw]
|
|
231
|
+
run_entry["event_count"] = len(events)
|
|
232
|
+
run_entry["events"] = events
|
|
233
|
+
else:
|
|
234
|
+
# Claude: single JSON object -> the entire payload
|
|
235
|
+
run_entry["event_count"] = 1
|
|
236
|
+
run_entry["payload"] = raw
|
|
237
|
+
|
|
238
|
+
runs.append(run_entry)
|
|
239
|
+
|
|
240
|
+
wf_entry = {
|
|
241
|
+
"workflow_name": wf_name,
|
|
242
|
+
"total_runs_collected": len(runs),
|
|
243
|
+
"runs": runs,
|
|
244
|
+
}
|
|
245
|
+
if "retention_warning" in cfg:
|
|
246
|
+
wf_entry["retention_note"] = cfg["retention_warning"]
|
|
247
|
+
|
|
248
|
+
result["workflows"][wf_name] = wf_entry
|
|
249
|
+
total_events = sum(r["event_count"] for r in runs)
|
|
250
|
+
print(f" {wf_name}: {len(runs)} run(s), {total_events} event(s) total")
|
|
251
|
+
|
|
252
|
+
Path("workflow-summaries.json").write_text(
|
|
253
|
+
json.dumps(result, indent=2, ensure_ascii=False),
|
|
254
|
+
encoding="utf-8",
|
|
255
|
+
)
|
|
256
|
+
print("\\nworkflow-summaries.json written")
|
|
257
|
+
PYEOF
|
|
258
|
+
|
|
259
|
+
# ── Step 5: Job summary ──────────────────────────────────────────────
|
|
260
|
+
- name: Write job summary
|
|
261
|
+
run: |
|
|
262
|
+
{
|
|
263
|
+
echo "## Weekly Workflow Summary Collector"
|
|
264
|
+
echo ""
|
|
265
|
+
echo "| | |"
|
|
266
|
+
echo "|---|---|"
|
|
267
|
+
echo "| **Week** | \`${{ steps.meta.outputs.week }}\` |"
|
|
268
|
+
echo "| **Date** | \`${{ steps.meta.outputs.date }}\` |"
|
|
269
|
+
echo "| **Repo** | \`${{ github.repository }}\` |"
|
|
270
|
+
echo "| **Triggered by** | \`${{ github.event_name }}\` |"
|
|
271
|
+
echo "| **Collecting artifacts from** | \`${{ steps.meta.outputs.since }}\` UTC onwards |"
|
|
272
|
+
if [ "${{ steps.meta.outputs.since_fallback }}" = "true" ]; then
|
|
273
|
+
echo "| **Cutoff basis** | ⚠️ No previous successful run found — used 7-day fallback |"
|
|
274
|
+
else
|
|
275
|
+
echo "| **Cutoff basis** | Last successful run [#${{ steps.meta.outputs.since_run_id }}](https://github.com/${{ github.repository }}/actions/runs/${{ steps.meta.outputs.since_run_id }}) (triggered by: \`${{ steps.meta.outputs.since_run_event }}\`) |"
|
|
276
|
+
fi
|
|
277
|
+
echo ""
|
|
278
|
+
jq -r '
|
|
279
|
+
.workflows | to_entries[] |
|
|
280
|
+
"### \(.key)\n" +
|
|
281
|
+
"- **Runs collected**: \(.value.total_runs_collected)\n" +
|
|
282
|
+
"- **Total events**: \([.value.runs[].event_count] | add // 0)\n" +
|
|
283
|
+
(if .value.warning then "- ⚠️ Warning: \(.value.warning)\n" else "" end) +
|
|
284
|
+
(if .value.retention_note then "- ℹ️ Note: \(.value.retention_note)\n" else "" end)
|
|
285
|
+
' workflow-summaries.json
|
|
286
|
+
} >> $GITHUB_STEP_SUMMARY
|
|
287
|
+
|
|
288
|
+
# ── Step 6: Upload compiled artifact ────────────────────────────────
|
|
289
|
+
- name: Upload workflow-summaries artifact
|
|
290
|
+
uses: actions/upload-artifact@v4
|
|
291
|
+
with:
|
|
292
|
+
name: workflow-summaries-${{ steps.meta.outputs.week }}
|
|
293
|
+
path: workflow-summaries.json
|
|
294
|
+
retention-days: 90
|
|
295
|
+
if-no-files-found: error
|
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
## [1.9.
|
|
1
|
+
## [1.9.8](https://github.com/deriv-com/smartcharts-champion/compare/v1.9.7...v1.9.8) (2026-03-27)
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
###
|
|
4
|
+
### ♻️ Chores
|
|
5
5
|
|
|
6
|
-
*
|
|
6
|
+
* update publish-smart-charts workflow to build using WASM ([#215](https://github.com/deriv-com/smartcharts-champion/issues/215)) ([0e60ff3](https://github.com/deriv-com/smartcharts-champion/commit/0e60ff3004e8c4a84a91812bc230a132b6a77855))
|
package/dist/assets/NOTICES
CHANGED
|
@@ -28905,37 +28905,6 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
28905
28905
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28906
28906
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28907
28907
|
|
|
28908
|
-
--------------------------------------------------------------------------------
|
|
28909
|
-
js
|
|
28910
|
-
|
|
28911
|
-
Copyright 2012, the Dart project authors.
|
|
28912
|
-
|
|
28913
|
-
Redistribution and use in source and binary forms, with or without
|
|
28914
|
-
modification, are permitted provided that the following conditions are
|
|
28915
|
-
met:
|
|
28916
|
-
|
|
28917
|
-
* Redistributions of source code must retain the above copyright
|
|
28918
|
-
notice, this list of conditions and the following disclaimer.
|
|
28919
|
-
* Redistributions in binary form must reproduce the above
|
|
28920
|
-
copyright notice, this list of conditions and the following
|
|
28921
|
-
disclaimer in the documentation and/or other materials provided
|
|
28922
|
-
with the distribution.
|
|
28923
|
-
* Neither the name of Google LLC nor the names of its
|
|
28924
|
-
contributors may be used to endorse or promote products derived
|
|
28925
|
-
from this software without specific prior written permission.
|
|
28926
|
-
|
|
28927
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
28928
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
28929
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
28930
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
28931
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
28932
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
28933
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
28934
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
28935
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
28936
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28937
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28938
|
-
|
|
28939
28908
|
--------------------------------------------------------------------------------
|
|
28940
28909
|
json
|
|
28941
28910
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{var e={hasImageCodecs:!(typeof ImageDecoder>"u"||"Google Inc."!==navigator.vendor&&"Edg/"!==navigator.agent),hasChromiumBreakIterators:typeof Intl.v8BreakIterator<"u"&&typeof Intl.Segmenter<"u",supportsWasmGC:WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,95,1,120,0])),crossOriginIsolated:window.crossOriginIsolated};function t(...e){return new URL(r(...e),document.baseURI).toString()}function r(...e){return e.filter(e=>!!e).map((e,t)=>0===t?i(e):function(e){let t=0;for(;t<e.length&&"/"===e.charAt(t);)t++;return e.substring(t)}(i(e))).filter(e=>e.length).join("/")}function i(e){let t=e.length;for(;t>0&&"/"===e.charAt(t-1);)t--;return e.substring(0,t)}var n=class{constructor(){this._scriptLoaded=!1}setTrustedTypesPolicy(e){this._ttPolicy=e}async loadEntrypoint(e){let{entrypointUrl:r=t("main.dart.js"),onEntrypointLoaded:i,nonce:n}=e||{};return this._loadJSEntrypoint(r,i,n)}async load(e,r,i,n,a){a??=e=>{e.initializeEngine(i).then(e=>e.runApp())};let{entryPointBaseUrl:o}=i;if("dart2wasm"===e.compileTarget)return this._loadWasmEntrypoint(e,r,o,a);{let r=t(o,e.mainJsPath??"main.dart.js");return this._loadJSEntrypoint(r,a,n)}}didCreateEngineInitializer(e){"function"==typeof this._didCreateEngineInitializerResolve&&(this._didCreateEngineInitializerResolve(e),this._didCreateEngineInitializerResolve=null,delete _flutter.loader.didCreateEngineInitializer),"function"==typeof this._onEntrypointLoaded&&this._onEntrypointLoaded(e)}_loadJSEntrypoint(e,t,r){let i="function"==typeof t;if(!this._scriptLoaded){this._scriptLoaded=!0;let n=this._createScriptTag(e,r);if(!i)return new Promise((e,t)=>{this._didCreateEngineInitializerResolve=e,n.addEventListener("error",t),document.head.append(n)});this._onEntrypointLoaded=t,document.head.append(n)}}async _loadWasmEntrypoint(e,r,i,n){if(!this._scriptLoaded){this._scriptLoaded=!0,this._onEntrypointLoaded=n;let{mainWasmPath:a,jsSupportRuntimePath:o}=e,s=t(i,a),l=t(i,o);null!=this._ttPolicy&&(l=this._ttPolicy.createScriptURL(l));let c,d=WebAssembly.compileStreaming(fetch(s)),u=await import(l);c="skwasm"===e.renderer?(async()=>{let e=await r.skwasm;return window._flutter_skwasmInstance=e,{skwasm:e.wasmExports,skwasmWrapper:e,ffi:{memory:e.wasmMemory}}})():{};let p=await u.instantiate(d,c);await u.invoke(p)}}_createScriptTag(e,t){let r=document.createElement("script");r.type="application/javascript",t&&(r.nonce=t);let i=e;return null!=this._ttPolicy&&(i=this._ttPolicy.createScriptURL(e)),r.src=i,r}};async function a(e,t,r){if(t<0)return e;let i,n=new Promise((e,n)=>{i=setTimeout(()=>{n(new Error(`${r} took more than ${t}ms to resolve. Moving on.`,{cause:a}))},t)});return Promise.race([e,n]).finally(()=>{clearTimeout(i)})}var o=class{setTrustedTypesPolicy(e){this._ttPolicy=e}loadServiceWorker(e){if(!e)return Promise.resolve();if(!("serviceWorker"in navigator)){let e="Service Worker API unavailable.";return window.isSecureContext||(e+="\nThe current context is NOT secure.",e+="\nRead more: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts"),Promise.reject(new Error(e))}let{serviceWorkerVersion:r,serviceWorkerUrl:i=t(`flutter_service_worker.js?v=${r}`),timeoutMillis:n=4e3}=e,o=i;return null!=this._ttPolicy&&(o=this._ttPolicy.createScriptURL(o)),a(navigator.serviceWorker.register(o).then(e=>this._getNewServiceWorker(e,r)).then(this._waitForServiceWorkerActivation),n,"prepareServiceWorker")}async _getNewServiceWorker(e,t){if(!e.active&&(e.installing||e.waiting))return e.installing||e.waiting;if(e.active.scriptURL.endsWith(t))return e.active;{let t=await e.update();return t.installing||t.waiting||t.active}}async _waitForServiceWorkerActivation(e){if(!e||"activated"===e.state){if(e)return;throw new Error("Cannot activate a null service worker!")}return new Promise((t,r)=>{e.addEventListener("statechange",()=>{"activated"===e.state&&t()})})}},s=class{constructor(e,t="flutter-js"){let r=e||[/\.js$/,/\.mjs$/];window.trustedTypes&&(this.policy=trustedTypes.createPolicy(t,{createScriptURL:function(e){if(e.startsWith("blob:"))return e;let i=new URL(e,window.location),n=i.pathname.split("/").pop();if(r.some(e=>e.test(n)))return i.toString();console.error("URL rejected by TrustedTypes policy",t,":",e,"(download prevented)")}}))}},l=e=>{let t=WebAssembly.compileStreaming(fetch(e));return(e,r)=>((async()=>{let i=await t,n=await WebAssembly.instantiate(i,e);r(n,i)})(),{})};window._flutter||(window._flutter={}),window._flutter.loader||(window._flutter.loader=new class{async loadEntrypoint(e){let{serviceWorker:t,...r}=e||{},i=new s,a=new o;a.setTrustedTypesPolicy(i.policy),await a.loadServiceWorker(t).catch(e=>{console.warn("Exception while loading service worker:",e)});let l=new n;return l.setTrustedTypesPolicy(i.policy),this.didCreateEngineInitializer=l.didCreateEngineInitializer.bind(l),l.loadEntrypoint(r)}async load({serviceWorkerSettings:i,onEntrypointLoaded:a,nonce:c,config:d}={}){d??={};let u=_flutter.buildConfig;if(!u)throw"FlutterLoader.load requires _flutter.buildConfig to be set";let p=u.builds.find(t=>!("dart2wasm"===t.compileTarget&&!e.supportsWasmGC||d.renderer&&!((e,t)=>"auto"===e.renderer?"canvaskit"==t||"html"==t:e.renderer==t)(t,d.renderer))&&(t=>"skwasm"!==t||e.crossOriginIsolated&&e.hasChromiumBreakIterators&&e.hasImageCodecs&&e.supportsWasmGC)(t.renderer));if(!p)throw"FlutterLoader could not find a build compatible with configuration and environment.";let w={};w.flutterTT=new s,i&&(w.serviceWorkerLoader=new o,w.serviceWorkerLoader.setTrustedTypesPolicy(w.flutterTT.policy),await w.serviceWorkerLoader.loadServiceWorker(i).catch(e=>{console.warn("Exception while loading service worker:",e)}));let m=function(e,t){return e.canvasKitBaseUrl?e.canvasKitBaseUrl:t.engineRevision&&!t.useLocalCanvasKit?r("https://www.gstatic.com/flutter-canvaskit",t.engineRevision):"canvaskit"}(d,u);"canvaskit"===p.renderer?w.canvasKit=((e,r,i,n)=>(window.flutterCanvasKitLoaded=(async()=>{if(window.flutterCanvasKit)return window.flutterCanvasKit;let a=i.hasChromiumBreakIterators&&i.hasImageCodecs;if(!a&&"chromium"==r.canvasKitVariant)throw"Chromium CanvasKit variant specifically requested, but unsupported in this browser";let o=a&&"full"!==r.canvasKitVariant,s=n;o&&(s=t(s,"chromium"));let c=t(s,"canvaskit.js");e.flutterTT.policy&&(c=e.flutterTT.policy.createScriptURL(c));let d=l(t(s,"canvaskit.wasm")),u=await import(c);return window.flutterCanvasKit=await u.default({instantiateWasm:d}),window.flutterCanvasKit})(),window.flutterCanvasKitLoaded))(w,d,e,m):"skwasm"===p.renderer&&(w.skwasm=(async(e,r,i,n)=>{let a=t(n,"skwasm.js"),o=a;e.flutterTT.policy&&(o=e.flutterTT.policy.createScriptURL(o));let s=l(t(n,"skwasm.wasm"));return await(await import(o)).default({instantiateWasm:s,locateFile:(e,t)=>{let r=t+e;return r.endsWith(".worker.js")?URL.createObjectURL(new Blob([`importScripts('${r}');`],{type:"application/javascript"})):r},mainScriptUrlOrBlob:a})})(w,0,0,m));let f=new n;return f.setTrustedTypesPolicy(w.flutterTT.policy),this.didCreateEngineInitializer=f.didCreateEngineInitializer.bind(f),f.load(p,w,d,c,a)}})})(),window._flutter||(window._flutter={}),_flutter.buildConfig={engineRevision:"c9b9d5780da342eb3f0f5e439a7db06f7d112575",builds:[{compileTarget:"dart2js",renderer:"
|
|
1
|
+
(()=>{var e={hasImageCodecs:!(typeof ImageDecoder>"u"||"Google Inc."!==navigator.vendor&&"Edg/"!==navigator.agent),hasChromiumBreakIterators:typeof Intl.v8BreakIterator<"u"&&typeof Intl.Segmenter<"u",supportsWasmGC:WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,95,1,120,0])),crossOriginIsolated:window.crossOriginIsolated};function t(...e){return new URL(r(...e),document.baseURI).toString()}function r(...e){return e.filter(e=>!!e).map((e,t)=>0===t?i(e):function(e){let t=0;for(;t<e.length&&"/"===e.charAt(t);)t++;return e.substring(t)}(i(e))).filter(e=>e.length).join("/")}function i(e){let t=e.length;for(;t>0&&"/"===e.charAt(t-1);)t--;return e.substring(0,t)}var n=class{constructor(){this._scriptLoaded=!1}setTrustedTypesPolicy(e){this._ttPolicy=e}async loadEntrypoint(e){let{entrypointUrl:r=t("main.dart.js"),onEntrypointLoaded:i,nonce:n}=e||{};return this._loadJSEntrypoint(r,i,n)}async load(e,r,i,n,a){a??=e=>{e.initializeEngine(i).then(e=>e.runApp())};let{entryPointBaseUrl:o}=i;if("dart2wasm"===e.compileTarget)return this._loadWasmEntrypoint(e,r,o,a);{let r=t(o,e.mainJsPath??"main.dart.js");return this._loadJSEntrypoint(r,a,n)}}didCreateEngineInitializer(e){"function"==typeof this._didCreateEngineInitializerResolve&&(this._didCreateEngineInitializerResolve(e),this._didCreateEngineInitializerResolve=null,delete _flutter.loader.didCreateEngineInitializer),"function"==typeof this._onEntrypointLoaded&&this._onEntrypointLoaded(e)}_loadJSEntrypoint(e,t,r){let i="function"==typeof t;if(!this._scriptLoaded){this._scriptLoaded=!0;let n=this._createScriptTag(e,r);if(!i)return new Promise((e,t)=>{this._didCreateEngineInitializerResolve=e,n.addEventListener("error",t),document.head.append(n)});this._onEntrypointLoaded=t,document.head.append(n)}}async _loadWasmEntrypoint(e,r,i,n){if(!this._scriptLoaded){this._scriptLoaded=!0,this._onEntrypointLoaded=n;let{mainWasmPath:a,jsSupportRuntimePath:o}=e,s=t(i,a),l=t(i,o);null!=this._ttPolicy&&(l=this._ttPolicy.createScriptURL(l));let c,d=WebAssembly.compileStreaming(fetch(s)),u=await import(l);c="skwasm"===e.renderer?(async()=>{let e=await r.skwasm;return window._flutter_skwasmInstance=e,{skwasm:e.wasmExports,skwasmWrapper:e,ffi:{memory:e.wasmMemory}}})():{};let p=await u.instantiate(d,c);await u.invoke(p)}}_createScriptTag(e,t){let r=document.createElement("script");r.type="application/javascript",t&&(r.nonce=t);let i=e;return null!=this._ttPolicy&&(i=this._ttPolicy.createScriptURL(e)),r.src=i,r}};async function a(e,t,r){if(t<0)return e;let i,n=new Promise((e,n)=>{i=setTimeout(()=>{n(new Error(`${r} took more than ${t}ms to resolve. Moving on.`,{cause:a}))},t)});return Promise.race([e,n]).finally(()=>{clearTimeout(i)})}var o=class{setTrustedTypesPolicy(e){this._ttPolicy=e}loadServiceWorker(e){if(!e)return Promise.resolve();if(!("serviceWorker"in navigator)){let e="Service Worker API unavailable.";return window.isSecureContext||(e+="\nThe current context is NOT secure.",e+="\nRead more: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts"),Promise.reject(new Error(e))}let{serviceWorkerVersion:r,serviceWorkerUrl:i=t(`flutter_service_worker.js?v=${r}`),timeoutMillis:n=4e3}=e,o=i;return null!=this._ttPolicy&&(o=this._ttPolicy.createScriptURL(o)),a(navigator.serviceWorker.register(o).then(e=>this._getNewServiceWorker(e,r)).then(this._waitForServiceWorkerActivation),n,"prepareServiceWorker")}async _getNewServiceWorker(e,t){if(!e.active&&(e.installing||e.waiting))return e.installing||e.waiting;if(e.active.scriptURL.endsWith(t))return e.active;{let t=await e.update();return t.installing||t.waiting||t.active}}async _waitForServiceWorkerActivation(e){if(!e||"activated"===e.state){if(e)return;throw new Error("Cannot activate a null service worker!")}return new Promise((t,r)=>{e.addEventListener("statechange",()=>{"activated"===e.state&&t()})})}},s=class{constructor(e,t="flutter-js"){let r=e||[/\.js$/,/\.mjs$/];window.trustedTypes&&(this.policy=trustedTypes.createPolicy(t,{createScriptURL:function(e){if(e.startsWith("blob:"))return e;let i=new URL(e,window.location),n=i.pathname.split("/").pop();if(r.some(e=>e.test(n)))return i.toString();console.error("URL rejected by TrustedTypes policy",t,":",e,"(download prevented)")}}))}},l=e=>{let t=WebAssembly.compileStreaming(fetch(e));return(e,r)=>((async()=>{let i=await t,n=await WebAssembly.instantiate(i,e);r(n,i)})(),{})};window._flutter||(window._flutter={}),window._flutter.loader||(window._flutter.loader=new class{async loadEntrypoint(e){let{serviceWorker:t,...r}=e||{},i=new s,a=new o;a.setTrustedTypesPolicy(i.policy),await a.loadServiceWorker(t).catch(e=>{console.warn("Exception while loading service worker:",e)});let l=new n;return l.setTrustedTypesPolicy(i.policy),this.didCreateEngineInitializer=l.didCreateEngineInitializer.bind(l),l.loadEntrypoint(r)}async load({serviceWorkerSettings:i,onEntrypointLoaded:a,nonce:c,config:d}={}){d??={};let u=_flutter.buildConfig;if(!u)throw"FlutterLoader.load requires _flutter.buildConfig to be set";let p=u.builds.find(t=>!("dart2wasm"===t.compileTarget&&!e.supportsWasmGC||d.renderer&&!((e,t)=>"auto"===e.renderer?"canvaskit"==t||"html"==t:e.renderer==t)(t,d.renderer))&&(t=>"skwasm"!==t||e.crossOriginIsolated&&e.hasChromiumBreakIterators&&e.hasImageCodecs&&e.supportsWasmGC)(t.renderer));if(!p)throw"FlutterLoader could not find a build compatible with configuration and environment.";let w={};w.flutterTT=new s,i&&(w.serviceWorkerLoader=new o,w.serviceWorkerLoader.setTrustedTypesPolicy(w.flutterTT.policy),await w.serviceWorkerLoader.loadServiceWorker(i).catch(e=>{console.warn("Exception while loading service worker:",e)}));let m=function(e,t){return e.canvasKitBaseUrl?e.canvasKitBaseUrl:t.engineRevision&&!t.useLocalCanvasKit?r("https://www.gstatic.com/flutter-canvaskit",t.engineRevision):"canvaskit"}(d,u);"canvaskit"===p.renderer?w.canvasKit=((e,r,i,n)=>(window.flutterCanvasKitLoaded=(async()=>{if(window.flutterCanvasKit)return window.flutterCanvasKit;let a=i.hasChromiumBreakIterators&&i.hasImageCodecs;if(!a&&"chromium"==r.canvasKitVariant)throw"Chromium CanvasKit variant specifically requested, but unsupported in this browser";let o=a&&"full"!==r.canvasKitVariant,s=n;o&&(s=t(s,"chromium"));let c=t(s,"canvaskit.js");e.flutterTT.policy&&(c=e.flutterTT.policy.createScriptURL(c));let d=l(t(s,"canvaskit.wasm")),u=await import(c);return window.flutterCanvasKit=await u.default({instantiateWasm:d}),window.flutterCanvasKit})(),window.flutterCanvasKitLoaded))(w,d,e,m):"skwasm"===p.renderer&&(w.skwasm=(async(e,r,i,n)=>{let a=t(n,"skwasm.js"),o=a;e.flutterTT.policy&&(o=e.flutterTT.policy.createScriptURL(o));let s=l(t(n,"skwasm.wasm"));return await(await import(o)).default({instantiateWasm:s,locateFile:(e,t)=>{let r=t+e;return r.endsWith(".worker.js")?URL.createObjectURL(new Blob([`importScripts('${r}');`],{type:"application/javascript"})):r},mainScriptUrlOrBlob:a})})(w,0,0,m));let f=new n;return f.setTrustedTypesPolicy(w.flutterTT.policy),this.didCreateEngineInitializer=f.didCreateEngineInitializer.bind(f),f.load(p,w,d,c,a)}})})(),window._flutter||(window._flutter={}),_flutter.buildConfig={engineRevision:"c9b9d5780da342eb3f0f5e439a7db06f7d112575",builds:[{compileTarget:"dart2wasm",renderer:"skwasm",mainWasmPath:"main.dart.wasm",jsSupportRuntimePath:"main.dart.mjs"},{compileTarget:"dart2js",renderer:"canvaskit",mainJsPath:"main.dart.js"}]},_flutter.loader.load({serviceWorkerSettings:{serviceWorkerVersion:"2860365703"}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const MANIFEST="flutter-app-manifest",TEMP="flutter-temp-cache",CACHE_NAME="flutter-app-cache",RESOURCES={"
|
|
1
|
+
"use strict";const MANIFEST="flutter-app-manifest",TEMP="flutter-temp-cache",CACHE_NAME="flutter-app-cache",RESOURCES={"manifest.json":"a06b13fcde5dfd1e240278072e116d12","version.json":"1756499d77011c0be564a414e567db76","canvaskit/skwasm.js.symbols":"262f4827a1317abb59d71d6c587a93e2","canvaskit/skwasm.worker.js":"89990e8c92bcb123999aa81f7e203b1c","canvaskit/skwasm.js":"694fda5704053957c2594de355805228","canvaskit/canvaskit.js":"66177750aff65a66cb07bb44b8c6422b","canvaskit/canvaskit.wasm":"1f237a213d7370cf95f443d896176460","canvaskit/chromium/canvaskit.js":"671c6b4f8fcc199dcc551c7bb125f239","canvaskit/chromium/canvaskit.wasm":"b1ac05b29c127d86df4bcfbf50dd902a","canvaskit/chromium/canvaskit.js.symbols":"a012ed99ccba193cf96bb2643003f6fc","canvaskit/canvaskit.js.symbols":"48c83a2ce573d9692e8d970e288d75f7","canvaskit/skwasm.wasm":"9f0c0c02b82a910d12ce0543ec130e60","index.html":"8a1c106fed2b8ec7f0a7fbdbedb16cff","/":"8a1c106fed2b8ec7f0a7fbdbedb16cff","flutter.js":"f393d3c16b631f36852323de8e583132","assets/AssetManifest.bin":"f049e764000ff7f4834702ea3985a348","assets/packages/deriv_chart/assets/fonts/quill_icons.ttf":"8e9f63f02fa78152f14dd9b5b5c4e92a","assets/FontManifest.json":"84fa087dba170bffc9f3713aeebe836c","assets/NOTICES":"a73f0d601fa6d9e4745b1bbfbf3fec8a","assets/AssetManifest.json":"0e2784379e19e2053abcff2635e3e6ae","assets/shaders/ink_sparkle.frag":"ecc85a2e95f5e9f53123dcaf8cb9b6ce","assets/fonts/MaterialIcons-Regular.otf":"d6db5dff634f0098a8fec881f24fa1e7","assets/fonts/IBMPlexSans-Regular.woff2":"4bb247144b2962b752857093491454e7","assets/fonts/IBMPlexSans-Bold.woff2":"19210a59bf50a6ba73fa97433170b4cf","assets/AssetManifest.bin.json":"be3eb7dfd4bfedb8054bd74919851a8b","main.dart.wasm":"e36ee19bcd5456275c34a1c4ba8aa46d","flutter_bootstrap.js":"8382b0c6dbb5b51b56a7ff0302f07118","main.dart.mjs":"cbb1b9c302101c711184ae568b3dcc35","favicon.png":"5dcef449791fa27946b3d35ad8803796","main.dart.js":"24e4f8ca23943eeb964047f2ca839cc1"},CORE=["main.dart.js","main.dart.wasm","main.dart.mjs","index.html","flutter_bootstrap.js","assets/AssetManifest.bin.json","assets/FontManifest.json"];async function downloadOffline(){var a=[],e=await caches.open(CACHE_NAME),s={};for(var t of await e.keys()){var c=t.url.substring(origin.length+1);""==c&&(c="/"),s[c]=!0}for(var n of Object.keys(RESOURCES))s[n]||a.push(n);return e.addAll(a)}function onlineFirst(a){return a.respondWith(fetch(a.request).then(e=>caches.open(CACHE_NAME).then(s=>(s.put(a.request,e.clone()),e))).catch(e=>caches.open(CACHE_NAME).then(s=>s.match(a.request).then(a=>{if(null!=a)return a;throw e}))))}self.addEventListener("install",a=>(self.skipWaiting(),a.waitUntil(caches.open(TEMP).then(a=>a.addAll(CORE.map(a=>new Request(a,{cache:"reload"}))))))),self.addEventListener("activate",function(a){return a.waitUntil(async function(){try{var a=await caches.open(CACHE_NAME),e=await caches.open(TEMP),s=await caches.open(MANIFEST),t=await s.match("manifest");if(!t){for(var c of(await caches.delete(CACHE_NAME),a=await caches.open(CACHE_NAME),await e.keys())){var n=await e.match(c);await a.put(c,n)}return await caches.delete(TEMP),await s.put("manifest",new Response(JSON.stringify(RESOURCES))),void self.clients.claim()}var f=await t.json(),i=self.location.origin;for(var c of await a.keys()){var r=c.url.substring(i.length+1);""==r&&(r="/"),RESOURCES[r]&&RESOURCES[r]==f[r]||await a.delete(c)}for(var c of await e.keys()){n=await e.match(c);await a.put(c,n)}return await caches.delete(TEMP),await s.put("manifest",new Response(JSON.stringify(RESOURCES))),void self.clients.claim()}catch(a){console.error("Failed to upgrade service worker: "+a),await caches.delete(CACHE_NAME),await caches.delete(TEMP),await caches.delete(MANIFEST)}}())}),self.addEventListener("fetch",a=>{if("GET"===a.request.method){var e=self.location.origin,s=a.request.url.substring(e.length+1);if(-1!=s.indexOf("?v=")&&(s=s.split("?v=")[0]),(a.request.url==e||a.request.url.startsWith(e+"/#")||""==s)&&(s="/"),RESOURCES[s])return"/"==s?onlineFirst(a):void a.respondWith(caches.open(CACHE_NAME).then(e=>e.match(a.request).then(s=>s||fetch(a.request).then(s=>(s&&Boolean(s.ok)&&e.put(a.request,s.clone()),s)))))}}),self.addEventListener("message",a=>{"skipWaiting"!==a.data?"downloadOffline"!==a.data||downloadOffline():self.skipWaiting()});
|