50)return!1;if(a.type===i.default.OPEN_PAREN)r++;else if(a.type===i.default.CLOSE_PAREN&&0===--r)return!0;if(this.isForbiddenToken(a))return!1}return!1},t.prototype.isForbiddenToken=function(t){var e=t.type,n=t.value;return e===i.default.RESERVED_TOPLEVEL||e===i.default.RESERVED_NEWLINE||e===i.default.COMMENT||e===i.default.BLOCK_COMMENT||";"===n},t}();e.default=a,t.exports=e.default},function(t,e,n){"use strict";e.__esModule=!0;var r=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.params=e,this.index=0}return t.prototype.get=function(t){var e=t.key,n=t.value;return this.params?e?this.params[e]:this.params[this.index++]:n},t}();e.default=r,t.exports=e.default},function(t,e,n){var r=n(75),o=n(77),i=n(45),a=n(9),s=n(41),c=n(46),u=n(76),l=n(47),f="[object Map]",p="[object Set]",d=Object.prototype.hasOwnProperty;t.exports=function(t){if(null==t)return!0;if(s(t)&&(a(t)||"string"==typeof t||"function"==typeof t.splice||c(t)||l(t)||i(t)))return!t.length;var e=o(t);if(e==f||e==p)return!t.size;if(u(t))return!r(t).length;for(var n in t)if(d.call(t,n))return!1;return!0}},function(t,e,n){var r=n(199)(Object.keys,Object);t.exports=r},function(t,e){t.exports=function(t,e){return function(n){return t(e(n))}}},function(t,e,n){var r=n(12)(n(8),"DataView");t.exports=r},function(t,e,n){var r=n(74),o=n(202),i=n(20),a=n(78),s=/^\[object .+?Constructor\]$/,c=Function.prototype,u=Object.prototype,l=c.toString,f=u.hasOwnProperty,p=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!i(t)||o(t))&&(r(t)?p:s).test(a(t))}},function(t,e,n){var r,o=n(203),i=(r=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";t.exports=function(t){return!!i&&i in t}},function(t,e,n){var r=n(8)["__core-js_shared__"];t.exports=r},function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},function(t,e,n){var r=n(12)(n(8),"Promise");t.exports=r},function(t,e,n){var r=n(12)(n(8),"WeakMap");t.exports=r},function(t,e,n){var r=n(18),o=n(19),i="[object Arguments]";t.exports=function(t){return o(t)&&r(t)==i}},function(t,e){t.exports=function(){return!1}},function(t,e,n){var r=n(18),o=n(42),i=n(19),a={};a["[object Float32Array]"]=a["[object Float64Array]"]=a["[object Int8Array]"]=a["[object Int16Array]"]=a["[object Int32Array]"]=a["[object Uint8Array]"]=a["[object Uint8ClampedArray]"]=a["[object Uint16Array]"]=a["[object Uint32Array]"]=!0,a["[object Arguments]"]=a["[object Array]"]=a["[object ArrayBuffer]"]=a["[object Boolean]"]=a["[object DataView]"]=a["[object Date]"]=a["[object Error]"]=a["[object Function]"]=a["[object Map]"]=a["[object Number]"]=a["[object Object]"]=a["[object RegExp]"]=a["[object Set]"]=a["[object String]"]=a["[object WeakMap]"]=!1,t.exports=function(t){return i(t)&&o(t.length)&&!!a[r(t)]}},function(t,e){t.exports=function(t){return function(e){return t(e)}}},function(t,e,n){(function(t){var r=n(71),o=e&&!e.nodeType&&e,i=o&&"object"==typeof t&&t&&!t.nodeType&&t,a=i&&i.exports===o&&r.process,s=function(){try{var t=i&&i.require&&i.require("util").types;return t||a&&a.binding&&a.binding("util")}catch(t){}}();t.exports=s}).call(this,n(22)(t))},function(t,e,n){var r=n(17),o=/[\\^$.*+?()[\]{}|]/g,i=RegExp(o.source);t.exports=function(t){return(t=r(t))&&i.test(t)?t.replace(o,"\\$&"):t}},function(t,e,n){"use strict";e.__esModule=!0;var r=i(n(25)),o=i(n(26));function i(t){return t&&t.__esModule?t:{default:t}}var a=["ALL","ALTER","ANALYZE","AND","ANY","ARRAY","AS","ASC","BEGIN","BETWEEN","BINARY","BOOLEAN","BREAK","BUCKET","BUILD","BY","CALL","CASE","CAST","CLUSTER","COLLATE","COLLECTION","COMMIT","CONNECT","CONTINUE","CORRELATE","COVER","CREATE","DATABASE","DATASET","DATASTORE","DECLARE","DECREMENT","DELETE","DERIVED","DESC","DESCRIBE","DISTINCT","DO","DROP","EACH","ELEMENT","ELSE","END","EVERY","EXCEPT","EXCLUDE","EXECUTE","EXISTS","EXPLAIN","FALSE","FETCH","FIRST","FLATTEN","FOR","FORCE","FROM","FUNCTION","GRANT","GROUP","GSI","HAVING","IF","IGNORE","ILIKE","IN","INCLUDE","INCREMENT","INDEX","INFER","INLINE","INNER","INSERT","INTERSECT","INTO","IS","JOIN","KEY","KEYS","KEYSPACE","KNOWN","LAST","LEFT","LET","LETTING","LIKE","LIMIT","LSM","MAP","MAPPING","MATCHED","MATERIALIZED","MERGE","MINUS","MISSING","NAMESPACE","NEST","NOT","NULL","NUMBER","OBJECT","OFFSET","ON","OPTION","OR","ORDER","OUTER","OVER","PARSE","PARTITION","PASSWORD","PATH","POOL","PREPARE","PRIMARY","PRIVATE","PRIVILEGE","PROCEDURE","PUBLIC","RAW","REALM","REDUCE","RENAME","RETURN","RETURNING","REVOKE","RIGHT","ROLE","ROLLBACK","SATISFIES","SCHEMA","SELECT","SELF","SEMI","SET","SHOW","SOME","START","STATISTICS","STRING","SYSTEM","THEN","TO","TRANSACTION","TRIGGER","TRUE","TRUNCATE","UNDER","UNION","UNIQUE","UNKNOWN","UNNEST","UNSET","UPDATE","UPSERT","USE","USER","USING","VALIDATE","VALUE","VALUED","VALUES","VIA","VIEW","WHEN","WHERE","WHILE","WITH","WITHIN","WORK","XOR"],s=["DELETE FROM","EXCEPT ALL","EXCEPT","EXPLAIN DELETE FROM","EXPLAIN UPDATE","EXPLAIN UPSERT","FROM","GROUP BY","HAVING","INFER","INSERT INTO","INTERSECT ALL","INTERSECT","LET","LIMIT","MERGE","NEST","ORDER BY","PREPARE","SELECT","SET CURRENT SCHEMA","SET SCHEMA","SET","UNION ALL","UNION","UNNEST","UPDATE","UPSERT","USE KEYS","VALUES","WHERE"],c=["AND","INNER JOIN","JOIN","LEFT JOIN","LEFT OUTER JOIN","OR","OUTER JOIN","RIGHT JOIN","RIGHT OUTER JOIN","XOR"],u=void 0,l=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.cfg=e}return t.prototype.format=function(t){return u||(u=new o.default({reservedWords:a,reservedToplevelWords:s,reservedNewlineWords:c,stringTypes:['""',"''","``"],openParens:["(","[","{"],closeParens:[")","]","}"],namedPlaceholderTypes:["$"],lineCommentTypes:["#","--"]})),new r.default(this.cfg,u).format(t)},t}();e.default=l,t.exports=e.default},function(t,e,n){"use strict";e.__esModule=!0;var r=i(n(25)),o=i(n(26));function i(t){return t&&t.__esModule?t:{default:t}}var a=["A","ACCESSIBLE","AGENT","AGGREGATE","ALL","ALTER","ANY","ARRAY","AS","ASC","AT","ATTRIBUTE","AUTHID","AVG","BETWEEN","BFILE_BASE","BINARY_INTEGER","BINARY","BLOB_BASE","BLOCK","BODY","BOOLEAN","BOTH","BOUND","BULK","BY","BYTE","C","CALL","CALLING","CASCADE","CASE","CHAR_BASE","CHAR","CHARACTER","CHARSET","CHARSETFORM","CHARSETID","CHECK","CLOB_BASE","CLONE","CLOSE","CLUSTER","CLUSTERS","COALESCE","COLAUTH","COLLECT","COLUMNS","COMMENT","COMMIT","COMMITTED","COMPILED","COMPRESS","CONNECT","CONSTANT","CONSTRUCTOR","CONTEXT","CONTINUE","CONVERT","COUNT","CRASH","CREATE","CREDENTIAL","CURRENT","CURRVAL","CURSOR","CUSTOMDATUM","DANGLING","DATA","DATE_BASE","DATE","DAY","DECIMAL","DEFAULT","DEFINE","DELETE","DESC","DETERMINISTIC","DIRECTORY","DISTINCT","DO","DOUBLE","DROP","DURATION","ELEMENT","ELSIF","EMPTY","ESCAPE","EXCEPTIONS","EXCLUSIVE","EXECUTE","EXISTS","EXIT","EXTENDS","EXTERNAL","EXTRACT","FALSE","FETCH","FINAL","FIRST","FIXED","FLOAT","FOR","FORALL","FORCE","FROM","FUNCTION","GENERAL","GOTO","GRANT","GROUP","HASH","HEAP","HIDDEN","HOUR","IDENTIFIED","IF","IMMEDIATE","IN","INCLUDING","INDEX","INDEXES","INDICATOR","INDICES","INFINITE","INSTANTIABLE","INT","INTEGER","INTERFACE","INTERVAL","INTO","INVALIDATE","IS","ISOLATION","JAVA","LANGUAGE","LARGE","LEADING","LENGTH","LEVEL","LIBRARY","LIKE","LIKE2","LIKE4","LIKEC","LIMITED","LOCAL","LOCK","LONG","MAP","MAX","MAXLEN","MEMBER","MERGE","MIN","MINUS","MINUTE","MLSLABEL","MOD","MODE","MONTH","MULTISET","NAME","NAN","NATIONAL","NATIVE","NATURAL","NATURALN","NCHAR","NEW","NEXTVAL","NOCOMPRESS","NOCOPY","NOT","NOWAIT","NULL","NULLIF","NUMBER_BASE","NUMBER","OBJECT","OCICOLL","OCIDATE","OCIDATETIME","OCIDURATION","OCIINTERVAL","OCILOBLOCATOR","OCINUMBER","OCIRAW","OCIREF","OCIREFCURSOR","OCIROWID","OCISTRING","OCITYPE","OF","OLD","ON","ONLY","OPAQUE","OPEN","OPERATOR","OPTION","ORACLE","ORADATA","ORDER","ORGANIZATION","ORLANY","ORLVARY","OTHERS","OUT","OVERLAPS","OVERRIDING","PACKAGE","PARALLEL_ENABLE","PARAMETER","PARAMETERS","PARENT","PARTITION","PASCAL","PCTFREE","PIPE","PIPELINED","PLS_INTEGER","PLUGGABLE","POSITIVE","POSITIVEN","PRAGMA","PRECISION","PRIOR","PRIVATE","PROCEDURE","PUBLIC","RAISE","RANGE","RAW","READ","REAL","RECORD","REF","REFERENCE","RELEASE","RELIES_ON","REM","REMAINDER","RENAME","RESOURCE","RESULT_CACHE","RESULT","RETURN","RETURNING","REVERSE","REVOKE","ROLLBACK","ROW","ROWID","ROWNUM","ROWTYPE","SAMPLE","SAVE","SAVEPOINT","SB1","SB2","SB4","SECOND","SEGMENT","SELF","SEPARATE","SEQUENCE","SERIALIZABLE","SHARE","SHORT","SIZE_T","SIZE","SMALLINT","SOME","SPACE","SPARSE","SQL","SQLCODE","SQLDATA","SQLERRM","SQLNAME","SQLSTATE","STANDARD","START","STATIC","STDDEV","STORED","STRING","STRUCT","STYLE","SUBMULTISET","SUBPARTITION","SUBSTITUTABLE","SUBTYPE","SUCCESSFUL","SUM","SYNONYM","SYSDATE","TABAUTH","TABLE","TDO","THE","THEN","TIME","TIMESTAMP","TIMEZONE_ABBR","TIMEZONE_HOUR","TIMEZONE_MINUTE","TIMEZONE_REGION","TO","TRAILING","TRANSACTION","TRANSACTIONAL","TRIGGER","TRUE","TRUSTED","TYPE","UB1","UB2","UB4","UID","UNDER","UNIQUE","UNPLUG","UNSIGNED","UNTRUSTED","USE","USER","USING","VALIDATE","VALIST","VALUE","VARCHAR","VARCHAR2","VARIABLE","VARIANCE","VARRAY","VARYING","VIEW","VIEWS","VOID","WHENEVER","WHILE","WITH","WORK","WRAPPED","WRITE","YEAR","ZONE"],s=["ADD","ALTER COLUMN","ALTER TABLE","BEGIN","CONNECT BY","DECLARE","DELETE FROM","DELETE","END","EXCEPT","EXCEPTION","FETCH FIRST","FROM","GROUP BY","HAVING","INSERT INTO","INSERT","INTERSECT","LIMIT","LOOP","MODIFY","ORDER BY","SELECT","SET CURRENT SCHEMA","SET SCHEMA","SET","START WITH","UNION ALL","UNION","UPDATE","VALUES","WHERE"],c=["AND","CROSS APPLY","CROSS JOIN","ELSE","END","INNER JOIN","JOIN","LEFT JOIN","LEFT OUTER JOIN","OR","OUTER APPLY","OUTER JOIN","RIGHT JOIN","RIGHT OUTER JOIN","WHEN","XOR"],u=void 0,l=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.cfg=e}return t.prototype.format=function(t){return u||(u=new o.default({reservedWords:a,reservedToplevelWords:s,reservedNewlineWords:c,stringTypes:['""',"N''","''","``"],openParens:["(","CASE"],closeParens:[")","END"],indexedPlaceholderTypes:["?"],namedPlaceholderTypes:[":"],lineCommentTypes:["--"],specialWordChars:["_","$","#",".","@"]})),new r.default(this.cfg,u).format(t)},t}();e.default=l,t.exports=e.default},function(t,e,n){"use strict";e.__esModule=!0;var r=i(n(25)),o=i(n(26));function i(t){return t&&t.__esModule?t:{default:t}}var a=["ACCESSIBLE","ACTION","AGAINST","AGGREGATE","ALGORITHM","ALL","ALTER","ANALYSE","ANALYZE","AS","ASC","AUTOCOMMIT","AUTO_INCREMENT","BACKUP","BEGIN","BETWEEN","BINLOG","BOTH","CASCADE","CASE","CHANGE","CHANGED","CHARACTER SET","CHARSET","CHECK","CHECKSUM","COLLATE","COLLATION","COLUMN","COLUMNS","COMMENT","COMMIT","COMMITTED","COMPRESSED","CONCURRENT","CONSTRAINT","CONTAINS","CONVERT","CREATE","CROSS","CURRENT_TIMESTAMP","DATABASE","DATABASES","DAY","DAY_HOUR","DAY_MINUTE","DAY_SECOND","DEFAULT","DEFINER","DELAYED","DELETE","DESC","DESCRIBE","DETERMINISTIC","DISTINCT","DISTINCTROW","DIV","DO","DROP","DUMPFILE","DUPLICATE","DYNAMIC","ELSE","ENCLOSED","END","ENGINE","ENGINES","ENGINE_TYPE","ESCAPE","ESCAPED","EVENTS","EXEC","EXECUTE","EXISTS","EXPLAIN","EXTENDED","FAST","FETCH","FIELDS","FILE","FIRST","FIXED","FLUSH","FOR","FORCE","FOREIGN","FULL","FULLTEXT","FUNCTION","GLOBAL","GRANT","GRANTS","GROUP_CONCAT","HEAP","HIGH_PRIORITY","HOSTS","HOUR","HOUR_MINUTE","HOUR_SECOND","IDENTIFIED","IF","IFNULL","IGNORE","IN","INDEX","INDEXES","INFILE","INSERT","INSERT_ID","INSERT_METHOD","INTERVAL","INTO","INVOKER","IS","ISOLATION","KEY","KEYS","KILL","LAST_INSERT_ID","LEADING","LEVEL","LIKE","LINEAR","LINES","LOAD","LOCAL","LOCK","LOCKS","LOGS","LOW_PRIORITY","MARIA","MASTER","MASTER_CONNECT_RETRY","MASTER_HOST","MASTER_LOG_FILE","MATCH","MAX_CONNECTIONS_PER_HOUR","MAX_QUERIES_PER_HOUR","MAX_ROWS","MAX_UPDATES_PER_HOUR","MAX_USER_CONNECTIONS","MEDIUM","MERGE","MINUTE","MINUTE_SECOND","MIN_ROWS","MODE","MODIFY","MONTH","MRG_MYISAM","MYISAM","NAMES","NATURAL","NOT","NOW()","NULL","OFFSET","ON DELETE","ON UPDATE","ON","ONLY","OPEN","OPTIMIZE","OPTION","OPTIONALLY","OUTFILE","PACK_KEYS","PAGE","PARTIAL","PARTITION","PARTITIONS","PASSWORD","PRIMARY","PRIVILEGES","PROCEDURE","PROCESS","PROCESSLIST","PURGE","QUICK","RAID0","RAID_CHUNKS","RAID_CHUNKSIZE","RAID_TYPE","RANGE","READ","READ_ONLY","READ_WRITE","REFERENCES","REGEXP","RELOAD","RENAME","REPAIR","REPEATABLE","REPLACE","REPLICATION","RESET","RESTORE","RESTRICT","RETURN","RETURNS","REVOKE","RLIKE","ROLLBACK","ROW","ROWS","ROW_FORMAT","SECOND","SECURITY","SEPARATOR","SERIALIZABLE","SESSION","SHARE","SHOW","SHUTDOWN","SLAVE","SONAME","SOUNDS","SQL","SQL_AUTO_IS_NULL","SQL_BIG_RESULT","SQL_BIG_SELECTS","SQL_BIG_TABLES","SQL_BUFFER_RESULT","SQL_CACHE","SQL_CALC_FOUND_ROWS","SQL_LOG_BIN","SQL_LOG_OFF","SQL_LOG_UPDATE","SQL_LOW_PRIORITY_UPDATES","SQL_MAX_JOIN_SIZE","SQL_NO_CACHE","SQL_QUOTE_SHOW_CREATE","SQL_SAFE_UPDATES","SQL_SELECT_LIMIT","SQL_SLAVE_SKIP_COUNTER","SQL_SMALL_RESULT","SQL_WARNINGS","START","STARTING","STATUS","STOP","STORAGE","STRAIGHT_JOIN","STRING","STRIPED","SUPER","TABLE","TABLES","TEMPORARY","TERMINATED","THEN","TO","TRAILING","TRANSACTIONAL","TRUE","TRUNCATE","TYPE","TYPES","UNCOMMITTED","UNIQUE","UNLOCK","UNSIGNED","USAGE","USE","USING","VARIABLES","VIEW","WHEN","WITH","WORK","WRITE","YEAR_MONTH"],s=["ADD","AFTER","ALTER COLUMN","ALTER TABLE","DELETE FROM","EXCEPT","FETCH FIRST","FROM","GROUP BY","GO","HAVING","INSERT INTO","INSERT","INTERSECT","LIMIT","MODIFY","ORDER BY","SELECT","SET CURRENT SCHEMA","SET SCHEMA","SET","UNION ALL","UNION","UPDATE","VALUES","WHERE"],c=["AND","CROSS APPLY","CROSS JOIN","ELSE","INNER JOIN","JOIN","LEFT JOIN","LEFT OUTER JOIN","OR","OUTER APPLY","OUTER JOIN","RIGHT JOIN","RIGHT OUTER JOIN","WHEN","XOR"],u=void 0,l=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.cfg=e}return t.prototype.format=function(t){return u||(u=new o.default({reservedWords:a,reservedToplevelWords:s,reservedNewlineWords:c,stringTypes:['""',"N''","''","``","[]"],openParens:["(","CASE"],closeParens:[")","END"],indexedPlaceholderTypes:["?"],namedPlaceholderTypes:["@",":"],lineCommentTypes:["#","--"]})),new r.default(this.cfg,u).format(t)},t}();e.default=l,t.exports=e.default},function(t,e){t.exports=function(t){const e={className:"variable",begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*(?![A-Za-z0-9])(?![$])"},n={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},r={className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]},o=t.inherit(t.APOS_STRING_MODE,{illegal:null}),i=t.inherit(t.QUOTE_STRING_MODE,{illegal:null,contains:t.QUOTE_STRING_MODE.contains.concat(r)}),a=t.END_SAME_AS_BEGIN({begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/,contains:t.QUOTE_STRING_MODE.contains.concat(r)}),s={className:"string",contains:[t.BACKSLASH_ESCAPE,n],variants:[t.inherit(o,{begin:"b'",end:"'"}),t.inherit(i,{begin:'b"',end:'"'}),i,o,a]},c={variants:[t.BINARY_NUMBER_MODE,t.C_NUMBER_MODE]},u={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list match|0 new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7","php8"],case_insensitive:!0,keywords:u,contains:[t.HASH_COMMENT_MODE,t.COMMENT("//","$",{contains:[n]}),t.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),t.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),n,{className:"keyword",begin:/\$this\b/},e,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[t.UNDERSCORE_TITLE_MODE,{begin:"=>"},{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:u,contains:["self",e,t.C_BLOCK_COMMENT_MODE,s,c]}]},{className:"class",beginKeywords:"class interface",relevance:0,end:/\{/,excludeEnd:!0,illegal:/[:($"]/,contains:[{beginKeywords:"extends implements"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/,contains:[t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",relevance:0,end:";",contains:[t.UNDERSCORE_TITLE_MODE]},s,c]}}},function(t,e,n){var r=n(80),o=n(237),i=n(238),a=n(81),s=n(239),c=n(49),u=200;t.exports=function(t,e,n){var l=-1,f=o,p=t.length,d=!0,h=[],g=h;if(n)d=!1,f=i;else if(p>=u){var m=e?null:s(t);if(m)return c(m);d=!1,f=a,g=new r}else g=e?[]:h;t:for(;++l-1}},function(t,e,n){var r=n(29);t.exports=function(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},function(t,e,n){var r=n(30);t.exports=function(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}},function(t,e){t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},function(t,e,n){var r=n(30);t.exports=function(t){return r(this,t).get(t)}},function(t,e,n){var r=n(30);t.exports=function(t){return r(this,t).has(t)}},function(t,e,n){var r=n(30);t.exports=function(t,e){var n=r(this,t),o=n.size;return n.set(t,e),this.size+=n.size==o?0:1,this}},function(t,e){var n="__lodash_hash_undefined__";t.exports=function(t){return this.__data__.set(t,n),this}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e,n){var r=n(72);t.exports=function(t,e){return!!(null==t?0:t.length)&&r(t,e,0)>-1}},function(t,e){t.exports=function(t,e,n){for(var r=-1,o=null==t?0:t.length;++r>>32-e},rotr:function(t,e){return t<<32-e|t>>>e},endian:function(t){if(t.constructor==Number)return 16711935&r.rotl(t,8)|4278255360&r.rotl(t,24);for(var e=0;e0;t--)e.push(Math.floor(256*Math.random()));return e},bytesToWords:function(t){for(var e=[],n=0,r=0;n>>5]|=t[n]<<24-r%32;return e},wordsToBytes:function(t){for(var e=[],n=0;n<32*t.length;n+=8)e.push(t[n>>>5]>>>24-n%32&255);return e},bytesToHex:function(t){for(var e=[],n=0;n>>4).toString(16)),e.push((15&t[n]).toString(16));return e.join("")},hexToBytes:function(t){for(var e=[],n=0;n>>6*(3-i)&63)):e.push("=");return e.join("")},base64ToBytes:function(t){t=t.replace(/[^A-Z0-9+\/]/gi,"");for(var e=[],r=0,o=0;r>>6-2*o);return e}},t.exports=r},function(t,e){function n(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}
+/*!
+ * Determine if an object is a Buffer
+ *
+ * @author Feross Aboukhadijeh
+ * @license MIT
+ */
+t.exports=function(t){return null!=t&&(n(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&n(t.slice(0,0))}(t)||!!t._isBuffer)}},function(t,e,n){"use strict";n.r(e);n(94);var r,o,i,a=n(6),s=n.n(a),c=n(32),u=n.n(c),l=n(33),f=n.n(l),p=n(7),d=n(0),h=Object(d.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("svg",{staticStyle:{display:"none"},attrs:{xmlns:"http://www.w3.org/2000/svg"}},[e("symbol",{attrs:{id:"arrow-down-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"}},[e("path",{attrs:{d:"M413.1 222.5l22.2 22.2c9.4 9.4 9.4 24.6 0 33.9L241 473c-9.4 9.4-24.6 9.4-33.9 0L12.7 278.6c-9.4-9.4-9.4-24.6 0-33.9l22.2-22.2c9.5-9.5 25-9.3 34.3.4L184 343.4V56c0-13.3 10.7-24 24-24h32c13.3 0 24 10.7 24 24v287.4l114.8-120.5c9.3-9.8 24.8-10 34.3-.4z"}})]),this._v(" "),e("symbol",{attrs:{id:"arrow-up-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"}},[e("path",{attrs:{d:"M34.9 289.5l-22.2-22.2c-9.4-9.4-9.4-24.6 0-33.9L207 39c9.4-9.4 24.6-9.4 33.9 0l194.3 194.3c9.4 9.4 9.4 24.6 0 33.9L413 289.4c-9.5 9.5-25 9.3-34.3-.4L264 168.6V456c0 13.3-10.7 24-24 24h-32c-13.3 0-24-10.7-24-24V168.6L69.2 289.1c-9.3 9.8-24.8 10-34.3.4z"}})]),this._v(" "),e("symbol",{attrs:{id:"clipboard-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512"}},[e("path",{attrs:{d:"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm144 418c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h42v36c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-36h42c3.3 0 6 2.7 6 6z"}})]),this._v(" "),e("symbol",{attrs:{id:"lightbulb-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 352 512"}},[e("path",{attrs:{d:"M176 80c-52.94 0-96 43.06-96 96 0 8.84 7.16 16 16 16s16-7.16 16-16c0-35.3 28.72-64 64-64 8.84 0 16-7.16 16-16s-7.16-16-16-16zM96.06 459.17c0 3.15.93 6.22 2.68 8.84l24.51 36.84c2.97 4.46 7.97 7.14 13.32 7.14h78.85c5.36 0 10.36-2.68 13.32-7.14l24.51-36.84c1.74-2.62 2.67-5.7 2.68-8.84l.05-43.18H96.02l.04 43.18zM176 0C73.72 0 0 82.97 0 176c0 44.37 16.45 84.85 43.56 115.78 16.64 18.99 42.74 58.8 52.42 92.16v.06h48v-.12c-.01-4.77-.72-9.51-2.15-14.07-5.59-17.81-22.82-64.77-62.17-109.67-20.54-23.43-31.52-53.15-31.61-84.14-.2-73.64 59.67-128 127.95-128 70.58 0 128 57.42 128 128 0 30.97-11.24 60.85-31.65 84.14-39.11 44.61-56.42 91.47-62.1 109.46a47.507 47.507 0 0 0-2.22 14.3v.1h48v-.05c9.68-33.37 35.78-73.18 52.42-92.16C335.55 260.85 352 220.37 352 176 352 78.8 273.2 0 176 0z"}})]),this._v(" "),e("symbol",{attrs:{id:"pencil-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"}},[e("path",{attrs:{d:"M497.9 142.1l-46.1 46.1c-4.7 4.7-12.3 4.7-17 0l-111-111c-4.7-4.7-4.7-12.3 0-17l46.1-46.1c18.7-18.7 49.1-18.7 67.9 0l60.1 60.1c18.8 18.7 18.8 49.1 0 67.9zM284.2 99.8L21.6 362.4.4 483.9c-2.9 16.4 11.4 30.6 27.8 27.8l121.5-21.3 262.6-262.6c4.7-4.7 4.7-12.3 0-17l-111-111c-4.8-4.7-12.4-4.7-17.1 0zM124.1 339.9c-5.5-5.5-5.5-14.3 0-19.8l154-154c5.5-5.5 14.3-5.5 19.8 0s5.5 14.3 0 19.8l-154 154c-5.5 5.5-14.3 5.5-19.8 0zM88 424h48v36.3l-64.5 11.3-31.1-31.1L51.7 376H88v48z"}})]),this._v(" "),e("symbol",{attrs:{id:"plus-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"}},[e("path",{attrs:{d:"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm144 276c0 6.6-5.4 12-12 12h-92v92c0 6.6-5.4 12-12 12h-56c-6.6 0-12-5.4-12-12v-92h-92c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h92v-92c0-6.6 5.4-12 12-12h56c6.6 0 12 5.4 12 12v92h92c6.6 0 12 5.4 12 12v56z"}})]),this._v(" "),e("symbol",{attrs:{id:"share-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"}},[e("path",{attrs:{d:"M503.691 189.836L327.687 37.851C312.281 24.546 288 35.347 288 56.015v80.053C127.371 137.907 0 170.1 0 322.326c0 61.441 39.581 122.309 83.333 154.132 13.653 9.931 33.111-2.533 28.077-18.631C66.066 312.814 132.917 274.316 288 272.085V360c0 20.7 24.3 31.453 39.687 18.164l176.004-152c11.071-9.562 11.086-26.753 0-36.328z"}})])])}),[],!1,null,null,null).exports,g=n(5),m={inject:["config"],props:["text"]},v=Object(d.a)(m,(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"mt-12 card card-has-header card-no-props"},[e("div",{staticClass:"card-details card-danger"},[e("div",{staticClass:"card-details-overflow scrollbar p-4"},[e("div",{staticClass:"text-xl"},[this._t("default")],2)])])])}),[],!1,null,null,null).exports,b=n(14),_={props:{name:{required:!0}},data:function(){return{fullException:!1}},methods:{removeClamp:function(){this.fullException||(this.fullException=!0)}}},y=Object(d.a)(_,(function(){var t=this.$createElement;return(this._self._c||t)("div",{staticClass:"ui-exception-message",class:this.fullException?"ui-exception-message-full":"",on:{mousedown:this.removeClamp}},[this._v("\n "+this._s(this.name)+"\n")])}),[],!1,null,null,null).exports,E={components:{ExceptionClass:n(15).a,ExceptionMessage:y,LineNumber:b.a,FilePath:g.a},inject:["report"],computed:{firstFrame:function(){return this.report.stacktrace[0]}}},x={inject:["report","telescopeUrl","config"],components:{OccurrenceDetails:Object(d.a)(E,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"card-details-overflow scrollbar p-12 pt-10"},[n("div",{staticClass:"text-2xl"},[n("ExceptionClass",{attrs:{name:t.report.exception_class}}),t._v(" "),n("ExceptionMessage",{attrs:{name:t.report.message}})],1),t._v(" "),n("div",[n("a",{staticClass:"ui-url",attrs:{href:t.report.context.request.url,target:"_blank"}},[t._v("\n "+t._s(t.report.context.request.url)+"\n ")])])])}),[],!1,null,null,null).exports,FilePath:g.a}},k=Object(d.a)(x,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"mt-12 card card-has-header card-no-props"},[n("div",{staticClass:"card-header"},[n("div",{staticClass:"grid items-center rounded-t border-b border-tint-300 text-xs text-tint-600 ",staticStyle:{"grid-template-columns":"1fr 1fr"}},[n("div",{staticClass:"grid cols-auto justify-start gap-2 px-4 py-2"},[n("div",{staticClass:"flex items-center"},[n("a",{attrs:{href:"http://flareapp.io/docs/ignition-for-laravel/introduction",target:"_blank",title:"Ignition docs"}},[n("svg",{staticClass:"w-4 h-5 mr-4",attrs:{viewBox:"0 0 428 988"}},[n("polygon",{staticStyle:{fill:"#FA4E79"},attrs:{points:"428,247.1 428,494.1 214,617.5 214,369.3 \t\t"}}),t._v(" "),n("polygon",{staticStyle:{fill:"#FFF082"},attrs:{points:"0,988 0,741 214,617.5 214,864.1 \t\t"}}),t._v(" "),n("polygon",{staticStyle:{fill:"#E6003A"},attrs:{points:"214,123.9 214,617.5 0,494.1 0,0 \t\t"}}),t._v(" "),n("polygon",{staticStyle:{fill:"#FFE100"},attrs:{points:"214,864.1 214,617.5 428,741 428,988 \t\t"}})])]),t._v(" "),n("FilePath",{attrs:{pathClass:"font-normal",file:t.report.application_path+t.config.directorySeparator,relative:!1}})],1)]),t._v(" "),n("div",{staticClass:"grid cols-auto items-center justify-end gap-4 px-4 py-2"},[t.telescopeUrl?n("div",[n("a",{staticClass:"link-dimmed sm:ml-6",attrs:{href:t.telescopeUrl,target:"_blank"}},[t._v("Telescope")])]):t._e()])])]),t._v(" "),n("div"),t._v(" "),n("div",{staticClass:"card-details"},[n("OccurrenceDetails")],1)])}),[],!1,null,null,null).exports,w=n(10),C=n.n(w),A=n(21),T=n.n(A),S=n(101)(),R=null,O={inject:["config"],props:{solution:{required:!0}},data:function(){return{isHidingSolutions:this.hasHideSolutionsCookie(),canExecuteSolutions:null,runningSolution:!1,executionSuccessful:null}},computed:{healthCheckEndpoint:function(){return this.solution.execute_endpoint.replace("execute-solution","health-check")}},created:function(){this.configureRunnableSolutions()},mounted:function(){this.isHidingSolutions&&this.$refs.solutionCard.classList.add("solution-hidden")},methods:{configureRunnableSolutions:function(){this.config.enableRunnableSolutions?this.checkExecutionEndpoint():this.canExecuteSolutions=!1},markdown:function(t){return S.render(t)},checkExecutionEndpoint:(o=T()(C.a.mark((function t(){var e;return C.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,fetch(this.healthCheckEndpoint);case 3:return t.next=5,t.sent.json();case 5:e=t.sent,this.canExecuteSolutions=e.can_execute_commands,t.next=12;break;case 9:t.prev=9,t.t0=t.catch(0),this.canExecuteSolutions=!1;case 12:case"end":return t.stop()}}),t,this,[[0,9]])}))),function(){return o.apply(this,arguments)}),execute:(r=T()(C.a.mark((function t(){var e;return C.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!this.runningSolution){t.next=2;break}return t.abrupt("return");case 2:return t.prev=2,this.runningSolution=!0,t.next=6,fetch(this.solution.execute_endpoint,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({solution:this.solution.class,parameters:this.solution.run_parameters})});case 6:e=t.sent,this.executionSuccessful=200===e.status,t.next=14;break;case 10:t.prev=10,t.t0=t.catch(2),console.error(t.t0),this.executionSuccessful=!1;case 14:return t.prev=14,this.runningSolution=!1,t.finish(14);case 17:case"end":return t.stop()}}),t,this,[[2,10,14,17]])}))),function(){return r.apply(this,arguments)}),refresh:function(){location.reload()},getUrlLabel:function(t){var e=document.createElement("a");return e.href=t,e.hostname},toggleSolutions:function(){var t=this;this.isHidingSolutions?(window.clearTimeout(R),this.toggleHidingSolutions()):(this.$refs.solutionCard.classList.add("solution-hiding"),R=window.setTimeout((function(){t.$refs.solutionCard.classList.remove("solution-hiding"),t.toggleHidingSolutions()}),100))},toggleHidingSolutions:function(){if(this.isHidingSolutions)return document.cookie="".concat("hide_solutions","=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;"),void(this.isHidingSolutions=!1);var t=new Date;t.setTime(t.getTime()+31536e6),document.cookie="".concat("hide_solutions","=true;expires=").concat(t.toUTCString(),";path=/;"),this.isHidingSolutions=!0},hasHideSolutionsCookie:function(){return document.cookie.includes("hide_solutions")}}},N={components:{DangerCard:v,SolutionCard:Object(d.a)(O,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"solution-toggle",class:{"solution-toggle-show":t.isHidingSolutions},on:{click:t.toggleSolutions}},[t.isHidingSolutions?n("a",{staticClass:"link-solution",attrs:{target:"_blank"}},[n("Icon",{staticClass:"text-xs mr-1",attrs:{name:"lightbulb"}}),t._v(" Show solutions")],1):n("a",{staticClass:"link-solution",attrs:{target:"_blank"}},[t._v("Hide solutions")])]),t._v(" "),n("div",{ref:"solutionCard",staticClass:"solution",class:{"solution-hidden":t.isHidingSolutions}},[n("div",{staticClass:"solution-main"},[n("div",{staticClass:"solution-background mx-0"},[n("svg",{staticClass:"hidden absolute right-0 h-full | md:block",attrs:{x:"0px",y:"0px",viewBox:"0 0 299 452"}},[n("g",{staticStyle:{opacity:"0.075"}},[n("polygon",{staticStyle:{fill:"rgb(63,63,63)"},attrs:{points:"298.1,451.9 150.9,451.9 21,226.9 298.1,227.1"}}),t._v(" "),n("polygon",{staticStyle:{fill:"rgb(151,151,151)"},attrs:{points:"298.1,227.1 21,226.9 150.9,1.9 298.1,1.9"}})])])]),t._v(" "),n("div",{staticClass:"solution-content-wrapper scrollbar"},[n("div",{staticClass:"solution-content ml-0"},[""!==t.solution.title?n("h2",{staticClass:"solution-title"},[t._v("\n "+t._s(t.solution.title)+"\n ")]):t._e(),t._v(" "),t.solution.description?n("div",{staticClass:"solution-description",domProps:{innerHTML:t._s(t.markdown(t.solution.description))}}):t._e(),t._v(" "),t.solution.is_runnable?n("div",[n("p",{staticClass:"solution-description",domProps:{innerHTML:t._s(t.markdown(t.solution.action_description))}}),t._v(" "),null===t.canExecuteSolutions?n("p",{staticClass:"py-4 text-sm italic"},[t._v("\n Loading...\n ")]):t._e(),t._v(" "),n("div",{staticClass:"mt-4"},[t.solution.is_runnable&&!0===t.canExecuteSolutions&&null===t.executionSuccessful?n("button",{staticClass:"button-secondary button-lg bg-tint-300 hover:bg-tint-400",attrs:{disabled:t.runningSolution},on:{click:t.execute}},[t.runningSolution?n("span",[t._v("Running...")]):t._e(),t._v(" "),t.runningSolution?t._e():n("span",[t._v(t._s(t.solution.run_button_text))])]):t._e(),t._v(" "),t.executionSuccessful?n("p",[n("strong",{staticClass:"font-semibold"},[t._v("The solution was executed successfully.")]),t._v(" "),n("a",{staticClass:"link-solution",attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.refresh(e)}}},[t._v("Refresh now.")])]):t._e(),t._v(" "),!1===t.executionSuccessful?n("p",[t._v("\n Something went wrong when executing the solution. Please try\n refreshing the page and try again.\n ")]):t._e()])]):t._e(),t._v(" "),Object.entries(t.solution.links).length>0?n("div",{staticClass:"mt-8 grid justify-start"},[n("div",{staticClass:"border-t-2 border-gray-700 opacity-25 "}),t._v(" "),n("div",{staticClass:"pt-2 grid cols-auto-1fr gapx-4 gapy-2 text-sm"},[n("label",{staticClass:"font-semibold uppercase tracking-wider"},[t._v("Read more")]),t._v(" "),n("ul",t._l(t.solution.links,(function(e,r){return n("li",{key:r},[n("a",{staticClass:"link-solution",attrs:{href:e,target:"_blank"}},[t._v(t._s(r))])])})),0)])]):t._e()])])])])])}),[],!1,null,null,null).exports,ErrorCard:k,FilePath:g.a},inject:["report","solutions","appEnv","appDebug"],data:function(){return{activeSolutionKey:0}},computed:{firstFrame:function(){return this.report.stacktrace[0]},solution:function(){return this.solutions[this.activeSolutionKey]}}},L=Object(d.a)(N,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"layout-col z-10"},["local"!==this.appEnv&&!0===this.appDebug?n("DangerCard",[n("p",[n("code",[t._v("APP_DEBUG")]),t._v(" is set to "),n("code",[t._v("true")]),t._v(" while "),n("code",[t._v("APP_ENV")]),t._v(" is\n not "),n("code",[t._v("local")])]),t._v(" "),n("p",{staticClass:"text-base"},[t._v("\n This could make your application vulnerable to remote execution.\n "),n("a",{staticClass:"underline",attrs:{target:"_blank",rel:"noopener",href:"https://flareapp.io/docs/ignition-for-laravel/security"}},[t._v("Read more about Ignition security.")])])]):t._e(),t._v(" "),n("ErrorCard")],1),t._v(" "),t.solutions.length>0?n("div",{staticClass:"layout-col z-1"},[n("SolutionCard",t._b({},"SolutionCard",{solution:t.solution},!1)),t._v(" "),t.solutions.length>1?n("div",{staticClass:"absolute left-0 bottom-0 w-full h-8 mb-2 px-4 text-sm z-10"},[n("ul",{staticClass:"grid cols-auto place-center gap-1"},t._l(t.solutions,(function(e,r){return n("li",{key:e.class,on:{click:function(e){t.activeSolutionKey=r}}},[n("a",{staticClass:"grid place-center h-8 min-w-8 px-2 rounded-full",class:{"bg-tint-200 font-semibold":t.activeSolutionKey===r,"hover:bg-tint-100 cursor-pointer":t.activeSolutionKey!==r}},[t._v("\n "+t._s(r+1)+"\n ")])])})),0)]):t._e()],1):t._e()])}),[],!1,null,null,null).exports,I=n(4),D=n.n(I),M={components:{CheckboxField:n(35).a},props:["error","isLoading"],computed:{selectedTabs:function(){return this.tabs.filter((function(t){return t.checked})).map((function(t){return t.name}))}},data:function(){return{tabs:[{label:"Stack trace",name:"stackTraceTab",checked:!0},{label:"Request",name:"requestTab",checked:!0},{label:"App",name:"appTab",checked:!0},{label:"User",name:"userTab",checked:!0},{label:"Context",name:"contextTab",checked:!0},{label:"Debug",name:"debugTab",checked:!0}]}},methods:{shareError:function(){this.isLoading||this.$emit("share",this.selectedTabs)}}},P=Object(d.a)(M,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"grid cols-2 justify-start gapx-6 gapy-2"},t._l(t.tabs,(function(e){return n("CheckboxField",{key:e.name,staticClass:"text-gray-200 hover:text-white",attrs:{label:e.label,name:e.name},on:{change:function(t){e.checked=!e.checked}},model:{value:e.checked,callback:function(n){t.$set(e,"checked",n)},expression:"tab.checked"}})})),1),t._v(" "),n("div",{staticClass:"mt-4"},[t.error?n("div",{staticClass:"mb-3"},[t._v("\n We were unable to share your error."),n("br"),t._v("\n Please try again later.\n ")]):t._e(),t._v(" "),n("button",{staticClass:"button-secondary button-sm text-white bg-tint-600",attrs:{disabled:t.isLoading},on:{click:t.shareError}},[t._v("\n "+t._s(t.isLoading?"Sharing…":"Share")+"\n ")])])])}),[],!1,null,null,null).exports,j={props:{text:{required:!0}},data:function(){return{copied:!1,timeout:!1}},methods:{copy:function(t){var e=this;this.timeout&&window.clearTimeout(this.timeout);var n=document.createElement("textarea");n.value=t,document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n),this.copied=!0,this.timeout=window.setTimeout((function(){return e.copied=!1}),3e3)}}},F={components:{CopyButton:Object(d.a)(j,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("button",{attrs:{title:"Copy to clipboard"},on:{click:function(e){return t.copy(t.text)}}},[n("Icon",{class:t.copied?"fill-green-300":"fill-gray-200 hover:fill-white",attrs:{name:"clipboard"}}),t._v(" "),t.copied?n("div",{staticClass:"ml-2 absolute top-0 left-full text-green-300"},[t._v("\n Copied!\n ")]):t._e()],1)}),[],!1,null,null,null).exports},props:{publicUrl:{required:!0},ownerUrl:{required:!0}}},U={components:{ShareLinks:Object(d.a)(F,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"text-left"},[n("p",{staticClass:"mt-2 text-gray-300"},[t._v("Share your error with others:")]),t._v(" "),n("div",{staticClass:"grid cols-auto items-center justify-start gap-2 mt-2"},[n("a",{staticClass:"button-secondary button-sm bg-tint-600 hover:bg-tint-700 text-white",attrs:{href:t.publicUrl,target:"_blank"}},[t._v("Open public share")]),t._v(" "),n("CopyButton",{attrs:{text:t.publicUrl}})],1),t._v(" "),n("p",{staticClass:"mt-4 text-gray-300"},[t._v("Administer your shared error here:")]),t._v(" "),n("div",{staticClass:"grid cols-auto items-center justify-start gap-2 mt-2"},[n("a",{staticClass:"button-secondary button-sm bg-tint-600 hover:bg-tint-700 text-white",attrs:{href:t.ownerUrl,target:"_blank"}},[t._v("Open share admin")]),t._v(" "),n("CopyButton",{attrs:{text:t.ownerUrl}})],1)])}),[],!1,null,null,null).exports,ShareForm:P},inject:["report","shareEndpoint"],data:function(){return{shareHadError:!1,sharedErrorUrls:null,menuVisible:!1,isShareLoading:!1}},watch:{menuVisible:function(t){t?window.addEventListener("click",this.toggleMenu):window.removeEventListener("click",this.toggleMenu)}},methods:{toggleMenu:function(){this.menuVisible=!this.menuVisible},shareError:(i=T()(C.a.mark((function t(e){var n,r;return C.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return this.isShareLoading=!0,t.prev=1,t.next=4,fetch(this.shareEndpoint,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({report:JSON.stringify(this.report),tabs:e,lineSelection:window.location.hash})});case 4:return n=t.sent,t.next=7,n.json();case 7:r=t.sent,n.ok?this.sharedErrorUrls=r:this.shareHadError=!0,t.next=14;break;case 11:t.prev=11,t.t0=t.catch(1),this.shareHadError=!0;case 14:this.isShareLoading=!1;case 15:case"end":return t.stop()}}),t,this,[[1,11]])}))),function(t){return i.apply(this,arguments)})}},$={inject:["config","report"],components:{ShareButton:Object(d.a)(U,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{on:{click:function(t){t.stopPropagation()}}},[n("button",{staticClass:"tab",class:t.menuVisible?"tab-active":"",on:{click:t.toggleMenu}},[t._v("\n Share\n "),n("Icon",{staticClass:"ml-2",attrs:{name:"share"}})],1),t._v(" "),n("div",{staticClass:"dropdown z-10 right-0 top-full p-4 overflow-visible",class:{hidden:!t.menuVisible},staticStyle:{"min-width":"18rem","margin-right":"-1px"},on:{click:function(t){t.stopPropagation()}}},[n("div",{staticClass:"flex items-center mb-4"},[n("svg",{staticClass:"w-4 h-5 mr-2",attrs:{viewBox:"0 0 682 1024"}},[n("polygon",{staticStyle:{fill:"#51DB9E"},attrs:{points:"235.3,510.5 21.5,387 21.5,140.2 236.5,264.1 "}}),t._v(" "),n("polygon",{staticStyle:{fill:"#7900F5"},attrs:{points:"235.3,1004.8 21.5,881.4 21.5,634.5 234.8,757.9 "}}),t._v(" "),n("polygon",{staticStyle:{fill:"#94F2C8"},attrs:{points:"448.9,386.9 21.5,140.2 235.3,16.7 663.2,263.4 "}}),t._v(" "),n("polygon",{staticStyle:{fill:"#A475F4"},attrs:{points:"234.8,757.9 21.5,634.5 235.3,511 449.1,634.5 "}})]),t._v(" "),n("h5",{staticClass:"text-left font-semibold uppercase tracking-wider whitespace-no-wrap"},[t._v("\n "+t._s(t.sharedErrorUrls?"Shared":"Share")+" on Flare\n ")]),t._v(" "),n("a",{staticClass:"ml-auto underline",attrs:{target:"_blank",href:"https://flareapp.io/docs/ignition-for-laravel/sharing-errors",title:"Flare documentation"}},[t._v("Docs\n ")])]),t._v(" "),t.sharedErrorUrls?n("div",[n("ShareLinks",{attrs:{publicUrl:t.sharedErrorUrls.public_url,ownerUrl:t.sharedErrorUrls.owner_url}})],1):n("ShareForm",{attrs:{error:t.shareHadError,"is-loading":t.isShareLoading},on:{share:t.shareError}})],1)])}),[],!1,null,null,null).exports},props:{value:{required:!0},customTabs:{required:!0}},data:function(){return{defaultTabs:[{component:"StackTab",title:"Stack trace"},{component:"RequestTab",title:"Request"}].concat(D()(this.report.context.livewire?[{component:"LivewireTab",title:"Livewire"}]:[]),[{component:"AppTab",title:"App"},{component:"UserTab",title:"User"},{component:"ContextTab",title:"Context"},{component:"DebugTab",title:"Debug"}]),shareButtonEnabled:this.config.enableShareButton}},mounted:function(){this.applyDefaultTabProps(),this.$emit("input",this.tabs[this.currentTabIndex])},computed:{currentTabIndex:function(){var t=this;return this.tabs.findIndex((function(e){return e.component===t.value.component}))},nextTab:function(){return this.tabs[this.currentTabIndex+1]||this.tabs[0]},previousTab:function(){return this.tabs[this.currentTabIndex-1]||this.tabs[this.tabs.length-1]},tabs:function(){var t={};return this.defaultTabs.forEach((function(e){t[e.component]=e})),this.customTabs.forEach((function(e){t[e.component]=e})),Object.values(t)}},methods:{applyDefaultTabProps:function(){var t=this;this.defaultTabs.map((function(e){return e.component===t.value.component&&(e.props=t.value.props||{}),e}))}}},B={props:{tab:{required:!0}},render:function(t){return t(this.tab.component,{props:this.tab.props||{}})}},z={props:{report:{required:!0},config:{required:!0},solutions:{required:!0},telescopeUrl:{required:!0},shareEndpoint:{required:!0},defaultTab:{required:!0},defaultTabProps:{required:!1},appEnv:{required:!0},appDebug:{required:!0}},data:function(){return{customTabs:window.tabs,tab:{component:this.defaultTab,props:this.defaultTabProps||{}}}},provide:function(){return{config:this.config,report:this.report,solutions:this.solutions,telescopeUrl:this.telescopeUrl,shareEndpoint:this.shareEndpoint,setTab:this.setTab,appEnv:this.appEnv,appDebug:this.appDebug}},components:{Summary:L,Tabs:Object(d.a)($,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("nav",{staticClass:"tab-nav"},[n("ul",{staticClass:"tab-bar"},t._l(t.tabs,(function(e){return n("li",{key:e.component},[n("button",{staticClass:"tab",class:t.value.component===e.component?"tab-active":"",on:{click:function(n){return n.preventDefault(),t.$emit("input",e)}}},[t._v("\n "+t._s(e.title)+"\n ")])])})),0),t._v(" "),t.shareButtonEnabled?[n("div",{staticClass:"tab-delimiter"}),t._v(" "),n("ShareButton")]:t._e()],2)}),[],!1,null,null,null).exports,Details:Object(d.a)(B,void 0,void 0,!1,null,null,null).exports,IconSymbols:h},methods:{setTab:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.tab={component:t,props:e}}},created:function(){}},q=Object(d.a)(z,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("IconSymbols"),t._v(" "),n("Summary"),t._v(" "),n("div",{staticClass:"layout-col mt-12"},[n("div",{staticClass:"tabs"},[n("Tabs",t._b({model:{value:t.tab,callback:function(e){t.tab=e},expression:"tab"}},"Tabs",{customTabs:t.customTabs},!1)),t._v(" "),n("div",{staticClass:"tab-main"},[n("Details",t._b({},"Details",{tab:t.tab},!1))],1)],1)])],1)}),[],!1,null,null,null).exports;function H(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function G(t){for(var e=1;e=this.selectedRange[0]&&t<=this.selectedRange[1])},editorUrl:function(t){return Object(c.a)(this.config,this.selectedFrame.file,t)},highlightedCode:function(t){var e=o.a.highlight("php",t||"",!0,this.highlightState);return this.highlightState=e.top,e.value||" "}}},l=n(0),f=Object(l.a)(u,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"stack-main"},[n("div",{staticClass:"stack-main-header"},[n("div",{staticClass:"grid cols-auto gap-2 justify-start items-center"},[n("ExceptionClass",{attrs:{name:t.selectedFrame.class||"",method:t.selectedFrame.method||""}})],1),t._v(" "),t.selectedFrame.file?n("FilePath",{staticClass:"mt-1",attrs:{"line-number":t.selectedFrame.line_number,file:t.selectedFrame.file,editable:!0}}):t._e()],1),t._v(" "),n("div",{staticClass:"stack-main-content"},[n("div",{staticClass:"stack-viewer scrollbar"},[n("div",{staticClass:"stack-ruler"},[n("div",{staticClass:"stack-lines"},t._l(t.selectedFrame.code_snippet,(function(e,r){return n("p",{key:r,staticClass:"stack-line cursor-pointer",class:{"stack-line-selected":t.withinSelectedRange(parseInt(r)),"stack-line-highlight":parseInt(r)===t.selectedFrame.line_number},on:{click:function(e){t.handleLineNumberClick(e,parseInt(r))}}},[t._v("\n "+t._s(r)+"\n ")])})),0)]),t._v(" "),n("pre",{ref:"codeContainer",staticClass:"stack-code",class:t.highlightTheme},[t._l(t.selectedFrame.code_snippet,(function(e,r){return n("p",{key:r,staticClass:"stack-code-line",class:{"stack-code-line-highlight":parseInt(r)===t.selectedFrame.line_number,"stack-code-line-selected":t.withinSelectedRange(parseInt(r))}},[n("span",{domProps:{innerHTML:t._s(t.highlightedCode(e))}}),n("a",{staticClass:"editor-link",attrs:{href:t.editorUrl(r)}},[n("Icon",{attrs:{name:"pencil"}})],1)])})),t._v("\n ")],2)])])])}),[],!1,null,null,null).exports,p={props:{frameGroup:{required:!0}},components:{ExceptionClass:i.a,FilePath:a.a,LineNumber:s.a}},d=Object(l.a)(p,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.frameGroup.expanded||"vendor"!==t.frameGroup.type?"unknown"===t.frameGroup.type?n("li",{staticClass:"stack-frame-group stack-frame-group-unknown"},[n("div",{staticClass:"stack-frame"},[n("button",{staticClass:"stack-frame-number"}),t._v(" "),n("div",{staticClass:"span-2 stack-frame-text"},[n("span",{staticClass:"text-left text-gray-500"},[t._v("\n "+t._s(t.frameGroup.frames.length>1?t.frameGroup.frames.length+" unknown frames":"1 unknown frame")+"\n ")])])])]):n("li",[n("ul",{staticClass:"stack-frame-group",class:"vendor"===t.frameGroup.type?"stack-frame-group-vendor":""},t._l(t.frameGroup.frames,(function(e,r){return n("li",{key:r,staticClass:"stack-frame | cursor-pointer",class:e.selected?"stack-frame-selected":"",on:{click:function(n){return t.$emit("select",e.frame_number)}}},[n("div",{staticClass:"stack-frame-number"},[t._v(t._s(e.frame_number))]),t._v(" "),n("div",{staticClass:"stack-frame-text"},[0===r?n("header",{staticClass:"stack-frame-header",class:e.class?"mb-1":""},[n("FilePath",{staticClass:"stack-frame-path",attrs:{pathClass:"vendor"===t.frameGroup.type?"text-gray-800":"text-purple-800",file:e.relative_file}})],1):t._e(),t._v(" "),e.class?n("span",{staticClass:"stack-frame-exception-class"},[n("ExceptionClass",{staticClass:"stack-frame-exception-class",attrs:{name:e.class}})],1):t._e()]),t._v(" "),n("div",{staticClass:"stack-frame-line"},[n("LineNumber",{attrs:{lineNumber:e.line_number}})],1)])})),0)]):n("li",{staticClass:"stack-frame-group stack-frame-group-vendor",on:{click:function(e){return t.$emit("expand")}}},[n("div",{staticClass:"stack-frame | cursor-pointer"},[n("button",{staticClass:"stack-frame-number"},[n("Icon",{staticClass:"align-middle text-gray-500",attrs:{name:"plus"}})],1),t._v(" "),n("div",{staticClass:"span-2 stack-frame-text"},[n("button",{staticClass:"text-left text-gray-500"},[t._v("\n "+t._s(t.frameGroup.frames.length>1?t.frameGroup.frames.length+" vendor frames…":"1 vendor frame…")+"\n ")])])])])}),[],!1,null,null,null).exports,h=n(6),g=n.n(h),m=n(4),v=n.n(m),b=n(16),_=n.n(b);function y(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function E(t){return t.map((function(e,n){return function(t){for(var e=1;e
+
+
+
+
+
+ Vue App
+
+
+
+
+
diff --git a/vendor/facade/ignition/resources/views/errorPage.php b/vendor/facade/ignition/resources/views/errorPage.php
new file mode 100644
index 00000000..28102bf0
--- /dev/null
+++ b/vendor/facade/ignition/resources/views/errorPage.php
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ = $title ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vendor/facade/ignition/src/Actions/ShareReportAction.php b/vendor/facade/ignition/src/Actions/ShareReportAction.php
new file mode 100644
index 00000000..4ad96834
--- /dev/null
+++ b/vendor/facade/ignition/src/Actions/ShareReportAction.php
@@ -0,0 +1,168 @@
+client = $client;
+ }
+
+ public function handle(array $report, array $tabs, ?string $lineSelection = null)
+ {
+ $this->tabs = $tabs;
+
+ $report = $this->filterReport($report);
+
+ try {
+ return $this->client->post('public-reports', [
+ 'report' => $this->trimReport($report),
+ 'tabs' => $tabs,
+ 'lineSelection' => $lineSelection,
+ ]);
+ } catch (Exception $exception) {
+ throw new UnableToShareErrorException($exception->getMessage());
+ }
+ }
+
+ public function filterReport(array $report): array
+ {
+ if (! $this->hasTab('stackTraceTab')) {
+ $report['stacktrace'] = array_slice($report['stacktrace'], 0, 1);
+ }
+
+ if (! $this->hasTab('debugTab')) {
+ $report['glows'] = [];
+ }
+
+ $report['context'] = $this->filterContextItems($report['context']);
+
+ return $report;
+ }
+
+ protected function hasTab(string $tab): bool
+ {
+ return in_array($tab, $this->tabs);
+ }
+
+ protected function filterContextItems(array $contextItems): array
+ {
+ if (! $this->hasTab('requestTab')) {
+ $contextItems = $this->removeRequestInformation($contextItems);
+ }
+
+ if (! $this->hasTab('appTab')) {
+ $contextItems = $this->removeAppInformation($contextItems);
+ }
+
+ if (! $this->hasTab('userTab')) {
+ $contextItems = $this->removeUserInformation($contextItems);
+ }
+
+ if (! $this->hasTab('contextTab')) {
+ $contextItems = $this->removeContextInformation($contextItems);
+ }
+
+ if (! $this->hasTab('debugTab')) {
+ $contextItems = $this->removeDebugInformation($contextItems);
+ }
+
+ return $contextItems;
+ }
+
+ protected function removeRequestInformation(array $contextItems): array
+ {
+ Arr::forget($contextItems, 'request');
+ Arr::forget($contextItems, 'request_data');
+ Arr::forget($contextItems, 'headers');
+ Arr::forget($contextItems, 'session');
+ Arr::forget($contextItems, 'cookies');
+
+ return $contextItems;
+ }
+
+ protected function removeAppInformation(array $contextItems): array
+ {
+ Arr::forget($contextItems, 'view');
+ Arr::forget($contextItems, 'route');
+
+ return $contextItems;
+ }
+
+ protected function removeUserInformation(array $contextItems): array
+ {
+ Arr::forget($contextItems, 'user');
+ Arr::forget($contextItems, 'request.ip');
+ Arr::forget($contextItems, 'request.useragent');
+
+ return $contextItems;
+ }
+
+ protected function removeContextInformation(array $contextItems): array
+ {
+ Arr::forget($contextItems, 'env');
+ Arr::forget($contextItems, 'git');
+ Arr::forget($contextItems, 'context');
+
+ Arr::forget($contextItems, $this->getCustomContextGroups($contextItems));
+
+ return $contextItems;
+ }
+
+ protected function removeDebugInformation(array $contextItems): array
+ {
+ Arr::forget($contextItems, 'dumps');
+ Arr::forget($contextItems, 'glows');
+ Arr::forget($contextItems, 'logs');
+ Arr::forget($contextItems, 'queries');
+
+ return $contextItems;
+ }
+
+ protected function getCustomContextGroups(array $contextItems): array
+ {
+ $predefinedContextItemGroups = [
+ 'request',
+ 'request_data',
+ 'headers',
+ 'session',
+ 'cookies',
+ 'view',
+ 'queries',
+ 'route',
+ 'user',
+ 'env',
+ 'git',
+ 'context',
+ 'logs',
+ 'dumps',
+ 'exception',
+ ];
+
+ return Collection::make($contextItems)
+ ->reject(function ($_value, $group) use ($predefinedContextItemGroups) {
+ return in_array($group, $predefinedContextItemGroups);
+ })
+ ->keys()
+ ->toArray();
+ }
+
+ protected function trimReport(array $report): array
+ {
+ return (new ReportTrimmer())->trim($report);
+ }
+}
diff --git a/vendor/facade/ignition/src/Commands/SolutionMakeCommand.php b/vendor/facade/ignition/src/Commands/SolutionMakeCommand.php
new file mode 100644
index 00000000..a9e2fc9c
--- /dev/null
+++ b/vendor/facade/ignition/src/Commands/SolutionMakeCommand.php
@@ -0,0 +1,65 @@
+option('runnable')
+ ? __DIR__.'/stubs/runnable-solution.stub'
+ : __DIR__.'/stubs/solution.stub';
+ }
+
+ /**
+ * Get the default namespace for the class.
+ *
+ * @param string $rootNamespace
+ * @return string
+ */
+ protected function getDefaultNamespace($rootNamespace)
+ {
+ return $rootNamespace.'\Solutions';
+ }
+
+ /**
+ * Get the console command options.
+ *
+ * @return array
+ */
+ protected function getOptions()
+ {
+ return [
+ ['runnable', null, InputOption::VALUE_NONE, 'Create runnable solution'],
+ ];
+ }
+}
diff --git a/vendor/facade/ignition/src/Commands/SolutionProviderMakeCommand.php b/vendor/facade/ignition/src/Commands/SolutionProviderMakeCommand.php
new file mode 100644
index 00000000..2c87fa4b
--- /dev/null
+++ b/vendor/facade/ignition/src/Commands/SolutionProviderMakeCommand.php
@@ -0,0 +1,50 @@
+config = $config;
+
+ $this->checkFlareKey();
+
+ if (app()->make('log') instanceof LogManager) {
+ $this->checkFlareLogger();
+ }
+
+ $this->sendTestException();
+ }
+
+ protected function checkFlareKey()
+ {
+ $message = empty($this->config->get('flare.key'))
+ ? '❌ Flare key not specified. Make sure you specify a value in the `key` key of the `flare` config file.'
+ : '✅ Flare key specified';
+
+ $this->info($message);
+
+ return $this;
+ }
+
+ public function checkFlareLogger()
+ {
+ $defaultLogChannel = $this->config->get('logging.default');
+
+ $activeStack = $this->config->get("logging.channels.{$defaultLogChannel}");
+
+ if (is_null($activeStack)) {
+ $this->info("❌ The default logging channel `{$defaultLogChannel}` is not configured in the `logging` config file");
+ }
+
+ if (! isset($activeStack['channels']) || ! in_array('flare', $activeStack['channels'])) {
+ $this->info("❌ The logging channel `{$defaultLogChannel}` does not contain the 'flare' channel");
+ }
+
+ if (is_null($this->config->get('logging.channels.flare'))) {
+ $this->info('❌ There is no logging channel named `flare` in the `logging` config file');
+ }
+
+ if ($this->config->get('logging.channels.flare.driver') !== 'flare') {
+ $this->info('❌ The `flare` logging channel defined in the `logging` config file is not set to `flare`.');
+ }
+
+ $this->info('✅ The Flare logging driver was configured correctly.');
+
+ return $this;
+ }
+
+ protected function sendTestException()
+ {
+ $testException = new Exception('This is an exception to test if the integration with Flare works.');
+
+ try {
+ app(Flare::class)->sendTestReport($testException);
+ $this->info('');
+ } catch (Exception $exception) {
+ $this->warn('❌ We were unable to send an exception to Flare. ');
+
+ if ($exception instanceof BadResponseCode) {
+ $this->info('');
+ $message = 'Unknown error';
+
+ $body = $exception->response->getBody();
+
+ if (is_array($body) && isset($body['message'])) {
+ $message = $body['message'];
+ }
+
+ $this->warn("{$exception->response->getHttpResponseCode()} - {$message}");
+ } else {
+ $this->warn($exception->getMessage());
+ }
+
+ $this->warn('Make sure that your key is correct and that you have a valid subscription.');
+ $this->info('');
+ $this->info('For more info visit the docs on https://flareapp.io/docs/ignition-for-laravel/introduction');
+ $this->info('You can see the status page of Flare at https://status.flareapp.io');
+ $this->info('Flare support can be reached at support@flareapp.io');
+
+ $this->line('');
+ $this->line('Extra info');
+ $this->table([], [
+ ['Platform', PHP_OS],
+ ['PHP', phpversion()],
+ ['Laravel', app()->version()],
+ ['facade/ignition', InstalledVersions::getVersion('facade/ignition')],
+ ['facade/flare-client-php', InstalledVersions::getVersion('facade/flare-client-php')],
+ ['Curl', curl_version()['version']],
+ ['SSL', curl_version()['ssl_version']],
+ ]);
+
+ if ($this->output->isVerbose()) {
+ throw $exception;
+ }
+
+ return;
+ }
+
+ $this->info('We tried to send an exception to Flare. Please check if it arrived!');
+ }
+}
diff --git a/vendor/facade/ignition/src/Commands/stubs/runnable-solution.stub b/vendor/facade/ignition/src/Commands/stubs/runnable-solution.stub
new file mode 100644
index 00000000..cf4f53fd
--- /dev/null
+++ b/vendor/facade/ignition/src/Commands/stubs/runnable-solution.stub
@@ -0,0 +1,43 @@
+runningInConsole()) {
+ return new LaravelConsoleContext($_SERVER['argv'] ?? []);
+ }
+
+ $request = app(Request::class);
+
+ if ($this->isRunningLiveWire($request)) {
+ return new LivewireRequestContext($request, app(LivewireManager::class));
+ }
+
+ return new LaravelRequestContext($request);
+ }
+
+ protected function isRunningLiveWire(Request $request)
+ {
+ return $request->hasHeader('x-livewire') && $request->hasHeader('referer');
+ }
+}
diff --git a/vendor/facade/ignition/src/Context/LaravelRequestContext.php b/vendor/facade/ignition/src/Context/LaravelRequestContext.php
new file mode 100644
index 00000000..74be8bdd
--- /dev/null
+++ b/vendor/facade/ignition/src/Context/LaravelRequestContext.php
@@ -0,0 +1,85 @@
+request = $request;
+ }
+
+ public function getUser(): array
+ {
+ try {
+ $user = $this->request->user();
+
+ if (! $user) {
+ return [];
+ }
+ } catch (Throwable $e) {
+ return [];
+ }
+
+ try {
+ if (method_exists($user, 'toFlare')) {
+ return $user->toFlare();
+ }
+
+ if (method_exists($user, 'toArray')) {
+ return $user->toArray();
+ }
+ } catch (Throwable $e) {
+ return [];
+ }
+
+ return [];
+ }
+
+ public function getRoute(): array
+ {
+ $route = $this->request->route();
+
+ return [
+ 'route' => optional($route)->getName(),
+ 'routeParameters' => $this->getRouteParameters(),
+ 'controllerAction' => optional($route)->getActionName(),
+ 'middleware' => array_values(optional($route)->gatherMiddleware() ?? []),
+ ];
+ }
+
+ protected function getRouteParameters(): array
+ {
+ try {
+ return collect(optional($this->request->route())->parameters ?? [])
+ ->map(function ($parameter) {
+ return $parameter instanceof Model ? $parameter->withoutRelations() : $parameter;
+ })
+ ->map(function ($parameter) {
+ return method_exists($parameter, 'toFlare') ? $parameter->toFlare() : $parameter;
+ })
+ ->toArray();
+ } catch (Throwable $e) {
+ return [];
+ }
+ }
+
+ public function toArray(): array
+ {
+ $properties = parent::toArray();
+
+ $properties['route'] = $this->getRoute();
+
+ $properties['user'] = $this->getUser();
+
+ return $properties;
+ }
+}
diff --git a/vendor/facade/ignition/src/Context/LivewireRequestContext.php b/vendor/facade/ignition/src/Context/LivewireRequestContext.php
new file mode 100644
index 00000000..98e8f8c6
--- /dev/null
+++ b/vendor/facade/ignition/src/Context/LivewireRequestContext.php
@@ -0,0 +1,94 @@
+livewireManager = $livewireManager;
+ }
+
+ public function getRequest(): array
+ {
+ $properties = parent::getRequest();
+
+ $properties['method'] = $this->livewireManager->originalMethod();
+ $properties['url'] = $this->livewireManager->originalUrl();
+
+ return $properties;
+ }
+
+ public function toArray(): array
+ {
+ $properties = parent::toArray();
+
+ $properties['livewire'] = $this->getLiveWireInformation();
+
+ return $properties;
+ }
+
+ protected function getLiveWireInformation(): array
+ {
+ $componentId = $this->request->input('fingerprint.id');
+ $componentAlias = $this->request->input('fingerprint.name');
+
+ if ($componentAlias === null) {
+ return [];
+ }
+
+ try {
+ $componentClass = $this->livewireManager->getClass($componentAlias);
+ } catch (Exception $e) {
+ $componentClass = null;
+ }
+
+ return [
+ 'component_class' => $componentClass,
+ 'component_alias' => $componentAlias,
+ 'component_id' => $componentId,
+ 'data' => $this->resolveData(),
+ 'updates' => $this->resolveUpdates(),
+ ];
+ }
+
+ protected function resolveData(): array
+ {
+ $data = $this->request->input('serverMemo.data') ?? [];
+
+ $dataMeta = $this->request->input('serverMemo.dataMeta') ?? [];
+
+ foreach ($dataMeta['modelCollections'] ?? [] as $key => $value) {
+ $data[$key] = array_merge($data[$key] ?? [], $value);
+ }
+
+ foreach ($dataMeta['models'] ?? [] as $key => $value) {
+ $data[$key] = array_merge($data[$key] ?? [], $value);
+ }
+
+ return $data;
+ }
+
+ protected function resolveUpdates()
+ {
+ $updates = $this->request->input('updates') ?? [];
+
+ return array_map(function (array $update) {
+ $update['payload'] = Arr::except($update['payload'] ?? [], ['id']);
+
+ return $update;
+ }, $updates);
+ }
+}
diff --git a/vendor/facade/ignition/src/DumpRecorder/Dump.php b/vendor/facade/ignition/src/DumpRecorder/Dump.php
new file mode 100644
index 00000000..f68191e0
--- /dev/null
+++ b/vendor/facade/ignition/src/DumpRecorder/Dump.php
@@ -0,0 +1,36 @@
+htmlDump = $htmlDump;
+ $this->file = $file;
+ $this->lineNumber = $lineNumber;
+ $this->microtime = $microtime ?? microtime(true);
+ }
+
+ public function toArray(): array
+ {
+ return [
+ 'html_dump' => $this->htmlDump,
+ 'file' => $this->file,
+ 'line_number' => $this->lineNumber,
+ 'microtime' => $this->microtime,
+ ];
+ }
+}
diff --git a/vendor/facade/ignition/src/DumpRecorder/DumpHandler.php b/vendor/facade/ignition/src/DumpRecorder/DumpHandler.php
new file mode 100644
index 00000000..636f1e32
--- /dev/null
+++ b/vendor/facade/ignition/src/DumpRecorder/DumpHandler.php
@@ -0,0 +1,23 @@
+dumpRecorder = $dumpRecorder;
+ }
+
+ public function dump($value)
+ {
+ $data = (new VarCloner())->cloneVar($value);
+
+ $this->dumpRecorder->record($data);
+ }
+}
diff --git a/vendor/facade/ignition/src/DumpRecorder/DumpRecorder.php b/vendor/facade/ignition/src/DumpRecorder/DumpRecorder.php
new file mode 100644
index 00000000..7418aff8
--- /dev/null
+++ b/vendor/facade/ignition/src/DumpRecorder/DumpRecorder.php
@@ -0,0 +1,112 @@
+app = $app;
+ }
+
+ public function register(): self
+ {
+ $multiDumpHandler = new MultiDumpHandler();
+
+ $this->app->singleton(MultiDumpHandler::class, function () use ($multiDumpHandler) {
+ return $multiDumpHandler;
+ });
+
+ $previousHandler = VarDumper::setHandler(function ($var) use ($multiDumpHandler) {
+ $multiDumpHandler->dump($var);
+ });
+
+ if ($previousHandler) {
+ $multiDumpHandler->addHandler($previousHandler);
+ } else {
+ $multiDumpHandler->addHandler($this->getDefaultHandler());
+ }
+
+ $multiDumpHandler->addHandler(function ($var) {
+ (new DumpHandler($this))->dump($var);
+ });
+
+ return $this;
+ }
+
+ public function record(Data $data)
+ {
+ $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 8);
+ $file = (string)Arr::get($backtrace, '6.file');
+ $lineNumber = (int)Arr::get($backtrace, '6.line');
+
+ if (! Arr::exists($backtrace, '7.class') && (string)Arr::get($backtrace, '7.function') === 'ddd') {
+ $file = (string)Arr::get($backtrace, '7.file');
+ $lineNumber = (int)Arr::get($backtrace, '7.line');
+ }
+
+ $htmlDump = (new HtmlDumper())->dump($data);
+
+ $this->dumps[] = new Dump($htmlDump, $file, $lineNumber);
+ }
+
+ public function getDumps(): array
+ {
+ return $this->toArray();
+ }
+
+ public function reset()
+ {
+ $this->dumps = [];
+ }
+
+ public function toArray(): array
+ {
+ $dumps = [];
+
+ foreach ($this->dumps as $dump) {
+ $dumps[] = $dump->toArray();
+ }
+
+ return $dumps;
+ }
+
+ protected function getDefaultHandler()
+ {
+ return function ($value) {
+ $data = (new VarCloner())->cloneVar($value);
+
+ $this->getDumper()->dump($data);
+ };
+ }
+
+ protected function getDumper()
+ {
+ if (isset($_SERVER['VAR_DUMPER_FORMAT'])) {
+ if ($_SERVER['VAR_DUMPER_FORMAT'] === 'html') {
+ return new BaseHtmlDumper();
+ }
+
+ return new CliDumper();
+ }
+
+ if (in_array(PHP_SAPI, ['cli', 'phpdbg']) && ! isset($_SERVER['LARAVEL_OCTANE'])) {
+ return new CliDumper() ;
+ }
+
+ return new BaseHtmlDumper();
+ }
+}
diff --git a/vendor/facade/ignition/src/DumpRecorder/HtmlDumper.php b/vendor/facade/ignition/src/DumpRecorder/HtmlDumper.php
new file mode 100644
index 00000000..d4cf0c3f
--- /dev/null
+++ b/vendor/facade/ignition/src/DumpRecorder/HtmlDumper.php
@@ -0,0 +1,29 @@
+cloneVar($variable)->withMaxDepth(3);
+
+ return $this->dump($clonedData);
+ }
+
+ public function dump(Data $data, $output = null, array $extraDisplayOptions = []): string
+ {
+ return (string)parent::dump($data, true, [
+ 'maxDepth' => 3,
+ 'maxStringLength' => 160,
+ ]);
+ }
+}
diff --git a/vendor/facade/ignition/src/DumpRecorder/MultiDumpHandler.php b/vendor/facade/ignition/src/DumpRecorder/MultiDumpHandler.php
new file mode 100644
index 00000000..2902a7f5
--- /dev/null
+++ b/vendor/facade/ignition/src/DumpRecorder/MultiDumpHandler.php
@@ -0,0 +1,23 @@
+handlers as $handler) {
+ $handler($value);
+ }
+ }
+
+ public function addHandler(callable $callable = null): self
+ {
+ $this->handlers[] = $callable;
+
+ return $this;
+ }
+}
diff --git a/vendor/facade/ignition/src/ErrorPage/ErrorPageHandler.php b/vendor/facade/ignition/src/ErrorPage/ErrorPageHandler.php
new file mode 100644
index 00000000..637b84c2
--- /dev/null
+++ b/vendor/facade/ignition/src/ErrorPage/ErrorPageHandler.php
@@ -0,0 +1,77 @@
+flareClient = $app->make(Flare::class);
+ $this->ignitionConfig = $ignitionConfig;
+ $this->renderer = $renderer;
+ $this->solutionProviderRepository = $solutionProviderRepository;
+ }
+
+ public function handle(Throwable $throwable, $defaultTab = null, $defaultTabProps = [])
+ {
+ $report = $this->flareClient->createReport($throwable);
+
+ $solutions = $this->solutionProviderRepository->getSolutionsForThrowable($throwable);
+
+ $viewModel = new ErrorPageViewModel(
+ $throwable,
+ $this->ignitionConfig,
+ $report,
+ $solutions
+ );
+
+ $viewModel->defaultTab($defaultTab, $defaultTabProps);
+
+ $this->renderException($viewModel);
+ }
+
+ public function handleReport(Report $report, $defaultTab = null, $defaultTabProps = [])
+ {
+ $viewModel = new ErrorPageViewModel(
+ $report->getThrowable(),
+ $this->ignitionConfig,
+ $report,
+ []
+ );
+
+ $viewModel->defaultTab($defaultTab, $defaultTabProps);
+
+ $this->renderException($viewModel);
+ }
+
+ protected function renderException(ErrorPageViewModel $exceptionViewModel)
+ {
+ echo $this->renderer->render(
+ 'errorPage',
+ $exceptionViewModel->toArray()
+ );
+ }
+}
diff --git a/vendor/facade/ignition/src/ErrorPage/ErrorPageViewModel.php b/vendor/facade/ignition/src/ErrorPage/ErrorPageViewModel.php
new file mode 100644
index 00000000..5f99f2a8
--- /dev/null
+++ b/vendor/facade/ignition/src/ErrorPage/ErrorPageViewModel.php
@@ -0,0 +1,200 @@
+throwable = $throwable;
+
+ $this->ignitionConfig = $ignitionConfig;
+
+ $this->report = $report;
+
+ $this->solutions = $solutions;
+
+ $this->appEnv = config('app.env');
+ $this->appDebug = config('app.debug');
+ }
+
+ public function throwableString(): string
+ {
+ if (! $this->throwable) {
+ return '';
+ }
+
+ $throwableString = sprintf(
+ "%s: %s in file %s on line %d\n\n%s\n",
+ get_class($this->throwable),
+ $this->throwable->getMessage(),
+ $this->throwable->getFile(),
+ $this->throwable->getLine(),
+ $this->report->getThrowable()->getTraceAsString()
+ );
+
+ return htmlspecialchars($throwableString);
+ }
+
+ public function telescopeUrl(): ?string
+ {
+ try {
+ if (! class_exists(Telescope::class)) {
+ return null;
+ }
+
+ if (! count(Telescope::$entriesQueue)) {
+ return null;
+ }
+
+ $telescopeEntry = collect(Telescope::$entriesQueue)->first(function ($entry) {
+ return $entry instanceof IncomingExceptionEntry;
+ });
+
+ if (is_null($telescopeEntry)) {
+ return null;
+ }
+
+ $telescopeEntryId = (string) $telescopeEntry->uuid;
+
+ return url(action([HomeController::class, 'index'])."/exceptions/{$telescopeEntryId}");
+ } catch (Exception $exception) {
+ return null;
+ }
+ }
+
+ public function title(): string
+ {
+ $message = htmlspecialchars($this->report->getMessage());
+
+ return "🧨 {$message}";
+ }
+
+ public function config(): array
+ {
+ return $this->ignitionConfig->toArray();
+ }
+
+ public function solutions(): array
+ {
+ $solutions = [];
+
+ foreach ($this->solutions as $solution) {
+ $solutions[] = (new SolutionTransformer($solution))->toArray();
+ }
+
+ return $solutions;
+ }
+
+ protected function shareEndpoint(): string
+ {
+ try {
+ // use string notation as L5.5 and L5.6 don't support array notation yet
+ return action('\Facade\Ignition\Http\Controllers\ShareReportController');
+ } catch (Exception $exception) {
+ return '';
+ }
+ }
+
+ public function report(): array
+ {
+ return $this->report->toArray();
+ }
+
+ public function jsonEncode($data): string
+ {
+ $jsonOptions = JSON_PARTIAL_OUTPUT_ON_ERROR | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT;
+
+ return json_encode($data, $jsonOptions);
+ }
+
+ public function getAssetContents(string $asset): string
+ {
+ $assetPath = __DIR__."/../../resources/compiled/{$asset}";
+
+ return file_get_contents($assetPath);
+ }
+
+ public function styles(): array
+ {
+ return array_keys(Ignition::styles());
+ }
+
+ public function scripts(): array
+ {
+ return array_keys(Ignition::scripts());
+ }
+
+ public function tabs(): string
+ {
+ return json_encode(Ignition::$tabs);
+ }
+
+ public function defaultTab(?string $defaultTab, ?array $defaultTabProps)
+ {
+ $this->defaultTab = $defaultTab ?? 'StackTab';
+
+ if ($defaultTabProps) {
+ $this->defaultTabProps = $defaultTabProps;
+ }
+ }
+
+ public function toArray(): array
+ {
+ return [
+ 'throwableString' => $this->throwableString(),
+ 'telescopeUrl' => $this->telescopeUrl(),
+ 'shareEndpoint' => $this->shareEndpoint(),
+ 'title' => $this->title(),
+ 'config' => $this->config(),
+ 'solutions' => $this->solutions(),
+ 'report' => $this->report(),
+ 'housekeepingEndpoint' => url(config('ignition.housekeeping_endpoint_prefix', '_ignition')),
+ 'styles' => $this->styles(),
+ 'scripts' => $this->scripts(),
+ 'tabs' => $this->tabs(),
+ 'jsonEncode' => Closure::fromCallable([$this, 'jsonEncode']),
+ 'getAssetContents' => Closure::fromCallable([$this, 'getAssetContents']),
+ 'defaultTab' => $this->defaultTab,
+ 'defaultTabProps' => $this->defaultTabProps,
+ 'appEnv' => $this->appEnv,
+ 'appDebug' => $this->appDebug,
+ ];
+ }
+}
diff --git a/vendor/facade/ignition/src/ErrorPage/IgnitionExceptionRenderer.php b/vendor/facade/ignition/src/ErrorPage/IgnitionExceptionRenderer.php
new file mode 100644
index 00000000..ec53dd36
--- /dev/null
+++ b/vendor/facade/ignition/src/ErrorPage/IgnitionExceptionRenderer.php
@@ -0,0 +1,26 @@
+errorPageHandler = $errorPageHandler;
+ }
+
+ public function render($throwable)
+ {
+ ob_start();
+
+ $this->errorPageHandler->handle($throwable);
+
+ return ob_get_clean();
+ }
+}
diff --git a/vendor/facade/ignition/src/ErrorPage/IgnitionWhoopsHandler.php b/vendor/facade/ignition/src/ErrorPage/IgnitionWhoopsHandler.php
new file mode 100644
index 00000000..fda4d5c9
--- /dev/null
+++ b/vendor/facade/ignition/src/ErrorPage/IgnitionWhoopsHandler.php
@@ -0,0 +1,48 @@
+errorPageHandler = $errorPageHandler;
+ }
+
+ public function handle(): ?int
+ {
+ try {
+ $this->errorPageHandler->handle($this->exception);
+ } catch (Error $error) {
+ // Errors aren't caught by Whoops.
+ // Convert the error to an exception and throw again.
+
+ throw new ErrorException(
+ $error->getMessage(),
+ $error->getCode(),
+ 1,
+ $error->getFile(),
+ $error->getLine(),
+ $error
+ );
+ }
+
+ return Handler::QUIT;
+ }
+
+ /** @param \Throwable $exception */
+ public function setException($exception): void
+ {
+ $this->exception = $exception;
+ }
+}
diff --git a/vendor/facade/ignition/src/ErrorPage/Renderer.php b/vendor/facade/ignition/src/ErrorPage/Renderer.php
new file mode 100644
index 00000000..a058eb6e
--- /dev/null
+++ b/vendor/facade/ignition/src/ErrorPage/Renderer.php
@@ -0,0 +1,43 @@
+viewPath = $this->formatPath($viewPath);
+ }
+
+ public function render(string $viewName, array $_data): string
+ {
+ ob_start();
+
+ $viewFile = "{$this->viewPath}/{$viewName}.php";
+
+ try {
+ extract($_data, EXTR_OVERWRITE);
+
+ include $viewFile;
+ } catch (Exception $exception) {
+ $viewException = new ViewException($exception->getMessage());
+ $viewException->setView($viewFile);
+ $viewException->setViewData($_data);
+
+ throw $viewException;
+ }
+
+ return ob_get_clean();
+ }
+
+ protected function formatPath(string $path): string
+ {
+ return preg_replace('/(?:\/)+$/u', '', $path).'/';
+ }
+}
diff --git a/vendor/facade/ignition/src/Exceptions/InvalidConfig.php b/vendor/facade/ignition/src/Exceptions/InvalidConfig.php
new file mode 100644
index 00000000..e48a2812
--- /dev/null
+++ b/vendor/facade/ignition/src/Exceptions/InvalidConfig.php
@@ -0,0 +1,29 @@
+setSolutionDescription("Please change the log level in your `config/logging.php` file. Valid log levels are {$validLogLevelsString}.");
+ }
+}
diff --git a/vendor/facade/ignition/src/Exceptions/UnableToShareErrorException.php b/vendor/facade/ignition/src/Exceptions/UnableToShareErrorException.php
new file mode 100644
index 00000000..408bdefe
--- /dev/null
+++ b/vendor/facade/ignition/src/Exceptions/UnableToShareErrorException.php
@@ -0,0 +1,9 @@
+viewData = $data;
+ }
+
+ public function getViewData(): array
+ {
+ return $this->viewData;
+ }
+
+ public function setView(string $path)
+ {
+ $this->view = $path;
+ }
+
+ protected function dumpViewData($variable): string
+ {
+ return (new HtmlDumper())->dumpVariable($variable);
+ }
+
+ public function context(): array
+ {
+ $context = [
+ 'view' => [
+ 'view' => $this->view,
+ ],
+ ];
+
+ if (config('flare.reporting.report_view_data')) {
+ $context['view']['data'] = array_map([$this, 'dumpViewData'], $this->viewData);
+ }
+
+ return $context;
+ }
+}
diff --git a/vendor/facade/ignition/src/Exceptions/ViewExceptionWithSolution.php b/vendor/facade/ignition/src/Exceptions/ViewExceptionWithSolution.php
new file mode 100644
index 00000000..96319aaf
--- /dev/null
+++ b/vendor/facade/ignition/src/Exceptions/ViewExceptionWithSolution.php
@@ -0,0 +1,22 @@
+solution = $solution;
+ }
+
+ public function getSolution(): Solution
+ {
+ return $this->solution;
+ }
+}
diff --git a/vendor/facade/ignition/src/Facades/Flare.php b/vendor/facade/ignition/src/Facades/Flare.php
new file mode 100644
index 00000000..e689afb9
--- /dev/null
+++ b/vendor/facade/ignition/src/Facades/Flare.php
@@ -0,0 +1,28 @@
+ensureLocalEnvironment();
+ $this->ensureLocalRequest();
+
+ $solution = $request->getRunnableSolution();
+
+ $solution->run($request->get('parameters', []));
+
+ return response('');
+ }
+
+ public function ensureLocalEnvironment()
+ {
+ if (! app()->environment('local')) {
+ abort(403, "Runnable solutions are disabled in non-local environments. Please make sure `APP_ENV` is set correctly. Additionally please make sure `APP_DEBUG` is set to false on ANY production environment!");
+ }
+ }
+
+ public function ensureLocalRequest()
+ {
+ $ipIsPublic = filter_var(
+ request()->ip(),
+ FILTER_VALIDATE_IP,
+ FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE
+ );
+
+ if ($ipIsPublic) {
+ abort(403, "Solutions can only be executed by requests from a local IP address. Please also make sure `APP_DEBUG` is set to false on ANY production environment.");
+ }
+ }
+}
diff --git a/vendor/facade/ignition/src/Http/Controllers/HealthCheckController.php b/vendor/facade/ignition/src/Http/Controllers/HealthCheckController.php
new file mode 100644
index 00000000..fb4082a8
--- /dev/null
+++ b/vendor/facade/ignition/src/Http/Controllers/HealthCheckController.php
@@ -0,0 +1,25 @@
+ $this->canExecuteCommands(),
+ ];
+ }
+
+ protected function canExecuteCommands(): bool
+ {
+ Artisan::call('help', ['--version']);
+
+ $output = Artisan::output();
+
+ return Str::contains($output, app()->version());
+ }
+}
diff --git a/vendor/facade/ignition/src/Http/Controllers/ScriptController.php b/vendor/facade/ignition/src/Http/Controllers/ScriptController.php
new file mode 100644
index 00000000..9860f45e
--- /dev/null
+++ b/vendor/facade/ignition/src/Http/Controllers/ScriptController.php
@@ -0,0 +1,24 @@
+script])) {
+ abort(404, 'Script not found');
+ }
+
+ return response(
+ file_get_contents(
+ Ignition::scripts()[$request->script]
+ ),
+ 200,
+ ['Content-Type' => 'application/javascript']
+ );
+ }
+}
diff --git a/vendor/facade/ignition/src/Http/Controllers/ShareReportController.php b/vendor/facade/ignition/src/Http/Controllers/ShareReportController.php
new file mode 100644
index 00000000..a56ae405
--- /dev/null
+++ b/vendor/facade/ignition/src/Http/Controllers/ShareReportController.php
@@ -0,0 +1,19 @@
+handle(json_decode($request->get('report'), true), $request->get('tabs'), $request->get('lineSelection'));
+ } catch (UnableToShareErrorException $exception) {
+ abort(500, 'Unable to share the error '.$exception->getMessage());
+ }
+ }
+}
diff --git a/vendor/facade/ignition/src/Http/Controllers/StyleController.php b/vendor/facade/ignition/src/Http/Controllers/StyleController.php
new file mode 100644
index 00000000..1bcfecdf
--- /dev/null
+++ b/vendor/facade/ignition/src/Http/Controllers/StyleController.php
@@ -0,0 +1,18 @@
+style]),
+ 200,
+ ['Content-Type' => 'text/css']
+ );
+ }
+}
diff --git a/vendor/facade/ignition/src/Http/Middleware/IgnitionConfigValueEnabled.php b/vendor/facade/ignition/src/Http/Middleware/IgnitionConfigValueEnabled.php
new file mode 100644
index 00000000..c9293121
--- /dev/null
+++ b/vendor/facade/ignition/src/Http/Middleware/IgnitionConfigValueEnabled.php
@@ -0,0 +1,27 @@
+ignitionConfig = $ignitionConfig;
+ }
+
+ public function handle(Request $request, Closure $next, string $value)
+ {
+ if (! $this->ignitionConfig->toArray()[$value]) {
+ abort(404);
+ }
+
+ return $next($request);
+ }
+}
diff --git a/vendor/facade/ignition/src/Http/Middleware/IgnitionEnabled.php b/vendor/facade/ignition/src/Http/Middleware/IgnitionEnabled.php
new file mode 100644
index 00000000..25a0926e
--- /dev/null
+++ b/vendor/facade/ignition/src/Http/Middleware/IgnitionEnabled.php
@@ -0,0 +1,30 @@
+ignitionEnabled()) {
+ abort(404);
+ }
+
+ return $next($request);
+ }
+
+ protected function ignitionEnabled(): bool
+ {
+ return config('app.debug');
+ }
+}
diff --git a/vendor/facade/ignition/src/Http/Requests/ExecuteSolutionRequest.php b/vendor/facade/ignition/src/Http/Requests/ExecuteSolutionRequest.php
new file mode 100644
index 00000000..28d46c7f
--- /dev/null
+++ b/vendor/facade/ignition/src/Http/Requests/ExecuteSolutionRequest.php
@@ -0,0 +1,41 @@
+ 'required',
+ 'parameters' => 'array',
+ ];
+ }
+
+ public function getSolution(): Solution
+ {
+ $solution = app(SolutionProviderRepository::class)
+ ->getSolutionForClass($this->get('solution'));
+
+ abort_if(is_null($solution), 404, 'Solution could not be found');
+
+ /** @var Solution */
+ return $solution;
+ }
+
+ public function getRunnableSolution(): RunnableSolution
+ {
+ $solution = $this->getSolution();
+
+ if (! $solution instanceof RunnableSolution) {
+ abort(404, 'Runnable solution could not be found');
+ }
+
+ return $solution;
+ }
+}
diff --git a/vendor/facade/ignition/src/Http/Requests/ShareReportRequest.php b/vendor/facade/ignition/src/Http/Requests/ShareReportRequest.php
new file mode 100644
index 00000000..11363e6b
--- /dev/null
+++ b/vendor/facade/ignition/src/Http/Requests/ShareReportRequest.php
@@ -0,0 +1,17 @@
+ 'required',
+ 'tabs' => 'required|array|min:1',
+ 'lineSelection' => [],
+ ];
+ }
+}
diff --git a/vendor/facade/ignition/src/Ignition.php b/vendor/facade/ignition/src/Ignition.php
new file mode 100644
index 00000000..4bebaf4b
--- /dev/null
+++ b/vendor/facade/ignition/src/Ignition.php
@@ -0,0 +1,43 @@
+flatMap(function ($tab) {
+ return $tab->styles;
+ })
+ ->unique()
+ ->toArray();
+ }
+
+ public static function scripts(): array
+ {
+ return collect(static::$tabs)->flatMap(function ($tab) {
+ return $tab->scripts;
+ })
+ ->unique()
+ ->toArray();
+ }
+
+ public static function registerAssets(Closure $callable)
+ {
+ static::$callBeforeShowingErrorPage[] = $callable;
+ }
+}
diff --git a/vendor/facade/ignition/src/IgnitionConfig.php b/vendor/facade/ignition/src/IgnitionConfig.php
new file mode 100644
index 00000000..d6304cd5
--- /dev/null
+++ b/vendor/facade/ignition/src/IgnitionConfig.php
@@ -0,0 +1,75 @@
+options = $this->mergeWithDefaultConfig($options);
+ }
+
+ public function getEditor(): ?string
+ {
+ return Arr::get($this->options, 'editor');
+ }
+
+ public function getRemoteSitesPath(): ?string
+ {
+ return Arr::get($this->options, 'remote_sites_path');
+ }
+
+ public function getLocalSitesPath(): ?string
+ {
+ return Arr::get($this->options, 'local_sites_path');
+ }
+
+ public function getTheme(): ?string
+ {
+ return Arr::get($this->options, 'theme');
+ }
+
+ public function getEnableShareButton(): bool
+ {
+ if (! app()->isBooted()) {
+ return false;
+ }
+
+ return Arr::get($this->options, 'enable_share_button', true);
+ }
+
+ public function getEnableRunnableSolutions(): bool
+ {
+ $enabled = Arr::get($this->options, 'enable_runnable_solutions', null);
+
+ if ($enabled === null) {
+ $enabled = config('app.debug');
+ }
+
+ return $enabled ?? false;
+ }
+
+ public function toArray(): array
+ {
+ return [
+ 'editor' => $this->getEditor(),
+ 'remoteSitesPath' => $this->getRemoteSitesPath(),
+ 'localSitesPath' => $this->getLocalSitesPath(),
+ 'theme' => $this->getTheme(),
+ 'enableShareButton' => $this->getEnableShareButton(),
+ 'enableRunnableSolutions' => $this->getEnableRunnableSolutions(),
+ 'directorySeparator' => DIRECTORY_SEPARATOR,
+ ];
+ }
+
+ protected function mergeWithDefaultConfig(array $options = []): array
+ {
+ return array_merge(config('ignition') ?: include __DIR__.'/../config/ignition.php', $options);
+ }
+}
diff --git a/vendor/facade/ignition/src/IgnitionServiceProvider.php b/vendor/facade/ignition/src/IgnitionServiceProvider.php
new file mode 100644
index 00000000..adb35870
--- /dev/null
+++ b/vendor/facade/ignition/src/IgnitionServiceProvider.php
@@ -0,0 +1,559 @@
+app->runningInConsole()) {
+ $this->publishes([
+ __DIR__.'/../config/flare.php' => config_path('flare.php'),
+ ], 'flare-config');
+
+ $this->publishes([
+ __DIR__.'/../config/ignition.php' => config_path('ignition.php'),
+ ], 'ignition-config');
+
+ if (isset($_SERVER['argv']) && ['artisan', 'tinker'] === $_SERVER['argv']) {
+ Api::sendReportsInBatches(false);
+ }
+
+ $this->app->make(JobRecorder::class)->register();
+ }
+
+ $this
+ ->registerViewEngines()
+ ->registerHousekeepingRoutes()
+ ->registerLogHandler()
+ ->registerCommands();
+
+ if ($this->app->bound('queue')) {
+ $this->setupQueue($this->app->get('queue'));
+ }
+
+ if (isset($_SERVER['LARAVEL_OCTANE'])) {
+ $this->setupOctane();
+ }
+
+ if (config('flare.reporting.report_logs', true)) {
+ $this->app->make(LogRecorder::class)->register();
+ }
+
+ if (config('flare.reporting.report_queries', true)) {
+ $this->app->make(QueryRecorder::class)->register();
+ }
+
+ $this->app->make(DumpRecorder::class)->register();
+ }
+
+ public function register()
+ {
+ $this->mergeConfigFrom(__DIR__.'/../config/flare.php', 'flare');
+ $this->mergeConfigFrom(__DIR__.'/../config/ignition.php', 'ignition');
+
+ $this
+ ->registerSolutionProviderRepository()
+ ->registerRenderer()
+ ->registerExceptionRenderer()
+ ->registerIgnitionConfig()
+ ->registerFlare()
+ ->registerDumpCollector()
+ ->registerJobRecorder();
+
+ if (config('flare.reporting.report_logs', true)) {
+ $this->registerLogRecorder();
+ }
+
+ if (config('flare.reporting.report_queries', true)) {
+ $this->registerQueryRecorder();
+ }
+
+ if (config('flare.reporting.anonymize_ips')) {
+ $this->app->get(Flare::class)->anonymizeIp();
+ }
+
+ $this->app->get(Flare::class)->censorRequestBodyFields(config('flare.reporting.censor_request_body_fields', ['password']));
+
+ $this->registerBuiltInMiddleware();
+ }
+
+ protected function registerViewEngines()
+ {
+ if (! $this->hasCustomViewEnginesRegistered()) {
+ return $this;
+ }
+
+ $this->app->make('view.engine.resolver')->register('php', function () {
+ return new PhpEngine($this->app['files']);
+ });
+
+ $this->app->make('view.engine.resolver')->register('blade', function () {
+ if (class_exists(CompilerEngineForIgnition::class)) {
+ return new CompilerEngineForIgnition($this->app['blade.compiler']);
+ }
+
+ return new CompilerEngine($this->app['blade.compiler']);
+ });
+
+ return $this;
+ }
+
+ protected function registerHousekeepingRoutes()
+ {
+ if ($this->app->runningInConsole()) {
+ return $this;
+ }
+
+ Route::group([
+ 'as' => 'ignition.',
+ 'prefix' => config('ignition.housekeeping_endpoint_prefix', '_ignition'),
+ 'middleware' => [IgnitionEnabled::class],
+ ], function () {
+ Route::get('health-check', HealthCheckController::class)->name('healthCheck');
+
+ Route::post('execute-solution', ExecuteSolutionController::class)
+ ->middleware(IgnitionConfigValueEnabled::class.':enableRunnableSolutions')
+ ->name('executeSolution');
+
+ Route::post('share-report', ShareReportController::class)
+ ->middleware(IgnitionConfigValueEnabled::class.':enableShareButton')
+ ->name('shareReport');
+
+ Route::get('scripts/{script}', ScriptController::class)->name('scripts');
+ Route::get('styles/{style}', StyleController::class)->name('styles');
+ });
+
+ return $this;
+ }
+
+ protected function registerSolutionProviderRepository()
+ {
+ $this->app->singleton(SolutionProviderRepositoryContract::class, function () {
+ $defaultSolutions = $this->getDefaultSolutions();
+
+ return new SolutionProviderRepository($defaultSolutions);
+ });
+
+ return $this;
+ }
+
+ protected function registerRenderer()
+ {
+ $this->app->bind(Renderer::class, function () {
+ return new Renderer(__DIR__.'/../resources/views/');
+ });
+
+ return $this;
+ }
+
+ protected function registerExceptionRenderer()
+ {
+ if (interface_exists(\Whoops\Handler\HandlerInterface::class)) {
+ $this->app->bind(\Whoops\Handler\HandlerInterface::class, function (Application $app) {
+ return $app->make(IgnitionWhoopsHandler::class);
+ });
+ }
+
+ if (interface_exists(\Illuminate\Contracts\Foundation\ExceptionRenderer::class)) {
+ $this->app->bind(\Illuminate\Contracts\Foundation\ExceptionRenderer::class, function (Application $app) {
+ return $app->make(IgnitionExceptionRenderer::class);
+ });
+ }
+
+ return $this;
+ }
+
+ protected function registerIgnitionConfig()
+ {
+ $this->app->singleton(IgnitionConfig::class, function () {
+ $options = [];
+
+ try {
+ if ($configPath = $this->getConfigFileLocation()) {
+ $options = require $configPath;
+ }
+ } catch (Throwable $e) {
+ // possible open_basedir restriction
+ }
+
+ return new IgnitionConfig($options);
+ });
+
+ return $this;
+ }
+
+ protected function registerFlare()
+ {
+ $this->app->singleton('flare.http', function () {
+ return new Client(
+ config('flare.key'),
+ config('flare.secret'),
+ config('flare.base_url', 'https://reporting.flareapp.io/api')
+ );
+ });
+
+ $this->app->singleton(SentReports::class);
+
+ $this->app->alias('flare.http', Client::class);
+
+ $this->app->singleton(Flare::class, function () {
+ $client = new Flare($this->app->get('flare.http'), new LaravelContextDetector(), $this->app);
+ $client->applicationPath(base_path());
+ $client->stage(config('app.env'));
+
+ return $client;
+ });
+
+ return $this;
+ }
+
+ protected function registerLogHandler()
+ {
+ $this->app->singleton('flare.logger', function ($app) {
+ $handler = new FlareHandler(
+ $app->make(Flare::class),
+ $app->make(SentReports::class)
+ );
+
+ $logLevelString = config('logging.channels.flare.level', 'error');
+
+ $logLevel = $this->getLogLevel($logLevelString);
+
+ $handler->setMinimumReportLogLevel($logLevel);
+
+ $logger = new Logger('Flare');
+ $logger->pushHandler($handler);
+
+ return $logger;
+ });
+
+ if ($this->app['log'] instanceof LogManager) {
+ Log::extend('flare', function ($app) {
+ return $app['flare.logger'];
+ });
+ } else {
+ $this->bindLogListener();
+ }
+
+ return $this;
+ }
+
+ protected function getLogLevel(string $logLevelString): int
+ {
+ $logLevel = Logger::getLevels()[strtoupper($logLevelString)] ?? null;
+
+ if (! $logLevel) {
+ throw InvalidConfig::invalidLogLevel($logLevelString);
+ }
+
+ return $logLevel;
+ }
+
+ protected function registerLogRecorder(): self
+ {
+ $this->app->singleton(LogRecorder::class, function (Application $app): LogRecorder {
+ return new LogRecorder(
+ $app,
+ $app->get('config')->get('flare.reporting.maximum_number_of_collected_logs')
+ );
+ });
+
+ return $this;
+ }
+
+ protected function registerDumpCollector()
+ {
+ $dumpCollector = $this->app->make(DumpRecorder::class);
+
+ $this->app->singleton(DumpRecorder::class);
+
+ $this->app->instance(DumpRecorder::class, $dumpCollector);
+
+ return $this;
+ }
+
+ protected function registerJobRecorder()
+ {
+ if (! $this->app->runningInConsole()) {
+ return $this;
+ }
+
+ $this->app->singleton(JobRecorder::class);
+
+ return $this;
+ }
+
+ protected function registerCommands()
+ {
+ $this->app->bind('command.flare:test', TestCommand::class);
+ $this->app->bind('command.make:solution', SolutionMakeCommand::class);
+ $this->app->bind('command.make:solution-provider', SolutionProviderMakeCommand::class);
+
+ if ($this->app['config']->get('flare.key')) {
+ $this->commands(['command.flare:test']);
+ }
+
+ if ($this->app['config']->get('ignition.register_commands', false)) {
+ $this->commands(['command.make:solution']);
+ $this->commands(['command.make:solution-provider']);
+ }
+
+ return $this;
+ }
+
+ protected function registerQueryRecorder(): self
+ {
+ $this->app->singleton(QueryRecorder::class, function (Application $app): QueryRecorder {
+ return new QueryRecorder(
+ $app,
+ $app->get('config')->get('flare.reporting.report_query_bindings'),
+ $app->get('config')->get('flare.reporting.maximum_number_of_collected_queries')
+ );
+ });
+
+ return $this;
+ }
+
+ protected function registerBuiltInMiddleware()
+ {
+ $middlewares = [
+ SetNotifierName::class,
+ AddEnvironmentInformation::class,
+ AddExceptionInformation::class,
+ ];
+
+ if (config('flare.reporting.report_logs', true)) {
+ $middlewares[] = AddLogs::class;
+ }
+
+ $middlewares[] = AddDumps::class;
+
+ if (config('flare.reporting.report_queries', true)) {
+ $middlewares[] = AddQueries::class;
+ }
+
+ $middlewares[] = AddSolutions::class;
+
+ if ($this->app->runningInConsole()) {
+ $middlewares[] = AddJobInformation::class;
+ }
+
+ $middleware = collect($middlewares)
+ ->map(function (string $middlewareClass) {
+ return $this->app->make($middlewareClass);
+ });
+
+ if (config('flare.reporting.collect_git_information')) {
+ $middleware[] = (new AddGitInformation());
+ }
+
+ foreach ($middleware as $singleMiddleware) {
+ $this->app->get(Flare::class)->registerMiddleware($singleMiddleware);
+ }
+
+ return $this;
+ }
+
+ protected function getDefaultSolutions(): array
+ {
+ return [
+ IncorrectValetDbCredentialsSolutionProvider::class,
+ MissingAppKeySolutionProvider::class,
+ DefaultDbNameSolutionProvider::class,
+ BadMethodCallSolutionProvider::class,
+ TableNotFoundSolutionProvider::class,
+ MissingImportSolutionProvider::class,
+ MissingPackageSolutionProvider::class,
+ InvalidRouteActionSolutionProvider::class,
+ ViewNotFoundSolutionProvider::class,
+ UndefinedVariableSolutionProvider::class,
+ MergeConflictSolutionProvider::class,
+ RunningLaravelDuskInProductionProvider::class,
+ MissingColumnSolutionProvider::class,
+ UnknownValidationSolutionProvider::class,
+ UndefinedLivewireMethodSolutionProvider::class,
+ UndefinedLivewirePropertySolutionProvider::class,
+ UndefinedPropertySolutionProvider::class,
+ MissingMixManifestSolutionProvider::class,
+ MissingLivewireComponentSolutionProvider::class,
+ LazyLoadingViolationSolutionProvider::class,
+ ];
+ }
+
+ protected function hasCustomViewEnginesRegistered()
+ {
+ $resolver = $this->app->make('view.engine.resolver');
+
+ if (! $resolver->resolve('php') instanceof LaravelPhpEngine) {
+ return false;
+ }
+
+ if (! $resolver->resolve('blade') instanceof LaravelCompilerEngine) {
+ return false;
+ }
+
+ return true;
+ }
+
+ protected function bindLogListener()
+ {
+ $this->app['log']->listen(function (MessageLogged $messageLogged) {
+ if (config('flare.key')) {
+ try {
+ $this->app['flare.logger']->log(
+ $messageLogged->level,
+ $messageLogged->message,
+ $messageLogged->context
+ );
+ } catch (Exception $exception) {
+ return;
+ }
+ }
+ });
+ }
+
+ protected function getConfigFileLocation(): ?string
+ {
+ $configFullPath = base_path().DIRECTORY_SEPARATOR.'.ignition';
+
+ if (file_exists($configFullPath)) {
+ return $configFullPath;
+ }
+
+ $configFullPath = Arr::get($_SERVER, 'HOME', '').DIRECTORY_SEPARATOR.'.ignition';
+
+ if (file_exists($configFullPath)) {
+ return $configFullPath;
+ }
+
+ return null;
+ }
+
+ protected function resetFlare()
+ {
+ $this->app->get(SentReports::class)->clear();
+ $this->app->get(Flare::class)->reset();
+
+ if (config('flare.reporting.report_logs', true)) {
+ $this->app->make(LogRecorder::class)->reset();
+ }
+
+ if (config('flare.reporting.report_queries', true)) {
+ $this->app->make(QueryRecorder::class)->reset();
+ }
+
+ if ($this->app->runningInConsole()) {
+ $this->app->make(JobRecorder::class)->reset();
+ }
+
+ $this->app->make(DumpRecorder::class)->reset();
+ }
+
+ protected function setupQueue(QueueManager $queue)
+ {
+ // Reset before executing a queue job to make sure the job's log/query/dump recorders are empty.
+ // When using a sync queue this also reports the queued reports from previous exceptions.
+ $queue->before(function () {
+ $this->resetFlare();
+ });
+
+ // Send queued reports (and reset) after executing a queue job.
+ $queue->after(function () {
+ $this->resetFlare();
+ });
+
+ // Note: the $queue->looping() event can't be used because it's not triggered on Vapor
+ }
+
+ /** @psalm-suppress UndefinedClass */
+ protected function setupOctane()
+ {
+ $this->app['events']->listen(RequestReceived::class, function () {
+ $this->resetFlare();
+ });
+
+ $this->app['events']->listen(TaskReceived::class, function () {
+ $this->resetFlare();
+ });
+
+ $this->app['events']->listen(TickReceived::class, function () {
+ $this->resetFlare();
+ });
+ }
+}
diff --git a/vendor/facade/ignition/src/JobRecorder/JobRecorder.php b/vendor/facade/ignition/src/JobRecorder/JobRecorder.php
new file mode 100644
index 00000000..ba18c911
--- /dev/null
+++ b/vendor/facade/ignition/src/JobRecorder/JobRecorder.php
@@ -0,0 +1,167 @@
+app = $app;
+ }
+
+ public function register(): self
+ {
+ $this->app['events']->listen(JobExceptionOccurred::class, [$this, 'record']);
+
+ return $this;
+ }
+
+ public function record(JobExceptionOccurred $event): void
+ {
+ $this->job = $event->job;
+ }
+
+ public function getJob(): ?Job
+ {
+ return $this->job;
+ }
+
+ public function reset(): void
+ {
+ $this->job = null;
+ }
+
+ public function toArray(): array
+ {
+ if ($this->job === null) {
+ return [];
+ }
+
+ return array_merge(
+ $this->getJobProperties(),
+ [
+ 'name' => $this->job->resolveName(),
+ 'connection' => $this->job->getConnectionName(),
+ 'queue' => $this->job->getQueue(),
+ ]
+ );
+ }
+
+ protected function getJobProperties(): array
+ {
+ $payload = collect($this->resolveJobPayload());
+
+ $properties = [];
+
+ foreach ($payload as $key => $value) {
+ if (! in_array($key, ['job', 'data', 'displayName'])) {
+ $properties[$key] = $value;
+ }
+ }
+
+ if ($pushedAt = DateTime::createFromFormat('U.u', $payload->get('pushedAt', ''))) {
+ $properties['pushedAt'] = $pushedAt->format(DATE_ATOM);
+ }
+
+ try {
+ $properties['data'] = $this->resolveCommandProperties(
+ $this->resolveObjectFromCommand($payload['data']['command']),
+ config('ignition.max_chained_job_reporting_depth', 5)
+ );
+ } catch (Exception $exception) {
+ }
+
+ return $properties;
+ }
+
+ protected function resolveJobPayload(): array
+ {
+ if (! $this->job instanceof RedisJob) {
+ return $this->job->payload();
+ }
+
+ try {
+ return json_decode($this->job->getReservedJob(), true, 512, JSON_THROW_ON_ERROR);
+ } catch (Exception $e) {
+ return $this->job->payload();
+ }
+ }
+
+ protected function resolveCommandProperties(object $command, int $maxChainDepth): array
+ {
+ $propertiesToIgnore = ['job', 'closure'];
+
+ $properties = collect((new ReflectionClass($command))->getProperties())
+ ->reject(function (ReflectionProperty $property) use ($propertiesToIgnore) {
+ return in_array($property->name, $propertiesToIgnore);
+ })
+ ->mapWithKeys(function (ReflectionProperty $property) use ($command) {
+ try {
+ $property->setAccessible(true);
+
+ return [$property->name => $property->getValue($command)];
+ } catch (Error $error) {
+ return [$property->name => 'uninitialized'];
+ }
+ });
+
+ if ($properties->has('chained')) {
+ $properties['chained'] = $this->resolveJobChain($properties->get('chained'), $maxChainDepth);
+ }
+
+ return $properties->all();
+ }
+
+ protected function resolveJobChain(array $chainedCommands, int $maxDepth): array
+ {
+ if ($maxDepth === 0) {
+ return ['Ignition stopped recording jobs after this point since the max chain depth was reached'];
+ }
+
+ return array_map(
+ function (string $command) use ($maxDepth) {
+ $commandObject = $this->resolveObjectFromCommand($command);
+
+ return [
+ 'name' => $commandObject instanceof CallQueuedClosure ? $commandObject->displayName() : get_class($commandObject),
+ 'data' => $this->resolveCommandProperties($commandObject, $maxDepth - 1),
+ ];
+ },
+ $chainedCommands
+ );
+ }
+
+ // Taken from Illuminate\Queue\CallQueuedHandler
+ protected function resolveObjectFromCommand(string $command): object
+ {
+ if (Str::startsWith($command, 'O:')) {
+ return unserialize($command);
+ }
+
+ if ($this->app->bound(Encrypter::class)) {
+ return unserialize($this->app[Encrypter::class]->decrypt($command));
+ }
+
+ throw new RuntimeException('Unable to extract job payload.');
+ }
+}
diff --git a/vendor/facade/ignition/src/LogRecorder/LogMessage.php b/vendor/facade/ignition/src/LogRecorder/LogMessage.php
new file mode 100644
index 00000000..faf55be9
--- /dev/null
+++ b/vendor/facade/ignition/src/LogRecorder/LogMessage.php
@@ -0,0 +1,47 @@
+message = $message;
+ $this->level = $level;
+ $this->context = $context;
+ $this->microtime = $microtime ?? microtime(true);
+ }
+
+ public static function fromMessageLoggedEvent(MessageLogged $event): self
+ {
+ return new self(
+ $event->message,
+ $event->level,
+ $event->context
+ );
+ }
+
+ public function toArray()
+ {
+ return [
+ 'message' => $this->message,
+ 'level' => $this->level,
+ 'context' => $this->context,
+ 'microtime' => $this->microtime,
+ ];
+ }
+}
diff --git a/vendor/facade/ignition/src/LogRecorder/LogRecorder.php b/vendor/facade/ignition/src/LogRecorder/LogRecorder.php
new file mode 100644
index 00000000..31b3706e
--- /dev/null
+++ b/vendor/facade/ignition/src/LogRecorder/LogRecorder.php
@@ -0,0 +1,91 @@
+app = $app;
+ $this->maxLogs = $maxLogs;
+ }
+
+ public function register(): self
+ {
+ $this->app['events']->listen(MessageLogged::class, [$this, 'record']);
+
+ return $this;
+ }
+
+ public function record(MessageLogged $event): void
+ {
+ if ($this->shouldIgnore($event)) {
+ return;
+ }
+
+ $this->logMessages[] = LogMessage::fromMessageLoggedEvent($event);
+
+ if (is_int($this->maxLogs)) {
+ $this->logMessages = array_slice($this->logMessages, -$this->maxLogs);
+ }
+ }
+
+ public function getLogMessages(): array
+ {
+ return $this->toArray();
+ }
+
+ public function toArray(): array
+ {
+ $logMessages = [];
+
+ foreach ($this->logMessages as $log) {
+ $logMessages[] = $log->toArray();
+ }
+
+ return $logMessages;
+ }
+
+ protected function shouldIgnore($event): bool
+ {
+ if (! isset($event->context['exception'])) {
+ return false;
+ }
+
+ if (! $event->context['exception'] instanceof Throwable) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public function reset(): void
+ {
+ $this->logMessages = [];
+ }
+
+ public function getMaxLogs(): ?int
+ {
+ return $this->maxLogs;
+ }
+
+ public function setMaxLogs(?int $maxLogs): self
+ {
+ $this->maxLogs = $maxLogs;
+
+ return $this;
+ }
+}
diff --git a/vendor/facade/ignition/src/Logger/FlareHandler.php b/vendor/facade/ignition/src/Logger/FlareHandler.php
new file mode 100644
index 00000000..fdbdaffa
--- /dev/null
+++ b/vendor/facade/ignition/src/Logger/FlareHandler.php
@@ -0,0 +1,101 @@
+flare = $flare;
+
+ $this->sentReports = $sentReports;
+
+ parent::__construct($level, $bubble);
+ }
+
+ public function setMinimumReportLogLevel(int $level)
+ {
+ if (! in_array($level, Logger::getLevels())) {
+ throw new \InvalidArgumentException('The given minimum log level is not supported.');
+ }
+
+ $this->minimumReportLogLevel = $level;
+ }
+
+ protected function write(array $record): void
+ {
+ if (! $this->shouldReport($record)) {
+ return;
+ }
+
+ if ($this->hasException($record)) {
+ /** @var Throwable $throwable */
+ $throwable = $record['context']['exception'];
+
+ collect(Ignition::$tabs)
+ ->each(function (Tab $tab) use ($throwable) {
+ $tab->beforeRenderingErrorPage($this->flare, $throwable);
+ });
+
+ $report = $this->flare->report($record['context']['exception']);
+
+ if ($report) {
+ $this->sentReports->add($report);
+ }
+
+ return;
+ }
+
+ if (config('flare.send_logs_as_events')) {
+ if ($this->hasValidLogLevel($record)) {
+ $this->flare->reportMessage(
+ $record['message'],
+ 'Log ' . Logger::getLevelName($record['level']),
+ function (Report $flareReport) use ($record) {
+ foreach ($record['context'] as $key => $value) {
+ $flareReport->context($key, $value);
+ }
+ }
+ );
+ }
+ }
+ }
+
+ protected function shouldReport(array $report): bool
+ {
+ if (! config('flare.key')) {
+ return false;
+ }
+
+ return $this->hasException($report) || $this->hasValidLogLevel($report);
+ }
+
+ protected function hasException(array $report): bool
+ {
+ $context = $report['context'];
+
+ return isset($context['exception']) && $context['exception'] instanceof Throwable;
+ }
+
+ protected function hasValidLogLevel(array $report): bool
+ {
+ return $report['level'] >= $this->minimumReportLogLevel;
+ }
+}
diff --git a/vendor/facade/ignition/src/Middleware/AddDumps.php b/vendor/facade/ignition/src/Middleware/AddDumps.php
new file mode 100644
index 00000000..8afffa6f
--- /dev/null
+++ b/vendor/facade/ignition/src/Middleware/AddDumps.php
@@ -0,0 +1,24 @@
+dumpRecorder = $dumpRecorder;
+ }
+
+ public function handle(Report $report, $next)
+ {
+ $report->group('dumps', $this->dumpRecorder->getDumps());
+
+ return $next($report);
+ }
+}
diff --git a/vendor/facade/ignition/src/Middleware/AddEnvironmentInformation.php b/vendor/facade/ignition/src/Middleware/AddEnvironmentInformation.php
new file mode 100644
index 00000000..ed74ab63
--- /dev/null
+++ b/vendor/facade/ignition/src/Middleware/AddEnvironmentInformation.php
@@ -0,0 +1,22 @@
+frameworkVersion(app()->version());
+
+ $report->group('env', [
+ 'laravel_version' => app()->version(),
+ 'laravel_locale' => app()->getLocale(),
+ 'laravel_config_cached' => app()->configurationIsCached(),
+ 'php_version' => phpversion(),
+ ]);
+
+ return $next($report);
+ }
+}
diff --git a/vendor/facade/ignition/src/Middleware/AddExceptionInformation.php b/vendor/facade/ignition/src/Middleware/AddExceptionInformation.php
new file mode 100644
index 00000000..c1ba2046
--- /dev/null
+++ b/vendor/facade/ignition/src/Middleware/AddExceptionInformation.php
@@ -0,0 +1,24 @@
+getThrowable();
+
+ if (! $throwable instanceof QueryException) {
+ return $next($report);
+ }
+
+ $report->group('exception', [
+ 'raw_sql' => $throwable->getSql(),
+ ]);
+
+ return $next($report);
+ }
+}
diff --git a/vendor/facade/ignition/src/Middleware/AddGitInformation.php b/vendor/facade/ignition/src/Middleware/AddGitInformation.php
new file mode 100644
index 00000000..c1f43564
--- /dev/null
+++ b/vendor/facade/ignition/src/Middleware/AddGitInformation.php
@@ -0,0 +1,57 @@
+group('git', [
+ 'hash' => $this->hash(),
+ 'message' => $this->message(),
+ 'tag' => $this->tag(),
+ 'remote' => $this->remote(),
+ ]);
+ } catch (RuntimeException $exception) {
+ }
+
+ return $next($report);
+ }
+
+ public function hash(): ?string
+ {
+ return $this->command("git log --pretty=format:'%H' -n 1");
+ }
+
+ public function message(): ?string
+ {
+ return $this->command("git log --pretty=format:'%s' -n 1");
+ }
+
+ public function tag(): ?string
+ {
+ return $this->command('git describe --tags --abbrev=0');
+ }
+
+ public function remote(): ?string
+ {
+ return $this->command('git config --get remote.origin.url');
+ }
+
+ protected function command($command)
+ {
+ $process = (new ReflectionClass(Process::class))->hasMethod('fromShellCommandline')
+ ? Process::fromShellCommandline($command, base_path())
+ : new Process($command, base_path());
+
+ $process->run();
+
+ return trim($process->getOutput());
+ }
+}
diff --git a/vendor/facade/ignition/src/Middleware/AddJobInformation.php b/vendor/facade/ignition/src/Middleware/AddJobInformation.php
new file mode 100644
index 00000000..1143e1c5
--- /dev/null
+++ b/vendor/facade/ignition/src/Middleware/AddJobInformation.php
@@ -0,0 +1,26 @@
+jobRecorder = $jobRecorder;
+ }
+
+ public function handle(Report $report, $next)
+ {
+ if ($this->jobRecorder->getJob()) {
+ $report->group('job', $this->jobRecorder->toArray());
+ }
+
+ return $next($report);
+ }
+}
diff --git a/vendor/facade/ignition/src/Middleware/AddLogs.php b/vendor/facade/ignition/src/Middleware/AddLogs.php
new file mode 100644
index 00000000..ea1d320c
--- /dev/null
+++ b/vendor/facade/ignition/src/Middleware/AddLogs.php
@@ -0,0 +1,24 @@
+logRecorder = $logRecorder;
+ }
+
+ public function handle(Report $report, $next)
+ {
+ $report->group('logs', $this->logRecorder->getLogMessages());
+
+ return $next($report);
+ }
+}
diff --git a/vendor/facade/ignition/src/Middleware/AddQueries.php b/vendor/facade/ignition/src/Middleware/AddQueries.php
new file mode 100644
index 00000000..f55094fe
--- /dev/null
+++ b/vendor/facade/ignition/src/Middleware/AddQueries.php
@@ -0,0 +1,24 @@
+queryRecorder = $queryRecorder;
+ }
+
+ public function handle(Report $report, $next)
+ {
+ $report->group('queries', $this->queryRecorder->getQueries());
+
+ return $next($report);
+ }
+}
diff --git a/vendor/facade/ignition/src/Middleware/AddSolutions.php b/vendor/facade/ignition/src/Middleware/AddSolutions.php
new file mode 100644
index 00000000..e0dc7ec6
--- /dev/null
+++ b/vendor/facade/ignition/src/Middleware/AddSolutions.php
@@ -0,0 +1,30 @@
+solutionProviderRepository = $solutionProviderRepository;
+ }
+
+ public function handle(Report $report, $next)
+ {
+ if ($throwable = $report->getThrowable()) {
+ $solutions = $this->solutionProviderRepository->getSolutionsForThrowable($throwable);
+
+ foreach ($solutions as $solution) {
+ $report->addSolution($solution);
+ }
+ }
+
+ return $next($report);
+ }
+}
diff --git a/vendor/facade/ignition/src/Middleware/SetNotifierName.php b/vendor/facade/ignition/src/Middleware/SetNotifierName.php
new file mode 100644
index 00000000..7b5740d4
--- /dev/null
+++ b/vendor/facade/ignition/src/Middleware/SetNotifierName.php
@@ -0,0 +1,17 @@
+notifierName(static::NOTIFIER_NAME);
+
+ return $next($report);
+ }
+}
diff --git a/vendor/facade/ignition/src/QueryRecorder/Query.php b/vendor/facade/ignition/src/QueryRecorder/Query.php
new file mode 100644
index 00000000..98885759
--- /dev/null
+++ b/vendor/facade/ignition/src/QueryRecorder/Query.php
@@ -0,0 +1,58 @@
+sql,
+ $queryExecuted->time,
+ $queryExecuted->connectionName ?? '',
+ $reportBindings ? $queryExecuted->bindings : null
+ );
+ }
+
+ protected function __construct(
+ string $sql,
+ float $time,
+ string $connectionName,
+ ?array $bindings = null,
+ ?float $microtime = null
+ ) {
+ $this->sql = $sql;
+ $this->time = $time;
+ $this->connectionName = $connectionName;
+ $this->bindings = $bindings;
+ $this->microtime = $microtime ?? microtime(true);
+ }
+
+ public function toArray(): array
+ {
+ return [
+ 'sql' => $this->sql,
+ 'time' => $this->time,
+ 'connection_name' => $this->connectionName,
+ 'bindings' => $this->bindings,
+ 'microtime' => $this->microtime,
+ ];
+ }
+}
diff --git a/vendor/facade/ignition/src/QueryRecorder/QueryRecorder.php b/vendor/facade/ignition/src/QueryRecorder/QueryRecorder.php
new file mode 100644
index 00000000..423d67c7
--- /dev/null
+++ b/vendor/facade/ignition/src/QueryRecorder/QueryRecorder.php
@@ -0,0 +1,87 @@
+app = $app;
+ $this->reportBindings = $reportBindings;
+ $this->maxQueries = $maxQueries;
+ }
+
+ public function register()
+ {
+ $this->app['events']->listen(QueryExecuted::class, [$this, 'record']);
+
+ return $this;
+ }
+
+ public function record(QueryExecuted $queryExecuted)
+ {
+ $this->queries[] = Query::fromQueryExecutedEvent($queryExecuted, $this->reportBindings);
+
+ if (is_int($this->maxQueries)) {
+ $this->queries = array_slice($this->queries, -$this->maxQueries);
+ }
+ }
+
+ public function getQueries(): array
+ {
+ $queries = [];
+
+ foreach ($this->queries as $query) {
+ $queries[] = $query->toArray();
+ }
+
+ return $queries;
+ }
+
+ public function reset()
+ {
+ $this->queries = [];
+ }
+
+ public function getReportBindings(): bool
+ {
+ return $this->reportBindings;
+ }
+
+ public function setReportBindings(bool $reportBindings): self
+ {
+ $this->reportBindings = $reportBindings;
+
+ return $this;
+ }
+
+ public function getMaxQueries(): ?int
+ {
+ return $this->maxQueries;
+ }
+
+ public function setMaxQueries(?int $maxQueries): self
+ {
+ $this->maxQueries = $maxQueries;
+
+ return $this;
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/BadMethodCallSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/BadMethodCallSolutionProvider.php
new file mode 100644
index 00000000..4aa85871
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/BadMethodCallSolutionProvider.php
@@ -0,0 +1,79 @@
+getClassAndMethodFromExceptionMessage($throwable->getMessage()))) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ return [
+ BaseSolution::create('Bad Method Call')
+ ->setSolutionDescription($this->getSolutionDescription($throwable)),
+ ];
+ }
+
+ public function getSolutionDescription(Throwable $throwable): string
+ {
+ if (! $this->canSolve($throwable)) {
+ return '';
+ }
+
+ extract($this->getClassAndMethodFromExceptionMessage($throwable->getMessage()), EXTR_OVERWRITE);
+
+ $possibleMethod = $this->findPossibleMethod($class, $method);
+
+ return "Did you mean {$class}::{$possibleMethod->name}() ?";
+ }
+
+ protected function getClassAndMethodFromExceptionMessage(string $message): ?array
+ {
+ if (! preg_match(self::REGEX, $message, $matches)) {
+ return null;
+ }
+
+ return [
+ 'class' => $matches[1],
+ 'method' => $matches[2],
+ ];
+ }
+
+ protected function findPossibleMethod(string $class, string $invalidMethodName)
+ {
+ return $this->getAvailableMethods($class)
+ ->sortByDesc(function (ReflectionMethod $method) use ($invalidMethodName) {
+ similar_text($invalidMethodName, $method->name, $percentage);
+
+ return $percentage;
+ })->first();
+ }
+
+ protected function getAvailableMethods($class): Collection
+ {
+ $class = new ReflectionClass($class);
+
+ return Collection::make($class->getMethods());
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/DefaultDbNameSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/DefaultDbNameSolutionProvider.php
new file mode 100644
index 00000000..77f904e8
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/DefaultDbNameSolutionProvider.php
@@ -0,0 +1,35 @@
+getCode() !== self::MYSQL_UNKNOWN_DATABASE_CODE) {
+ return false;
+ }
+
+ if (! in_array(env('DB_DATABASE'), ['homestead', 'laravel'])) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ return [new SuggestUsingCorrectDbNameSolution()];
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/IncorrectValetDbCredentialsSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/IncorrectValetDbCredentialsSolutionProvider.php
new file mode 100644
index 00000000..d1a1604b
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/IncorrectValetDbCredentialsSolutionProvider.php
@@ -0,0 +1,67 @@
+isAccessDeniedCode($throwable->getCode())) {
+ return false;
+ }
+
+ if (! $this->envFileExists()) {
+ return false;
+ }
+
+ if (! $this->isValetInstalled()) {
+ return false;
+ }
+
+ if ($this->usingCorrectDefaultCredentials()) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ return [new UseDefaultValetDbCredentialsSolution()];
+ }
+
+ protected function envFileExists(): bool
+ {
+ return file_exists(base_path('.env'));
+ }
+
+ protected function isAccessDeniedCode($code): bool
+ {
+ return $code === static::MYSQL_ACCESS_DENIED_CODE;
+ }
+
+ protected function isValetInstalled(): bool
+ {
+ return file_exists('/usr/local/bin/valet');
+ }
+
+ protected function usingCorrectDefaultCredentials(): bool
+ {
+ return env('DB_USERNAME') === 'root' && env('DB_PASSWORD') === '';
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/InvalidRouteActionSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/InvalidRouteActionSolutionProvider.php
new file mode 100644
index 00000000..c78cb432
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/InvalidRouteActionSolutionProvider.php
@@ -0,0 +1,79 @@
+getMessage(), $matches)) {
+ return false;
+ }
+
+ return Str::startsWith($throwable->getMessage(), 'Invalid route action: ');
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ preg_match(self::REGEX, $throwable->getMessage(), $matches);
+
+ $invalidController = $matches[1] ?? null;
+
+ $suggestedController = $this->findRelatedController($invalidController);
+
+ if ($suggestedController === $invalidController) {
+ return [
+ BaseSolution::create("`{$invalidController}` is not invokable.")
+ ->setSolutionDescription("The controller class `{$invalidController}` is not invokable. Did you forget to add the `__invoke` method or is the controller's method missing in your routes file?"),
+ ];
+ }
+
+ if ($suggestedController) {
+ return [
+ BaseSolution::create("`{$invalidController}` was not found.")
+ ->setSolutionDescription("Controller class `{$invalidController}` for one of your routes was not found. Did you mean `{$suggestedController}`?"),
+ ];
+ }
+
+ return [
+ BaseSolution::create("`{$invalidController}` was not found.")
+ ->setSolutionDescription("Controller class `{$invalidController}` for one of your routes was not found. Are you sure this controller exists and is imported correctly?"),
+ ];
+ }
+
+ protected function findRelatedController(string $invalidController): ?string
+ {
+ $composerClassMap = app(ComposerClassMap::class);
+
+ $controllers = collect($composerClassMap->listClasses())
+ ->filter(function (string $_file, string $fqcn) {
+ return Str::endsWith($fqcn, 'Controller');
+ })
+ ->mapWithKeys(function (string $_file, string $fqcn) {
+ return [$fqcn => class_basename($fqcn)];
+ })
+ ->toArray();
+
+ $basenameMatch = StringComparator::findClosestMatch($controllers, $invalidController, 4);
+
+ $controllers = array_flip($controllers);
+
+ $fqcnMatch = StringComparator::findClosestMatch($controllers, $invalidController, 4);
+
+ return $fqcnMatch ?? $basenameMatch;
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/LazyLoadingViolationSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/LazyLoadingViolationSolutionProvider.php
new file mode 100644
index 00000000..1b772135
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/LazyLoadingViolationSolutionProvider.php
@@ -0,0 +1,41 @@
+getPrevious()) {
+ return false;
+ }
+
+ return $previous instanceof LazyLoadingViolationException;
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ $majorVersion = LaravelVersion::major();
+
+ return [BaseSolution::create(
+ 'Lazy loading was disabled to detect N+1 problems'
+ )
+ ->setSolutionDescription(
+ 'Either avoid lazy loading the relation or allow lazy loading.'
+ )
+ ->setDocumentationLinks([
+ 'Read the docs on preventing lazy loading' => "https://laravel.com/docs/{$majorVersion}.x/eloquent-relationships#preventing-lazy-loading",
+ 'Watch a video on how to deal with the N+1 problem' => 'https://www.youtube.com/watch?v=ZE7KBeraVpc',
+ ]),];
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/MergeConflictSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/MergeConflictSolutionProvider.php
new file mode 100644
index 00000000..5e91aa63
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/MergeConflictSolutionProvider.php
@@ -0,0 +1,75 @@
+hasMergeConflictExceptionMessage($throwable)) {
+ return false;
+ }
+
+ $file = file_get_contents($throwable->getFile());
+
+ if (strpos($file, '=======') === false) {
+ return false;
+ }
+
+ if (strpos($file, '>>>>>>>') === false) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ $file = file_get_contents($throwable->getFile());
+ preg_match('/\>\>\>\>\>\>\> (.*?)\n/', $file, $matches);
+ $source = $matches[1];
+
+ $target = $this->getCurrentBranch(basename($throwable->getFile()));
+
+ return [
+ BaseSolution::create("Merge conflict from branch '$source' into $target")
+ ->setSolutionDescription('You have a Git merge conflict. To undo your merge do `git reset --hard HEAD`'),
+ ];
+ }
+
+ protected function getCurrentBranch(string $directory): string
+ {
+ $branch = "'".trim(shell_exec("cd ${directory}; git branch | grep \\* | cut -d ' ' -f2"))."'";
+
+ if ($branch === "''") {
+ $branch = 'current branch';
+ }
+
+ return $branch;
+ }
+
+ protected function hasMergeConflictExceptionMessage(Throwable $throwable): bool
+ {
+ // For PHP 7.x and below
+ if (Str::startsWith($throwable->getMessage(), 'syntax error, unexpected \'<<\'')) {
+ return true;
+ }
+
+ // For PHP 8+
+ if (Str::startsWith($throwable->getMessage(), 'syntax error, unexpected token "<<"')) {
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/MissingAppKeySolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/MissingAppKeySolutionProvider.php
new file mode 100644
index 00000000..c0648dca
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/MissingAppKeySolutionProvider.php
@@ -0,0 +1,25 @@
+getMessage() === 'No application encryption key has been specified.';
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ return [new GenerateAppKeySolution()];
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/MissingColumnSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/MissingColumnSolutionProvider.php
new file mode 100644
index 00000000..27b2a5d3
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/MissingColumnSolutionProvider.php
@@ -0,0 +1,35 @@
+isBadTableErrorCode($throwable->getCode());
+ }
+
+ protected function isBadTableErrorCode($code): bool
+ {
+ return $code === static::MYSQL_BAD_FIELD_CODE;
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ return [new RunMigrationsSolution('A column was not found')];
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/MissingImportSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/MissingImportSolutionProvider.php
new file mode 100644
index 00000000..55aaadc9
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/MissingImportSolutionProvider.php
@@ -0,0 +1,48 @@
+getMessage(), $matches)) {
+ return false;
+ }
+
+ $class = $matches[1];
+
+ $this->composerClassMap = new ComposerClassMap();
+
+ $this->search($class);
+
+ return ! is_null($this->foundClass);
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ return [new SuggestImportSolution($this->foundClass)];
+ }
+
+ protected function search(string $missingClass)
+ {
+ $this->foundClass = $this->composerClassMap->searchClassMap($missingClass);
+
+ if (is_null($this->foundClass)) {
+ $this->foundClass = $this->composerClassMap->searchPsrMaps($missingClass);
+ }
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/MissingLivewireComponentSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/MissingLivewireComponentSolutionProvider.php
new file mode 100644
index 00000000..bddf8915
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/MissingLivewireComponentSolutionProvider.php
@@ -0,0 +1,42 @@
+livewireIsInstalled()) {
+ return false;
+ }
+
+ if (! $throwable instanceof ComponentNotFoundException) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ return [new LivewireDiscoverSolution('A Livewire component was not found')];
+ }
+
+ public function livewireIsInstalled(): bool
+ {
+ if (! class_exists(ComponentNotFoundException::class)) {
+ return false;
+ }
+ if (! class_exists(LivewireComponentsFinder::class)) {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/MissingMixManifestSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/MissingMixManifestSolutionProvider.php
new file mode 100644
index 00000000..224501fe
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/MissingMixManifestSolutionProvider.php
@@ -0,0 +1,24 @@
+getMessage(), 'The Mix manifest does not exist');
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ return [
+ BaseSolution::create('Missing Mix Manifest File')
+ ->setSolutionDescription('Did you forget to run `npm ci && npm run dev`?'),
+ ];
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/MissingPackageSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/MissingPackageSolutionProvider.php
new file mode 100644
index 00000000..2eed0410
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/MissingPackageSolutionProvider.php
@@ -0,0 +1,58 @@
+getMessage(), $matches)) {
+ return false;
+ }
+
+ $class = $matches[1];
+
+ if (Str::startsWith($class, app()->getNamespace())) {
+ return false;
+ }
+
+ $this->package = $this->findPackageFromClassName($class);
+
+ return ! is_null($this->package);
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ return [new MissingPackageSolution($this->package)];
+ }
+
+ protected function findPackageFromClassName(string $missingClassName): ?Package
+ {
+ if (! $package = $this->findComposerPackageForClassName($missingClassName)) {
+ return null;
+ }
+
+ return $package->hasNamespaceThatContainsClassName($missingClassName)
+ ? $package
+ : null;
+ }
+
+ protected function findComposerPackageForClassName(string $className): ?Package
+ {
+ $packages = Packagist::findPackagesForClassName($className);
+
+ return $packages[0] ?? null;
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/RouteNotDefinedSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/RouteNotDefinedSolutionProvider.php
new file mode 100644
index 00000000..b866d616
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/RouteNotDefinedSolutionProvider.php
@@ -0,0 +1,63 @@
+=')) {
+ if (! $throwable instanceof RouteNotFoundException) {
+ return false;
+ }
+ }
+
+ if (version_compare(Application::VERSION, '6.0.0', '<')) {
+ if (! $throwable instanceof InvalidArgumentException && ! $throwable instanceof ViewException) {
+ return false;
+ }
+ }
+
+ return (bool)preg_match(self::REGEX, $throwable->getMessage(), $matches);
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ preg_match(self::REGEX, $throwable->getMessage(), $matches);
+
+ $missingRoute = $matches[1] ?? null;
+
+ $suggestedRoute = $this->findRelatedRoute($missingRoute);
+
+ if ($suggestedRoute) {
+ return [
+ BaseSolution::create("{$missingRoute} was not defined.")
+ ->setSolutionDescription("Did you mean `{$suggestedRoute}`?"),
+ ];
+ }
+
+ return [
+ BaseSolution::create("{$missingRoute} was not defined.")
+ ->setSolutionDescription('Are you sure that the route is defined'),
+ ];
+ }
+
+ protected function findRelatedRoute(string $missingRoute): ?string
+ {
+ Route::getRoutes()->refreshNameLookups();
+
+ return StringComparator::findClosestMatch(array_keys(Route::getRoutes()->getRoutesByName()), $missingRoute);
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/RunningLaravelDuskInProductionProvider.php b/vendor/facade/ignition/src/SolutionProviders/RunningLaravelDuskInProductionProvider.php
new file mode 100644
index 00000000..e1474835
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/RunningLaravelDuskInProductionProvider.php
@@ -0,0 +1,30 @@
+getMessage() === 'It is unsafe to run Dusk in production.';
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ return [
+ BaseSolution::create('Laravel Dusk should not be run in production.')
+ ->setSolutionDescription('Install the dependencies with the `--no-dev` flag.'),
+ BaseSolution::create('Laravel Dusk can be run in other environments.')
+ ->setSolutionDescription('Consider setting the `APP_ENV` to something other than `production` like `local` for example.'),
+ ];
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/SolutionProviderRepository.php b/vendor/facade/ignition/src/SolutionProviders/SolutionProviderRepository.php
new file mode 100644
index 00000000..01b2ca90
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/SolutionProviderRepository.php
@@ -0,0 +1,95 @@
+solutionProviders = Collection::make($solutionProviders);
+ }
+
+ public function registerSolutionProvider(string $solutionProviderClass): SolutionProviderRepositoryContract
+ {
+ $this->solutionProviders->push($solutionProviderClass);
+
+ return $this;
+ }
+
+ public function registerSolutionProviders(array $solutionProviderClasses): SolutionProviderRepositoryContract
+ {
+ $this->solutionProviders = $this->solutionProviders->merge($solutionProviderClasses);
+
+ return $this;
+ }
+
+ public function getSolutionsForThrowable(Throwable $throwable): array
+ {
+ $solutions = [];
+
+ if ($throwable instanceof Solution) {
+ $solutions[] = $throwable;
+ }
+
+ if ($throwable instanceof ProvidesSolution) {
+ $solutions[] = $throwable->getSolution();
+ }
+
+ $providedSolutions = $this->solutionProviders
+ ->filter(function (string $solutionClass) {
+ if (! in_array(HasSolutionsForThrowable::class, class_implements($solutionClass))) {
+ return false;
+ }
+
+ if (in_array($solutionClass, config('ignition.ignored_solution_providers', []))) {
+ return false;
+ }
+
+ return true;
+ })
+ ->map(function (string $solutionClass) {
+ return app($solutionClass);
+ })
+ ->filter(function (HasSolutionsForThrowable $solutionProvider) use ($throwable) {
+ try {
+ return $solutionProvider->canSolve($throwable);
+ } catch (Throwable $e) {
+ return false;
+ }
+ })
+ ->map(function (HasSolutionsForThrowable $solutionProvider) use ($throwable) {
+ try {
+ return $solutionProvider->getSolutions($throwable);
+ } catch (Throwable $e) {
+ return [];
+ }
+ })
+ ->flatten()
+ ->toArray();
+
+ return array_merge($solutions, $providedSolutions);
+ }
+
+ public function getSolutionForClass(string $solutionClass): ?Solution
+ {
+ if (! class_exists($solutionClass)) {
+ return null;
+ }
+
+ if (! in_array(Solution::class, class_implements($solutionClass))) {
+ return null;
+ }
+
+ return app($solutionClass);
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/TableNotFoundSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/TableNotFoundSolutionProvider.php
new file mode 100644
index 00000000..e4e5d7a8
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/TableNotFoundSolutionProvider.php
@@ -0,0 +1,35 @@
+isBadTableErrorCode($throwable->getCode());
+ }
+
+ protected function isBadTableErrorCode($code): bool
+ {
+ return $code === static::MYSQL_BAD_TABLE_CODE;
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ return [new RunMigrationsSolution('A table was not found')];
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/UndefinedLivewireMethodSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/UndefinedLivewireMethodSolutionProvider.php
new file mode 100644
index 00000000..dd1156f4
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/UndefinedLivewireMethodSolutionProvider.php
@@ -0,0 +1,48 @@
+ $methodName, 'component' => $component] = $this->getMethodAndComponent($throwable);
+
+ if ($methodName === null || $component === null) {
+ return [];
+ }
+
+ $parsed = LivewireComponentParser::create($component);
+
+ return $parsed->getMethodNamesLike($methodName)
+ ->map(function (string $suggested) use ($parsed, $methodName) {
+ return new SuggestLivewireMethodNameSolution(
+ $methodName,
+ $parsed->getComponentClass(),
+ $suggested
+ );
+ })
+ ->toArray();
+ }
+
+ protected function getMethodAndComponent(Throwable $throwable): array
+ {
+ preg_match_all('/\[([\d\w\-_]*)\]/m', $throwable->getMessage(), $matches, PREG_SET_ORDER);
+
+ return [
+ 'methodName' => $matches[0][1] ?? null,
+ 'component' => $matches[1][1] ?? null,
+ ];
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/UndefinedLivewirePropertySolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/UndefinedLivewirePropertySolutionProvider.php
new file mode 100644
index 00000000..67039950
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/UndefinedLivewirePropertySolutionProvider.php
@@ -0,0 +1,49 @@
+ $variable, 'component' => $component] = $this->getMethodAndComponent($throwable);
+
+ if ($variable === null || $component === null) {
+ return [];
+ }
+
+ $parsed = LivewireComponentParser::create($component);
+
+ return $parsed->getPropertyNamesLike($variable)
+ ->map(function (string $suggested) use ($parsed, $variable) {
+ return new SuggestLivewirePropertyNameSolution(
+ $variable,
+ $parsed->getComponentClass(),
+ '$'.$suggested
+ );
+ })
+ ->toArray();
+ }
+
+ protected function getMethodAndComponent(Throwable $throwable): array
+ {
+ preg_match_all('/\[([\d\w\-_\$]*)\]/m', $throwable->getMessage(), $matches, PREG_SET_ORDER, 0);
+
+ return [
+ 'variable' => $matches[0][1] ?? null,
+ 'component' => $matches[1][1] ?? null,
+ ];
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/UndefinedPropertySolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/UndefinedPropertySolutionProvider.php
new file mode 100644
index 00000000..09ea19b1
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/UndefinedPropertySolutionProvider.php
@@ -0,0 +1,98 @@
+getClassAndPropertyFromExceptionMessage($throwable->getMessage()))) {
+ return false;
+ }
+
+ if (! $this->similarPropertyExists($throwable)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ return [
+ BaseSolution::create('Unknown Property')
+ ->setSolutionDescription($this->getSolutionDescription($throwable)),
+ ];
+ }
+
+ public function getSolutionDescription(Throwable $throwable): string
+ {
+ if (! $this->canSolve($throwable) || ! $this->similarPropertyExists($throwable)) {
+ return '';
+ }
+
+ extract($this->getClassAndPropertyFromExceptionMessage($throwable->getMessage()), EXTR_OVERWRITE);
+
+ $possibleProperty = $this->findPossibleProperty($class, $property);
+
+ return "Did you mean {$class}::\${$possibleProperty->name} ?";
+ }
+
+ protected function similarPropertyExists(Throwable $throwable)
+ {
+ extract($this->getClassAndPropertyFromExceptionMessage($throwable->getMessage()), EXTR_OVERWRITE);
+
+ $possibleProperty = $this->findPossibleProperty($class, $property);
+
+ return $possibleProperty !== null;
+ }
+
+ protected function getClassAndPropertyFromExceptionMessage(string $message): ?array
+ {
+ if (! preg_match(self::REGEX, $message, $matches)) {
+ return null;
+ }
+
+ return [
+ 'class' => $matches[1],
+ 'property' => $matches[2],
+ ];
+ }
+
+ protected function findPossibleProperty(string $class, string $invalidPropertyName)
+ {
+ return $this->getAvailableProperties($class)
+ ->sortByDesc(function (ReflectionProperty $property) use ($invalidPropertyName) {
+ similar_text($invalidPropertyName, $property->name, $percentage);
+
+ return $percentage;
+ })
+ ->filter(function (ReflectionProperty $property) use ($invalidPropertyName) {
+ similar_text($invalidPropertyName, $property->name, $percentage);
+
+ return $percentage >= self::MINIMUM_SIMILARITY;
+ })->first();
+ }
+
+ protected function getAvailableProperties($class): Collection
+ {
+ $class = new ReflectionClass($class);
+
+ return Collection::make($class->getProperties());
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/UndefinedVariableSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/UndefinedVariableSolutionProvider.php
new file mode 100644
index 00000000..8a6917b1
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/UndefinedVariableSolutionProvider.php
@@ -0,0 +1,95 @@
+getNameAndView($throwable) !== null;
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ $solutions = [];
+
+ extract($this->getNameAndView($throwable));
+
+ if (! isset($variableName)) {
+ return [];
+ }
+
+ $solutions = $this->findCorrectVariableSolutions($throwable, $variableName, $viewFile);
+ $solutions[] = $this->findOptionalVariableSolution($variableName, $viewFile);
+
+ return $solutions;
+ }
+
+ protected function findCorrectVariableSolutions(
+ ViewException $throwable,
+ string $variableName,
+ string $viewFile
+ ): array {
+ return collect($throwable->getViewData())
+ ->map(function ($value, $key) use ($variableName) {
+ similar_text($variableName, $key, $percentage);
+
+ return ['match' => $percentage, 'value' => $value];
+ })
+ ->sortByDesc('match')->filter(function ($var) {
+ return $var['match'] > 40;
+ })
+ ->keys()
+ ->map(function ($suggestion) use ($variableName, $viewFile) {
+ return new SuggestCorrectVariableNameSolution($variableName, $viewFile, $suggestion);
+ })
+ ->map(function ($solution) {
+ return $solution->isRunnable()
+ ? $solution
+ : BaseSolution::create($solution->getSolutionTitle())
+ ->setSolutionDescription($solution->getSolutionDescription());
+ })
+ ->toArray();
+ }
+
+ protected function findOptionalVariableSolution(string $variableName, string $viewFile)
+ {
+ $optionalSolution = new MakeViewVariableOptionalSolution($variableName, $viewFile);
+
+ return $optionalSolution->isRunnable()
+ ? $optionalSolution
+ : BaseSolution::create($optionalSolution->getSolutionTitle())
+ ->setSolutionDescription($optionalSolution->getSolutionDescription());
+ }
+
+ protected function getNameAndView(Throwable $throwable): ?array
+ {
+ $pattern = '/Undefined variable:? (.*?) \(View: (.*?)\)/';
+
+ preg_match($pattern, $throwable->getMessage(), $matches);
+
+ if (count($matches) === 3) {
+ [, $variableName, $viewFile] = $matches;
+ $variableName = ltrim($variableName, '$');
+
+ return compact('variableName', 'viewFile');
+ }
+
+ return null;
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/UnknownValidationSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/UnknownValidationSolutionProvider.php
new file mode 100644
index 00000000..99d3e24b
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/UnknownValidationSolutionProvider.php
@@ -0,0 +1,83 @@
+validate(?!(Attribute|UsingCustomRule))[A-Z][a-zA-Z]+)/m';
+
+ public function canSolve(Throwable $throwable): bool
+ {
+ if (! $throwable instanceof BadMethodCallException) {
+ return false;
+ }
+
+ return ! is_null($this->getMethodFromExceptionMessage($throwable->getMessage()));
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ return [
+ BaseSolution::create('Unknown Validation Rule')
+ ->setSolutionDescription($this->getSolutionDescription($throwable)),
+ ];
+ }
+
+ protected function getSolutionDescription(Throwable $throwable): string
+ {
+ $method = $this->getMethodFromExceptionMessage($throwable->getMessage());
+
+ $possibleMethod = StringComparator::findSimilarText(
+ $this->getAvailableMethods()->toArray(),
+ $method
+ );
+
+ if (empty($possibleMethod)) {
+ return '';
+ }
+
+ $rule = Str::snake(str_replace('validate', '', $possibleMethod));
+
+ return "Did you mean `{$rule}` ?";
+ }
+
+ protected function getMethodFromExceptionMessage(string $message): ?string
+ {
+ if (! preg_match(self::REGEX, $message, $matches)) {
+ return null;
+ }
+
+ return $matches['method'];
+ }
+
+ protected function getAvailableMethods(): Collection
+ {
+ $class = new ReflectionClass(Validator::class);
+
+ $extensions = Collection::make((app('validator')->make([], []))->extensions)
+ ->keys()
+ ->map(function (string $extension) {
+ return 'validate'.Str::studly($extension);
+ });
+
+ return Collection::make($class->getMethods())
+ ->filter(function (ReflectionMethod $method) {
+ return preg_match('/(validate(?!(Attribute|UsingCustomRule))[A-Z][a-zA-Z]+)/', $method->name);
+ })
+ ->map(function (ReflectionMethod $method) {
+ return $method->name;
+ })
+ ->merge($extensions);
+ }
+}
diff --git a/vendor/facade/ignition/src/SolutionProviders/ViewNotFoundSolutionProvider.php b/vendor/facade/ignition/src/SolutionProviders/ViewNotFoundSolutionProvider.php
new file mode 100644
index 00000000..cd24e855
--- /dev/null
+++ b/vendor/facade/ignition/src/SolutionProviders/ViewNotFoundSolutionProvider.php
@@ -0,0 +1,124 @@
+getMessage(), $matches);
+ }
+
+ public function getSolutions(Throwable $throwable): array
+ {
+ preg_match(self::REGEX, $throwable->getMessage(), $matches);
+
+ $missingView = $matches[1] ?? null;
+
+ $suggestedView = $this->findRelatedView($missingView);
+
+ if ($suggestedView == $missingView) {
+ return [
+ BaseSolution::create("{$missingView} was not found.")
+ ->setSolutionDescription('View names should not contain the . character!'),
+ ];
+ }
+
+ if ($suggestedView) {
+ return [
+ BaseSolution::create("{$missingView} was not found.")
+ ->setSolutionDescription("Did you mean `{$suggestedView}`?"),
+ ];
+ }
+
+ return [
+ BaseSolution::create("{$missingView} was not found.")
+ ->setSolutionDescription('Are you sure the view exists and is a `.blade.php` file?'),
+ ];
+ }
+
+ protected function findRelatedView(string $missingView): ?string
+ {
+ $views = $this->getAllViews();
+
+ return StringComparator::findClosestMatch($views, $missingView);
+ }
+
+ protected function getAllViews(): array
+ {
+ /** @var \Illuminate\View\FileViewFinder $fileViewFinder */
+ $fileViewFinder = View::getFinder();
+
+ $extensions = $fileViewFinder->getExtensions();
+
+ $viewsForHints = collect($fileViewFinder->getHints())
+ ->flatMap(function ($paths, string $namespace) use ($extensions) {
+ $paths = Arr::wrap($paths);
+
+ return collect($paths)
+ ->flatMap(function (string $path) use ($extensions) {
+ return $this->getViewsInPath($path, $extensions);
+ })
+ ->map(function (string $view) use ($namespace) {
+ return "{$namespace}::{$view}";
+ })
+ ->toArray();
+ });
+
+ $viewsForViewPaths = collect($fileViewFinder->getPaths())
+ ->flatMap(function (string $path) use ($extensions) {
+ return $this->getViewsInPath($path, $extensions);
+ });
+
+ return $viewsForHints->merge($viewsForViewPaths)->toArray();
+ }
+
+ protected function getViewsInPath(string $path, array $extensions): array
+ {
+ $filePatterns = array_map(function (string $extension) {
+ return "*.{$extension}";
+ }, $extensions);
+
+ $extensionsWithDots = array_map(function (string $extension) {
+ return ".{$extension}";
+ }, $extensions);
+
+ $files = (new Finder())
+ ->in($path)
+ ->files();
+
+ foreach ($filePatterns as $filePattern) {
+ $files->name($filePattern);
+ }
+
+ $views = [];
+
+ foreach ($files as $file) {
+ if ($file instanceof SplFileInfo) {
+ $view = $file->getRelativePathname();
+ $view = str_replace($extensionsWithDots, '', $view);
+ $view = str_replace('/', '.', $view);
+ $views[] = $view;
+ }
+ }
+
+ return $views;
+ }
+}
diff --git a/vendor/facade/ignition/src/Solutions/GenerateAppKeySolution.php b/vendor/facade/ignition/src/Solutions/GenerateAppKeySolution.php
new file mode 100644
index 00000000..fe570476
--- /dev/null
+++ b/vendor/facade/ignition/src/Solutions/GenerateAppKeySolution.php
@@ -0,0 +1,46 @@
+ 'https://laravel.com/docs/master/installation#configuration',
+ ];
+ }
+
+ public function getSolutionActionDescription(): string
+ {
+ return 'Generate your application encryption key using `php artisan key:generate`.';
+ }
+
+ public function getRunButtonText(): string
+ {
+ return 'Generate app key';
+ }
+
+ public function getSolutionDescription(): string
+ {
+ return '';
+ }
+
+ public function getRunParameters(): array
+ {
+ return [];
+ }
+
+ public function run(array $parameters = [])
+ {
+ Artisan::call('key:generate');
+ }
+}
diff --git a/vendor/facade/ignition/src/Solutions/LivewireDiscoverSolution.php b/vendor/facade/ignition/src/Solutions/LivewireDiscoverSolution.php
new file mode 100644
index 00000000..87b5c0bb
--- /dev/null
+++ b/vendor/facade/ignition/src/Solutions/LivewireDiscoverSolution.php
@@ -0,0 +1,53 @@
+customTitle = $customTitle;
+ }
+
+ public function getSolutionTitle(): string
+ {
+ return $this->customTitle;
+ }
+
+ public function getSolutionDescription(): string
+ {
+ return 'You might have forgotten to discover your Livewire components. You can discover your Livewire components using `php artisan livewire:discover`.';
+ }
+
+ public function getDocumentationLinks(): array
+ {
+ return [
+ 'Livewire: Artisan Commands' => 'https://laravel-livewire.com/docs/2.x/artisan-commands',
+ ];
+ }
+
+ public function getRunParameters(): array
+ {
+ return [];
+ }
+
+ public function getSolutionActionDescription(): string
+ {
+ return 'Pressing the button below will try to discover your Livewire components.';
+ }
+
+ public function getRunButtonText(): string
+ {
+ return 'Run livewire:discover';
+ }
+
+ public function run(array $parameters = [])
+ {
+ app(LivewireComponentsFinder::class)->build();
+ }
+}
diff --git a/vendor/facade/ignition/src/Solutions/MakeViewVariableOptionalSolution.php b/vendor/facade/ignition/src/Solutions/MakeViewVariableOptionalSolution.php
new file mode 100644
index 00000000..d9e815ee
--- /dev/null
+++ b/vendor/facade/ignition/src/Solutions/MakeViewVariableOptionalSolution.php
@@ -0,0 +1,122 @@
+variableName = $variableName;
+ $this->viewFile = $viewFile;
+ }
+
+ public function getSolutionTitle(): string
+ {
+ return "$$this->variableName is undefined";
+ }
+
+ public function getDocumentationLinks(): array
+ {
+ return [];
+ }
+
+ public function getSolutionActionDescription(): string
+ {
+ $output = [
+ 'Make the variable optional in the blade template.',
+ "Replace `{{ $$this->variableName }}` with `{{ $$this->variableName ?? '' }}`",
+ ];
+
+ return implode(PHP_EOL, $output);
+ }
+
+ public function getRunButtonText(): string
+ {
+ return 'Make variable optional';
+ }
+
+ public function getSolutionDescription(): string
+ {
+ return '';
+ }
+
+ public function getRunParameters(): array
+ {
+ return [
+ 'variableName' => $this->variableName,
+ 'viewFile' => $this->viewFile,
+ ];
+ }
+
+ public function isRunnable(array $parameters = [])
+ {
+ return $this->makeOptional($this->getRunParameters()) !== false;
+ }
+
+ public function run(array $parameters = [])
+ {
+ $output = $this->makeOptional($parameters);
+ if ($output !== false) {
+ file_put_contents($parameters['viewFile'], $output);
+ }
+ }
+
+ protected function isSafePath(string $path): bool
+ {
+ if (! Str::startsWith($path, ['/', './'])) {
+ return false;
+ }
+ if (! Str::endsWith($path, '.blade.php')) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public function makeOptional(array $parameters = [])
+ {
+ if (! $this->isSafePath($parameters['viewFile'])) {
+ return false;
+ }
+
+ $originalContents = file_get_contents($parameters['viewFile']);
+ $newContents = str_replace('$'.$parameters['variableName'], '$'.$parameters['variableName']." ?? ''", $originalContents);
+
+ $originalTokens = token_get_all(Blade::compileString($originalContents));
+ $newTokens = token_get_all(Blade::compileString($newContents));
+
+ $expectedTokens = $this->generateExpectedTokens($originalTokens, $parameters['variableName']);
+
+ if ($expectedTokens !== $newTokens) {
+ return false;
+ }
+
+ return $newContents;
+ }
+
+ protected function generateExpectedTokens(array $originalTokens, string $variableName): array
+ {
+ $expectedTokens = [];
+ foreach ($originalTokens as $token) {
+ $expectedTokens[] = $token;
+ if ($token[0] === T_VARIABLE && $token[1] === '$'.$variableName) {
+ $expectedTokens[] = [T_WHITESPACE, ' ', $token[2]];
+ $expectedTokens[] = [T_COALESCE, '??', $token[2]];
+ $expectedTokens[] = [T_WHITESPACE, ' ', $token[2]];
+ $expectedTokens[] = [T_CONSTANT_ENCAPSED_STRING, "''", $token[2]];
+ }
+ }
+
+ return $expectedTokens;
+ }
+}
diff --git a/vendor/facade/ignition/src/Solutions/MissingPackageSolution.php b/vendor/facade/ignition/src/Solutions/MissingPackageSolution.php
new file mode 100644
index 00000000..832597c9
--- /dev/null
+++ b/vendor/facade/ignition/src/Solutions/MissingPackageSolution.php
@@ -0,0 +1,42 @@
+possiblePackage = $possiblePackage;
+ }
+
+ public function getSolutionTitle(): string
+ {
+ return 'A composer dependency is missing';
+ }
+
+ public function getSolutionDescription(): string
+ {
+ $output = [
+ 'You might be missing a composer dependency.',
+ 'A possible package that was found is `'.$this->possiblePackage->name.'`.',
+ '',
+ 'See if this is the package that you need and install it via `composer require '.$this->possiblePackage->name.'`.',
+ ];
+
+ return implode(PHP_EOL, $output);
+ }
+
+ public function getDocumentationLinks(): array
+ {
+ return [
+ 'Git repository' => $this->possiblePackage->repository,
+ 'Package on Packagist' => $this->possiblePackage->url,
+ ];
+ }
+}
diff --git a/vendor/facade/ignition/src/Solutions/RunMigrationsSolution.php b/vendor/facade/ignition/src/Solutions/RunMigrationsSolution.php
new file mode 100644
index 00000000..29f391bd
--- /dev/null
+++ b/vendor/facade/ignition/src/Solutions/RunMigrationsSolution.php
@@ -0,0 +1,53 @@
+customTitle = $customTitle;
+ }
+
+ public function getSolutionTitle(): string
+ {
+ return $this->customTitle;
+ }
+
+ public function getSolutionDescription(): string
+ {
+ return 'You might have forgotten to run your migrations. You can run your migrations using `php artisan migrate`.';
+ }
+
+ public function getDocumentationLinks(): array
+ {
+ return [
+ 'Database: Running Migrations docs' => 'https://laravel.com/docs/master/migrations#running-migrations',
+ ];
+ }
+
+ public function getRunParameters(): array
+ {
+ return [];
+ }
+
+ public function getSolutionActionDescription(): string
+ {
+ return 'Pressing the button below will try to run your migrations.';
+ }
+
+ public function getRunButtonText(): string
+ {
+ return 'Run migrations';
+ }
+
+ public function run(array $parameters = [])
+ {
+ Artisan::call('migrate');
+ }
+}
diff --git a/vendor/facade/ignition/src/Solutions/SolutionTransformer.php b/vendor/facade/ignition/src/Solutions/SolutionTransformer.php
new file mode 100644
index 00000000..db2080cd
--- /dev/null
+++ b/vendor/facade/ignition/src/Solutions/SolutionTransformer.php
@@ -0,0 +1,45 @@
+solution = $solution;
+ }
+
+ public function toArray(): array
+ {
+ $isRunnable = ($this->solution instanceof RunnableSolution);
+
+ return [
+ 'class' => get_class($this->solution),
+ 'title' => $this->solution->getSolutionTitle(),
+ 'description' => $this->solution->getSolutionDescription(),
+ 'links' => $this->solution->getDocumentationLinks(),
+ 'is_runnable' => $isRunnable,
+ 'run_button_text' => $isRunnable ? $this->solution->getRunButtonText() : '',
+ 'run_parameters' => $isRunnable ? $this->solution->getRunParameters() : [],
+ 'action_description' => $isRunnable ? $this->solution->getSolutionActionDescription() : '',
+ 'execute_endpoint' => $this->executeEndpoint(),
+ ];
+ }
+
+ protected function executeEndpoint(): string
+ {
+ try {
+ return action('\Facade\Ignition\Http\Controllers\ExecuteSolutionController');
+ } catch (Throwable $exception) {
+ return '';
+ }
+ }
+}
diff --git a/vendor/facade/ignition/src/Solutions/SuggestCorrectVariableNameSolution.php b/vendor/facade/ignition/src/Solutions/SuggestCorrectVariableNameSolution.php
new file mode 100644
index 00000000..e1681768
--- /dev/null
+++ b/vendor/facade/ignition/src/Solutions/SuggestCorrectVariableNameSolution.php
@@ -0,0 +1,44 @@
+variableName = $variableName;
+ $this->viewFile = $viewFile;
+ $this->suggested = $suggested;
+ }
+
+ public function getSolutionTitle(): string
+ {
+ return 'Possible typo $'.$this->variableName;
+ }
+
+ public function getDocumentationLinks(): array
+ {
+ return [];
+ }
+
+ public function getSolutionDescription(): string
+ {
+ return "Did you mean `$$this->suggested`?";
+ }
+
+ public function isRunnable(): bool
+ {
+ return false;
+ }
+}
diff --git a/vendor/facade/ignition/src/Solutions/SuggestImportSolution.php b/vendor/facade/ignition/src/Solutions/SuggestImportSolution.php
new file mode 100644
index 00000000..7779c97a
--- /dev/null
+++ b/vendor/facade/ignition/src/Solutions/SuggestImportSolution.php
@@ -0,0 +1,31 @@
+class = $class;
+ }
+
+ public function getSolutionTitle(): string
+ {
+ return 'A class import is missing';
+ }
+
+ public function getSolutionDescription(): string
+ {
+ return 'You have a missing class import. Try importing this class: `'.$this->class.'`.';
+ }
+
+ public function getDocumentationLinks(): array
+ {
+ return [];
+ }
+}
diff --git a/vendor/facade/ignition/src/Solutions/SuggestLivewireMethodNameSolution.php b/vendor/facade/ignition/src/Solutions/SuggestLivewireMethodNameSolution.php
new file mode 100644
index 00000000..3c39b9bd
--- /dev/null
+++ b/vendor/facade/ignition/src/Solutions/SuggestLivewireMethodNameSolution.php
@@ -0,0 +1,44 @@
+methodName = $methodName;
+ $this->componentClass = $componentClass;
+ $this->suggested = $suggested;
+ }
+
+ public function getSolutionTitle(): string
+ {
+ return "Possible typo `{$this->componentClass}::{$this->methodName}()`";
+ }
+
+ public function getDocumentationLinks(): array
+ {
+ return [];
+ }
+
+ public function getSolutionDescription(): string
+ {
+ return "Did you mean `{$this->suggested}()`?";
+ }
+
+ public function isRunnable(): bool
+ {
+ return false;
+ }
+}
diff --git a/vendor/facade/ignition/src/Solutions/SuggestLivewirePropertyNameSolution.php b/vendor/facade/ignition/src/Solutions/SuggestLivewirePropertyNameSolution.php
new file mode 100644
index 00000000..198152ed
--- /dev/null
+++ b/vendor/facade/ignition/src/Solutions/SuggestLivewirePropertyNameSolution.php
@@ -0,0 +1,44 @@
+variableName = $variableName;
+ $this->componentClass = $componentClass;
+ $this->suggested = $suggested;
+ }
+
+ public function getSolutionTitle(): string
+ {
+ return "Possible typo {$this->componentClass}::{$this->variableName}";
+ }
+
+ public function getDocumentationLinks(): array
+ {
+ return [];
+ }
+
+ public function getSolutionDescription(): string
+ {
+ return "Did you mean `$this->suggested`?";
+ }
+
+ public function isRunnable(): bool
+ {
+ return false;
+ }
+}
diff --git a/vendor/facade/ignition/src/Solutions/SuggestUsingCorrectDbNameSolution.php b/vendor/facade/ignition/src/Solutions/SuggestUsingCorrectDbNameSolution.php
new file mode 100644
index 00000000..c1fb3bd0
--- /dev/null
+++ b/vendor/facade/ignition/src/Solutions/SuggestUsingCorrectDbNameSolution.php
@@ -0,0 +1,27 @@
+ 'https://laravel.com/docs/master/database#configuration',
+ ];
+ }
+}
diff --git a/vendor/facade/ignition/src/Solutions/UseDefaultValetDbCredentialsSolution.php b/vendor/facade/ignition/src/Solutions/UseDefaultValetDbCredentialsSolution.php
new file mode 100644
index 00000000..d0c40362
--- /dev/null
+++ b/vendor/facade/ignition/src/Solutions/UseDefaultValetDbCredentialsSolution.php
@@ -0,0 +1,64 @@
+ensureLineExists('DB_USERNAME', 'root');
+ $this->ensureLineExists('DB_PASSWORD', '');
+ }
+
+ protected function ensureLineExists(string $key, string $value)
+ {
+ $envPath = base_path('.env');
+
+ $envLines = array_map(function (string $envLine) use ($value, $key) {
+ return Str::startsWith($envLine, $key)
+ ? "{$key}={$value}".PHP_EOL
+ : $envLine;
+ }, file($envPath));
+
+ file_put_contents($envPath, implode('', $envLines));
+ }
+
+ public function getDocumentationLinks(): array
+ {
+ return [];
+ }
+
+ public function getRunParameters(): array
+ {
+ return [
+ 'Valet documentation' => 'https://laravel.com/docs/master/valet',
+ ];
+ }
+
+ public function getSolutionDescription(): string
+ {
+ return 'You seem to be using Valet, but the .env file does not contain the right default database credentials.';
+ }
+}
diff --git a/vendor/facade/ignition/src/Support/ComposerClassMap.php b/vendor/facade/ignition/src/Support/ComposerClassMap.php
new file mode 100644
index 00000000..b1e4be01
--- /dev/null
+++ b/vendor/facade/ignition/src/Support/ComposerClassMap.php
@@ -0,0 +1,125 @@
+composer = require $autoloaderPath;
+ } else {
+ $this->composer = new FakeComposer();
+ }
+ $this->basePath = app_path();
+ }
+
+ public function listClasses(): array
+ {
+ $classes = $this->composer->getClassMap();
+
+ return array_merge($classes, $this->listClassesInPsrMaps());
+ }
+
+ public function searchClassMap(string $missingClass): ?string
+ {
+ foreach ($this->composer->getClassMap() as $fqcn => $file) {
+ $basename = basename($file, '.php');
+
+ if ($basename === $missingClass) {
+ return $fqcn;
+ }
+ }
+
+ return null;
+ }
+
+ public function listClassesInPsrMaps(): array
+ {
+ // TODO: This is incorrect. Doesnt list all fqcns. Need to parse namespace? e.g. App\LoginController is wrong
+
+ $prefixes = array_merge(
+ $this->composer->getPrefixes(),
+ $this->composer->getPrefixesPsr4()
+ );
+
+ $classes = [];
+
+ foreach ($prefixes as $namespace => $directories) {
+ foreach ($directories as $directory) {
+ if (file_exists($directory)) {
+ $files = (new Finder())
+ ->in($directory)
+ ->files()
+ ->name('*.php');
+
+ foreach ($files as $file) {
+ if ($file instanceof SplFileInfo) {
+ $fqcn = $this->getFullyQualifiedClassNameFromFile($namespace, $file);
+
+ $classes[$fqcn] = $file->getRelativePathname();
+ }
+ }
+ }
+ }
+ }
+
+ return $classes;
+ }
+
+ public function searchPsrMaps(string $missingClass): ?string
+ {
+ $prefixes = array_merge(
+ $this->composer->getPrefixes(),
+ $this->composer->getPrefixesPsr4()
+ );
+
+ foreach ($prefixes as $namespace => $directories) {
+ foreach ($directories as $directory) {
+ if (file_exists($directory)) {
+ $files = (new Finder())
+ ->in($directory)
+ ->files()
+ ->name('*.php');
+
+ foreach ($files as $file) {
+ if ($file instanceof SplFileInfo) {
+ $basename = basename($file->getRelativePathname(), '.php');
+
+ if ($basename === $missingClass) {
+ return $namespace.basename($file->getRelativePathname(), '.php');
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ protected function getFullyQualifiedClassNameFromFile(string $rootNamespace, SplFileInfo $file): string
+ {
+ $class = trim(str_replace($this->basePath, '', $file->getRealPath()), DIRECTORY_SEPARATOR);
+
+ $class = str_replace(
+ [DIRECTORY_SEPARATOR, 'App\\'],
+ ['\\', app()->getNamespace()],
+ ucfirst(Str::replaceLast('.php', '', $class))
+ );
+
+ return $rootNamespace.$class;
+ }
+}
diff --git a/vendor/facade/ignition/src/Support/FakeComposer.php b/vendor/facade/ignition/src/Support/FakeComposer.php
new file mode 100644
index 00000000..ac725931
--- /dev/null
+++ b/vendor/facade/ignition/src/Support/FakeComposer.php
@@ -0,0 +1,21 @@
+version(), 0, 1);
+ }
+}
diff --git a/vendor/facade/ignition/src/Support/LivewireComponentParser.php b/vendor/facade/ignition/src/Support/LivewireComponentParser.php
new file mode 100644
index 00000000..4a4ba86b
--- /dev/null
+++ b/vendor/facade/ignition/src/Support/LivewireComponentParser.php
@@ -0,0 +1,97 @@
+componentAlias = $componentAlias;
+ $this->componentClass = app(LivewireManager::class)->getClass($this->componentAlias);
+ $this->reflectionClass = new ReflectionClass($this->componentClass);
+ }
+
+ public function getComponentClass(): string
+ {
+ return $this->componentClass;
+ }
+
+ public function getPropertyNamesLike(string $similar): Collection
+ {
+ $properties = collect($this->reflectionClass->getProperties(ReflectionProperty::IS_PUBLIC))
+ ->reject(function (ReflectionProperty $reflectionProperty) {
+ return $reflectionProperty->class !== $this->reflectionClass->name;
+ })
+ ->map(function (ReflectionProperty $reflectionProperty) {
+ return $reflectionProperty->name;
+ });
+
+ $computedProperties = collect($this->reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC))
+ ->reject(function (ReflectionMethod $reflectionMethod) {
+ return $reflectionMethod->class !== $this->reflectionClass->name;
+ })
+ ->filter(function (ReflectionMethod $reflectionMethod) {
+ return str_starts_with($reflectionMethod->name, 'get') && str_ends_with($reflectionMethod->name, 'Property');
+ })
+ ->map(function (ReflectionMethod $reflectionMethod) {
+ return lcfirst(Str::of($reflectionMethod->name)->after('get')->before('Property'));
+ });
+
+ return $this->filterItemsBySimilarity(
+ $properties->merge($computedProperties),
+ $similar
+ );
+ }
+
+ public function getMethodNamesLike(string $similar): Collection
+ {
+ $methods = collect($this->reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC))
+ ->reject(function (ReflectionMethod $reflectionMethod) {
+ return $reflectionMethod->class !== $this->reflectionClass->name;
+ })
+ ->map(function (ReflectionMethod $reflectionMethod) {
+ return $reflectionMethod->name;
+ });
+
+ return $this->filterItemsBySimilarity($methods, $similar);
+ }
+
+ protected function filterItemsBySimilarity(Collection $items, string $similar): Collection
+ {
+ return $items
+ ->map(function (string $name) use ($similar) {
+ similar_text($similar, $name, $percentage);
+
+ return ['match' => $percentage, 'value' => $name];
+ })
+ ->sortByDesc('match')
+ ->filter(function (array $item) {
+ return $item['match'] > 40;
+ })
+ ->map(function (array $item) {
+ return $item['value'];
+ })
+ ->values();
+ }
+}
diff --git a/vendor/facade/ignition/src/Support/Packagist/Package.php b/vendor/facade/ignition/src/Support/Packagist/Package.php
new file mode 100644
index 00000000..27043f3b
--- /dev/null
+++ b/vendor/facade/ignition/src/Support/Packagist/Package.php
@@ -0,0 +1,50 @@
+name = $properties['name'];
+
+ $this->url = $properties['url'];
+
+ $this->repository = $properties['repository'];
+ }
+
+ public function hasNamespaceThatContainsClassName(string $className): bool
+ {
+ return $this->getNamespaces()->contains(function ($namespace) use ($className) {
+ return Str::startsWith(strtolower($className), strtolower($namespace));
+ });
+ }
+
+ protected function getNamespaces(): Collection
+ {
+ $details = json_decode(file_get_contents("https://packagist.org/packages/{$this->name}.json"), true);
+
+ return collect($details['package']['versions'])
+ ->map(function ($version) {
+ return collect($version['autoload'] ?? [])
+ ->map(function ($autoload) {
+ return array_keys($autoload);
+ })
+ ->flatten();
+ })
+ ->flatten()
+ ->unique();
+ }
+}
diff --git a/vendor/facade/ignition/src/Support/Packagist/Packagist.php b/vendor/facade/ignition/src/Support/Packagist/Packagist.php
new file mode 100644
index 00000000..a6f481e3
--- /dev/null
+++ b/vendor/facade/ignition/src/Support/Packagist/Packagist.php
@@ -0,0 +1,29 @@
+results);
+ }
+}
diff --git a/vendor/facade/ignition/src/Support/SentReports.php b/vendor/facade/ignition/src/Support/SentReports.php
new file mode 100644
index 00000000..3a9b54e4
--- /dev/null
+++ b/vendor/facade/ignition/src/Support/SentReports.php
@@ -0,0 +1,57 @@
+ */
+ protected $reports = [];
+
+ public function add(Report $report): self
+ {
+ $this->reports[] = $report;
+
+ return $this;
+ }
+
+ public function all(): array
+ {
+ return $this->reports;
+ }
+
+ public function uuids(): array
+ {
+ return array_map(function (Report $report) {
+ return $report->trackingUuid();
+ }, $this->reports);
+ }
+
+ public function urls(): array
+ {
+ return array_map(function (string $trackingUuid) {
+ return "https://flareapp.io/tracked-occurrence/{$trackingUuid}";
+ }, $this->uuids());
+ }
+
+ public function latestUuid(): ?string
+ {
+ if (! $latestReport = Arr::last($this->reports)) {
+ return null;
+ }
+
+ return $latestReport->trackingUuid();
+ }
+
+ public function latestUrl(): ?string
+ {
+ return Arr::last($this->urls());
+ }
+
+ public function clear()
+ {
+ $this->reports = [];
+ }
+}
diff --git a/vendor/facade/ignition/src/Support/StringComparator.php b/vendor/facade/ignition/src/Support/StringComparator.php
new file mode 100644
index 00000000..5db7273a
--- /dev/null
+++ b/vendor/facade/ignition/src/Support/StringComparator.php
@@ -0,0 +1,51 @@
+sortByDesc(function (string $string) use ($input) {
+ similar_text($input, $string, $percentage);
+
+ return $percentage;
+ })
+ ->first();
+ }
+}
diff --git a/vendor/facade/ignition/src/Tabs/Tab.php b/vendor/facade/ignition/src/Tabs/Tab.php
new file mode 100644
index 00000000..d71bdc74
--- /dev/null
+++ b/vendor/facade/ignition/src/Tabs/Tab.php
@@ -0,0 +1,75 @@
+registerAssets();
+ }
+
+ public function name(): string
+ {
+ return Str::studly(class_basename(get_called_class()));
+ }
+
+ public function component(): string
+ {
+ return Str::snake(class_basename(get_called_class()), '-');
+ }
+
+ public function beforeRenderingErrorPage(Flare $flare, Throwable $throwable)
+ {
+ $this->flare = $flare;
+
+ $this->throwable = $throwable;
+ }
+
+ public function script(string $name, string $path)
+ {
+ $this->scripts[$name] = $path;
+
+ return $this;
+ }
+
+ public function style(string $name, string $path)
+ {
+ $this->styles[$name] = $path;
+
+ return $this;
+ }
+
+ abstract protected function registerAssets();
+
+ public function meta(): array
+ {
+ return [];
+ }
+
+ public function jsonSerialize()
+ {
+ return [
+ 'title' => $this->name(),
+ 'component' => $this->component(),
+ 'props' => [
+ 'meta' => $this->meta(),
+ ],
+ ];
+ }
+}
diff --git a/vendor/facade/ignition/src/Views/Compilers/BladeSourceMapCompiler.php b/vendor/facade/ignition/src/Views/Compilers/BladeSourceMapCompiler.php
new file mode 100644
index 00000000..415ff346
--- /dev/null
+++ b/vendor/facade/ignition/src/Views/Compilers/BladeSourceMapCompiler.php
@@ -0,0 +1,94 @@
+compileString(file_get_contents($filename));
+ } catch (ErrorException $e) {
+ return 1;
+ }
+
+ $map = explode("\n", $map);
+
+ $line = $map[$exceptionLineNumber - 1] ?? $exceptionLineNumber;
+ $pattern = '/\|---LINE:([0-9]+)---\|/m';
+
+ if (preg_match($pattern, (string)$line, $matches)) {
+ return (int)$matches[1];
+ }
+
+ return $exceptionLineNumber;
+ }
+
+ public function compileString($value)
+ {
+ try {
+ $value = $this->addEchoLineNumbers($value);
+
+ $value = $this->addStatementLineNumbers($value);
+
+ $value = parent::compileString($value);
+
+ return $this->trimEmptyLines($value);
+ } catch (\Exception $e) {
+ return $value;
+ }
+ }
+
+ protected function addEchoLineNumbers(string $value)
+ {
+ $pattern = sprintf('/(@)?%s\s*(.+?)\s*%s(\r?\n)?/s', $this->contentTags[0], $this->contentTags[1]);
+
+ if (preg_match_all($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) {
+ foreach (array_reverse($matches[0]) as $match) {
+ $position = mb_strlen(substr($value, 0, $match[1]));
+
+ $value = $this->insertLineNumberAtPosition($position, $value);
+ }
+ }
+
+ return $value;
+ }
+
+ protected function addStatementLineNumbers(string $value)
+ {
+ $shouldInsertLineNumbers = preg_match_all(
+ '/\B@(@?\w+(?:::\w+)?)([ \t]*)(\( ( (?>[^()]+) | (?3) )* \))?/x',
+ $value,
+ $matches,
+ PREG_OFFSET_CAPTURE
+ );
+
+ if ($shouldInsertLineNumbers) {
+ foreach (array_reverse($matches[0]) as $match) {
+ $position = mb_strlen(substr($value, 0, $match[1]));
+
+ $value = $this->insertLineNumberAtPosition($position, $value);
+ }
+ }
+
+ return $value;
+ }
+
+ protected function insertLineNumberAtPosition(int $position, string $value)
+ {
+ $before = mb_substr($value, 0, $position);
+ $lineNumber = count(explode("\n", $before));
+
+ return mb_substr($value, 0, $position)."|---LINE:{$lineNumber}---|".mb_substr($value, $position);
+ }
+
+ protected function trimEmptyLines(string $value)
+ {
+ $value = preg_replace('/^\|---LINE:([0-9]+)---\|$/m', '', $value);
+
+ return ltrim($value, PHP_EOL);
+ }
+}
diff --git a/vendor/facade/ignition/src/Views/Concerns/CollectsViewExceptions.php b/vendor/facade/ignition/src/Views/Concerns/CollectsViewExceptions.php
new file mode 100644
index 00000000..e064842b
--- /dev/null
+++ b/vendor/facade/ignition/src/Views/Concerns/CollectsViewExceptions.php
@@ -0,0 +1,67 @@
+lastCompiledData[] = [
+ 'path' => $path,
+ 'compiledPath' => $this->getCompiledPath($path),
+ 'data' => $this->filterViewData($data),
+ ];
+ }
+
+ public function filterViewData(array $data): array
+ {
+ // By default, Laravel views get two shared data keys:
+ // __env and app. We try to filter them out.
+ return array_filter($data, function ($value, $key) {
+ if ($key === 'app') {
+ return ! $value instanceof Application;
+ }
+
+ return $key !== '__env';
+ }, ARRAY_FILTER_USE_BOTH);
+ }
+
+ public function getCompiledViewData($compiledPath): array
+ {
+ $compiledView = $this->findCompiledView($compiledPath);
+
+ return $compiledView['data'] ?? [];
+ }
+
+ public function getCompiledViewName($compiledPath): string
+ {
+ $compiledView = $this->findCompiledView($compiledPath);
+
+ return $compiledView['path'] ?? $compiledPath;
+ }
+
+ protected function findCompiledView($compiledPath): ?array
+ {
+ return Collection::make($this->lastCompiledData)
+ ->first(function ($compiledData) use ($compiledPath) {
+ $comparePath = $compiledData['compiledPath'];
+
+ return realpath(dirname($comparePath)).DIRECTORY_SEPARATOR.basename($comparePath) === $compiledPath;
+ });
+ }
+
+ protected function getCompiledPath($path): string
+ {
+ if ($this instanceof CompilerEngine) {
+ return $this->getCompiler()->getCompiledPath($path);
+ }
+
+ return $path;
+ }
+}
diff --git a/vendor/facade/ignition/src/Views/Engines/CompilerEngine.php b/vendor/facade/ignition/src/Views/Engines/CompilerEngine.php
new file mode 100644
index 00000000..59b028b9
--- /dev/null
+++ b/vendor/facade/ignition/src/Views/Engines/CompilerEngine.php
@@ -0,0 +1,117 @@
+currentPath = $path;
+
+ $this->collectViewData($path, $data);
+
+ return parent::get($path, $data);
+ }
+
+ /**
+ * Handle a view exception.
+ *
+ * @param \Throwable $baseException
+ * @param int $obLevel
+ *
+ * @return void
+ *
+ * @throws \Throwable
+ */
+ protected function handleViewException(Throwable $baseException, $obLevel)
+ {
+ while (ob_get_level() > $obLevel) {
+ ob_end_clean();
+ }
+
+ if ($baseException instanceof ViewException) {
+ throw $baseException;
+ }
+
+ $viewExceptionClass = ViewException::class;
+
+ if ($baseException instanceof ProvidesSolution) {
+ $viewExceptionClass = ViewExceptionWithSolution::class;
+ }
+
+ $exception = new $viewExceptionClass(
+ $this->getMessage($baseException),
+ 0,
+ 1,
+ $this->getCompiledViewName($baseException->getFile()),
+ $this->getBladeLineNumber($baseException->getFile(), $baseException->getLine()),
+ $baseException
+ );
+
+ if ($baseException instanceof ProvidesSolution) {
+ $exception->setSolution($baseException->getSolution());
+ }
+
+
+ $this->modifyViewsInTrace($exception);
+
+ $exception->setView($this->getCompiledViewName($baseException->getFile()));
+ $exception->setViewData($this->getCompiledViewData($baseException->getFile()));
+
+ throw $exception;
+ }
+
+ protected function getBladeLineNumber(string $compiledPath, int $exceptionLineNumber): int
+ {
+ $viewPath = $this->getCompiledViewName($compiledPath);
+
+ if (! $viewPath) {
+ return $exceptionLineNumber;
+ }
+
+ $sourceMapCompiler = new BladeSourceMapCompiler(app(Filesystem::class), 'not-needed');
+
+ return $sourceMapCompiler->detectLineNumber($viewPath, $exceptionLineNumber);
+ }
+
+ protected function modifyViewsInTrace(ViewException $exception)
+ {
+ $trace = Collection::make($exception->getPrevious()->getTrace())
+ ->map(function ($trace) {
+ if ($compiledData = $this->findCompiledView(Arr::get($trace, 'file', ''))) {
+ $trace['file'] = $compiledData['path'];
+ $trace['line'] = $this->getBladeLineNumber($trace['file'], $trace['line']);
+ }
+
+ return $trace;
+ })->toArray();
+
+ $traceProperty = new ReflectionProperty('Exception', 'trace');
+ $traceProperty->setAccessible(true);
+ $traceProperty->setValue($exception, $trace);
+ }
+}
diff --git a/vendor/facade/ignition/src/Views/Engines/PhpEngine.php b/vendor/facade/ignition/src/Views/Engines/PhpEngine.php
new file mode 100644
index 00000000..25ad8b51
--- /dev/null
+++ b/vendor/facade/ignition/src/Views/Engines/PhpEngine.php
@@ -0,0 +1,47 @@
+collectViewData($path, $data);
+
+ return parent::get($path, $data);
+ }
+
+ /**
+ * Handle a view exception.
+ *
+ * @param \Throwable $baseException
+ * @param int $obLevel
+ *
+ * @return void
+ *
+ * @throws \Throwable
+ */
+ protected function handleViewException(Throwable $baseException, $obLevel)
+ {
+ $exception = new ViewException($baseException->getMessage(), 0, 1, $baseException->getFile(), $baseException->getLine(), $baseException);
+
+ $exception->setView($this->getCompiledViewName($baseException->getFile()));
+ $exception->setViewData($this->getCompiledViewData($baseException->getFile()));
+
+ parent::handleViewException($exception, $obLevel);
+ }
+}
diff --git a/vendor/facade/ignition/src/helpers.php b/vendor/facade/ignition/src/helpers.php
new file mode 100644
index 00000000..81b0992a
--- /dev/null
+++ b/vendor/facade/ignition/src/helpers.php
@@ -0,0 +1,31 @@
+make(Flare::class);
+
+ $report = $client->createReportFromMessage('Dump, Die, Debug', 'info');
+
+ $handler->handleReport($report, 'DebugTab', [
+ 'dump' => true,
+ 'glow' => false,
+ 'log' => false,
+ 'query' => false,
+ ]);
+
+ die();
+ }
+}
diff --git a/vendor/fideloper/proxy/.github/ISSUE_TEMPLATE/laravel-9-updates.md b/vendor/fideloper/proxy/.github/ISSUE_TEMPLATE/laravel-9-updates.md
new file mode 100644
index 00000000..d0b276f6
--- /dev/null
+++ b/vendor/fideloper/proxy/.github/ISSUE_TEMPLATE/laravel-9-updates.md
@@ -0,0 +1,14 @@
+---
+name: Laravel 9 Updates
+about: Inform about Laravel 9 changes
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+
diff --git a/vendor/fideloper/proxy/.github/workflows/tests.yml b/vendor/fideloper/proxy/.github/workflows/tests.yml
new file mode 100644
index 00000000..35cea961
--- /dev/null
+++ b/vendor/fideloper/proxy/.github/workflows/tests.yml
@@ -0,0 +1,51 @@
+# This is a basic workflow to help you get started with Actions
+
+name: Tests
+
+# Controls when the action will run.
+on:
+ push:
+ pull_request:
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+# A workflow run is made up of one or more jobs that can run sequentially or in parallel
+jobs:
+ # This workflow contains a single job called "build"
+ run_tests:
+ # The type of runner that the job will run on
+ runs-on: ubuntu-latest
+
+ strategy:
+ fail-fast: true
+ matrix:
+ php: [7.2, 7.3, 7.4, 8.0, 8.1]
+
+ name: PHP ${{ matrix.php }}
+
+ # Steps represent a sequence of tasks that will be executed as part of the job
+ steps:
+ # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
+ - uses: actions/checkout@v2
+
+ - name: Checkout code
+ uses: actions/checkout@v2
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php }}
+ extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite
+ tools: composer:v2
+ coverage: none
+
+ - name: Install dependencies
+ uses: nick-invision/retry@v1
+ with:
+ timeout_minutes: 5
+ max_attempts: 5
+ command: composer update --prefer-dist --no-interaction --no-progress
+
+ - name: Execute tests
+ run: vendor/bin/phpunit --verbose
diff --git a/vendor/fideloper/proxy/composer.json b/vendor/fideloper/proxy/composer.json
index a42061f7..d7ce15a4 100755
--- a/vendor/fideloper/proxy/composer.json
+++ b/vendor/fideloper/proxy/composer.json
@@ -16,7 +16,7 @@
"require-dev": {
"illuminate/http": "^5.0|^6.0|^7.0|^8.0|^9.0",
"mockery/mockery": "^1.0",
- "phpunit/phpunit": "^6.0"
+ "phpunit/phpunit": "^8.5.8|^9.3.3"
},
"autoload": {
"psr-4": {
diff --git a/vendor/fideloper/proxy/config/trustedproxy.php b/vendor/fideloper/proxy/config/trustedproxy.php
index e618ae24..c3a47d82 100644
--- a/vendor/fideloper/proxy/config/trustedproxy.php
+++ b/vendor/fideloper/proxy/config/trustedproxy.php
@@ -35,16 +35,12 @@ return [
*
* Options include:
*
- * - Illuminate\Http\Request::HEADER_X_FORWARDED_ALL (use all x-forwarded-* headers to establish trust)
- * - Illuminate\Http\Request::HEADER_FORWARDED (use the FORWARDED header to establish trust)
- * - Illuminate\Http\Request::HEADER_X_FORWARDED_AWS_ELB (If you are using AWS Elastic Load Balancer)
- *
- * - 'HEADER_X_FORWARDED_ALL' (use all x-forwarded-* headers to establish trust)
- * - 'HEADER_FORWARDED' (use the FORWARDED header to establish trust)
- * - 'HEADER_X_FORWARDED_AWS_ELB' (If you are using AWS Elastic Load Balancer)
+ * - All headers (see below) - Trust all x-forwarded-* headers
+ * - Illuminate\Http\Request::HEADER_FORWARDED - Use the FORWARDED header to establish trust
+ * - Illuminate\Http\Request::HEADER_X_FORWARDED_AWS_ELB - If you are using AWS Elastic Load Balancer
*
* @link https://symfony.com/doc/current/deployment/proxies.html
*/
- 'headers' => Illuminate\Http\Request::HEADER_X_FORWARDED_ALL,
+ 'headers' => Illuminate\Http\Request::HEADER_X_FORWARDED_FOR | Illuminate\Http\Request::HEADER_X_FORWARDED_HOST | Illuminate\Http\Request::HEADER_X_FORWARDED_PORT | Illuminate\Http\Request::HEADER_X_FORWARDED_PROTO | Illuminate\Http\Request::HEADER_X_FORWARDED_AWS_ELB,
];
diff --git a/vendor/fideloper/proxy/src/TrustProxies.php b/vendor/fideloper/proxy/src/TrustProxies.php
index 79c26153..4f3b2afa 100644
--- a/vendor/fideloper/proxy/src/TrustProxies.php
+++ b/vendor/fideloper/proxy/src/TrustProxies.php
@@ -119,10 +119,24 @@ class TrustProxies
case Request::HEADER_FORWARDED:
return Request::HEADER_FORWARDED;
break;
- case 'HEADER_X_FORWARDED_ALL':
- case Request::HEADER_X_FORWARDED_ALL:
- return Request::HEADER_X_FORWARDED_ALL;
+ case 'HEADER_X_FORWARDED_FOR':
+ case Request::HEADER_X_FORWARDED_FOR:
+ return Request::HEADER_X_FORWARDED_FOR;
break;
+ case 'HEADER_X_FORWARDED_HOST':
+ case Request::HEADER_X_FORWARDED_HOST:
+ return Request::HEADER_X_FORWARDED_HOST;
+ break;
+ case 'HEADER_X_FORWARDED_PORT':
+ case Request::HEADER_X_FORWARDED_PORT:
+ return Request::HEADER_X_FORWARDED_PORT;
+ break;
+ case 'HEADER_X_FORWARDED_PROTO':
+ case Request::HEADER_X_FORWARDED_PROTO:
+ return Request::HEADER_X_FORWARDED_PROTO;
+ break;
+ default:
+ return Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO | Request::HEADER_X_FORWARDED_AWS_ELB;
}
return $headers;
diff --git a/vendor/filp/whoops/.github/FUNDING.yml b/vendor/filp/whoops/.github/FUNDING.yml
deleted file mode 100644
index 74f6e857..00000000
--- a/vendor/filp/whoops/.github/FUNDING.yml
+++ /dev/null
@@ -1 +0,0 @@
-github: denis-sokolov
diff --git a/vendor/filp/whoops/.github/workflows/tests.yml b/vendor/filp/whoops/.github/workflows/tests.yml
deleted file mode 100644
index 8f07dd5a..00000000
--- a/vendor/filp/whoops/.github/workflows/tests.yml
+++ /dev/null
@@ -1,56 +0,0 @@
-name: Tests
-
-on:
- push:
- pull_request:
-
-jobs:
- tests:
- name: PHP ${{ matrix.php }}
- runs-on: ubuntu-20.04
-
- strategy:
- matrix:
- php: ['5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1']
-
- steps:
- - name: Checkout Code
- uses: actions/checkout@v2
-
- - name: Setup PHP
- uses: shivammathur/setup-php@v2
- with:
- php-version: ${{ matrix.php }}
- tools: composer:v2
- coverage: none
- env:
- update: true
-
- - name: Setup Problem Matchers
- run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
-
- - name: Fix PHPUnit Version PHP < 7.4
- uses: nick-invision/retry@v1
- with:
- timeout_minutes: 5
- max_attempts: 5
- command: composer require "phpunit/phpunit:^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8" --dev --no-update --no-interaction
- if: "matrix.php < 7.4"
-
- - name: Fix PHPUnit Version PHP >= 7.4
- uses: nick-invision/retry@v1
- with:
- timeout_minutes: 5
- max_attempts: 5
- command: composer require "phpunit/phpunit:^9.3.3" --dev --no-update --no-interaction
- if: "matrix.php >= 7.4"
-
- - name: Install PHP Dependencies
- uses: nick-invision/retry@v1
- with:
- timeout_minutes: 5
- max_attempts: 5
- command: composer update --no-interaction --no-progress
-
- - name: Execute PHPUnit
- run: vendor/bin/phpunit
diff --git a/vendor/filp/whoops/CHANGELOG.md b/vendor/filp/whoops/CHANGELOG.md
index 88458aba..567c1101 100644
--- a/vendor/filp/whoops/CHANGELOG.md
+++ b/vendor/filp/whoops/CHANGELOG.md
@@ -20,7 +20,7 @@
* Switched syntax highlighting to Prism.js
-Avoids licensing issues with prettify, and uses a maintaned, modern project.
+Avoids licensing issues with prettify, and uses a maintained, modern project.
# 2.13.0
diff --git a/vendor/filp/whoops/src/Whoops/Resources/css/prism.css b/vendor/filp/whoops/src/Whoops/Resources/css/prism.css
index 5faf2b88..a03db53d 100644
--- a/vendor/filp/whoops/src/Whoops/Resources/css/prism.css
+++ b/vendor/filp/whoops/src/Whoops/Resources/css/prism.css
@@ -1,237 +1,5 @@
-/* PrismJS 1.24.1
+/* PrismJS 1.29.0
https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+markup-templating+php&plugins=line-highlight+line-numbers */
-/**
- * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML
- * Based on https://github.com/chriskempson/tomorrow-theme
- * @author Rose Pritchard
- */
-
-code[class*="language-"],
-pre[class*="language-"] {
- color: #ccc;
- background: none;
- font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
- font-size: 1em;
- text-align: left;
- white-space: pre;
- word-spacing: normal;
- word-break: normal;
- word-wrap: normal;
- line-height: 1.5;
-
- -moz-tab-size: 4;
- -o-tab-size: 4;
- tab-size: 4;
-
- -webkit-hyphens: none;
- -moz-hyphens: none;
- -ms-hyphens: none;
- hyphens: none;
-
-}
-
-/* Code blocks */
-pre[class*="language-"] {
- padding: 1em;
- margin: .5em 0;
- overflow: auto;
-}
-
-:not(pre) > code[class*="language-"],
-pre[class*="language-"] {
- background: #2d2d2d;
-}
-
-/* Inline code */
-:not(pre) > code[class*="language-"] {
- padding: .1em;
- border-radius: .3em;
- white-space: normal;
-}
-
-.token.comment,
-.token.block-comment,
-.token.prolog,
-.token.doctype,
-.token.cdata {
- color: #999;
-}
-
-.token.punctuation {
- color: #ccc;
-}
-
-.token.tag,
-.token.attr-name,
-.token.namespace,
-.token.deleted {
- color: #e2777a;
-}
-
-.token.function-name {
- color: #6196cc;
-}
-
-.token.boolean,
-.token.number,
-.token.function {
- color: #f08d49;
-}
-
-.token.property,
-.token.class-name,
-.token.constant,
-.token.symbol {
- color: #f8c555;
-}
-
-.token.selector,
-.token.important,
-.token.atrule,
-.token.keyword,
-.token.builtin {
- color: #cc99cd;
-}
-
-.token.string,
-.token.char,
-.token.attr-value,
-.token.regex,
-.token.variable {
- color: #7ec699;
-}
-
-.token.operator,
-.token.entity,
-.token.url {
- color: #67cdcc;
-}
-
-.token.important,
-.token.bold {
- font-weight: bold;
-}
-.token.italic {
- font-style: italic;
-}
-
-.token.entity {
- cursor: help;
-}
-
-.token.inserted {
- color: green;
-}
-
-pre[data-line] {
- position: relative;
- padding: 1em 0 1em 3em;
-}
-
-.line-highlight {
- position: absolute;
- left: 0;
- right: 0;
- padding: inherit 0;
- margin-top: 1em; /* Same as .prism’s padding-top */
-
- background: hsla(24, 20%, 50%,.08);
- background: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
-
- pointer-events: none;
-
- line-height: inherit;
- white-space: pre;
-}
-
-@media print {
- .line-highlight {
- /*
- * This will prevent browsers from replacing the background color with white.
- * It's necessary because the element is layered on top of the displayed code.
- */
- -webkit-print-color-adjust: exact;
- color-adjust: exact;
- }
-}
-
- .line-highlight:before,
- .line-highlight[data-end]:after {
- content: attr(data-start);
- position: absolute;
- top: .4em;
- left: .6em;
- min-width: 1em;
- padding: 0 .5em;
- background-color: hsla(24, 20%, 50%,.4);
- color: hsl(24, 20%, 95%);
- font: bold 65%/1.5 sans-serif;
- text-align: center;
- vertical-align: .3em;
- border-radius: 999px;
- text-shadow: none;
- box-shadow: 0 1px white;
- }
-
- .line-highlight[data-end]:after {
- content: attr(data-end);
- top: auto;
- bottom: .4em;
- }
-
-.line-numbers .line-highlight:before,
-.line-numbers .line-highlight:after {
- content: none;
-}
-
-pre[id].linkable-line-numbers span.line-numbers-rows {
- pointer-events: all;
-}
-pre[id].linkable-line-numbers span.line-numbers-rows > span:before {
- cursor: pointer;
-}
-pre[id].linkable-line-numbers span.line-numbers-rows > span:hover:before {
- background-color: rgba(128, 128, 128, .2);
-}
-
-pre[class*="language-"].line-numbers {
- position: relative;
- padding-left: 3.8em;
- counter-reset: linenumber;
-}
-
-pre[class*="language-"].line-numbers > code {
- position: relative;
- white-space: inherit;
-}
-
-.line-numbers .line-numbers-rows {
- position: absolute;
- pointer-events: none;
- top: 0;
- font-size: 100%;
- left: -3.8em;
- width: 3em; /* works for line-numbers below 1000 lines */
- letter-spacing: -1px;
- border-right: 1px solid #999;
-
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-
-}
-
- .line-numbers-rows > span {
- display: block;
- counter-increment: linenumber;
- }
-
- .line-numbers-rows > span:before {
- content: counter(linenumber);
- color: #999;
- display: block;
- padding-right: 0.8em;
- text-align: right;
- }
-
+code[class*=language-],pre[class*=language-]{color:#ccc;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}
+pre[data-line]{position:relative;padding:1em 0 1em 3em}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:hsla(24,20%,50%,.08);background:linear-gradient(to right,hsla(24,20%,50%,.1) 70%,hsla(24,20%,50%,0));pointer-events:none;line-height:inherit;white-space:pre}@media print{.line-highlight{-webkit-print-color-adjust:exact;color-adjust:exact}}.line-highlight:before,.line-highlight[data-end]:after{content:attr(data-start);position:absolute;top:.4em;left:.6em;min-width:1em;padding:0 .5em;background-color:hsla(24,20%,50%,.4);color:#f4f1ef;font:bold 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px #fff}.line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}.line-numbers .line-highlight:after,.line-numbers .line-highlight:before{content:none}pre[id].linkable-line-numbers span.line-numbers-rows{pointer-events:all}pre[id].linkable-line-numbers span.line-numbers-rows>span:before{cursor:pointer}pre[id].linkable-line-numbers span.line-numbers-rows>span:hover:before{background-color:rgba(128,128,128,.2)}
+pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}
diff --git a/vendor/filp/whoops/src/Whoops/Resources/js/prism.js b/vendor/filp/whoops/src/Whoops/Resources/js/prism.js
index 068dd0b5..ae10d901 100644
--- a/vendor/filp/whoops/src/Whoops/Resources/js/prism.js
+++ b/vendor/filp/whoops/src/Whoops/Resources/js/prism.js
@@ -1,8 +1,8 @@
-/* PrismJS 1.24.1
+/* PrismJS 1.29.0
https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+markup-templating+php&plugins=line-highlight+line-numbers */
-var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/