Skip to content

Commit d509eec

Browse files
authored
Refactor pubspek boolean logic and update web assets instructions (#126)
- Add GEMINI.md to document the correct workflow for modifying and recompiling web assets within pubviz. - Simplify boolean logic for hasFlutterPluginKey in pubspek.dart using Dart 3 record pattern matching. - Replace .forEach with for-in loops in pubspek.dart and remove associated lint ignores. - Update UI implementations in _example_src and regenerate corresponding web assets.
1 parent 3947040 commit d509eec

11 files changed

Lines changed: 93 additions & 40 deletions

File tree

GEMINI.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Pubviz AI Agent Instructions
2+
3+
These instructions help guide AI agents when making changes to this repository.
4+
5+
## Web Assets Workflow (`_example_src` vs `lib/assets`)
6+
7+
The `pubviz` application includes a compiled web frontend that is bundled
8+
directly into the Dart package. It is critical to understand the distinction
9+
between the source files and the compiled outputs:
10+
11+
1. **Source of Truth (`_example_src/`)**:
12+
- All web application source code (HTML, CSS, Dart) lives in the
13+
`_example_src` directory.
14+
- **Make all web-related UI or logic edits here.** Do NOT manually edit
15+
files in `lib/assets/`.
16+
17+
2. **Compiled Output (`lib/assets/`)**:
18+
- This directory contains the final generated web artifacts (Compiled JS,
19+
WASM, CSS, copied HTML, etc.) ensuring offline functionality.
20+
- It also contains `build_inputs.json`, which tracks the `SHA-256` hashes
21+
of the input files (`_example_src`, `lib`, `build.yaml`, `pubspec.yaml`)
22+
to ensure the cache isn't stale.
23+
24+
3. **Rebuilding Assets**:
25+
- Whenever you modify *anything* in `_example_src/`, `lib/`, `build.yaml`,
26+
or `pubspec.yaml`, you **MUST** run the following command to recompile
27+
the assets and sync them to `lib/assets/`:
28+
```bash
29+
dart tool/update_assets.dart
30+
```
31+
- If you fail to run this step, the CI test
32+
`ensure_web_assets_built_test.dart` will fail because the
33+
`build_inputs.json` hash will no longer match the source files on disk,
34+
or the manual static byte checks will fail.
35+
36+
## Code Generation (`build_runner`)
37+
- `pubviz` uses `build_cli` (for `lib/src/options.dart`) and `build_version`
38+
(for `lib/src/version.dart`).
39+
- The `dart tool/update_assets.dart` script invokes `build_runner build` under
40+
the hood, so running it will also safely update `options.g.dart` and
41+
`version.dart` if their inputs changed.
42+
43+
## Code Hygiene
44+
- Use `dart format .` after making Dart file changes to maintain spacing/styling
45+
rules.
46+
- Validate your work with `dart test` (or `dart test -P presubmit`) to ensure
47+
your modifications didn't break functionality.

_example_src/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
</div>
2020
<div id="controls-footer">
2121
<a href="https://pub.dev/packages/pubviz" target="_blank" rel="noopener noreferrer">package:pubviz</a>
22+
<span id="version">vXYZ</span>
2223
</div>
2324
</div>
2425
<div id="graph-wrapper">

_example_src/web_app.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:convert' show LineSplitter, htmlEscape;
77
import 'dart:js_interop';
88

99
import 'package:pubviz/src/colors.dart';
10+
import 'package:pubviz/src/version.dart';
1011
import 'package:web/web.dart';
1112

1213
typedef DepInfo = ({
@@ -74,6 +75,9 @@ void main() {
7475
toggleZoom();
7576
}
7677
});
78+
79+
(document.querySelector('#version') as HTMLSpanElement).textContent =
80+
'v$packageVersion';
7781
}
7882

7983
Future<void> _process() async {

analysis_options.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ linter:
2727
- prefer_final_locals
2828
- require_trailing_commas
2929
- unnecessary_await_in_return
30+
- unnecessary_ignore
3031
- use_if_null_to_convert_nulls_to_bools
3132
- use_raw_strings
3233
- use_string_buffers

lib/assets/build_inputs.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"_example_src/favicon.ico": "39ab6b867a1c4c75019506267b3b4ce7cc60fb2ba66870e6485b4e31f6265a7c",
3-
"_example_src/index.html": "dff96f3cde0deeee4ffbe702244f8eb043d817cc01c273226241fbb023e8b9ab",
3+
"_example_src/index.html": "f2be81879aff39d920483cab30d6b3fa56bd4a528c4a853904b77644b67f6634",
44
"_example_src/style.css": "9123572a80468f0788d1b9a47a5f9c7d0ea2228646101f48da35eb9392788dfb",
5-
"_example_src/web_app.dart": "6ddf7cafbd002069d8b6da0e125f2d0543ed6f52f1f764a791d3b3023771a92d",
5+
"_example_src/web_app.dart": "aa883182a767490e2d38617b3d8f383cc8ada028356d6e0f7b8cd260d856592b",
66
"build.yaml": "4afbf68cad8a8c6117d931c66905e172804d9541b3fd336016b6ff4549c2acdf",
77
"lib/pubviz.dart": "660265e3bfb4da0739beb5271d3f04fc01ef32e0a58972b023bd84166a78d61e",
88
"lib/src/colors.dart": "802bcd9a31b062865654c1a5300292164ff8f7f003caf2c8277225177ce74e56",
@@ -13,7 +13,7 @@
1313
"lib/src/options.g.dart": "f0d5e6701e92162b8470b9b35f0ca48bf8e4ad60fb2e82e0faaa858d3f72173a",
1414
"lib/src/outdated_info.dart": "23a6b6703d4a67933c747afda2bd5fee7fded43448239dd84243512b58f16c8a",
1515
"lib/src/pub_data_service.dart": "a288875418a1c50163465ba6bba0df32ea94d8de02e1d389f1aecf80829c4db0",
16-
"lib/src/pubspek.dart": "67ae4b64b2a5b62b033f16f94065013084fad1df3e4d222b973cd1827c8e3258",
16+
"lib/src/pubspek.dart": "085f028d02097617cb50bd1e22dd5f799a18e52f3eddf5ec30674269a3ae1a52",
1717
"lib/src/service.dart": "602e1ed24835efb2a1a15706d487f5d024641c7bd83fc6ca8ddef9287acebf6b",
1818
"lib/src/terminate.dart": "43459f9bf9b821d342f32b9ad1ce4fed9b51fe1cb96d7efd9858045293afce50",
1919
"lib/src/update_order.dart": "c47cabe4d41f7113f81fd769bfe0d9a20f2f27fb305f660772c6db1b2d28d120",

lib/assets/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
</div>
2020
<div id="controls-footer">
2121
<a href="https://pub.dev/packages/pubviz" target="_blank" rel="noopener noreferrer">package:pubviz</a>
22+
<span id="version">vXYZ</span>
2223
</div>
2324
</div>
2425
<div id="graph-wrapper">

lib/assets/web_app.dart2js.js

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -249,11 +249,11 @@ Og(a){return A.rL(a,new Error())},
249249
rL(a,b){var s
250250
if(a==null)a=new A.Ez()
251251
b.dartException=a
252-
s=A.D
252+
s=A.Ju
253253
if("defineProperty" in Object){Object.defineProperty(b,"message",{get:s})
254254
b.name=""}else b.toString=s
255255
return b},
256-
D(){return J.Rh(this.dartException)},
256+
Ju(){return J.Rh(this.dartException)},
257257
vh(a,b){throw A.rL(a,b==null?new Error():b)},
258258
cW(a,b,c){var s
259259
if(b==null)b=0
@@ -578,7 +578,7 @@ switch(a0){case 5:case 1:case 2:case 3:case 4:return a2
578578
case 6:s=a2.x
579579
r=A.PL(a1,s,a3,a4)
580580
if(r===s)return a2
581-
return A.B(a1,r,!0)
581+
return A.D(a1,r,!0)
582582
case 7:s=a2.x
583583
r=A.PL(a1,s,a3,a4)
584584
if(r===s)return a2
@@ -715,7 +715,7 @@ else if(s===t.N)r=A.Bt
715715
else if(s===t.y)r=A.p8
716716
else if(s===t.H)r=A.z5
717717
else if(s===t.i)r=A.rV
718-
else if(s===t.m)r=A.AN
718+
else if(s===t.m)r=A.A
719719
s.a=r
720720
return s.a(a)},
721721
YO(a){var s=this
@@ -791,7 +791,7 @@ throw A.rL(A.Lz(a,"String"),new Error())},
791791
ra(a){if(typeof a=="string")return a
792792
if(a==null)return a
793793
throw A.rL(A.Lz(a,"String?"),new Error())},
794-
AN(a){if(A.Vl(a))return a
794+
A(a){if(A.Vl(a))return a
795795
throw A.rL(A.Lz(a,"JSObject"),new Error())},
796796
wI(a){if(a==null)return a
797797
if(A.Vl(a))return a
@@ -900,7 +900,7 @@ s.as=c
900900
r=A.BD(a,s)
901901
a.eC.set(c,r)
902902
return r},
903-
B(a,b,c){var s,r=b.as+"?",q=a.eC.get(r)
903+
D(a,b,c){var s,r=b.as+"?",q=a.eC.get(r)
904904
if(q!=null)return q
905905
s=A.ll(a,b,r,c)
906906
a.eC.set(r,s)
@@ -929,7 +929,7 @@ r.w=7
929929
r.x=b
930930
r.as=c
931931
return A.BD(a,r)},
932-
H(a,b){var s,r,q=""+b+"^",p=a.eC.get(q)
932+
B(a,b){var s,r,q=""+b+"^",p=a.eC.get(q)
933933
if(p!=null)return p
934934
s=new A.Jc(null,null)
935935
s.w=13
@@ -1016,7 +1016,7 @@ return A.BD(a,l)},
10161016
u(a,b,c,d){return{u:a,e:b,r:c,s:[],p:0,n:d}},
10171017
x(a){var s,r,q,p,o,n,m,l=a.r,k=a.s
10181018
for(s=l.length,r=0;r<s;){q=l.charCodeAt(r)
1019-
if(q>=48&&q<=57)r=A.A(r+1,q,l,k)
1019+
if(q>=48&&q<=57)r=A.H(r+1,q,l,k)
10201020
else if((((q|32)>>>0)-97&65535)<26||q===95||q===36||q===124)r=A.t(a,r,l,k,!1)
10211021
else if(q===46)r=A.t(a,r,l,k,!0)
10221022
else{++r
@@ -1027,7 +1027,7 @@ case 33:k.push(!0)
10271027
break
10281028
case 59:k.push(A.K(a.u,a.e,k.pop()))
10291029
break
1030-
case 94:k.push(A.H(a.u,k.pop()))
1030+
case 94:k.push(A.B(a.u,k.pop()))
10311031
break
10321032
case 35:k.push(A.m(a.u,5,"#"))
10331033
break
@@ -1043,7 +1043,7 @@ break
10431043
case 38:A.I(a,k)
10441044
break
10451045
case 63:p=a.u
1046-
k.push(A.B(p,A.K(p,a.e,k.pop()),a.n))
1046+
k.push(A.D(p,A.K(p,a.e,k.pop()),a.n))
10471047
break
10481048
case 47:p=a.u
10491049
k.push(A.f(p,A.K(p,a.e,k.pop()),a.n))
@@ -1081,7 +1081,7 @@ r=n+1
10811081
break
10821082
default:throw"Bad character "+q}}}m=k.pop()
10831083
return A.K(a.u,a.e,m)},
1084-
A(a,b,c,d){var s,r,q=b-48
1084+
H(a,b,c,d){var s,r,q=b-48
10851085
for(s=c.length;a<s;++a){r=c.charCodeAt(a)
10861086
if(!(r>=48&&r<=57))break
10871087
q=q*10+(r-48)}d.push(q)
@@ -1679,13 +1679,18 @@ _.c=b
16791679
_.d=c
16801680
_.e=d},
16811681
vN:function vN(a){this.a=a},
1682-
E2(){A.i()
1682+
E2(){var s,r
1683+
A.i()
16831684
A.J($.v(),"wheel",new A.e(),!1)
16841685
A.J($.l(),"wheel",new A.L(),!1)
1685-
var s=new A.b()
1686+
s=new A.b()
16861687
A.J($.o(),"click",new A.C(s),!1)
16871688
A.J($.n(),"change",new A.w(),!1)
1688-
A.J(v.G.window,"keydown",new A.em(s,new A.h()),!1)},
1689+
r=v.G
1690+
A.J(r.window,"keydown",new A.em(s,new A.h()),!1)
1691+
r=r.document.querySelector("#version")
1692+
s=r==null?A.A(r):r
1693+
s.textContent="v5.0.0"},
16891694
i(){var s=0,r=A.FX(t.n),q=1,p=[],o=[],n,m,l,k,j,i,h,g,f
16901695
var $async$i=A.lz(function(a,b){if(a===1){p.push(b)
16911696
s=q}for(;;)switch(s){case 0:h=$.oa
@@ -1732,7 +1737,7 @@ a=new A.oi(i,new A.AR(),A.Lh(i).C("oi<cX.E>")).h(0,"\n")
17321737
i=v.G
17331738
i.document.querySelector("#graph-container").insertAdjacentHTML("beforeend",a)
17341739
i=i.document.querySelector("svg")
1735-
if(i==null)i=A.AN(i)
1740+
if(i==null)i=A.A(i)
17361741
$.oa=i
17371742
i=A.it(i.querySelectorAll("g.node"))
17381743
i=A.K1(i,new A.lg(),i.$ti.C("cX.E"),t.a)
@@ -2766,7 +2771,7 @@ $S:18}
27662771
A.w0.prototype={
27672772
$1(a){var s
27682773
if($.fq==null){s=a.currentTarget
2769-
if(s==null)s=A.AN(s)
2774+
if(s==null)s=A.A(s)
27702775
A.ws(s,this.a,this.b)}},
27712776
$S:1}
27722777
A.FL.prototype={
@@ -2776,7 +2781,7 @@ A.yx.prototype={
27762781
$1(a){var s,r
27772782
a.stopPropagation()
27782783
s=a.currentTarget
2779-
if(s==null)s=A.AN(s)
2784+
if(s==null)s=A.A(s)
27802785
if($.fq===s){$.fq=null
27812786
r=null}else{$.fq=s
27822787
r=s}if(r==null)r=s
@@ -3051,17 +3056,17 @@ s($,"X0","t8",()=>A.CU(B.h0))
30513056
s($,"N8","jv",()=>{A.w4()
30523057
return $.zI})
30533058
s($,"UO","o",()=>{var r=A.aJ(A.Qh(A.pk(),"document"),"querySelector","#hamburgerBtn")
3054-
return r==null?A.AN(r):r})
3059+
return r==null?A.A(r):r})
30553060
s($,"bV","E1",()=>{var r=A.aJ(A.Qh(A.pk(),"document"),"querySelector","#controls-panel")
3056-
return r==null?A.AN(r):r})
3061+
return r==null?A.A(r):r})
30573062
s($,"xh","n",()=>{var r=A.aJ(A.Qh(A.pk(),"document"),"querySelector","#zoomCheckbox")
3058-
return r==null?A.AN(r):r})
3063+
return r==null?A.A(r):r})
30593064
s($,"y8","v",()=>{var r=A.aJ(A.Qh(A.pk(),"document"),"querySelector","#deps-in-box")
3060-
return r==null?A.AN(r):r})
3065+
return r==null?A.A(r):r})
30613066
s($,"JX","l",()=>{var r=A.aJ(A.Qh(A.pk(),"document"),"querySelector","#deps-out-box")
3062-
return r==null?A.AN(r):r})
3067+
return r==null?A.A(r):r})
30633068
s($,"pt","Mc",()=>{var r=A.aJ(A.Qh(A.pk(),"document"),"querySelector","#dot")
3064-
return A.AF(A.DF(B.xB.bS(A.Bt(A.Qh(r==null?A.AN(r):r,"innerHTML")))),t.N)})})();(function nativeSupport(){!function(){var s=function(a){var m={}
3069+
return A.AF(A.DF(B.xB.bS(A.Bt(A.Qh(r==null?A.A(r):r,"innerHTML")))),t.N)})})();(function nativeSupport(){!function(){var s=function(a){var m={}
30653070
m[a]=1
30663071
return Object.keys(hunkHelpers.convertToFastObject(m))[0]}
30673072
v.getIsolateTag=function(a){return s("___dart_"+a+v.isolateTag)}

lib/assets/web_app.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ class CompiledApp {
235235
_4750: x0 => x0.currentTarget,
236236
_4798: x0 => x0.length,
237237
_4857: x0 => x0.textContent,
238+
_4858: (x0,x1) => { x0.textContent = x1 },
238239
_4862: () => globalThis.document,
239240
_5273: x0 => x0.id,
240241
_5274: (x0,x1) => { x0.id = x1 },

lib/assets/web_app.wasm

128 Bytes
Binary file not shown.

lib/assets/web_app.wasm.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)