From 04376c5552b3d85bf9825313045fca6af53f103b Mon Sep 17 00:00:00 2001 From: Youngsang Jun Date: Wed, 18 Dec 2024 03:16:05 -0500 Subject: [PATCH 1/2] Commit 1 (Dec 18 0315) Commit 1 (Dec 18 0315) --- Jun_Youngsang/css/style.css | 270 +++ .../layers/updated_geojson_file 2.geojson | 1 + Jun_Youngsang/eslint.config.js | 15 + Jun_Youngsang/index.html | 89 + Jun_Youngsang/js/eventlist.js | 164 ++ Jun_Youngsang/js/firebase.js | 27 + Jun_Youngsang/js/geocoder.js | 14 + Jun_Youngsang/js/layers.js | 61 + Jun_Youngsang/js/main.js | 126 ++ Jun_Youngsang/js/map-setup.js | 23 + Jun_Youngsang/js/map.js.bak | 651 +++++++ Jun_Youngsang/package-lock.json | 1621 +++++++++++++++++ Jun_Youngsang/package.json | 9 + 13 files changed, 3071 insertions(+) create mode 100644 Jun_Youngsang/css/style.css create mode 100644 Jun_Youngsang/data/layers/updated_geojson_file 2.geojson create mode 100644 Jun_Youngsang/eslint.config.js create mode 100644 Jun_Youngsang/index.html create mode 100644 Jun_Youngsang/js/eventlist.js create mode 100644 Jun_Youngsang/js/firebase.js create mode 100644 Jun_Youngsang/js/geocoder.js create mode 100644 Jun_Youngsang/js/layers.js create mode 100644 Jun_Youngsang/js/main.js create mode 100644 Jun_Youngsang/js/map-setup.js create mode 100644 Jun_Youngsang/js/map.js.bak create mode 100644 Jun_Youngsang/package-lock.json create mode 100644 Jun_Youngsang/package.json diff --git a/Jun_Youngsang/css/style.css b/Jun_Youngsang/css/style.css new file mode 100644 index 0000000..576b6bf --- /dev/null +++ b/Jun_Youngsang/css/style.css @@ -0,0 +1,270 @@ +.map-overlay { + position: absolute; + width: 30%; + top: 0; + bottom: 0; + left: 0; + font: + 12px/20px 'Open Sans', + Arial, + Helvetica, + sans-serif; + background-color: #efefef; + height: 100vh; + overflow: hidden; +} + +#map { + position: absolute; + left: 30%; + top: 0; + bottom: 0; + min-width: 70%; +} + +#eventList { + margin-top: 10px; + padding: 10px; + overflow-y: auto; + height: 100%; +} + +#eventList h4 { + font-size: 1.5rem; + color: #333; + margin-bottom: 10px; +} + +#eventList h5 { + font-size: 1rem; + color: #aaa; + margin-bottom: 15px; + font-style: italic; +} + +#eventListContainer { + list-style-type: none; + padding: 0; + margin: 0; + cursor: pointer; + transition: background-color 0.3s; +} + + +#eventListContainer li { + background-color: #f9f9f9; + padding: 10px; + margin-bottom: 10px; + border-radius: 8px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + display: flex; + justify-content: space-between; + align-items: center; +} + +#eventListContainer li button { + margin-left: 1px; +} + +.event-details { + flex: 1; + } + + +.event-title { +font-weight: bold; +font-size: 16px; +margin-bottom: 5px; + } + +.edit-btn { + padding: 3px 5px; + font-size: 14px; + margin-left: 5px; + border: none; + border-radius: 4px; + cursor: pointer; + background-color: #55E; + color: #fff; + } + +.delete-btn { + padding: 3px 5px; + font-size: 14px; + margin-left: 5px; + border: none; + border-radius: 4px; + cursor: pointer; + background-color: #dc3545; + color: #fff; + } + +.edit-btn:hover { + background-color: rgb(58, 58, 182) !important; + color: #fff; + } + +.delete-btn:hover { + background-color: #8a232d !important; + color: #fff; + } + #eventListContainer :hover { + background-color: #bed3f3; +} + +.mapboxgl-popup-content { + max-width: 800px; + max-height: 800px; + overflow-y: auto; + font: + 12px/20px 'Open Sans', + Arial, + Helvetica, + sans-serif; +} + +.map-overlay fieldset { + display: none; + background: #ddd; + border: none; + padding: 00px; + margin: 0; +} + +.map-overlay .geocoder { + display: block; + background: #ddd; + border: none; + padding: 10px; + margin: 0; + width: 100%; + left: 0; + top: 0; +} + +.map-overlay .mapboxgl-ctrl-geocoder { + max-width: 100%; +} + +.map-overlay input { + display: block; + border: none; + width: 100%; + border-radius: 3px; + padding: 8px; + margin: 0; + box-sizing: border-box; +} + +.group-toggle { + margin-top: 30px; + position: absolute; + top: 0; + left: 0; + background: #f0f0f0; + padding: 0; + + height: 100%; + z-index: 1; +} + +.toggle-button { + margin: 5px; + background-color: #ddd; + color: #003764; + padding: 5px 10px; + font-size: 12px; + border: none; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s; + font-family: 'Open Sans', sans-serif; +} + +/* 버튼 호버 효과 */ +.toggle-button:hover { + background-color: #ccc; +} + +.map-overlay .backgroundmap { + position: absolute; + overflow: hidden; + padding: 10px; + top: 75%; + width: 100%; + max-height: 30%; + background: #f0f0f0; + font-family: 'Open Sans', sans-serif; + display: flex; + flex-direction: column; +} + +/* 버튼 스타일 */ +.btn-primary { + background-color: #003764; + border-color: #003764; + padding: 5px 10px; + font-size: 14px; + border-radius: 4px; + cursor: pointer; + color: #fff; +} + +.btn-secondary { + background-color: #6c757d; + border-color: #6c757d; + padding: 5px 10px; + font-size: 14px; + border-radius: 4px; + cursor: pointer; + color: white; +} + +/* 모달 스타일 */ +.modal-content { + border-radius: 8px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); +} + +.modal-header { + background-color: #003764; + color: white; + border-bottom: none; + padding: 15px; +} + +.modal-header h5 { + margin: 0; +} + +.modal-body { + padding: 20px; + background-color: #f9f9f9; +} + +.modal-footer { + padding: 15px; + border-top: none; + background-color: #f4f4f4; +} + +.modal-footer .btn { + border-radius: 5px; +} + +.add-event-button { + position: absolute; + background-color: #007bff; + color: white; + padding: 10px 20px; + border: none; + border-radius: 5px; + cursor: pointer; + z-index: 999; + transform: translate(-50%, -50%); + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); + } + + .add-event-button:hover { + background-color: #0056b3; + } diff --git a/Jun_Youngsang/data/layers/updated_geojson_file 2.geojson b/Jun_Youngsang/data/layers/updated_geojson_file 2.geojson new file mode 100644 index 0000000..5d5bfbd --- /dev/null +++ b/Jun_Youngsang/data/layers/updated_geojson_file 2.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"OBJECTID":20,"countryName":"usa","featureDescription":"na","featureName":"Naval Station Norfolk","installationId":"N62688","isCui":"No","isFirrmaSite":"Yes","isJointBase":"No","mediaId":"na","metadataId":"na","mirtaLocationsIdpk":" ","sdsId":"697cec17-38ee-4f84-aee6-4923cd709a79","siteName":"NAVSTA Norfolk VA","siteOperationalStatus":"act","siteReportingComponent":"usn","stateNameCode":"VA","B2023":"NA","B2024":"NA","B2025":"NA","Sum":"NA","X":null},"geometry":{"type":"MultiPolygon","coordinates":[[[[-76.3256732,36.963407],[-76.3219184,36.9629112],[-76.321875,36.9631059],[-76.3219205,36.9631145],[-76.3218958,36.9632422],[-76.3217536,36.9632153],[-76.3217827,36.9630933],[-76.3218324,36.9630984],[-76.32187,36.9629048],[-76.3177829,36.962365],[-76.3136959,36.961825],[-76.3127977,36.9586077],[-76.3119608,36.9556095],[-76.3080188,36.9558387],[-76.304178,36.956064],[-76.3003373,36.9562892],[-76.3000939,36.9534166],[-76.2998506,36.950544],[-76.2955701,36.949058],[-76.2912897,36.9475717],[-76.2921197,36.9460517],[-76.2918929,36.9459793],[-76.291908,36.9459541],[-76.2926828,36.9462267],[-76.2927815,36.9460882],[-76.29257,36.9459969],[-76.2929262,36.9454435],[-76.2902469,36.9445029],[-76.2876129,36.9435782],[-76.2870042,36.9431593],[-76.2869031,36.9432749],[-76.2852205,36.9451713],[-76.2874372,36.9465396],[-76.2870988,36.9472364],[-76.2873491,36.9473148],[-76.2872212,36.9475722],[-76.2869789,36.9475062],[-76.2867383,36.948002],[-76.2862581,36.9481259],[-76.2863313,36.9483186],[-76.2861532,36.9483643],[-76.2860877,36.9481714],[-76.2842989,36.948659],[-76.2843798,36.9488455],[-76.2842172,36.948891],[-76.2841362,36.9486983],[-76.2824403,36.9491662],[-76.2825291,36.9493588],[-76.2821961,36.9494498],[-76.2821228,36.9492508],[-76.2809505,36.9495759],[-76.2797278,36.9499118],[-76.2776598,36.9504878],[-76.2763167,36.9508594],[-76.2735154,36.9516173],[-76.2732875,36.9517321],[-76.2730404,36.951821],[-76.2729867,36.9518715],[-76.2729565,36.9519218],[-76.2728406,36.951973],[-76.2725692,36.9520259],[-76.272244,36.9521168],[-76.2719809,36.9522008],[-76.2717794,36.9522466],[-76.2717413,36.952297],[-76.2717431,36.9524031],[-76.2717216,36.9525157],[-76.2717243,36.952678],[-76.2717588,36.9528837],[-76.2718091,36.9531017],[-76.271866,36.9532447],[-76.2719147,36.953369],[-76.2719937,36.9534492],[-76.2729802,36.9533557],[-76.2734962,36.9533049],[-76.2735854,36.9532853],[-76.2736446,36.9532581],[-76.2736737,36.9532153],[-76.2736826,36.9531567],[-76.2737085,36.9531192],[-76.2737548,36.9531107],[-76.2738084,36.9531385],[-76.2738189,36.9531571],[-76.2738492,36.9532107],[-76.2738174,36.9532882],[-76.2737657,36.9533659],[-76.2736803,36.9534146],[-76.2735615,36.9534398],[-76.2730088,36.953483],[-76.2720249,36.953546],[-76.2719965,36.9536054],[-76.2719591,36.9536995],[-76.2719103,36.9538287],[-76.271907,36.9538374],[-76.2718702,36.9539689],[-76.2718334,36.9540942],[-76.2717899,36.954282],[-76.2717302,36.9544387],[-76.2717098,36.9546138],[-76.2716961,36.9547263],[-76.2717069,36.9549072],[-76.2717469,36.9549755],[-76.2718804,36.955049],[-76.2719051,36.9551299],[-76.2720001,36.9552288],[-76.2721334,36.9552898],[-76.2722904,36.9553755],[-76.2723925,36.9554306],[-76.272496,36.9555731],[-76.2725067,36.9557478],[-76.2725105,36.9559788],[-76.2724902,36.9561601],[-76.2725006,36.9563161],[-76.2725044,36.9565471],[-76.272537,36.9566341],[-76.2725473,36.9567839],[-76.2725808,36.9569271],[-76.2725594,36.957046],[-76.2725468,36.9572272],[-76.2725506,36.9574519],[-76.2725379,36.9576269],[-76.2725791,36.9577638],[-76.2725889,36.9578823],[-76.2725835,36.958026],[-76.2725403,36.9582387],[-76.2724957,36.9583641],[-76.2724987,36.9585389],[-76.2724614,36.9586392],[-76.2724632,36.9587453],[-76.2724267,36.9588893],[-76.2724138,36.9590518],[-76.272432,36.9592077],[-76.272434,36.9593263],[-76.2724117,36.959389],[-76.2723656,36.9594269],[-76.2723601,36.9595643],[-76.2723545,36.9596955],[-76.2723555,36.9597517],[-76.2723169,36.9597708],[-76.2722777,36.9597525],[-76.2722474,36.9598028],[-76.2722264,36.9599466],[-76.272284,36.9601333],[-76.2722431,36.9603437],[-76.2722998,36.9607939],[-76.2721682,36.9607814],[-76.2720432,36.9609956],[-76.271993,36.9620864],[-76.2718776,36.9623714],[-76.271639,36.96296],[-76.2708241,36.963259],[-76.270753,36.9631749],[-76.2708362,36.9630629],[-76.2708989,36.962916],[-76.2709519,36.9627918],[-76.2711422,36.9627326],[-76.2714463,36.9627723],[-76.2715006,36.9625038],[-76.2711966,36.9624641],[-76.2707008,36.9624453],[-76.2703669,36.9627691],[-76.2701899,36.9628107],[-76.2700648,36.9628401],[-76.2697425,36.9628914],[-76.2695583,36.9627479],[-76.2692962,36.9627264],[-76.2687204,36.962478],[-76.2685559,36.9624095],[-76.268556,36.9624085],[-76.2684541,36.9623659],[-76.2684497,36.9623653],[-76.2683376,36.9623186],[-76.2682144,36.962322],[-76.2680825,36.9621681],[-76.2679598,36.962108],[-76.2678452,36.9620384],[-76.267736,36.9619925],[-76.2675085,36.9618971],[-76.2672485,36.9617923],[-76.2669974,36.9616745],[-76.2668143,36.9615497],[-76.2667887,36.9615323],[-76.2663214,36.9613307],[-76.2660524,36.9611193],[-76.2654503,36.9607798],[-76.2647755,36.960964],[-76.2645738,36.9608807],[-76.2642209,36.9607955],[-76.2639571,36.9606865],[-76.2637054,36.9605256],[-76.2636266,36.9604502],[-76.2635474,36.9603389],[-76.2635038,36.9602775],[-76.2634669,36.9602257],[-76.2634074,36.9600998],[-76.2633489,36.9599401],[-76.2632812,36.9597977],[-76.2621539,36.9590769],[-76.2618193,36.9588629],[-76.2625884,36.9580899],[-76.2628404,36.9578927],[-76.2628995,36.9578555],[-76.2629533,36.9578134],[-76.2630012,36.957767],[-76.2630426,36.9577168],[-76.2630772,36.9576633],[-76.2631044,36.9576071],[-76.263124,36.9575489],[-76.2631358,36.9574894],[-76.2631946,36.9571624],[-76.2631954,36.9571572],[-76.2632257,36.9569532],[-76.2632653,36.956745],[-76.2633134,36.9565378],[-76.2633698,36.9563321],[-76.2634346,36.9561279],[-76.2635076,36.9559256],[-76.2636009,36.9556552],[-76.2637351,36.9553855],[-76.2638282,36.9551876],[-76.2638508,36.955142],[-76.26389,36.9550381],[-76.2639287,36.9549287],[-76.263965,36.9548186],[-76.2640477,36.9543243],[-76.2645973,36.9538967],[-76.2647061,36.9540016],[-76.2648335,36.9539142],[-76.2648259,36.9538834],[-76.2647149,36.9537791],[-76.2650893,36.9535224],[-76.2646203,36.9530624],[-76.2649374,36.9528996],[-76.2655892,36.9535612],[-76.2660898,36.9532799],[-76.2660245,36.9532051],[-76.2695012,36.9512488],[-76.2667415,36.948084],[-76.2665508,36.9478711],[-76.265929,36.9471591],[-76.2686787,36.9459529],[-76.271348,36.9447791],[-76.2730015,36.9452133],[-76.2738498,36.9431242],[-76.2758993,36.9422335],[-76.2759977,36.9417914],[-76.2760134,36.9417209],[-76.2760947,36.9411092],[-76.2761612,36.9404222],[-76.2763467,36.9403022],[-76.2764625,36.9402722],[-76.2762899,36.9402588],[-76.2760913,36.9400163],[-76.275993,36.9397547],[-76.2759692,36.939655],[-76.2757787,36.9396176],[-76.2755613,36.9392928],[-76.2752844,36.9390608],[-76.2753383,36.9388868],[-76.2752,36.9389601],[-76.2751222,36.9388583],[-76.2748927,36.9386093],[-76.2745884,36.9384272],[-76.274525,36.9383816],[-76.2743404,36.9382486],[-76.2740021,36.9380141],[-76.2738515,36.9377116],[-76.2737876,36.9373856],[-76.2736409,36.9372168],[-76.273586,36.9371537],[-76.2733737,36.9370416],[-76.2729313,36.936838],[-76.2727704,36.9366641],[-76.272723,36.9363756],[-76.2727319,36.9360605],[-76.272803,36.9356697],[-76.2727529,36.9354716],[-76.2726921,36.9354309],[-76.2725256,36.9353194],[-76.2723075,36.9352176],[-76.2723397,36.9351119],[-76.2725624,36.9349106],[-76.272738,36.93478],[-76.2728984,36.9345999],[-76.272934,36.9344748],[-76.2728756,36.9343719],[-76.2729176,36.9341692],[-76.273031,36.9339591],[-76.2732209,36.9336175],[-76.2734049,36.9335722],[-76.2732758,36.9335418],[-76.2732494,36.9334224],[-76.2731977,36.9332468],[-76.2727295,36.932912],[-76.2723899,36.9326757],[-76.2721176,36.9325319],[-76.2721594,36.9324296],[-76.2722572,36.9324127],[-76.2723552,36.9323617],[-76.2722645,36.9323059],[-76.2721293,36.9322761],[-76.2720284,36.9322095],[-76.2718618,36.9320666],[-76.2717604,36.931978],[-76.2715471,36.9318538],[-76.2714234,36.931803],[-76.2711661,36.9318214],[-76.2708482,36.9319624],[-76.2707656,36.9320695],[-76.2706642,36.9320744],[-76.2703624,36.9321852],[-76.2701217,36.9322432],[-76.2699844,36.932238],[-76.2697456,36.9321578],[-76.269616,36.9321384],[-76.269392,36.9321182],[-76.2692468,36.9320893],[-76.2691159,36.932086],[-76.2690061,36.932108],[-76.2687979,36.9320597],[-76.2685979,36.931962],[-76.2684508,36.9317631],[-76.2684302,36.9316758],[-76.2683788,36.9316045],[-76.2683324,36.9314677],[-76.2682121,36.9313213],[-76.2681252,36.9312351],[-76.2679473,36.9311227],[-76.267865,36.9309964],[-76.26777,36.9310098],[-76.2672884,36.9310776],[-76.2666495,36.9311675],[-76.26629,36.9314263],[-76.2684568,36.9275246],[-76.2691825,36.9247368],[-76.2697249,36.9226526],[-76.2697398,36.9225954],[-76.2698151,36.9223063],[-76.2698619,36.9221417],[-76.2699163,36.9219787],[-76.2699781,36.9218173],[-76.2700473,36.9216579],[-76.2701238,36.9215006],[-76.2702076,36.9213458],[-76.2702984,36.9211935],[-76.2703961,36.921044],[-76.2705007,36.9208976],[-76.2706119,36.9207543],[-76.2711632,36.9200728],[-76.2712348,36.9199843],[-76.2714003,36.9197797],[-76.271518,36.9196279],[-76.2716286,36.9194726],[-76.2717317,36.9193141],[-76.2718273,36.9191526],[-76.2719153,36.9189883],[-76.2719954,36.9188214],[-76.2720676,36.9186522],[-76.2721318,36.9184809],[-76.2721879,36.9183078],[-76.2722358,36.9181332],[-76.2722755,36.9179572],[-76.272462,36.917029],[-76.2764676,36.9197564],[-76.2795471,36.9218534],[-76.2795128,36.9220641],[-76.2825542,36.9239694],[-76.2855552,36.9259941],[-76.2884225,36.9279285],[-76.2912898,36.9298628],[-76.2947271,36.9321813],[-76.2948056,36.9322343],[-76.2955497,36.9327361],[-76.2957295,36.932857],[-76.2958602,36.9329456],[-76.2961613,36.9331486],[-76.2962922,36.9332371],[-76.2963904,36.9333031],[-76.2972219,36.9338639],[-76.297365,36.9337272],[-76.2978361,36.9340449],[-76.2986847,36.9339966],[-76.2988385,36.9339887],[-76.3000089,36.9339288],[-76.3021092,36.9338213],[-76.3031927,36.9337658],[-76.3042644,36.9337109],[-76.3074477,36.933545],[-76.3113257,36.9332897],[-76.3142333,36.9330882],[-76.3159008,36.9329944],[-76.3158948,36.9329135],[-76.3158864,36.9328047],[-76.3178674,36.9326775],[-76.3180587,36.9345335],[-76.3180709,36.9346705],[-76.3181075,36.9350815],[-76.3181486,36.9355439],[-76.3182395,36.9365652],[-76.3183689,36.9380189],[-76.3186203,36.9410164],[-76.3186252,36.9410712],[-76.3188813,36.9437734],[-76.3149056,36.9439763],[-76.3109474,36.9442018],[-76.3069892,36.9444271],[-76.3062202,36.9443627],[-76.3063227,36.944584],[-76.3070724,36.9446442],[-76.311036,36.944419],[-76.3149996,36.9441937],[-76.3185287,36.9440138],[-76.3193104,36.9439693],[-76.3190349,36.9410477],[-76.31903,36.9409929],[-76.3187576,36.93776],[-76.3187287,36.937435],[-76.3186293,36.9363184],[-76.3185,36.9348645],[-76.3183899,36.9336309],[-76.321958,36.9333735],[-76.3232341,36.9332828],[-76.3241027,36.9332215],[-76.3240986,36.9331728],[-76.3247462,36.9331351],[-76.3247733,36.9335447],[-76.3288324,36.9333118],[-76.328917,36.9342667],[-76.3300917,36.9341991],[-76.3301106,36.934198],[-76.3338654,36.9337093],[-76.3348087,36.9336861],[-76.3356157,36.9478148],[-76.3337321,36.9542861],[-76.332645,36.9580209],[-76.3308924,36.9640416],[-76.3256732,36.963407]]]]}},{"type":"Feature","properties":{"OBJECTID":2,"countryName":"usa","featureDescription":"na","featureName":"NAVSUPPACT Hampton Roads VA","installationId":"N57095","isCui":"No","isFirrmaSite":"No","isJointBase":"No","mediaId":"na","metadataId":"na","mirtaLocationsIdpk":" ","sdsId":"8b011bb7-9e1d-4915-9465-09cad2612ab4","siteName":"NAVSUPPACT Hampton Roads VA","siteOperationalStatus":"act","siteReportingComponent":"usn","stateNameCode":"VA","B2023":"NA","B2024":"NA","B2025":"NA","Sum":"NA","X":null},"geometry":{"type":"MultiPolygon","coordinates":[[[[-76.3064969,36.9281148],[-76.3063059,36.9281774],[-76.3065261,36.9286099],[-76.3064324,36.9286407],[-76.3065746,36.92892],[-76.3063833,36.9289828],[-76.306604,36.929415],[-76.3067465,36.9296948],[-76.3065565,36.9297572],[-76.3069061,36.9304438],[-76.3080473,36.9300693],[-76.308134,36.9302396],[-76.3088647,36.9299326],[-76.3091778,36.9305475],[-76.3084433,36.9307435],[-76.3074667,36.9315167],[-76.3074307,36.9319541],[-76.3072,36.9323972],[-76.3055311,36.9324908],[-76.3047752,36.9331432],[-76.3014472,36.9333301],[-76.2981192,36.9335168],[-76.2980265,36.9335203],[-76.2979338,36.9335205],[-76.2978412,36.9335174],[-76.2966836,36.9330856],[-76.2939258,36.9312088],[-76.2932478,36.9308194],[-76.2906382,36.9290433],[-76.2880287,36.9272672],[-76.2854192,36.9254909],[-76.283054,36.9238808],[-76.2830026,36.9238458],[-76.28281,36.9237147],[-76.2814152,36.9227651],[-76.2814925,36.9227126],[-76.2814378,36.9226576],[-76.2813868,36.9225993],[-76.2813396,36.9225378],[-76.2812956,36.922465],[-76.2812576,36.9223889],[-76.2812255,36.9223101],[-76.2811997,36.9222291],[-76.2811803,36.9221463],[-76.2811674,36.9220623],[-76.2811611,36.9219774],[-76.2811615,36.9218924],[-76.2811685,36.9218076],[-76.281182,36.9217237],[-76.2812021,36.9216411],[-76.2812286,36.9215602],[-76.2812613,36.9214817],[-76.2813,36.921406],[-76.2813445,36.9213335],[-76.2813945,36.9212648],[-76.2814498,36.9212001],[-76.2815099,36.92114],[-76.2815745,36.9210847],[-76.2816432,36.9210346],[-76.2817157,36.9209901],[-76.2817914,36.9209513],[-76.2818698,36.9209185],[-76.2819506,36.920892],[-76.2820333,36.9208719],[-76.2829453,36.9207737],[-76.2829738,36.9209785],[-76.286524,36.9205962],[-76.2866819,36.9205792],[-76.2900384,36.9202176],[-76.2934288,36.9198523],[-76.2934062,36.9198443],[-76.2934821,36.9197081],[-76.2962115,36.9194139],[-76.2982445,36.9191948],[-76.2983056,36.9192021],[-76.2984122,36.9192189],[-76.2985178,36.9192416],[-76.298622,36.91927],[-76.2987245,36.9193041],[-76.298825,36.9193436],[-76.2989231,36.9193886],[-76.2996858,36.9193442],[-76.3003303,36.9192747],[-76.3037206,36.9189092],[-76.3071109,36.9185435],[-76.3104999,36.9181778],[-76.3127449,36.9202501],[-76.3141912,36.921585],[-76.3131349,36.9223225],[-76.3125489,36.9224316],[-76.3125216,36.9224382],[-76.3124957,36.9224492],[-76.312472,36.9224644],[-76.3124512,36.9224832],[-76.3124338,36.9225053],[-76.3123247,36.9226852],[-76.3123079,36.922755],[-76.3123633,36.9233851],[-76.3158032,36.9231899],[-76.3159417,36.9233655],[-76.3160748,36.9235451],[-76.3162025,36.9237287],[-76.3163245,36.9239161],[-76.3164408,36.9241071],[-76.3165514,36.9243015],[-76.316656,36.9244991],[-76.3167546,36.9246999],[-76.3168435,36.9248964],[-76.3169259,36.9250958],[-76.3170019,36.9252977],[-76.3170713,36.925502],[-76.317134,36.9257084],[-76.31719,36.9259167],[-76.3172392,36.9261268],[-76.3172816,36.9263383],[-76.3141078,36.9265168],[-76.3124873,36.9266079],[-76.3098944,36.9267536],[-76.3075344,36.9268861],[-76.3075592,36.9269348],[-76.3073691,36.9269973],[-76.3065137,36.9272785],[-76.3066563,36.9275581],[-76.3062769,36.9276828],[-76.3064969,36.9281148]]]]}}]} \ No newline at end of file diff --git a/Jun_Youngsang/eslint.config.js b/Jun_Youngsang/eslint.config.js new file mode 100644 index 0000000..b66a718 --- /dev/null +++ b/Jun_Youngsang/eslint.config.js @@ -0,0 +1,15 @@ +import globals from "globals"; +import pluginJs from "@eslint/js"; + + +export default [ + {languageOptions: { + globals: { + ...globals.browser, + mapboxgl: 'readonly', + MapboxGeocoder: 'readonly', + bootstrap: 'readonly', + }, + },}, + pluginJs.configs.recommended, +]; \ No newline at end of file diff --git a/Jun_Youngsang/index.html b/Jun_Youngsang/index.html new file mode 100644 index 0000000..79c7bd2 --- /dev/null +++ b/Jun_Youngsang/index.html @@ -0,0 +1,89 @@ + + + + + Base Management System By Youngsang Jun + + + + + + + + + + + + + + + + +
+ +
+
Map
+
+ +
+

Find Locations

+
+

Event List

+
To add a new event, click on the map to select the location of the event place.
+
    +
    + + + + + + + +
    + + + + \ No newline at end of file diff --git a/Jun_Youngsang/js/eventlist.js b/Jun_Youngsang/js/eventlist.js new file mode 100644 index 0000000..9c2f869 --- /dev/null +++ b/Jun_Youngsang/js/eventlist.js @@ -0,0 +1,164 @@ +import { db, collection, getDocs, doc, deleteDoc, updateDoc, getDoc } from './firebase.js'; + +let currentMarkers = []; // An array that stores the markers displayed on the map +let activePopup = null; // A variable that stores the currently active popup + +// Function to load event markers on the event list and map +async function loadEvents(map) { + const eventListContainer = document.getElementById("eventListContainer"); + + try { + // Initialize the event list container + eventListContainer.innerHTML = ""; + + // Remove all markers from the map + currentMarkers.forEach((marker) => marker.remove()); + currentMarkers = []; // 배열 초기화 + + // Import event data from Firestore + const querySnapshot = await getDocs(collection(db, "base_event_reports")); + + querySnapshot.forEach((docSnapshot) => { + const data = docSnapshot.data(); + const { latitude, longitude } = data.event_place; + const docId = docSnapshot.id; // Import the document ID + + // Add event data to the event list container + const listItem = document.createElement("li"); + listItem.innerHTML = ` +
    +
    ${data.event_name}
    +
    ${data.event_org} (${data.event_charge})
    + ${new Date(data.event_timestamp_from.seconds * 1000).toLocaleString()} - + ${new Date(data.event_timestamp_to.seconds * 1000).toLocaleString()}
    +
    +
    + + +
    + `; + eventListContainer.appendChild(listItem); + + // FlyTo and popup event location when clicking on the event list item + listItem.addEventListener("click", () => { + // Remove previously active popup + if (activePopup) { + activePopup.remove(); + } + map.flyTo({ + center: [longitude, latitude], + zoom: 14, + essential: true + }); + // Create a new popup and add it to the map + activePopup = new mapboxgl.Popup({ offset: 25 }) + .setLngLat([longitude, latitude]) + .setHTML(` + ${data.event_name}
    + ${data.event_charge} (${data.event_org})
    + ${new Date(data.event_timestamp_from.seconds * 1000).toLocaleString()} - + ${new Date(data.event_timestamp_to.seconds * 1000).toLocaleString()} + `) + .addTo(map); + }); + + + + // Add markers to the map + if (!isNaN(latitude) && !isNaN(longitude)) { + const marker = new mapboxgl.Marker({color: "#003764"}) + .setLngLat([longitude, latitude]) // 경도, 위도 순서 + .setPopup(new mapboxgl.Popup().setHTML(` + ${data.event_name}
    + ${data.event_charge} (${data.event_org})
    + ${new Date(data.event_timestamp_from.seconds * 1000).toLocaleString()} - + ${new Date(data.event_timestamp_to.seconds * 1000).toLocaleString()} + `)) + .addTo(map); + + currentMarkers.push(marker); // Add the marker to the array + } + }); + + // Add event listener to the event list container + eventListContainer.addEventListener("click", (e) => handleListActions(e, map)); + + } catch (error) { + console.error("Error loading events: ", error); + } +} + +// Edit and delete event actions +async function handleListActions(e, map) { + const target = e.target; + const docId = target.getAttribute("data-id"); + + if (target.classList.contains("delete-btn")) { + const confirmDelete = confirm("Are you sure you want to delete this event?"); + if (confirmDelete) { + try { + await deleteDoc(doc(db, "base_event_reports", docId)); + alert("Event deleted successfully!"); + loadEvents(map); // Refresh the event list + } catch (error) { + console.error("Error deleting event: ", error); + } + } + } + + if (target.classList.contains("edit-btn")) { + // Fill in the edit form with the current values + const docRef = doc(db, "base_event_reports", docId); + const docSnapshot = await getDoc(docRef); + + if (docSnapshot.exists()) { + const data = docSnapshot.data(); + + // Fill in the form fields with the current values + document.getElementById("event_name").value = data.event_name; + document.getElementById("event_charge").value = data.event_charge; + document.getElementById("event_org").value = data.event_org; + document.getElementById("event_personnum").value = data.event_personnum; + document.getElementById("event_place").value = `${data.event_place.latitude}, ${data.event_place.longitude}`; + document.getElementById("event_timestamp_from").value = new Date(data.event_timestamp_from.seconds * 1000).toISOString().slice(0, 16); + document.getElementById("event_timestamp_to").value = new Date(data.event_timestamp_to.seconds * 1000).toISOString().slice(0, 16); + document.getElementById("event_type").value = data.event_type; + + // Show the Bootstrap modal + const editModal = new bootstrap.Modal(document.getElementById("eventModal")); + editModal.show(); + + // confirmButton (Update Firestore) + const confirmButton = document.getElementById("confirmButton"); + confirmButton.replaceWith(confirmButton.cloneNode(true)); // Remove existing event listener + document.getElementById("confirmButton").addEventListener("click", async () => { + try { + const updatedData = { + event_name: document.getElementById("event_name").value, + event_charge: document.getElementById("event_charge").value, + event_org: document.getElementById("event_org").value, + event_personnum: parseInt(document.getElementById("event_personnum").value, 10), + event_place: { + latitude: parseFloat(document.getElementById("event_place").value.split(",")[0]), + longitude: parseFloat(document.getElementById("event_place").value.split(",")[1]), + }, + event_timestamp_from: new Date(document.getElementById("event_timestamp_from").value), + event_timestamp_to: new Date(document.getElementById("event_timestamp_to").value), + event_type: document.getElementById("event_type").value, + }; + + await updateDoc(docRef, updatedData); + alert("Event updated successfully!"); + editModal.hide(); // Close the modal + loadEvents(map); // Refresh the event list + } catch (error) { + console.error("Error updating event: ", error); + } + }); + } else { + alert("Document does not exist!"); + } + } +} + +export { loadEvents }; \ No newline at end of file diff --git a/Jun_Youngsang/js/firebase.js b/Jun_Youngsang/js/firebase.js new file mode 100644 index 0000000..c0aba9b --- /dev/null +++ b/Jun_Youngsang/js/firebase.js @@ -0,0 +1,27 @@ +// Import the functions you need from the SDKs you need +import { initializeApp } from "https://www.gstatic.com/firebasejs/11.0.1/firebase-app.js"; +import { getFirestore, collection, addDoc, getDocs, doc, deleteDoc, updateDoc, getDoc } from "https://www.gstatic.com/firebasejs/11.0.1/firebase-firestore.js"; +import { getAnalytics } from "https://www.gstatic.com/firebasejs/11.0.1/firebase-analytics.js"; + +// TODO: Add SDKs for Firebase products that you want to use +// https://firebase.google.com/docs/web/setup#available-libraries + +// Your web app's Firebase configuration +// For Firebase JS SDK v7.20.0 and later, measurementId is optional + +const firebaseConfig = { + apiKey: "AIzaSyC5xj_4S1dTuUT_nxNznnx7yA1ebllh-vw", + authDomain: "base-management-system-jun.firebaseapp.com", + projectId: "base-management-system-jun", + storageBucket: "base-management-system-jun.firebasestorage.app", + messagingSenderId: "362513632673", + appId: "1:362513632673:web:fae45d9f33c9eb97c9cfe0", + measurementId: "G-Q8EQ3BS3T2", +}; + +// Initialize Firebase +const app = initializeApp(firebaseConfig); +const analytics = getAnalytics(app); +const db = getFirestore(app); + +export { app, analytics, db, collection, addDoc, getDocs, doc, deleteDoc, updateDoc, getDoc }; \ No newline at end of file diff --git a/Jun_Youngsang/js/geocoder.js b/Jun_Youngsang/js/geocoder.js new file mode 100644 index 0000000..0d8a427 --- /dev/null +++ b/Jun_Youngsang/js/geocoder.js @@ -0,0 +1,14 @@ +function setupGeocoder(map) { + // Add the control to the map. + const geocoder = new MapboxGeocoder({ + accessToken: mapboxgl.accessToken, + bbox: [-76.34, 36.9, -76.25, 36.97], + language: 'en-US', + countries: 'us', + mapboxgl: mapboxgl, + }); + + document.getElementById('geocoder').appendChild(geocoder.onAdd(map)); +} + +export { setupGeocoder }; diff --git a/Jun_Youngsang/js/layers.js b/Jun_Youngsang/js/layers.js new file mode 100644 index 0000000..1c0f734 --- /dev/null +++ b/Jun_Youngsang/js/layers.js @@ -0,0 +1,61 @@ + +function addLayers(map) { + // Add Source Layer + map.addSource('bases', { + 'type': 'geojson', + 'data': './data/layers/updated_geojson_file 2.geojson', + }); + + // Add a new source from our GeoJSON data and + // set the 'cluster' option to true. GL-JS will + // add the point_count property to your source data. + + const layers = [ + { + 'id': 'base-borders', + 'source': 'bases', + 'type': 'line', + 'paint': { + 'line-color': [ + 'match', + ['get', 'siteReportingComponent'], + 'usaf', 'rgba(0, 240, 240, 0.5)', + 'usa', 'rgba(0, 240, 0, 0.5)', + 'usmc', 'rgba(240, 0, 0, 0.5)', + 'usn', 'rgba(0, 0, 240, 0.5)', + 'rgba(100, 100, 100, 0.5)', + ], + 'line-width': 4, + }, + }, + { + 'id': 'base-fills', + 'source': 'bases', + 'type': 'fill', + 'paint': { + 'fill-color': [ + 'match', + ['get', 'siteReportingComponent'], + 'usaf', 'rgba(0, 240, 240, 0.5)', + 'usa', 'rgba(0, 240, 0, 0.5)', + 'usmc', 'rgba(240, 0, 0, 0.5)', + 'usn', 'rgba(0, 0, 240, 0.5)', + 'rgba(100, 100, 100, 0.5)', + ], + 'fill-opacity': [ + 'case', + ['boolean', ['feature-state', 'hover'], false], + 1, + 0.5, + ], + }, + }, + ]; + + // Add All Layers to the Map + layers.forEach((layer) => { + map.addLayer(layer); + }); + +} +export { addLayers }; diff --git a/Jun_Youngsang/js/main.js b/Jun_Youngsang/js/main.js new file mode 100644 index 0000000..8ec418b --- /dev/null +++ b/Jun_Youngsang/js/main.js @@ -0,0 +1,126 @@ +import { db, collection, addDoc } from './firebase.js'; +import { setupMap } from './map-setup.js'; +import { setupGeocoder } from './geocoder.js'; +import { addLayers } from './layers.js'; +import { loadEvents } from './eventlist.js'; + +mapboxgl.accessToken = 'pk.eyJ1IjoieWptYXJrIiwiYSI6ImNtMHlwOG81NTBxZ2kya3BsZXp5MXJ5Z2wifQ.ijwd5rmGXOOJtSao2rNQhg'; +const map = setupMap(); + +new mapboxgl.Popup({ closeOnClick: false }) +.setLngLat([-76.295, 36.965]) +.setHTML(` +

    Base Management System by Youngsang Jun

    +

    About Base Management System

    +

    Base Management System is a system for manage all kinds of events in a military base, such as training, exercise, sports, construction projects etc. This engagement project uses the Norfolk Naval Base in Virginia as an example. Therefore, the expected primary users of this system are the personnel stationed at the Norfolk Naval Base. The system will share schedules and locations of activities with relevant personnel within the base.

    +

    Notes

    +

    - This dataset is fictitious and does not reflect actual data.

    +`) +.addTo(map); + +// 초기 레이어 및 소스 추가 +map.on('load', () => { + addLayers(map); + loadEvents(map); +}); +setupGeocoder(map); + +map.on("click", (e) => { + // Add Event Button only in the base-fills layer + const features = map.queryRenderedFeatures(e.point, { + layers: ['base-fills'] + }); + if (features.length) { + const lat = e.lngLat.lat.toFixed(6); + const lng = e.lngLat.lng.toFixed(6); + + // Fill the event_place coordination input field with the clicked location + const eventPlaceInput = document.getElementById("event_place"); + eventPlaceInput.value = `${lat}, ${lng}`; + + // Add marker on the clicked location + if (window.selectedMarker) { + window.selectedMarker.remove(); // Remove the existing marker + } + + window.selectedMarker = new mapboxgl.Marker() + .setLngLat([lng, lat]) + .addTo(map); + + const popupContent = document.createElement("div"); + popupContent.innerHTML = ` + + `; + + new mapboxgl.Popup({ offset: -5 }) + .setLngLat([lng, lat]) + .setDOMContent(popupContent) + .addTo(map); + + // Add Event + popupContent.querySelector("#addEventButton").addEventListener("click", () => { + // 폼 초기화: 모든 입력 필드를 빈 값으로 설정 + const form = document.getElementById("eventForm"); + form.reset(); + + // Add event + document.getElementById("event_place").value = `${lat}, ${lng}`; + document.getElementById("event_name").focus(); // 이벤트 이름 입력 필드에 포커스 + // Bootstrap modal + const addEventModal = new bootstrap.Modal(document.getElementById("eventModal")); + addEventModal.show(); + }); + } +}); + +document.getElementById("confirmButton").addEventListener("click", async () => { + const form = document.getElementById("eventForm"); + + // Import the values from the form + const event_charge = document.getElementById("event_charge").value; + const event_name = document.getElementById("event_name").value; + const event_org = document.getElementById("event_org").value; + const event_personnum = parseInt(document.getElementById("event_personnum").value, 10); + const [lat, lng] = document.getElementById("event_place").value.split(",").map(Number); + const event_timestamp_from = new Date(document.getElementById("event_timestamp_from").value); + const event_timestamp_to = new Date(document.getElementById("event_timestamp_to").value); + const event_type = document.getElementById("event_type").value; + + if (!event_charge || !event_name || isNaN(lat) || isNaN(lng)) { + alert("Please fill in all required fields correctly!"); + return; + } + + try { + // Save the event to Firestore + await addDoc(collection(db, "base_event_reports"), { + event_charge, + event_name, + event_org, + event_personnum, + event_place: { latitude: lat, longitude: lng }, + event_timestamp_from, + event_timestamp_to, + event_type, + }); + + alert("Event successfully saved!"); + form.reset(); + document.querySelector('#eventModal .btn-close').click(); + loadEvents(map); + } catch (error) { + console.error("Error adding document: ", error); + alert("Failed to save event!"); + } +}); + +document.getElementById("eventModal").addEventListener("hidden.bs.modal", () => { + + const backdrops = document.querySelectorAll(".modal-backdrop"); + backdrops.forEach((backdrop) => backdrop.remove()); + + document.body.classList.remove("modal-open"); + document.body.style.overflow = ""; +}); \ No newline at end of file diff --git a/Jun_Youngsang/js/map-setup.js b/Jun_Youngsang/js/map-setup.js new file mode 100644 index 0000000..a05a114 --- /dev/null +++ b/Jun_Youngsang/js/map-setup.js @@ -0,0 +1,23 @@ +function setupMap() { + const map = new mapboxgl.Map({ + container: 'map', + style: 'mapbox://styles/mapbox/outdoors-v12', + center: [-76.29736398778428, 36.94070755], + maxBounds: [ + [-76.44, 36.8], + [-76.15, 37.07] + ], + maxZoom: 15, + minZoom: 1, + zoom: 13, + }); + + // 내비게이션 및 스케일 컨트롤 추가 + const nav = new mapboxgl.NavigationControl(); + map.addControl(nav, 'top-left'); + map.addControl(new mapboxgl.ScaleControl()); + + return map; +} + +export { setupMap }; diff --git a/Jun_Youngsang/js/map.js.bak b/Jun_Youngsang/js/map.js.bak new file mode 100644 index 0000000..dc515e6 --- /dev/null +++ b/Jun_Youngsang/js/map.js.bak @@ -0,0 +1,651 @@ +mapboxgl.accessToken = 'pk.eyJ1IjoieWptYXJrIiwiYSI6ImNtMHlwOG81NTBxZ2kya3BsZXp5MXJ5Z2wifQ.ijwd5rmGXOOJtSao2rNQhg'; + + const map = new mapboxgl.Map({ + container: 'map', + // Choose from Mapbox's core styles, or make your own style with Mapbox Studio + style: 'mapbox://styles/mapbox/satellite-streets-v12', + center: [-98, 38.88], + maxZoom: 15, + minZoom: 1, + zoom: 3 + }); + + // 마우스 오버/아웃을 위한 전역 변수 + let hoveredPolygonId = null; + let bases = []; + + const nav = new mapboxgl.NavigationControl(); + map.addControl(new mapboxgl.ScaleControl()); + // Holds visible airport features for filtering + map.addControl(nav, 'top-left'); + + const popup = new mapboxgl.Popup({ closeOnClick: false }) + .setLngLat([-96, 62.8]) + .setHTML(` +

    DefenseBoard

    +

    About DefenseBoard

    +

    - DefenseBoard is a dashboard that uses spatial data to link various types of attributes in the defense sector such as military personnel, facilities, budget, logistics, etc.

    +

    - The map on the right displays publicly accessible base locations across the United States, while on the left, users can view attribute data by base, military unit, or region.

    +

    - Users can also access congressional inquiries and related laws and regulations via links.

    +

    Notes

    +

    - The DoD installations are commonly referred to as a base, camp, post, station, yard, center, homeport facility for any ship, or other activity under the jurisdiction, custody, control of the DoD. Publicly releasable locations of DoD Sites in the 50 states, Puerto Rico, and Guam available through data.gov.

    +

    - This dataset was created from source data provided by the four Military Service Component headquarters and was compiled by the Defense Installation Spatial Data Infrastructure (DISDI) Program within the Office of the Deputy Under Secretary of Defense for Installations and Environment, Business Enterprise Integration Directorate. Sites were selected from the 2009 Base Structure Report (BSR), a summary of the DoD Real Property Inventory.

    +

    - The military facility budgets per base for 2023-2025 used in DefenseBoard are fictitious and do not reflect actual data.

    +

    Reference

    +

    https://comptroller.defense.gov/Budget-Materials/Budget2025/#press

    + `) + .addTo(map); + + const filterEl = document.getElementById('feature-filter'); + const listingEl = document.getElementById('feature-listing'); + + function renderListings(features) { + const empty = document.createElement('p'); + // Clear any existing listings + listingEl.innerHTML = ''; + + features = features.sort((a, b) => { + return a.properties['siteName'].localeCompare( + b.properties['siteName'] + ); + }) + + if (features.length) { + for (const feature of features) { + const itemLink = document.createElement('a'); + const label = `${feature.properties.siteName} (${feature.properties.siteReportingComponent})`; + let currentPopup = null; + itemLink.href = '#'; + itemLink.textContent = label; + itemLink.addEventListener('mouseover', () => { + const coordinates = feature.geometry.coordinates; + const center = Array.isArray(coordinates[0]) ? coordinates[0][0] : coordinates; + + if (currentPopup) { + currentPopup.remove(); + } + + // 새 팝업 생성 및 전역 변수에 저장 + currentPopup = new mapboxgl.Popup() + .setLngLat(center) + .setHTML(label) + .addTo(map); + }); + itemLink.addEventListener('mouseout', () => { + if (currentPopup) { + currentPopup.remove(); + currentPopup = null; // 팝업 변수 초기화 + } + }); + itemLink.addEventListener('click', (e) => { + e.preventDefault(); // 기본 동작 방지 + + const coordinates = feature.geometry.coordinates; + const center = Array.isArray(coordinates[0]) ? coordinates[0][0] : coordinates; + + map.flyTo({ + center: center, + zoom: 9, // 원하는 줌 레벨 + essential: true // 애니메이션 필수로 설정 + }); + }); + + + + listingEl.appendChild(itemLink); + } + + // Show the filter input + filterEl.parentNode.style.display = 'block'; + } else if (features.length === 0 && filterEl.value !== '') { + empty.textContent = 'No results found'; + listingEl.appendChild(empty); + } else { + empty.textContent = 'Drag the map to populate results'; + listingEl.appendChild(empty); + + // Hide the filter input + filterEl.parentNode.style.display = 'none'; + + // remove features filter + map.setFilter('base-fills', ['has', 'siteReportingComponent']); + } + + + } + + function normalize(string) { + return string.trim().toLowerCase(); + } + + // Because features come from tiled vector data, + // feature geometries may be split + // or duplicated across tile boundaries. + // As a result, features may appear + // multiple times in query results. + function getUniqueFeatures(features, comparatorProperty) { + const uniqueIds = new Set(); + const uniqueFeatures = []; + for (const feature of features) { + const id = feature.properties[comparatorProperty]; + if (!uniqueIds.has(id)) { + uniqueIds.add(id); + uniqueFeatures.push(feature); + } + } + return uniqueFeatures; + } + +// 레이어 및 소스 추가 함수 + function addLayers() { + + // 소스 추가 + map.addSource('bases', { + 'type': 'geojson', + 'data': './data/layers/updated_geojson_file.geojson' + }); + + // Add a new source from our GeoJSON data and + // set the 'cluster' option to true. GL-JS will + // add the point_count property to your source data. + map.addSource('bases_point', { + type: 'geojson', + data: './data/layers/NTAD_Military_Bases_updated_v2.geojson', + cluster: true, + clusterMaxZoom: 14, // Max zoom to cluster points on + clusterRadius: 50, + clusterProperties: { + "totalAmount2025": ["+", ["coalesce", ["get", "B2025"], 0]], // amount 속성의 합계를 클러스터에 계산 + "totalAmount2024": ["+", ["coalesce", ["get", "B2024"], 0]], // amount 속성의 합계를 클러스터에 계산 + "totalAmount2023": ["+", ["coalesce", ["get", "B2023"], 0]] // amount 속성의 합계를 클러스터에 계산 + } + }); + + const layers = [ + { + 'id': 'base-borders', + 'source': 'bases', + 'type': 'line', + 'paint': { + 'line-color': [ + 'match', + ['get', 'siteReportingComponent'], + 'usaf', 'rgba(0, 240, 240, 0.5)', + 'usa', 'rgba(0, 240, 0, 0.5)', + 'usmc', 'rgba(240, 0, 0, 0.5)', + 'usn', 'rgba(0, 0, 240, 0.5)', + 'rgba(100, 100, 100, 0.5)', + ], + 'line-width': 4 + } + }, + { + 'id': 'base-fills', + 'source': 'bases', + 'type': 'fill', + 'paint': { + 'fill-color': [ + 'match', + ['get', 'siteReportingComponent'], + 'usaf', 'rgba(0, 240, 240, 0.5)', + 'usa', 'rgba(0, 240, 0, 0.5)', + 'usmc', 'rgba(240, 0, 0, 0.5)', + 'usn', 'rgba(0, 0, 240, 0.5)', + 'rgba(100, 100, 100, 0.5)', + ], + 'fill-opacity': [ + 'case', + ['boolean', ['feature-state', 'hover'], false], + 1, + 0.5 + ] + } + }, + { + id: 'clusters2025', + type: 'circle', + source: 'bases_point', + filter: [ + 'all', + ['has', 'point_count'], // 클러스터인 경우에만 + ['>', ['get', 'totalAmount2025'], 0] // totalAmount > 0인 경우에만 + ], + paint: { + // Use step expressions (https://docs.mapbox.com/style-spec/reference/expressions/#step) + // with three steps to implement three types of circles: + // * Blue, 20px circles when point count is less than 100 + // * Yellow, 30px circles when point count is between 100 and 750 + // * Pink, 40px circles when point count is greater than or equal to 750 + 'circle-color': [ + 'step', + ['get', 'totalAmount2025'], + '#51bbd6', + 100000, + '#f1f075', + 750000, + '#f28cb1' + ], + 'circle-radius': [ + 'step', + ['get', 'totalAmount2025'], + 20, + 100000, + 30, + 750000, + 40 + ] + }, + layout: { + 'visibility': 'none' // 기본적으로 비활성화 + } + }, + { + id: 'cluster-count2025', + type: 'symbol', + source: 'bases_point', + filter: [ + 'all', + ['has', 'point_count'], // 클러스터인 경우에만 + ['>', ['get', 'totalAmount2025'], 0] // totalAmount > 0인 경우에만 + ], + layout: { + 'text-field': '{totalAmount2025}', + 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'], + 'text-size': 12, + 'visibility': 'none' // 기본적으로 비활성화 + } + }, + { + id: 'clusters2024', + type: 'circle', + source: 'bases_point', + filter: [ + 'all', + ['has', 'point_count'], // 클러스터인 경우에만 + ['>', ['get', 'totalAmount2024'], 0] // totalAmount > 0인 경우에만 + ], + paint: { + // Use step expressions (https://docs.mapbox.com/style-spec/reference/expressions/#step) + // with three steps to implement three types of circles: + // * Blue, 20px circles when point count is less than 100 + // * Yellow, 30px circles when point count is between 100 and 750 + // * Pink, 40px circles when point count is greater than or equal to 750 + 'circle-color': [ + 'step', + ['get', 'totalAmount2024'], + '#51bbd6', + 100000, + '#f1f075', + 750000, + '#f28cb1' + ], + 'circle-radius': [ + 'step', + ['get', 'totalAmount2024'], + 20, + 100000, + 30, + 750000, + 40 + ] + }, + layout: { + 'visibility': 'none' // 기본적으로 비활성화 + } + }, + { + id: 'cluster-count2024', + type: 'symbol', + source: 'bases_point', + filter: [ + 'all', + ['has', 'point_count'], // 클러스터인 경우에만 + ['>', ['get', 'totalAmount2024'], 0] // totalAmount > 0인 경우에만 + ], + layout: { + 'text-field': '{totalAmount2024}', + 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'], + 'text-size': 12, + 'visibility': 'none' // 기본적으로 비활성화 + } + }, + { + id: 'clusters2023', + type: 'circle', + source: 'bases_point', + filter: [ + 'all', + ['has', 'point_count'], // 클러스터인 경우에만 + ['>', ['get', 'totalAmount2023'], 0] // totalAmount > 0인 경우에만 + ], + paint: { + // Use step expressions (https://docs.mapbox.com/style-spec/reference/expressions/#step) + // with three steps to implement three types of circles: + // * Blue, 20px circles when point count is less than 100 + // * Yellow, 30px circles when point count is between 100 and 750 + // * Pink, 40px circles when point count is greater than or equal to 750 + 'circle-color': [ + 'step', + ['get', 'totalAmount2023'], + '#51bbd6', + 100000, + '#f1f075', + 750000, + '#f28cb1' + ], + 'circle-radius': [ + 'step', + ['get', 'totalAmount2023'], + 20, + 100000, + 30, + 750000, + 40 + ] + }, + layout: { + 'visibility': 'none' // 기본적으로 비활성화 + } + }, + { + id: 'cluster-count2023', + type: 'symbol', + source: 'bases_point', + filter: [ + 'all', + ['has', 'point_count'], // 클러스터인 경우에만 + ['>', ['get', 'totalAmount2023'], 0] // totalAmount > 0인 경우에만 + ], + layout: { + 'text-field': '{totalAmount2023}', + 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'], + 'text-size': 12, + 'visibility': 'none' // 기본적으로 비활성화 + } + }, + { + id: 'unclustered-point', + type: 'circle', + source: 'bases_point', + filter: ['!', ['has', 'point_count']], + paint: { + 'circle-color': '#11b4da', + 'circle-radius': 4, + 'circle-stroke-width': 1, + 'circle-stroke-color': '#fff' + } + } + ]; + + // 모든 레이어 추가 + layers.forEach((layer) => { + map.addLayer(layer); + }); + + map.on('movestart', () => { + // reset features filter as the map starts moving + map.setFilter('base-fills', ['has', 'siteReportingComponent']); + }); + + map.on('moveend', () => { + const features = map.queryRenderedFeatures({ layers: ['base-fills'] }); + + if (features) { + const uniqueFeatures = getUniqueFeatures(features, 'siteName'); + // Populate features for the listing overlay. + renderListings(uniqueFeatures); + + // Clear the input container + filterEl.value = ''; + + // Store the current features in sn `airports` variable to + // later use for filtering on `keyup`. + bases = uniqueFeatures; + } + }); + + filterEl.addEventListener('keyup', (e) => { + const value = normalize(e.target.value); + + // Filter visible features that match the input value. + const filtered = []; + for (const feature of bases) { + const name = normalize(feature.properties.siteName); + const code = normalize(feature.properties.siteReportingComponent); + if (name.includes(value) || code.includes(value)) { + filtered.push(feature); + } + } + + // Populate the sidebar with filtered results + renderListings(filtered); + + // Set the filter to populate features into the layer. + if (filtered.length) { + map.setFilter('base-fills', [ + 'match', + ['get', 'siteName'], + filtered.map((feature) => { + return feature.properties.siteName; + }), + true, + false + ]); + } + }); + + // Call this function on initialization + // passing an empty array to render an empty state + renderListings([]); + + map.on('click', 'base-fills', (e) => { + // if (currentPopup) { + // currentPopup.remove(); + // } + new mapboxgl.Popup() + .setLngLat(e.lngLat) + .setHTML(`${e.features[0].properties.siteName} (${e.features[0].properties.siteReportingComponent})`) + .addTo(map); + const coordinates = e.lngLat; + const center = Array.isArray(coordinates[0]) ? coordinates[0] : coordinates; + map.flyTo({ + center: center, + zoom: 9, // 원하는 줌 레벨 + essential: true // 애니메이션 필수로 설정 + }); + }); + // When the user moves their mouse over the state-fill layer, we'll update the + // feature state for the feature under the mouse. + map.on('mousemove', 'base-fills', (e) => { + if (e.features.length > 0) { + if (hoveredPolygonId !== null) { + map.setFeatureState( + { source: 'bases', id: hoveredPolygonId }, + { hover: false } + ); + } + hoveredPolygonId = e.features[0].installationId; + map.setFeatureState( + { source: 'bases', id: hoveredPolygonId }, + { hover: true } + ); + } + }); + + // Change the cursor to a pointer when + // the mouse is over the states layer. + map.on('mouseenter', 'base-fills', () => { + map.getCanvas().style.cursor = 'pointer'; + }); + + // Change the cursor back to a pointer + // when it leaves the states layer. + // When the mouse leaves the state-fill layer, update the feature state of the + // previously hovered feature. + map.on('mouseleave', 'base-fills', () => { + map.getCanvas().style.cursor = ''; + if (hoveredPolygonId !== null) { + map.setFeatureState( + { source: 'bases', id: hoveredPolygonId }, + { hover: false } + ); + } + hoveredPolygonId = null; + }); + + // inspect a cluster on click + map.on('click', 'clusters2025', (e) => { + const features = map.queryRenderedFeatures(e.point, { + layers: ['clusters2025'] + }); + const clusterId = features[0].properties.cluster_id; + map.getSource('bases_point').getClusterExpansionZoom( + clusterId, + (err, zoom) => { + if (err) return; + + map.easeTo({ + center: features[0].geometry.coordinates, + zoom: zoom + }); + } + ); + }); + map.on('click', 'clusters2024', (e) => { + const features = map.queryRenderedFeatures(e.point, { + layers: ['clusters2024'] + }); + const clusterId = features[0].properties.cluster_id; + map.getSource('bases_point').getClusterExpansionZoom( + clusterId, + (err, zoom) => { + if (err) return; + + map.easeTo({ + center: features[0].geometry.coordinates, + zoom: zoom + }); + } + ); + }); + map.on('click', 'clusters2023', (e) => { + const features = map.queryRenderedFeatures(e.point, { + layers: ['clusters2023'] + }); + const clusterId = features[0].properties.cluster_id; + map.getSource('bases_point').getClusterExpansionZoom( + clusterId, + (err, zoom) => { + if (err) return; + + map.easeTo({ + center: features[0].geometry.coordinates, + zoom: zoom + }); + } + ); + }); + + // When a click event occurs on a feature in + // the unclustered-point layer, open a popup at + // the location of the feature, with + // description HTML from its properties. + map.on('click', 'unclustered-point', (e) => { + const coordinates = e.features[0].geometry.coordinates.slice(); + const mag = e.features[0].properties.B2025; + const tsunami = + e.features[0].properties.tsunami === 1 ? 'yes' : 'no'; + + // Ensure that if the map is zoomed out such that + // multiple copies of the feature are visible, the + // popup appears over the copy being pointed to. + if (['mercator', 'equirectangular'].includes(map.getProjection().name)) { + while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) { + coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360; + } + } + }); + + map.on('mouseenter', 'clusters2025', () => { + map.getCanvas().style.cursor = 'pointer'; + }); + map.on('mouseleave', 'clusters2025', () => { + map.getCanvas().style.cursor = ''; + }); + map.on('mouseenter', 'clusters2024', () => { + map.getCanvas().style.cursor = 'pointer'; + }); + map.on('mouseleave', 'clusters2024', () => { + map.getCanvas().style.cursor = ''; + }); + map.on('mouseenter', 'clusters2023', () => { + map.getCanvas().style.cursor = 'pointer'; + }); + map.on('mouseleave', 'clusters2023', () => { + map.getCanvas().style.cursor = ''; + }); + + } + + // 레이어 그룹 토글 버튼 생성 함 + function createGroupToggleButton(groupName, layerIds) { + const container = document.getElementById('groupToggleContainer'); + const button = document.createElement('button'); + button.textContent = `View/hide ${groupName}`; + button.onclick = () => toggleGroupVisibility(layerIds); + button.classList.add('toggle-button'); + container.appendChild(button); + } + + // 레이어 가시성 토글 함수 + function toggleGroupVisibility(layerIds) { + layerIds.forEach(layerId => { + const visibility = map.getLayoutProperty(layerId, 'visibility'); + + // 현재 가시성 상태에 따라 토글 + if (visibility === 'visible' || visibility === undefined) { + map.setLayoutProperty(layerId, 'visibility', 'none'); + } else { + map.setLayoutProperty(layerId, 'visibility', 'visible'); + } + }); + } + + // 초기 레이어 및 소스 추가 + map.on('load', () => { + addLayers(); + }); + + // Add the control to the map. + const geocoder = new MapboxGeocoder({ + accessToken: mapboxgl.accessToken, + language: 'en-US', + countries: 'us', + mapboxgl: mapboxgl + }); + + document.getElementById('geocoder').appendChild(geocoder.onAdd(map)); + + // 레이어 선택을 위한 버튼 설정 + const layerList = document.getElementById('backgroundmap'); + const inputs = layerList.getElementsByTagName('input'); + for (const input of inputs) { + input.onclick = (layer) => { + const layerId = layer.target.id; + map.setStyle('mapbox://styles/mapbox/' + layerId); + }; + } + + // 레이어 토글 버튼 생성 + createGroupToggleButton('Installations', ['base-borders', 'base-fills']); + createGroupToggleButton('FY2025 Installation Budget', ['clusters2025', 'unclustered-point', 'cluster-count2025']); + createGroupToggleButton('FY2024 Installation Budget', ['clusters2024', 'unclustered-point', 'cluster-count2024']); + createGroupToggleButton('FY2023 Installation Budget', ['clusters2023', 'unclustered-point', 'cluster-count2023']); + // 새로운 스타일 로드 시 레이어 복원 + map.on('styledata', () => { + if (!map.getSource('bases')) { + addLayers(); // 소스와 레이어가 없는 경우에만 추가 + } + }); + + \ No newline at end of file diff --git a/Jun_Youngsang/package-lock.json b/Jun_Youngsang/package-lock.json new file mode 100644 index 0000000..ae02496 --- /dev/null +++ b/Jun_Youngsang/package-lock.json @@ -0,0 +1,1621 @@ +{ + "name": "Jun_Youngsang", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@eslint/js": "^9.13.0", + "@typescript-eslint/eslint-plugin": "^8.11.0", + "eslint": "^9.13.0", + "globals": "^15.11.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.2.tgz", + "integrity": "sha512-2WwyTYNVaMNUWPZTOJdkax9iqTdirrApgTbk+Qoq5EPX6myqZvG8QGFRgdKmkjKVG6/G/a565vpPauHk0+hpBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/core": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz", + "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz", + "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz", + "integrity": "sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/type-utils": "8.11.0", + "@typescript-eslint/utils": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.11.0.tgz", + "integrity": "sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz", + "integrity": "sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz", + "integrity": "sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/utils": "8.11.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz", + "integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz", + "integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.11.0.tgz", + "integrity": "sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz", + "integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.11.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", + "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz", + "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.7.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.13.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", + "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/Jun_Youngsang/package.json b/Jun_Youngsang/package.json new file mode 100644 index 0000000..1cd110a --- /dev/null +++ b/Jun_Youngsang/package.json @@ -0,0 +1,9 @@ +{ + "type": "module", + "devDependencies": { + "@eslint/js": "^9.13.0", + "@typescript-eslint/eslint-plugin": "^8.11.0", + "eslint": "^9.13.0", + "globals": "^15.11.0" + } +} From 55271ab7dad5cb3bec53ba44ebaa8fa562586a3e Mon Sep 17 00:00:00 2001 From: Youngsang Jun Date: Wed, 18 Dec 2024 03:49:08 -0500 Subject: [PATCH 2/2] Commit 1 (Dec 18 0345) Commit 1 (Dec 18 0345) --- Jun_Youngsang/eslint.config.js | 0 Jun_Youngsang/package-lock.json | 983 +++++++++++++++++++++++++++++- Jun_Youngsang/package.json | 4 +- Jun_Youngsang/stylelint.config.js | 5 + 4 files changed, 983 insertions(+), 9 deletions(-) mode change 100644 => 100755 Jun_Youngsang/eslint.config.js create mode 100644 Jun_Youngsang/stylelint.config.js diff --git a/Jun_Youngsang/eslint.config.js b/Jun_Youngsang/eslint.config.js old mode 100644 new mode 100755 diff --git a/Jun_Youngsang/package-lock.json b/Jun_Youngsang/package-lock.json index ae02496..20fa990 100644 --- a/Jun_Youngsang/package-lock.json +++ b/Jun_Youngsang/package-lock.json @@ -8,7 +8,135 @@ "@eslint/js": "^9.13.0", "@typescript-eslint/eslint-plugin": "^8.11.0", "eslint": "^9.13.0", - "globals": "^15.11.0" + "globals": "^15.11.0", + "stylelint": "^16.12.0", + "stylelint-config-standard": "^36.0.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/@eslint-community/eslint-utils": { @@ -171,9 +299,9 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz", - "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", + "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -518,6 +646,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -541,6 +679,26 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -618,6 +776,13 @@ "dev": true, "license": "MIT" }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -625,10 +790,37 @@ "dev": true, "license": "MIT" }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -640,6 +832,43 @@ "node": ">= 8" } }, + "node_modules/css-functions-list": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12 || >=16" + } + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", @@ -665,6 +894,46 @@ "dev": true, "license": "MIT" }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -934,6 +1203,23 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -1021,6 +1307,47 @@ "node": ">=10.13.0" } }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { "version": "15.11.0", "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", @@ -1034,6 +1361,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true, + "license": "MIT" + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -1051,6 +1406,19 @@ "node": ">=8" } }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -1088,6 +1456,20 @@ "node": ">=0.8.19" } }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1098,6 +1480,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -1121,6 +1513,16 @@ "node": ">=0.12.0" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1128,6 +1530,13 @@ "dev": true, "license": "ISC" }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1148,6 +1557,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -1172,7 +1588,24 @@ "json-buffer": "3.0.1" } }, - "node_modules/levn": { + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/known-css-properties": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", + "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", @@ -1186,6 +1619,13 @@ "node": ">= 0.8.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -1209,6 +1649,44 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -1256,6 +1734,25 @@ "dev": true, "license": "MIT" }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -1263,6 +1760,16 @@ "dev": true, "license": "MIT" }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -1326,6 +1833,25 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -1346,6 +1872,23 @@ "node": ">=8" } }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -1359,6 +1902,90 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -1400,6 +2027,16 @@ ], "license": "MIT" }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -1481,6 +2118,85 @@ "node": ">=8" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -1494,6 +2210,172 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylelint": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.12.0.tgz", + "integrity": "sha512-F8zZ3L/rBpuoBZRvI4JVT20ZanPLXfQLzMOZg1tzPflRVh9mKpOZ8qcSIhh1my3FjAjZWG4T2POwGnmn6a6hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.0.1", + "debug": "^4.3.7", + "fast-glob": "^3.3.2", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^9.1.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^6.0.2", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.35.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "supports-hyperlinks": "^3.1.0", + "svg-tags": "^1.0.0", + "table": "^6.9.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz", + "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint-config-standard": { + "version": "36.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-36.0.1.tgz", + "integrity": "sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "stylelint-config-recommended": "^14.0.1" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/node_modules/flat-cache": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.3.1", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/node_modules/ignore": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1507,6 +2389,70 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -1578,6 +2524,13 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -1604,6 +2557,20 @@ "node": ">=0.10.0" } }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/Jun_Youngsang/package.json b/Jun_Youngsang/package.json index 1cd110a..b3f87ae 100644 --- a/Jun_Youngsang/package.json +++ b/Jun_Youngsang/package.json @@ -4,6 +4,8 @@ "@eslint/js": "^9.13.0", "@typescript-eslint/eslint-plugin": "^8.11.0", "eslint": "^9.13.0", - "globals": "^15.11.0" + "globals": "^15.11.0", + "stylelint": "^16.12.0", + "stylelint-config-standard": "^36.0.1" } } diff --git a/Jun_Youngsang/stylelint.config.js b/Jun_Youngsang/stylelint.config.js new file mode 100644 index 0000000..0605362 --- /dev/null +++ b/Jun_Youngsang/stylelint.config.js @@ -0,0 +1,5 @@ +export default { + rules: { + "selector-id-pattern": null + } +}; \ No newline at end of file