1- import { p5Versions , currentP5Version } from "../../common/p5Versions" ;
1+ import { p5Versions , currentP5Version } from '../../common/p5Versions' ;
2+
3+ const DEFAULTS = {
4+ sound : true ,
5+ preload : false ,
6+ shapes : false ,
7+ data : false
8+ } ;
29
310// One centralized parser
411export function parseUrlParams ( url ) {
5- const params = new URLSearchParams ( new URL ( url , 'https://dummy.origin' ) . search ) ;
12+ const params = new URLSearchParams (
13+ new URL ( url , 'https://dummy.origin' ) . search
14+ ) ;
615
716 return {
817 version : validateVersion ( params . get ( 'version' ) ) , // string
9- sound : validateSound ( params . get ( 'sound' ) ) , // bool
10- preload : validatePreload ( params . get ( 'preload' ) ) , // bool
11- shapes : validateShapes ( params . get ( 'shapes' ) ) , // bool
12- data : validateData ( params . get ( 'data' ) ) // bool
18+ sound : validateBool ( params . get ( 'sound' ) , DEFAULTS . sound ) , // bool
19+ preload : validateBool ( params . get ( 'preload' ) , DEFAULTS . preload ) , // bool
20+ shapes : validateBool ( params . get ( 'shapes' ) , DEFAULTS . shapes ) , // bool
21+ data : validateBool ( params . get ( 'data' ) , DEFAULTS . data ) // bool
1322 // Easy to add more params here
1423 } ;
1524}
1625
1726function validateVersion ( version ) {
18- if ( ! version ) {
19- return currentP5Version ;
20- }
21-
22- // if valid return version
23-
27+ if ( ! version ) {
2428 return currentP5Version ;
25- }
26- function validateSound ( sound ) {
27- return ;
29+ }
30+ const v = String ( version ) . trim ( ) ;
31+ if ( v . toLowerCase ( ) === 'latest' ) {
32+ const newest = getNewestVersion ( p5Versions ) ;
33+ return newest ?? currentP5Version ; //The ?? operator means: “if newest is null or undefined, use currentP5Version
34+ }
35+ if ( v . toLowerCase ( ) === 'current' ) return currentP5Version ;
36+ if ( p5Versions . includes ( v ) ) return v ;
37+ const normalized = v . replace ( / ^ v / i, '' ) ;
38+ if ( p5Versions . includes ( normalized ) ) return normalized ;
39+ //This line strips that leading v using a regular expression ^v (meaning “v at the start”) and then rechecks.
2840
29- // on, true, 1 == on
30- // off, false, 0 == off
31-
32- // default if none triggered
41+ // if valid return version
42+ return currentP5Version ;
43+ }
3344
45+ //picks highest version number from array
46+ function getNewestVersion ( list ) {
47+ // Defensive copy + semver sort (major.minor.patch)
48+ const parts = ( s ) => s . split ( '.' ) . map ( ( n ) => parseInt ( n , 10 ) || 0 ) ;
49+ return [ ...list ] . sort ( ( a , b ) => {
50+ const [ am , an , ap ] = parts ( a ) ;
51+ const [ bm , bn , bp ] = parts ( b ) ;
52+ if ( am !== bm ) return bm - am ;
53+ if ( an !== bn ) return bn - an ;
54+ return bp - ap ;
55+ } ) [ 0 ] ;
3456}
35- function validatePreload ( preload ) {
36- return ;
3757
38- // on, true, 1 == on
39- // off, false, 0 == off
40-
41- // default if none triggered
58+ function validateBool ( value , defaultValue ) {
59+ if ( value ) return defaultValue ; // param absent
60+ //if (value === '') return true; // bare flag: ?flag
4261
43- }
44- function validateShapes ( shapes ) {
45- return ;
62+ const v = String ( value ) . trim ( ) . toLowerCase ( ) ;
4663
47- // on, true, 1 == on
48- // off, false, 0 == off
49-
50- // default if none triggered
64+ const TRUTHY = new Set ( [ 'on' , 'true' , '1' , 'yes' , 'y' , 'enable' , 'enabled' ] ) ;
65+ const FALSY = new Set ( [
66+ 'off' ,
67+ 'false' ,
68+ '0' ,
69+ //'no',
70+ //'n',
71+ //'disable',
72+ //'disabled'
73+ ] ) ;
5174
75+ if ( TRUTHY . has ( v ) ) return true ;
76+ if ( FALSY . has ( v ) ) return false ;
5277
78+ return defaultValue ; // unrecognized → fall back safely
5379}
54- function validateData ( data ) {
55- return ;
56-
57- // on, true, 1 == on
58- // off, false, 0 == off
59-
60- // default if none triggered
6180
62- }
0 commit comments