Post Expirator - Version 2.6.1

Version Description

Download this release

Release Info

Developer publishpress
Plugin Icon 128x128 Post Expirator
Version 2.6.1
Comparing to
See all releases

Code changes from version 2.6.0 to 2.6.1

Files changed (40) hide show
  1. assets/css/settings.css +24 -1
  2. assets/img/post-expirator-wp-logo.png +0 -0
  3. assets/js/block.js +1 -439
  4. assets/js/block.js.map +1 -1
  5. assets/jsx/block.jsx +15 -2
  6. classes/CronFacade.class.php +47 -0
  7. classes/Display.class.php +318 -280
  8. classes/Facade.class.php +486 -445
  9. classes/Reviews.class.php +46 -0
  10. classes/Util.class.php +48 -45
  11. composer.json +50 -35
  12. composer.lock +6930 -1173
  13. legacy-functions.php +48 -49
  14. post-expirator-debug.php +85 -75
  15. post-expirator.php +1659 -1223
  16. readme.txt +13 -1
  17. vendor/autoload.php +1 -1
  18. vendor/composer/ClassLoader.php +139 -12
  19. vendor/composer/InstalledVersions.php +327 -209
  20. vendor/composer/autoload_files.php +10 -0
  21. vendor/composer/autoload_real.php +25 -5
  22. vendor/composer/autoload_static.php +6 -2
  23. vendor/composer/installed.json +58 -1
  24. vendor/composer/installed.php +29 -21
  25. vendor/composer/platform_check.php +26 -0
  26. vendor/publishpress/wordpress-reviews/.gitignore +2 -0
  27. vendor/publishpress/wordpress-reviews/LICENSE +674 -0
  28. vendor/publishpress/wordpress-reviews/README.md +141 -0
  29. vendor/publishpress/wordpress-reviews/ReviewsController.php +688 -0
  30. vendor/publishpress/wordpress-reviews/composer.json +31 -0
  31. vendor/publishpress/wordpress-reviews/composer.lock +1192 -0
  32. views/bulk-edit.php +139 -106
  33. views/classic-metabox.php +158 -122
  34. views/expire-column.php +61 -53
  35. views/how-to-expire.php +44 -23
  36. views/menu-defaults.php +241 -157
  37. views/menu-diagnostics.php +128 -89
  38. views/menu-general.php +408 -245
  39. views/quick-edit.php +103 -82
  40. views/tabs.php +34 -17
assets/css/settings.css CHANGED
@@ -22,7 +22,7 @@ tr.pe-event {
22
  #pe-settings-tabs fieldset {
23
  border: 1px solid black;
24
  border-radius: 6px;
25
- padding: 0px 12px;
26
  margin-bottom: 20px;
27
  }
28
 
@@ -31,3 +31,26 @@ tr.pe-event {
31
  width: 300px;
32
  margin-bottom: 2px;
33
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  #pe-settings-tabs fieldset {
23
  border: 1px solid black;
24
  border-radius: 6px;
25
+ padding: 0 12px;
26
  margin-bottom: 20px;
27
  }
28
 
31
  width: 300px;
32
  margin-bottom: 2px;
33
  }
34
+
35
+ .pe-status {
36
+ display: inline-block;
37
+ font-size: 25px;
38
+ }
39
+
40
+ .pe-status-enabled {
41
+ color: #2c9b1a;
42
+ }
43
+
44
+ .pe-status-disabled {
45
+ color: #e58484;
46
+ }
47
+
48
+ .pe-status + span {
49
+ line-height: 25px;
50
+ margin-left: 5px;
51
+ margin-right: 10px;
52
+ }
53
+
54
+ .pe-status + span + input[type="submit"] {
55
+ margin-right: 10px;
56
+ }
assets/img/post-expirator-wp-logo.png ADDED
Binary file
assets/js/block.js CHANGED
@@ -1,440 +1,2 @@
1
- /******/ (function(modules) { // webpackBootstrap
2
- /******/ // The module cache
3
- /******/ var installedModules = {};
4
- /******/
5
- /******/ // The require function
6
- /******/ function __webpack_require__(moduleId) {
7
- /******/
8
- /******/ // Check if module is in cache
9
- /******/ if(installedModules[moduleId]) {
10
- /******/ return installedModules[moduleId].exports;
11
- /******/ }
12
- /******/ // Create a new module (and put it into the cache)
13
- /******/ var module = installedModules[moduleId] = {
14
- /******/ i: moduleId,
15
- /******/ l: false,
16
- /******/ exports: {}
17
- /******/ };
18
- /******/
19
- /******/ // Execute the module function
20
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
- /******/
22
- /******/ // Flag the module as loaded
23
- /******/ module.l = true;
24
- /******/
25
- /******/ // Return the exports of the module
26
- /******/ return module.exports;
27
- /******/ }
28
- /******/
29
- /******/
30
- /******/ // expose the modules object (__webpack_modules__)
31
- /******/ __webpack_require__.m = modules;
32
- /******/
33
- /******/ // expose the module cache
34
- /******/ __webpack_require__.c = installedModules;
35
- /******/
36
- /******/ // define getter function for harmony exports
37
- /******/ __webpack_require__.d = function(exports, name, getter) {
38
- /******/ if(!__webpack_require__.o(exports, name)) {
39
- /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
40
- /******/ }
41
- /******/ };
42
- /******/
43
- /******/ // define __esModule on exports
44
- /******/ __webpack_require__.r = function(exports) {
45
- /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
46
- /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
47
- /******/ }
48
- /******/ Object.defineProperty(exports, '__esModule', { value: true });
49
- /******/ };
50
- /******/
51
- /******/ // create a fake namespace object
52
- /******/ // mode & 1: value is a module id, require it
53
- /******/ // mode & 2: merge all properties of value into the ns
54
- /******/ // mode & 4: return value when already ns object
55
- /******/ // mode & 8|1: behave like require
56
- /******/ __webpack_require__.t = function(value, mode) {
57
- /******/ if(mode & 1) value = __webpack_require__(value);
58
- /******/ if(mode & 8) return value;
59
- /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
60
- /******/ var ns = Object.create(null);
61
- /******/ __webpack_require__.r(ns);
62
- /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
63
- /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
64
- /******/ return ns;
65
- /******/ };
66
- /******/
67
- /******/ // getDefaultExport function for compatibility with non-harmony modules
68
- /******/ __webpack_require__.n = function(module) {
69
- /******/ var getter = module && module.__esModule ?
70
- /******/ function getDefault() { return module['default']; } :
71
- /******/ function getModuleExports() { return module; };
72
- /******/ __webpack_require__.d(getter, 'a', getter);
73
- /******/ return getter;
74
- /******/ };
75
- /******/
76
- /******/ // Object.prototype.hasOwnProperty.call
77
- /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
78
- /******/
79
- /******/ // __webpack_public_path__
80
- /******/ __webpack_require__.p = "";
81
- /******/
82
- /******/
83
- /******/ // Load entry module and return exports
84
- /******/ return __webpack_require__(__webpack_require__.s = 0);
85
- /******/ })
86
- /************************************************************************/
87
- /******/ ({
88
-
89
- /***/ "./assets/jsx/block.jsx":
90
- /*!******************************!*\
91
- !*** ./assets/jsx/block.jsx ***!
92
- \******************************/
93
- /*! no static exports found */
94
- /***/ (function(module, exports, __webpack_require__) {
95
-
96
- "use strict";
97
-
98
-
99
- var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
100
-
101
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
102
-
103
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
104
-
105
- function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
106
-
107
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
108
-
109
- (function (wp, config) {
110
- var registerPlugin = wp.plugins.registerPlugin;
111
- var __ = wp.i18n.__;
112
- var PluginDocumentSettingPanel = wp.editPost.PluginDocumentSettingPanel;
113
- var _wp$components = wp.components,
114
- PanelRow = _wp$components.PanelRow,
115
- DateTimePicker = _wp$components.DateTimePicker,
116
- CheckboxControl = _wp$components.CheckboxControl,
117
- SelectControl = _wp$components.SelectControl,
118
- FormTokenField = _wp$components.FormTokenField,
119
- Spinner = _wp$components.Spinner;
120
- var _wp$element = wp.element,
121
- Fragment = _wp$element.Fragment,
122
- Component = _wp$element.Component;
123
- var decodeEntities = wp.htmlEntities.decodeEntities;
124
- var _lodash = lodash,
125
- isEmpty = _lodash.isEmpty,
126
- keys = _lodash.keys,
127
- compact = _lodash.compact;
128
-
129
- var PostExpiratorSidebar = function (_Component) {
130
- _inherits(PostExpiratorSidebar, _Component);
131
-
132
- function PostExpiratorSidebar() {
133
- _classCallCheck(this, PostExpiratorSidebar);
134
-
135
- var _this = _possibleConstructorReturn(this, (PostExpiratorSidebar.__proto__ || Object.getPrototypeOf(PostExpiratorSidebar)).apply(this, arguments));
136
-
137
- _this.state = {
138
- categoriesList: [],
139
- catIdVsName: []
140
- };
141
- return _this;
142
- }
143
-
144
- _createClass(PostExpiratorSidebar, [{
145
- key: 'componentWillMount',
146
- value: function componentWillMount() {
147
- var _this2 = this;
148
-
149
- var attributes = this.state.attributes;
150
-
151
-
152
- var postMeta = wp.data.select('core/editor').getEditedPostAttribute('meta');
153
- var postType = wp.data.select('core/editor').getCurrentPostType();
154
-
155
- var enabled = config.defaults.autoEnable == 1;
156
- var date = new Date();
157
-
158
- var expireAction = this.getExpireType(postMeta);
159
-
160
- var categories = [];
161
- if (expireAction.includes('category')) {
162
- categories = this.getCategories(postMeta);
163
- }
164
-
165
- if (postMeta['_expiration-date-status'] && postMeta['_expiration-date-status'] === 'saved') {
166
- enabled = true;
167
- }
168
-
169
- if (postMeta['_expiration-date']) {
170
- date.setTime((postMeta['_expiration-date'] + date.getTimezoneOffset() * 60) * 1000);
171
- } else {
172
- categories = config.default_categories;
173
- if (config.default_date) {
174
- date.setTime((parseInt(config.default_date) + date.getTimezoneOffset() * 60) * 1000);
175
- }
176
- }
177
-
178
- var taxonomy = config.defaults.taxonomy || 'category';
179
-
180
- this.setState({
181
- enabled: enabled,
182
- date: date,
183
- expireAction: expireAction,
184
- categories: categories,
185
- taxonomy: taxonomy
186
- });
187
-
188
- var categoriesList = [];
189
- var catIdVsName = [];
190
-
191
- if (!taxonomy && postType === 'post' || taxonomy === 'category') {
192
- wp.apiFetch({
193
- path: wp.url.addQueryArgs('wp/v2/categories', { per_page: -1, hide_empty: false })
194
- }).then(function (list) {
195
- list.forEach(function (cat) {
196
- categoriesList[cat.name] = cat;
197
- catIdVsName[cat.id] = cat.name;
198
- });
199
- _this2.setState({ categoriesList: categoriesList, catIdVsName: catIdVsName, taxonomy: __('Category') });
200
- });
201
- } else if (postType !== 'page') {
202
- wp.apiFetch({
203
- path: wp.url.addQueryArgs('wp/v2/taxonomies/' + taxonomy, { context: 'edit' })
204
- }).then(function (taxAttributes) {
205
- // fetch all terms
206
- wp.apiFetch({
207
- path: wp.url.addQueryArgs('wp/v2/' + taxAttributes.rest_base, { context: 'edit' })
208
- }).then(function (terms) {
209
- terms.forEach(function (term) {
210
- categoriesList[decodeEntities(term.name)] = term;
211
- catIdVsName[term.id] = decodeEntities(term.name);
212
- });
213
- _this2.setState({ categoriesList: categoriesList, catIdVsName: catIdVsName, taxonomy: decodeEntities(taxAttributes.name) });
214
- });
215
- });
216
- }
217
- }
218
- }, {
219
- key: 'componentDidUpdate',
220
- value: function componentDidUpdate() {
221
- var _state = this.state,
222
- enabled = _state.enabled,
223
- date = _state.date,
224
- expireAction = _state.expireAction,
225
- categories = _state.categories,
226
- attribute = _state.attribute;
227
-
228
- var setPostMeta = function setPostMeta(newMeta) {
229
- return wp.data.dispatch('core/editor').editPost({ meta: newMeta });
230
- };
231
- var postMeta = wp.data.select('core/editor').getEditedPostAttribute('meta');
232
-
233
- switch (attribute) {
234
- case 'enabled':
235
- setPostMeta({ '_expiration-date-status': enabled ? 'saved' : '' });
236
- // if date is not set when the checkbox is enabled, set it to the default date
237
- // this is to prevent the user from having to click the date to set it
238
- if (!postMeta['_expiration-date']) {
239
- setPostMeta({ '_expiration-date': this.getDate(date) });
240
- }
241
- break;
242
- case 'date':
243
- if (typeof date === 'string') {
244
- setPostMeta({ '_expiration-date': this.getDate(date) });
245
- }
246
- break;
247
- case 'action':
248
- setPostMeta({ '_expiration-date-type': expireAction });
249
- if (!expireAction.includes('category')) {
250
- setPostMeta({ '_expiration-date-categories': [] });
251
- }
252
- break;
253
- case 'category':
254
- setPostMeta({ '_expiration-date-categories': categories });
255
- break;
256
- }
257
- }
258
- }, {
259
- key: 'render',
260
- value: function render() {
261
- var _this3 = this;
262
-
263
- var _state2 = this.state,
264
- categoriesList = _state2.categoriesList,
265
- catIdVsName = _state2.catIdVsName;
266
- var _state3 = this.state,
267
- enabled = _state3.enabled,
268
- date = _state3.date,
269
- expireAction = _state3.expireAction,
270
- categories = _state3.categories,
271
- taxonomy = _state3.taxonomy;
272
-
273
-
274
- var postType = wp.data.select('core/editor').getCurrentPostType();
275
-
276
- var actionsList = [{ label: __('Draft', 'post-expirator'), value: 'draft' }, { label: __('Delete', 'post-expirator'), value: 'delete' }, { label: __('Trash', 'post-expirator'), value: 'trash' }, { label: __('Private', 'post-expirator'), value: 'private' }, { label: __('Stick', 'post-expirator'), value: 'stick' }, { label: __('Unstick', 'post-expirator'), value: 'unstick' }];
277
-
278
- if (postType !== 'page') {
279
- actionsList = _.union(actionsList, [{ label: __('Category: Replace', 'post-expirator'), value: 'category' }, { label: __('Category: Add', 'post-expirator'), value: 'category-add' }, { label: __('Category: Remove', 'post-expirator'), value: 'category-remove' }]);
280
- }
281
-
282
- var selectedCats = categories && compact(categories.map(function (id) {
283
- return catIdVsName[id] || false;
284
- }));
285
- if (typeof selectedCats === 'string') {
286
- selectedCats = [];
287
- }
288
-
289
- return React.createElement(
290
- PluginDocumentSettingPanel,
291
- { title: __('Post Expirator', 'post-expirator'), icon: 'calendar', initialOpen: enabled },
292
- React.createElement(
293
- PanelRow,
294
- null,
295
- React.createElement(CheckboxControl, {
296
- label: __('Enable Post Expiration', 'post-expirator'),
297
- checked: enabled,
298
- onChange: function onChange(value) {
299
- _this3.setState({ enabled: !enabled, attribute: 'enabled' });
300
- }
301
- })
302
- ),
303
- enabled && React.createElement(
304
- Fragment,
305
- null,
306
- React.createElement(
307
- PanelRow,
308
- null,
309
- React.createElement(DateTimePicker, {
310
- currentDate: date,
311
- onChange: function onChange(value) {
312
- return _this3.setState({ date: value, attribute: 'date' });
313
- },
314
- is12Hour: true
315
- })
316
- ),
317
- React.createElement(SelectControl, {
318
- label: __('How to expire', 'post-expirator'),
319
- value: expireAction,
320
- options: actionsList,
321
- onChange: function onChange(value) {
322
- _this3.setState({ expireAction: value, attribute: 'action' });
323
- }
324
- }),
325
- expireAction.includes('category') && (isEmpty(keys(categoriesList)) && React.createElement(
326
- Fragment,
327
- null,
328
- __('Loading', 'post-expirator') + (' (' + taxonomy + ')'),
329
- React.createElement(Spinner, null)
330
- ) || React.createElement(FormTokenField, {
331
- label: __('Expiration Categories', 'post-expirator') + (' (' + taxonomy + ')'),
332
- value: selectedCats,
333
- suggestions: Object.keys(categoriesList),
334
- onChange: function onChange(value) {
335
- _this3.setState({ categories: _this3.selectCategories(value), attribute: 'category' });
336
- },
337
- maxSuggestions: 10
338
- }))
339
- )
340
- );
341
- }
342
-
343
- // what action to take on expiration
344
-
345
- }, {
346
- key: 'getExpireType',
347
- value: function getExpireType(postMeta) {
348
- var typeNew = postMeta['_expiration-date-type'];
349
- var typeOld = postMeta['_expiration-date-options'] && postMeta['_expiration-date-options']['expireType'];
350
-
351
- if (typeNew) {
352
- return typeNew;
353
- }
354
-
355
- if (typeOld) {
356
- return typeOld;
357
- }
358
-
359
- return 'draft';
360
- }
361
-
362
- // what categories to add/remove/replace
363
-
364
- }, {
365
- key: 'getCategories',
366
- value: function getCategories(postMeta) {
367
- var categoriesNew = postMeta['_expiration-date-categories'] && postMeta['_expiration-date-categories'];
368
- var categoriesOld = postMeta['_expiration-date-options'] && postMeta['_expiration-date-options']['category'];
369
-
370
- if ((typeof categoriesNew === 'undefined' ? 'undefined' : _typeof(categoriesNew)) === 'object' && categoriesNew.length > 0) {
371
- return categoriesNew;
372
- }
373
-
374
- if (categoriesOld && typeof categoriesOld !== 'undefined' && (typeof categoriesOld === 'undefined' ? 'undefined' : _typeof(categoriesOld)) !== 'object') {
375
- categories = [categoriesOld];
376
- }
377
-
378
- return categoriesOld;
379
- }
380
-
381
- // fired for the autocomplete
382
-
383
- }, {
384
- key: 'selectCategories',
385
- value: function selectCategories(tokens) {
386
- var _state4 = this.state,
387
- categoriesList = _state4.categoriesList,
388
- catIdVsName = _state4.catIdVsName;
389
-
390
-
391
- var hasNoSuggestion = tokens.some(function (token) {
392
- return typeof token === 'string' && !categoriesList[token];
393
- });
394
-
395
- if (hasNoSuggestion) {
396
- return;
397
- }
398
-
399
- var categories = tokens.map(function (token) {
400
- return typeof token === 'string' ? categoriesList[token] : token;
401
- });
402
-
403
- return categories.map(function (cat) {
404
- return cat.id;
405
- });
406
- }
407
- }, {
408
- key: 'getDate',
409
- value: function getDate(date) {
410
- var newDate = new Date();
411
- newDate.setTime(Date.parse(date));
412
- newDate.setTime(newDate.getTime() - new Date().getTimezoneOffset() * 60 * 1000);
413
- return newDate.getTime() / 1000;
414
- }
415
- }]);
416
-
417
- return PostExpiratorSidebar;
418
- }(Component);
419
-
420
- registerPlugin('postexpirator-sidebar', {
421
- render: PostExpiratorSidebar
422
- });
423
- })(window.wp, config);
424
-
425
- /***/ }),
426
-
427
- /***/ 0:
428
- /*!************************************!*\
429
- !*** multi ./assets/jsx/block.jsx ***!
430
- \************************************/
431
- /*! no static exports found */
432
- /***/ (function(module, exports, __webpack_require__) {
433
-
434
- module.exports = __webpack_require__(/*! ./assets/jsx/block.jsx */"./assets/jsx/block.jsx");
435
-
436
-
437
- /***/ })
438
-
439
- /******/ });
440
  //# sourceMappingURL=block.js.map
1
+ !function(e){var t={};function a(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,a),o.l=!0,o.exports}a.m=e,a.c=t,a.d=function(e,t,r){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(a.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)a.d(r,o,function(t){return e[t]}.bind(null,o));return r},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="",a(a.s=0)}([function(e,t,a){e.exports=a(1)},function(e,t,a){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=function(){function e(e,t){for(var a=0;a<t.length;a++){var r=t[a];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,a,r){return a&&e(t.prototype,a),r&&e(t,r),t}}();function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}!function(e,t){var a=e.plugins.registerPlugin,s=e.i18n.__,c=e.editPost.PluginDocumentSettingPanel,u=e.components,p=u.PanelRow,l=u.DateTimePicker,d=u.CheckboxControl,f=u.SelectControl,g=u.FormTokenField,y=u.Spinner,m=e.element,b=m.Fragment,x=m.Component,v=e.htmlEntities.decodeEntities,h=lodash,E=h.isEmpty,P=h.keys,T=h.compact;a("postexpirator-sidebar",{render:function(a){function u(){n(this,u);var e=i(this,(u.__proto__||Object.getPrototypeOf(u)).apply(this,arguments));return e.state={categoriesList:[],catIdVsName:[]},e}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(u,a),o(u,[{key:"componentWillMount",value:function(){var a=this,r=(this.state.attributes,e.data.select("core/editor").getEditedPostAttribute("meta")),o=e.data.select("core/editor").getCurrentPostType(),n=function(t){return e.data.dispatch("core/editor").editPost({meta:t})},i=1==t.defaults.autoEnable,c=new Date,u=this.getExpireType(r),p=[];u.includes("category")&&(p=this.getCategories(r)),r["_expiration-date-status"]&&"saved"===r["_expiration-date-status"]&&(i=!0),r["_expiration-date"]?c.setTime(1e3*(r["_expiration-date"]+60*c.getTimezoneOffset())):(p=t.default_categories,t.default_date&&c.setTime(1e3*(parseInt(t.default_date)+60*c.getTimezoneOffset())));var l=t.defaults.taxonomy||"category";this.setState({enabled:i,date:c,expireAction:u,categories:p,taxonomy:l}),n({"_expiration-date-status":i?"saved":""}),n({"_expiration-date":c.getTime()/1e3}),n({"_expiration-date-type":u}),n({"_expiration-date-categories":p});var d=[],f=[];!l&&"post"===o||"category"===l?e.apiFetch({path:e.url.addQueryArgs("wp/v2/categories",{per_page:-1})}).then((function(e){e.forEach((function(e){d[e.name]=e,f[e.id]=e.name})),a.setState({categoriesList:d,catIdVsName:f,taxonomy:s("Category")})})):"page"!==o&&e.apiFetch({path:e.url.addQueryArgs("wp/v2/taxonomies/"+l,{context:"edit"})}).then((function(t){e.apiFetch({path:e.url.addQueryArgs("wp/v2/"+t.rest_base,{context:"edit"})}).then((function(e){e.forEach((function(e){d[v(e.name)]=e,f[e.id]=v(e.name)})),a.setState({categoriesList:d,catIdVsName:f,taxonomy:v(t.name)})}))}))}},{key:"componentDidUpdate",value:function(){var t=this.state,a=t.enabled,r=t.date,o=t.expireAction,n=t.categories,i=t.attribute,s=function(t){return e.data.dispatch("core/editor").editPost({meta:t})},c=e.data.select("core/editor").getEditedPostAttribute("meta");switch(i){case"enabled":s({"_expiration-date-status":a?"saved":""}),c["_expiration-date"]||s({"_expiration-date":this.getDate(r)});break;case"date":"string"==typeof r&&s({"_expiration-date":this.getDate(r)});break;case"action":s({"_expiration-date-type":o}),o.includes("category")||s({"_expiration-date-categories":[]});break;case"category":s({"_expiration-date-categories":n})}}},{key:"render",value:function(){var t=this,a=this.state,r=a.categoriesList,o=a.catIdVsName,n=this.state,i=n.enabled,u=n.date,m=n.expireAction,x=n.categories,v=n.taxonomy,h=e.data.select("core/editor").getCurrentPostType(),S=[{label:s("Draft","post-expirator"),value:"draft"},{label:s("Delete","post-expirator"),value:"delete"},{label:s("Trash","post-expirator"),value:"trash"},{label:s("Private","post-expirator"),value:"private"},{label:s("Stick","post-expirator"),value:"stick"},{label:s("Unstick","post-expirator"),value:"unstick"}];"page"!==h&&(S=_.union(S,[{label:s("Category: Replace","post-expirator"),value:"category"},{label:s("Category: Add","post-expirator"),value:"category-add"},{label:s("Category: Remove","post-expirator"),value:"category-remove"}]));var k=x&&T(x.map((function(e){return o[e]||!1})));return"string"==typeof k&&(k=[]),React.createElement(c,{title:s("Post Expirator","post-expirator"),icon:"calendar",initialOpen:i,className:"post-expirator-panel"},React.createElement(p,null,React.createElement(d,{label:s("Enable Post Expiration","post-expirator"),checked:i,onChange:function(e){t.setState({enabled:!i,attribute:"enabled"})}})),i&&React.createElement(b,null,React.createElement(p,null,React.createElement(l,{currentDate:u,onChange:function(e){return t.setState({date:e,attribute:"date"})},is12Hour:!0})),React.createElement(f,{label:s("How to expire","post-expirator"),value:m,options:S,onChange:function(e){t.setState({expireAction:e,attribute:"action"})}}),m.includes("category")&&(E(P(r))&&React.createElement(b,null,s("Loading","post-expirator")+" ("+v+")",React.createElement(y,null))||React.createElement(g,{label:s("Expiration Categories","post-expirator")+" ("+v+")",value:k,suggestions:Object.keys(r),onChange:function(e){t.setState({categories:t.selectCategories(e),attribute:"category"})},maxSuggestions:10}))))}},{key:"getExpireType",value:function(e){var a=e["_expiration-date-type"],r=e["_expiration-date-options"]&&e["_expiration-date-options"].expireType;return a||(r||(t&&t.defaults&&t.defaults.expireType?t.defaults.expireType:"draft"))}},{key:"getCategories",value:function(e){var t=e["_expiration-date-categories"]&&e["_expiration-date-categories"],a=e["_expiration-date-options"]&&e["_expiration-date-options"].category;return"object"===(void 0===t?"undefined":r(t))&&t.length>0?t:(a&&void 0!==a&&"object"!==(void 0===a?"undefined":r(a))&&(categories=[a]),a)}},{key:"selectCategories",value:function(e){var t=this.state,a=t.categoriesList;t.catIdVsName;if(!e.some((function(e){return"string"==typeof e&&!a[e]})))return e.map((function(e){return"string"==typeof e?a[e]:e})).map((function(e){return e.id}))}},{key:"getDate",value:function(e){var t=new Date;return t.setTime(Date.parse(e)),t.setTime(t.getTime()-60*(new Date).getTimezoneOffset()*1e3),t.getTime()/1e3}}]),u}(x)})}(window.wp,config)}]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  //# sourceMappingURL=block.js.map
assets/js/block.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./assets/jsx/block.jsx"],"names":["wp","config","registerPlugin","plugins","__","i18n","PluginDocumentSettingPanel","editPost","components","PanelRow","DateTimePicker","CheckboxControl","SelectControl","FormTokenField","Spinner","element","Fragment","Component","decodeEntities","htmlEntities","lodash","isEmpty","keys","compact","PostExpiratorSidebar","arguments","state","categoriesList","catIdVsName","attributes","postMeta","data","select","getEditedPostAttribute","postType","getCurrentPostType","enabled","defaults","autoEnable","date","Date","expireAction","getExpireType","categories","includes","getCategories","setTime","getTimezoneOffset","default_categories","default_date","parseInt","taxonomy","setState","apiFetch","path","url","addQueryArgs","per_page","hide_empty","then","list","forEach","cat","name","id","context","taxAttributes","rest_base","terms","term","attribute","setPostMeta","newMeta","dispatch","meta","getDate","actionsList","label","value","_","union","selectedCats","map","Object","selectCategories","typeNew","typeOld","categoriesNew","categoriesOld","length","tokens","hasNoSuggestion","some","token","newDate","parse","getTime","render","window"],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;;;;;;;;;;;;;;AClFA,CAAC,UAAWA,EAAX,EAAeC,MAAf,EAAwB;AAAA,QAEbC,cAFa,GAEMF,GAAGG,OAFT,CAEbD,cAFa;AAAA,QAGbE,EAHa,GAGNJ,GAAGK,IAHG,CAGbD,EAHa;AAAA,QAIbE,0BAJa,GAIkBN,GAAGO,QAJrB,CAIbD,0BAJa;AAAA,yBAKyEN,GAAGQ,UAL5E;AAAA,QAKbC,QALa,kBAKbA,QALa;AAAA,QAKHC,cALG,kBAKHA,cALG;AAAA,QAKaC,eALb,kBAKaA,eALb;AAAA,QAK8BC,aAL9B,kBAK8BA,aAL9B;AAAA,QAK6CC,cAL7C,kBAK6CA,cAL7C;AAAA,QAK6DC,OAL7D,kBAK6DA,OAL7D;AAAA,sBAMWd,GAAGe,OANd;AAAA,QAMbC,QANa,eAMbA,QANa;AAAA,QAMHC,SANG,eAMHA,SANG;AAAA,QAObC,cAPa,GAOMlB,GAAGmB,YAPT,CAObD,cAPa;AAAA,kBAQcE,MARd;AAAA,QAQbC,OARa,WAQbA,OARa;AAAA,QAQJC,IARI,WAQJA,IARI;AAAA,QAQEC,OARF,WAQEA,OARF;;AAAA,QAUfC,oBAVe;AAAA;;AAWjB,wCAAc;AAAA;;AAAA,qJACAC,SADA;;AAGV,kBAAKC,KAAL,GAAa;AACTC,gCAAgB,EADP;AAETC,6BAAa;AAFJ,aAAb;AAHU;AAOb;;AAlBgB;AAAA;AAAA,iDAoBI;AAAA;;AAAA,oBACTC,UADS,GACM,KAAKH,KADX,CACTG,UADS;;;AAGjB,oBAAMC,WAAW9B,GAAG+B,IAAH,CAAQC,MAAR,CAAgB,aAAhB,EAAgCC,sBAAhC,CAAwD,MAAxD,CAAjB;AACA,oBAAMC,WAAWlC,GAAG+B,IAAH,CAAQC,MAAR,CAAe,aAAf,EAA8BG,kBAA9B,EAAjB;;AAEA,oBAAIC,UAAUnC,OAAOoC,QAAP,CAAgBC,UAAhB,IAA8B,CAA5C;AACA,oBAAIC,OAAO,IAAIC,IAAJ,EAAX;;AAEA,oBAAIC,eAAe,KAAKC,aAAL,CAAmBZ,QAAnB,CAAnB;;AAEA,oBAAIa,aAAa,EAAjB;AACA,oBAAGF,aAAaG,QAAb,CAAsB,UAAtB,CAAH,EAAqC;AACjCD,iCAAa,KAAKE,aAAL,CAAmBf,QAAnB,CAAb;AACH;;AAED,oBAAGA,SAAS,yBAAT,KAAuCA,SAAS,yBAAT,MAAwC,OAAlF,EAA0F;AACtFM,8BAAU,IAAV;AACH;;AAED,oBAAGN,SAAS,kBAAT,CAAH,EAAgC;AAC5BS,yBAAKO,OAAL,CAAa,CAAChB,SAAS,kBAAT,IAA+BS,KAAKQ,iBAAL,KAA2B,EAA3D,IAAiE,IAA9E;AACH,iBAFD,MAEK;AACDJ,iCAAa1C,OAAO+C,kBAApB;AACA,wBAAG/C,OAAOgD,YAAV,EAAuB;AACnBV,6BAAKO,OAAL,CAAa,CAACI,SAASjD,OAAOgD,YAAhB,IAAgCV,KAAKQ,iBAAL,KAA2B,EAA5D,IAAkE,IAA/E;AACH;AACJ;;AAED,oBAAII,WAAWlD,OAAOoC,QAAP,CAAgBc,QAAhB,IAA4B,UAA3C;;AAEA,qBAAKC,QAAL,CAAe;AACXhB,6BAASA,OADE;AAEXG,0BAAMA,IAFK;AAGXE,kCAAcA,YAHH;AAIXE,gCAAYA,UAJD;AAKXQ,8BAAUA;AALC,iBAAf;;AAQA,oBAAIxB,iBAAiB,EAArB;AACA,oBAAIC,cAAc,EAAlB;;AAEA,oBAAK,CAACuB,QAAD,IAAajB,aAAa,MAA3B,IAAsCiB,aAAa,UAAvD,EAAmE;AAC/DnD,uBAAGqD,QAAH,CAAa;AACTC,8BAAMtD,GAAGuD,GAAH,CAAOC,YAAP,CAAqB,kBAArB,EAAyC,EAAEC,UAAU,CAAC,CAAb,EAAgBC,YAAY,KAA5B,EAAzC;AADG,qBAAb,EAEIC,IAFJ,CAEU,UAAEC,IAAF,EAAY;AAClBA,6BAAKC,OAAL,CAAa,eAAO;AAChBlC,2CAAgBmC,IAAIC,IAApB,IAA6BD,GAA7B;AACAlC,wCAAakC,IAAIE,EAAjB,IAAwBF,IAAIC,IAA5B;AACH,yBAHD;AAIA,+BAAKX,QAAL,CAAe,EAAEzB,gBAAgBA,cAAlB,EAAkCC,aAAaA,WAA/C,EAA4DuB,UAAU/C,GAAI,UAAJ,CAAtE,EAAf;AACH,qBARD;AASH,iBAVD,MAUM,IAAG8B,aAAa,MAAhB,EAAwB;AAC1BlC,uBAAGqD,QAAH,CAAa;AACTC,8BAAMtD,GAAGuD,GAAH,CAAOC,YAAP,uBAAyCL,QAAzC,EAAqD,EAAEc,SAAS,MAAX,EAArD;AADG,qBAAb,EAEIN,IAFJ,CAEU,UAAEO,aAAF,EAAqB;AAC3B;AACAlE,2BAAGqD,QAAH,CAAa;AACTC,kCAAMtD,GAAGuD,GAAH,CAAOC,YAAP,YAA8BU,cAAcC,SAA5C,EAAyD,EAAEF,SAAS,MAAX,EAAzD;AADG,yBAAb,EAEIN,IAFJ,CAEU,UAAES,KAAF,EAAa;AACnBA,kCAAMP,OAAN,CAAc,gBAAQ;AAClBlC,+CAAgBT,eAAemD,KAAKN,IAApB,CAAhB,IAA8CM,IAA9C;AACAzC,4CAAayC,KAAKL,EAAlB,IAAyB9C,eAAemD,KAAKN,IAApB,CAAzB;AACH,6BAHD;AAIA,mCAAKX,QAAL,CAAe,EAAEzB,gBAAgBA,cAAlB,EAAkCC,aAAaA,WAA/C,EAA4DuB,UAAUjC,eAAegD,cAAcH,IAA7B,CAAtE,EAAf;AACH,yBARD;AASH,qBAbD;AAcH;AAEJ;AAzFgB;AAAA;AAAA,iDA2FI;AAAA,6BAC8C,KAAKrC,KADnD;AAAA,oBACTU,OADS,UACTA,OADS;AAAA,oBACAG,IADA,UACAA,IADA;AAAA,oBACME,YADN,UACMA,YADN;AAAA,oBACoBE,UADpB,UACoBA,UADpB;AAAA,oBACgC2B,SADhC,UACgCA,SADhC;;AAEjB,oBAAMC,cAAc,SAAdA,WAAc,CAACC,OAAD;AAAA,2BAAaxE,GAAG+B,IAAH,CAAQ0C,QAAR,CAAkB,aAAlB,EAAkClE,QAAlC,CAA4C,EAAEmE,MAAMF,OAAR,EAA5C,CAAb;AAAA,iBAApB;AACA,oBAAM1C,WAAW9B,GAAG+B,IAAH,CAAQC,MAAR,CAAgB,aAAhB,EAAgCC,sBAAhC,CAAwD,MAAxD,CAAjB;;AAEA,wBAAOqC,SAAP;AACI,yBAAK,SAAL;AACIC,oCAAa,EAAE,2BAA6BnC,UAAU,OAAV,GAAoB,EAAnD,EAAb;AACA;AACA;AACA,4BAAG,CAACN,SAAS,kBAAT,CAAJ,EAAiC;AAC7ByC,wCAAa,EAAC,oBAAoB,KAAKI,OAAL,CAAapC,IAAb,CAArB,EAAb;AACH;AACD;AACJ,yBAAK,MAAL;AACI,4BAAG,OAAOA,IAAP,KAAgB,QAAnB,EAA4B;AACxBgC,wCAAa,EAAC,oBAAoB,KAAKI,OAAL,CAAapC,IAAb,CAArB,EAAb;AACH;AACD;AACJ,yBAAK,QAAL;AACIgC,oCAAa,EAAE,yBAAyB9B,YAA3B,EAAb;AACA,4BAAG,CAACA,aAAaG,QAAb,CAAsB,UAAtB,CAAJ,EAAsC;AAClC2B,wCAAa,EAAE,+BAA+B,EAAjC,EAAb;AACH;AACD;AACJ,yBAAK,UAAL;AACIA,oCAAa,EAAE,+BAA+B5B,UAAjC,EAAb;AACA;AAtBR;AAyBH;AAzHgB;AAAA;AAAA,qCA2HR;AAAA;;AAAA,8BACmC,KAAKjB,KADxC;AAAA,oBACGC,cADH,WACGA,cADH;AAAA,oBACmBC,WADnB,WACmBA,WADnB;AAAA,8BAEyD,KAAKF,KAF9D;AAAA,oBAEGU,OAFH,WAEGA,OAFH;AAAA,oBAEYG,IAFZ,WAEYA,IAFZ;AAAA,oBAEkBE,YAFlB,WAEkBA,YAFlB;AAAA,oBAEgCE,UAFhC,WAEgCA,UAFhC;AAAA,oBAE4CQ,QAF5C,WAE4CA,QAF5C;;;AAIL,oBAAMjB,WAAWlC,GAAG+B,IAAH,CAAQC,MAAR,CAAe,aAAf,EAA8BG,kBAA9B,EAAjB;;AAEA,oBAAIyC,cAAc,CACd,EAAEC,OAAOzE,GAAI,OAAJ,EAAa,gBAAb,CAAT,EAA0C0E,OAAO,OAAjD,EADc,EAEd,EAAED,OAAOzE,GAAI,QAAJ,EAAc,gBAAd,CAAT,EAA2C0E,OAAO,QAAlD,EAFc,EAGd,EAAED,OAAOzE,GAAI,OAAJ,EAAa,gBAAb,CAAT,EAA0C0E,OAAO,OAAjD,EAHc,EAId,EAAED,OAAOzE,GAAI,SAAJ,EAAe,gBAAf,CAAT,EAA4C0E,OAAO,SAAnD,EAJc,EAKd,EAAED,OAAOzE,GAAI,OAAJ,EAAa,gBAAb,CAAT,EAA0C0E,OAAO,OAAjD,EALc,EAMd,EAAED,OAAOzE,GAAI,SAAJ,EAAe,gBAAf,CAAT,EAA4C0E,OAAO,SAAnD,EANc,CAAlB;;AASA,oBAAG5C,aAAa,MAAhB,EAAuB;AACnB0C,kCAAcG,EAAEC,KAAF,CAAQJ,WAAR,EAAqB,CAC/B,EAAEC,OAAOzE,GAAG,mBAAH,EAAwB,gBAAxB,CAAT,EAAoD0E,OAAO,UAA3D,EAD+B,EAE/B,EAAED,OAAOzE,GAAG,eAAH,EAAoB,gBAApB,CAAT,EAAgD0E,OAAO,cAAvD,EAF+B,EAG/B,EAAED,OAAOzE,GAAG,kBAAH,EAAuB,gBAAvB,CAAT,EAAmD0E,OAAO,iBAA1D,EAH+B,CAArB,CAAd;AAKH;;AAED,oBAAIG,eAAetC,cAAcpB,QAAQoB,WAAWuC,GAAX,CAAe,UAAClB,EAAD;AAAA,2BAAQpC,YAAYoC,EAAZ,KAAmB,KAA3B;AAAA,iBAAf,CAAR,CAAjC;AACA,oBAAG,OAAOiB,YAAP,KAAwB,QAA3B,EAAoC;AAChCA,mCAAe,EAAf;AACH;;AAED,uBACI;AAAC,8CAAD;AAAA,sBAA4B,OAAQ7E,GAAI,gBAAJ,EAAsB,gBAAtB,CAApC,EAA+E,MAAK,UAApF,EAA+F,aAAcgC,OAA7G;AACI;AAAC,gCAAD;AAAA;AACI,4CAAC,eAAD;AACI,mCAAQhC,GAAI,wBAAJ,EAA8B,gBAA9B,CADZ;AAEI,qCAAUgC,OAFd;AAGI,sCAAW,kBAAC0C,KAAD,EAAW;AAAE,uCAAK1B,QAAL,CAAe,EAAEhB,SAAS,CAACA,OAAZ,EAAqBkC,WAAW,SAAhC,EAAf;AAA8D;AAH1F;AADJ,qBADJ;AAQMlC,+BACE;AAAC,gCAAD;AAAA;AACI;AAAC,oCAAD;AAAA;AACI,gDAAC,cAAD;AACI,6CAAcG,IADlB;AAEI,0CAAW,kBAAEuC,KAAF;AAAA,2CAAa,OAAK1B,QAAL,CAAe,EAAEb,MAAMuC,KAAR,EAAeR,WAAW,MAA1B,EAAf,CAAb;AAAA,iCAFf;AAGI,0CAAW;AAHf;AADJ,yBADJ;AAQI,4CAAC,aAAD;AACI,mCAAQlE,GAAI,eAAJ,EAAqB,gBAArB,CADZ;AAEI,mCAAQqC,YAFZ;AAGI,qCAAUmC,WAHd;AAII,sCAAW,kBAACE,KAAD,EAAW;AAAE,uCAAK1B,QAAL,CAAe,EAAEX,cAAcqC,KAAhB,EAAuBR,WAAW,QAAlC,EAAf;AAA+D;AAJ3F,0BARJ;AAcM7B,qCAAaG,QAAb,CAAsB,UAAtB,MAEQvB,QAAQC,KAAKK,cAAL,CAAR,KACE;AAAC,oCAAD;AAAA;AACMvB,+BAAI,SAAJ,EAAe,gBAAf,YAAyC+C,QAAzC,OADN;AAEI,gDAAC,OAAD;AAFJ,yBADJ,IAQJ,oBAAC,cAAD;AACI,mCAAQ/C,GAAG,uBAAH,EAA4B,gBAA5B,YAAqD+C,QAArD,OADZ;AAEI,mCAAQ8B,YAFZ;AAGI,yCAAcE,OAAO7D,IAAP,CAAYK,cAAZ,CAHlB;AAII,sCAAW,kBAAEmD,KAAF,EAAa;AAAE,uCAAK1B,QAAL,CAAe,EAAET,YAAY,OAAKyC,gBAAL,CAAsBN,KAAtB,CAAd,EAA4CR,WAAW,UAAvD,EAAf;AAAsF,6BAJpH;AAKI,4CAAiB;AALrB,0BAVF;AAdN;AATR,iBADJ;AA+CH;;AAED;;AAxMiB;AAAA;AAAA,0CAyMHxC,QAzMG,EAyMO;AACpB,oBAAIuD,UAAUvD,SAAS,uBAAT,CAAd;AACA,oBAAIwD,UAAUxD,SAAS,0BAAT,KAAwCA,SAAS,0BAAT,EAAqC,YAArC,CAAtD;;AAEA,oBAAGuD,OAAH,EAAW;AACP,2BAAOA,OAAP;AACH;;AAED,oBAAGC,OAAH,EAAW;AACP,2BAAOA,OAAP;AACH;;AAED,uBAAO,OAAP;AACH;;AAED;;AAxNiB;AAAA;AAAA,0CAyNHxD,QAzNG,EAyNO;AACpB,oBAAIyD,gBAAgBzD,SAAS,6BAAT,KAA2CA,SAAS,6BAAT,CAA/D;AACA,oBAAI0D,gBAAgB1D,SAAS,0BAAT,KAAwCA,SAAS,0BAAT,EAAqC,UAArC,CAA5D;;AAEA,oBAAG,QAAOyD,aAAP,yCAAOA,aAAP,OAAyB,QAAzB,IAAqCA,cAAcE,MAAd,GAAuB,CAA/D,EAAiE;AAC7D,2BAAOF,aAAP;AACH;;AAED,oBAAGC,iBAAiB,OAAOA,aAAP,KAAyB,WAA1C,IAAyD,QAAOA,aAAP,yCAAOA,aAAP,OAAyB,QAArF,EAA8F;AAC1F7C,iCAAa,CAAE6C,aAAF,CAAb;AACH;;AAED,uBAAOA,aAAP;AAEH;;AAED;;AAzOiB;AAAA;AAAA,6CA0OAE,MA1OA,EA0OQ;AAAA,8BACmB,KAAKhE,KADxB;AAAA,oBACbC,cADa,WACbA,cADa;AAAA,oBACGC,WADH,WACGA,WADH;;;AAGrB,oBAAI+D,kBAAkBD,OAAOE,IAAP,CAAY,UAAUC,KAAV,EAAiB;AAC/C,2BAAO,OAAOA,KAAP,KAAiB,QAAjB,IAA6B,CAAClE,eAAekE,KAAf,CAArC;AACH,iBAFqB,CAAtB;;AAIA,oBAAIF,eAAJ,EAAqB;AACjB;AACH;;AAED,oBAAIhD,aAAa+C,OAAOR,GAAP,CAAW,UAAUW,KAAV,EAAiB;AACzC,2BAAO,OAAOA,KAAP,KAAiB,QAAjB,GAA4BlE,eAAekE,KAAf,CAA5B,GAAoDA,KAA3D;AACH,iBAFgB,CAAjB;;AAIA,uBAAOlD,WAAWuC,GAAX,CAAgB,UAACpB,GAAD;AAAA,2BAASA,IAAIE,EAAb;AAAA,iBAAhB,CAAP;AACH;AA1PgB;AAAA;AAAA,oCA4PTzB,IA5PS,EA4PJ;AACT,oBAAIuD,UAAU,IAAItD,IAAJ,EAAd;AACAsD,wBAAQhD,OAAR,CAAgBN,KAAKuD,KAAL,CAAWxD,IAAX,CAAhB;AACAuD,wBAAQhD,OAAR,CAAgBgD,QAAQE,OAAR,KAAoB,IAAIxD,IAAJ,GAAWO,iBAAX,KAAiC,EAAjC,GAAsC,IAA1E;AACA,uBAAS+C,QAAQE,OAAR,EAAD,GAAsB,IAA9B;AACH;AAjQgB;;AAAA;AAAA,MAUc/E,SAVd;;AAqQrBf,mBAAgB,uBAAhB,EAAyC;AACrC+F,gBAAQzE;AAD6B,KAAzC;AAKH,CA1QD,EA0QI0E,OAAOlG,EA1QX,EA0QeC,MA1Qf,E","file":"block.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","(function ( wp, config ) {\r\n\r\n const { registerPlugin } = wp.plugins;\r\n const { __ } = wp.i18n;\r\n const { PluginDocumentSettingPanel } = wp.editPost;\r\n const { PanelRow, DateTimePicker, CheckboxControl, SelectControl, FormTokenField, Spinner } = wp.components;\r\n const { Fragment, Component } = wp.element;\r\n const { decodeEntities } = wp.htmlEntities;\r\n const { isEmpty, keys, compact } = lodash;\r\n\r\n class PostExpiratorSidebar extends Component {\r\n constructor() {\r\n super( ...arguments );\r\n\r\n this.state = {\r\n categoriesList: [],\r\n catIdVsName: [],\r\n }\r\n }\r\n\r\n componentWillMount() {\r\n const { attributes } = this.state;\r\n\r\n const postMeta = wp.data.select( 'core/editor' ).getEditedPostAttribute( 'meta' );\r\n const postType = wp.data.select('core/editor').getCurrentPostType();\r\n\r\n let enabled = config.defaults.autoEnable == 1;\r\n let date = new Date();\r\n\r\n let expireAction = this.getExpireType(postMeta);\r\n\r\n let categories = [];\r\n if(expireAction.includes('category')){\r\n categories = this.getCategories(postMeta);\r\n }\r\n\r\n if(postMeta['_expiration-date-status'] && postMeta['_expiration-date-status'] === 'saved'){\r\n enabled = true;\r\n }\r\n\r\n if(postMeta['_expiration-date']){\r\n date.setTime((postMeta['_expiration-date'] + date.getTimezoneOffset() * 60) * 1000);\r\n }else{\r\n categories = config.default_categories;\r\n if(config.default_date){\r\n date.setTime((parseInt(config.default_date) + date.getTimezoneOffset() * 60) * 1000);\r\n }\r\n }\r\n\r\n let taxonomy = config.defaults.taxonomy || 'category';\r\n\r\n this.setState( {\r\n enabled: enabled,\r\n date: date,\r\n expireAction: expireAction,\r\n categories: categories,\r\n taxonomy: taxonomy,\r\n } );\r\n\r\n let categoriesList = [];\r\n let catIdVsName = [];\r\n\r\n if( (!taxonomy && postType === 'post') || taxonomy === 'category' ){\r\n wp.apiFetch( {\r\n path: wp.url.addQueryArgs( 'wp/v2/categories', { per_page: -1, hide_empty: false } ),\r\n } ).then( ( list ) => {\r\n list.forEach(cat => {\r\n categoriesList[ cat.name ] = cat;\r\n catIdVsName[ cat.id ] = cat.name;\r\n });\r\n this.setState( { categoriesList: categoriesList, catIdVsName: catIdVsName, taxonomy: __( 'Category' ) } );\r\n } );\r\n }else if(postType !== 'page') {\r\n wp.apiFetch( {\r\n path: wp.url.addQueryArgs( `wp/v2/taxonomies/${taxonomy}`, { context: 'edit' } ),\r\n } ).then( ( taxAttributes ) => {\r\n // fetch all terms\r\n wp.apiFetch( {\r\n path: wp.url.addQueryArgs( `wp/v2/${taxAttributes.rest_base}`, { context: 'edit' } ),\r\n } ).then( ( terms ) => {\r\n terms.forEach(term => {\r\n categoriesList[ decodeEntities(term.name) ] = term;\r\n catIdVsName[ term.id ] = decodeEntities(term.name);\r\n });\r\n this.setState( { categoriesList: categoriesList, catIdVsName: catIdVsName, taxonomy: decodeEntities(taxAttributes.name) } );\r\n });\r\n });\r\n }\r\n\r\n }\r\n\r\n componentDidUpdate() {\r\n const { enabled, date, expireAction, categories, attribute } = this.state;\r\n const setPostMeta = (newMeta) => wp.data.dispatch( 'core/editor' ).editPost( { meta: newMeta } );\r\n const postMeta = wp.data.select( 'core/editor' ).getEditedPostAttribute( 'meta' );\r\n\r\n switch(attribute){\r\n case 'enabled':\r\n setPostMeta( { '_expiration-date-status' : (enabled ? 'saved' : '' ) } );\r\n // if date is not set when the checkbox is enabled, set it to the default date\r\n // this is to prevent the user from having to click the date to set it\r\n if(!postMeta['_expiration-date']){\r\n setPostMeta( {'_expiration-date': this.getDate(date) } );\r\n }\r\n break;\r\n case 'date':\r\n if(typeof date === 'string'){\r\n setPostMeta( {'_expiration-date': this.getDate(date) } );\r\n }\r\n break;\r\n case 'action':\r\n setPostMeta( { '_expiration-date-type': expireAction } );\r\n if(!expireAction.includes('category')){\r\n setPostMeta( { '_expiration-date-categories': [] } );\r\n }\r\n break;\r\n case 'category':\r\n setPostMeta( { '_expiration-date-categories': categories } );\r\n break;\r\n }\r\n\r\n }\r\n\r\n render() {\r\n const { categoriesList, catIdVsName } = this.state;\r\n const { enabled, date, expireAction, categories, taxonomy } = this.state;\r\n\r\n const postType = wp.data.select('core/editor').getCurrentPostType();\r\n\r\n let actionsList = [\r\n { label: __( 'Draft', 'post-expirator' ), value: 'draft' },\r\n { label: __( 'Delete', 'post-expirator' ), value: 'delete' },\r\n { label: __( 'Trash', 'post-expirator' ), value: 'trash' },\r\n { label: __( 'Private', 'post-expirator' ), value: 'private' },\r\n { label: __( 'Stick', 'post-expirator' ), value: 'stick' },\r\n { label: __( 'Unstick', 'post-expirator' ), value: 'unstick' },\r\n ];\r\n\r\n if(postType !== 'page'){\r\n actionsList = _.union(actionsList, [\r\n { label: __('Category: Replace', 'post-expirator'), value: 'category' },\r\n { label: __('Category: Add', 'post-expirator'), value: 'category-add' },\r\n { label: __('Category: Remove', 'post-expirator'), value: 'category-remove' },\r\n ]);\r\n }\r\n\r\n let selectedCats = categories && compact(categories.map((id) => catIdVsName[id] || false ));\r\n if(typeof selectedCats === 'string'){\r\n selectedCats = [];\r\n }\r\n \r\n return (\r\n <PluginDocumentSettingPanel title={ __( 'Post Expirator', 'post-expirator' ) } icon=\"calendar\" initialOpen={ enabled }>\r\n <PanelRow>\r\n <CheckboxControl\r\n label={ __( 'Enable Post Expiration', 'post-expirator' ) }\r\n checked={ enabled }\r\n onChange={ (value) => { this.setState( { enabled: !enabled, attribute: 'enabled' } ) } }\r\n />\r\n </PanelRow>\r\n { enabled && (\r\n <Fragment>\r\n <PanelRow>\r\n <DateTimePicker\r\n currentDate={ date }\r\n onChange={ ( value ) => this.setState( { date: value, attribute: 'date' } ) }\r\n is12Hour={ true }\r\n />\r\n </PanelRow>\r\n <SelectControl\r\n label={ __( 'How to expire', 'post-expirator' ) }\r\n value={ expireAction }\r\n options={ actionsList }\r\n onChange={ (value) => { this.setState( { expireAction: value, attribute: 'action' } ) } }\r\n />\r\n { expireAction.includes('category') && \r\n (\r\n ( isEmpty(keys(categoriesList)) && (\r\n <Fragment>\r\n { __( 'Loading', 'post-expirator' ) + ` (${taxonomy})` }\r\n <Spinner/>\r\n </Fragment>\r\n ) )\r\n ||\r\n (\r\n <FormTokenField\r\n label={ __('Expiration Categories', 'post-expirator') + ` (${taxonomy})` }\r\n value={ selectedCats }\r\n suggestions={ Object.keys(categoriesList) }\r\n onChange={ ( value ) => { this.setState( { categories: this.selectCategories(value), attribute: 'category' } ) } }\r\n maxSuggestions={ 10 }\r\n />\r\n )\r\n ) }\r\n </Fragment>\r\n ) }\r\n </PluginDocumentSettingPanel>\r\n );\r\n }\r\n\r\n // what action to take on expiration\r\n getExpireType(postMeta) {\r\n let typeNew = postMeta['_expiration-date-type'];\r\n let typeOld = postMeta['_expiration-date-options'] && postMeta['_expiration-date-options']['expireType'];\r\n\r\n if(typeNew){\r\n return typeNew;\r\n }\r\n\r\n if(typeOld){\r\n return typeOld;\r\n }\r\n\r\n return 'draft';\r\n }\r\n\r\n // what categories to add/remove/replace\r\n getCategories(postMeta) {\r\n let categoriesNew = postMeta['_expiration-date-categories'] && postMeta['_expiration-date-categories'];\r\n let categoriesOld = postMeta['_expiration-date-options'] && postMeta['_expiration-date-options']['category'];\r\n\r\n if(typeof categoriesNew === 'object' && categoriesNew.length > 0){\r\n return categoriesNew;\r\n }\r\n\r\n if(categoriesOld && typeof categoriesOld !== 'undefined' && typeof categoriesOld !== 'object'){\r\n categories = [ categoriesOld ];\r\n }\r\n\r\n return categoriesOld;\r\n\r\n }\r\n\r\n // fired for the autocomplete\r\n selectCategories(tokens) {\r\n const { categoriesList, catIdVsName } = this.state;\r\n\r\n var hasNoSuggestion = tokens.some(function (token) {\r\n return typeof token === 'string' && !categoriesList[token];\r\n });\r\n\r\n if (hasNoSuggestion) {\r\n return;\r\n }\r\n\r\n var categories = tokens.map(function (token) {\r\n return typeof token === 'string' ? categoriesList[token] : token;\r\n })\r\n\r\n return categories.map( (cat) => cat.id );\r\n }\r\n\r\n getDate(date){\r\n let newDate = new Date();\r\n newDate.setTime(Date.parse(date));\r\n newDate.setTime(newDate.getTime() - new Date().getTimezoneOffset() * 60 * 1000);\r\n return ((newDate.getTime()) / 1000);\r\n }\r\n\r\n }\r\n\r\n registerPlugin( 'postexpirator-sidebar', {\r\n render: PostExpiratorSidebar\r\n } );\r\n\r\n\r\n})( window.wp, config );"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./assets/jsx/block.jsx"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","wp","config","registerPlugin","plugins","__","i18n","PluginDocumentSettingPanel","editPost","components","PanelRow","DateTimePicker","CheckboxControl","SelectControl","FormTokenField","Spinner","element","Fragment","Component","decodeEntities","htmlEntities","lodash","isEmpty","keys","compact","render","arguments","state","categoriesList","catIdVsName","postMeta","this","attributes","data","select","getEditedPostAttribute","postType","getCurrentPostType","setPostMeta","newMeta","dispatch","meta","enabled","defaults","autoEnable","date","Date","expireAction","getExpireType","categories","includes","getCategories","setTime","getTimezoneOffset","default_categories","default_date","parseInt","taxonomy","setState","getTime","apiFetch","path","url","addQueryArgs","per_page","then","list","forEach","cat","id","context","taxAttributes","rest_base","terms","term","attribute","getDate","actionsList","label","_","union","selectedCats","map","title","icon","initialOpen","className","checked","onChange","currentDate","is12Hour","options","suggestions","selectCategories","maxSuggestions","typeNew","typeOld","expireType","categoriesNew","categoriesOld","length","tokens","some","token","newDate","parse","window"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,swBClFrD,SAAWC,EAAIC,GAAQ,IAEZC,EAAkBF,EAAGG,QAArBD,eACAE,EAAMJ,EAAGK,KAATD,GACAE,EAA8BN,EAAGO,SAAjCD,2BAJY,EAKyEN,EAAGQ,WAAxFC,EALY,EAKZA,SAAUC,EALE,EAKFA,eAAgBC,EALd,EAKcA,gBAAiBC,EAL/B,EAK+BA,cAAeC,EAL9C,EAK8CA,eAAgBC,EAL9D,EAK8DA,QAL9D,EAMWd,EAAGe,QAA1BC,EANY,EAMZA,SAAUC,EANE,EAMFA,UACVC,EAAkBlB,EAAGmB,aAArBD,eAPY,EAQcE,OAA1BC,EARY,EAQZA,QAASC,EARG,EAQHA,KAAMC,EARH,EAQGA,QAwRtBrB,EAAe,wBAAyB,CACpCsB,OAjSe,YAWf,aAAc,0EACDC,YADC,OAGV,EAAKC,MAAQ,CACTC,eAAgB,GAChBC,YAAa,IALP,EAXC,O,yTAAA,sDAoBM,WAGXC,GAFeC,KAAKJ,MAAnBK,WAEU/B,EAAGgC,KAAKC,OAAO,eAAeC,uBAAuB,SAChEC,EAAWnC,EAAGgC,KAAKC,OAAO,eAAeG,qBACzCC,EAAc,SAACC,GAAD,OAAatC,EAAGgC,KAAKO,SAAS,eAAehC,SAAS,CAACiC,KAAMF,KAE7EG,EAAwC,GAA9BxC,EAAOyC,SAASC,WAC1BC,EAAO,IAAIC,KAEXC,EAAehB,KAAKiB,cAAclB,GAElCmB,EAAa,GACbF,EAAaG,SAAS,cACtBD,EAAalB,KAAKoB,cAAcrB,IAGhCA,EAAS,4BAAsE,UAAxCA,EAAS,6BAChDY,GAAU,GAGVZ,EAAS,oBACTe,EAAKO,QAAyE,KAAhEtB,EAAS,oBAAiD,GAA3Be,EAAKQ,uBAElDJ,EAAa/C,EAAOoD,mBAChBpD,EAAOqD,cACPV,EAAKO,QAA0E,KAAjEI,SAAStD,EAAOqD,cAA2C,GAA3BV,EAAKQ,uBAI3D,IAAII,EAAWvD,EAAOyC,SAASc,UAAY,WAE3C1B,KAAK2B,SAAS,CACVhB,QAASA,EACTG,KAAMA,EACNE,aAAcA,EACdE,WAAYA,EACZQ,SAAUA,IAIdnB,EAAY,CAAC,0BAA4BI,EAAU,QAAU,KAC7DJ,EAAY,CAAC,mBAAqBO,EAAKc,UAAa,MACpDrB,EAAY,CAAC,wBAAyBS,IACtCT,EAAY,CAAC,8BAA+BW,IAE5C,IAAIrB,EAAiB,GACjBC,EAAc,IAEZ4B,GAAyB,SAAbrB,GAAqC,aAAbqB,EACtCxD,EAAG2D,SAAS,CACRC,KAAM5D,EAAG6D,IAAIC,aAAa,mBAAoB,CAACC,UAAW,MAC3DC,MAAK,SAACC,GACLA,EAAKC,SAAQ,SAAAC,GACTxC,EAAewC,EAAI5F,MAAQ4F,EAC3BvC,EAAYuC,EAAIC,IAAMD,EAAI5F,QAE9B,EAAKkF,SAAS,CAAC9B,eAAgBA,EAAgBC,YAAaA,EAAa4B,SAAUpD,EAAG,iBAEtE,SAAb+B,GACPnC,EAAG2D,SAAS,CACRC,KAAM5D,EAAG6D,IAAIC,aAAP,oBAAwCN,EAAY,CAACa,QAAS,WACrEL,MAAK,SAACM,GAELtE,EAAG2D,SAAS,CACRC,KAAM5D,EAAG6D,IAAIC,aAAP,SAA6BQ,EAAcC,UAAa,CAACF,QAAS,WACzEL,MAAK,SAACQ,GACLA,EAAMN,SAAQ,SAAAO,GACV9C,EAAeT,EAAeuD,EAAKlG,OAASkG,EAC5C7C,EAAY6C,EAAKL,IAAMlD,EAAeuD,EAAKlG,SAE/C,EAAKkF,SAAS,CACV9B,eAAgBA,EAChBC,YAAaA,EACb4B,SAAUtC,EAAeoD,EAAc/F,gBA9F5C,2CAsGM,MAC4CuD,KAAKJ,MAA3De,EADU,EACVA,QAASG,EADC,EACDA,KAAME,EADL,EACKA,aAAcE,EADnB,EACmBA,WAAY0B,EAD/B,EAC+BA,UAC1CrC,EAAc,SAACC,GAAD,OAAatC,EAAGgC,KAAKO,SAAS,eAAehC,SAAS,CAACiC,KAAMF,KAC3ET,EAAW7B,EAAGgC,KAAKC,OAAO,eAAeC,uBAAuB,QAEtE,OAAQwC,GACJ,IAAK,UACDrC,EAAY,CAAC,0BAA4BI,EAAU,QAAU,KAGxDZ,EAAS,qBACVQ,EAAY,CAAC,mBAAoBP,KAAK6C,QAAQ/B,KAElD,MACJ,IAAK,OACmB,iBAATA,GACPP,EAAY,CAAC,mBAAoBP,KAAK6C,QAAQ/B,KAElD,MACJ,IAAK,SACDP,EAAY,CAAC,wBAAyBS,IACjCA,EAAaG,SAAS,aACvBZ,EAAY,CAAC,8BAA+B,KAEhD,MACJ,IAAK,WACDA,EAAY,CAAC,8BAA+BW,OAhIzC,+BAsIN,aACiClB,KAAKJ,MAApCC,EADF,EACEA,eAAgBC,EADlB,EACkBA,YADlB,EAEuDE,KAAKJ,MAA1De,EAFF,EAEEA,QAASG,EAFX,EAEWA,KAAME,EAFjB,EAEiBA,aAAcE,EAF/B,EAE+BA,WAAYQ,EAF3C,EAE2CA,SAE1CrB,EAAWnC,EAAGgC,KAAKC,OAAO,eAAeG,qBAE3CwC,EAAc,CACd,CAACC,MAAOzE,EAAG,QAAS,kBAAmBnB,MAAO,SAC9C,CAAC4F,MAAOzE,EAAG,SAAU,kBAAmBnB,MAAO,UAC/C,CAAC4F,MAAOzE,EAAG,QAAS,kBAAmBnB,MAAO,SAC9C,CAAC4F,MAAOzE,EAAG,UAAW,kBAAmBnB,MAAO,WAChD,CAAC4F,MAAOzE,EAAG,QAAS,kBAAmBnB,MAAO,SAC9C,CAAC4F,MAAOzE,EAAG,UAAW,kBAAmBnB,MAAO,YAGnC,SAAbkD,IACAyC,EAAcE,EAAEC,MAAMH,EAAa,CAC/B,CAACC,MAAOzE,EAAG,oBAAqB,kBAAmBnB,MAAO,YAC1D,CAAC4F,MAAOzE,EAAG,gBAAiB,kBAAmBnB,MAAO,gBACtD,CAAC4F,MAAOzE,EAAG,mBAAoB,kBAAmBnB,MAAO,sBAIjE,IAAI+F,EAAehC,GAAczB,EAAQyB,EAAWiC,KAAI,SAACb,GAAD,OAAQxC,EAAYwC,KAAO,MAKnF,MAJ4B,iBAAjBY,IACPA,EAAe,IAIf,oBAAC1E,EAAD,CAA4B4E,MAAO9E,EAAG,iBAAkB,kBAAmB+E,KAAK,WACpDC,YAAa3C,EAAS4C,UAAW,wBACzD,oBAAC5E,EAAD,KACI,oBAACE,EAAD,CACIkE,MAAOzE,EAAG,yBAA0B,kBACpCkF,QAAS7C,EACT8C,SAAU,SAACtG,GACP,EAAKwE,SAAS,CAAChB,SAAUA,EAASiC,UAAW,gBAIxDjC,GACG,oBAACzB,EAAD,KACI,oBAACP,EAAD,KACI,oBAACC,EAAD,CACI8E,YAAa5C,EACb2C,SAAU,SAACtG,GAAD,OAAW,EAAKwE,SAAS,CAACb,KAAM3D,EAAOyF,UAAW,UAC5De,UAAU,KAGlB,oBAAC7E,EAAD,CACIiE,MAAOzE,EAAG,gBAAiB,kBAC3BnB,MAAO6D,EACP4C,QAASd,EACTW,SAAU,SAACtG,GACP,EAAKwE,SAAS,CAACX,aAAc7D,EAAOyF,UAAW,cAGtD5B,EAAaG,SAAS,cAElB5B,EAAQC,EAAKK,KACV,oBAACX,EAAD,KACKZ,EAAG,UAAW,kBAAd,KAAuCoD,EAAvC,IACD,oBAAC1C,EAAD,QAKJ,oBAACD,EAAD,CACIgE,MAAOzE,EAAG,wBAAyB,kBAA5B,KAAqDoD,EAArD,IACPvE,MAAO+F,EACPW,YAAajH,OAAO4C,KAAKK,GACzB4D,SAAU,SAACtG,GACP,EAAKwE,SAAS,CACVT,WAAY,EAAK4C,iBAAiB3G,GAClCyF,UAAW,cAGnBmB,eAAgB,UAnNjC,oCA8NDhE,GACV,IAAIiE,EAAUjE,EAAS,yBACnBkE,EAAUlE,EAAS,6BAA+BA,EAAS,4BAAT,WAItD,OAAIiE,IAIAC,IAIA9F,GAAUA,EAAOyC,UAAYzC,EAAOyC,SAASsD,WACtC/F,EAAOyC,SAASsD,WAGpB,YAhPI,oCAoPDnE,GACV,IAAIoE,EAAgBpE,EAAS,gCAAkCA,EAAS,+BACpEqE,EAAgBrE,EAAS,6BAA+BA,EAAS,4BAAT,SAE5D,MAA6B,iBAAzB,IAAOoE,EAAP,cAAOA,KAA8BA,EAAcE,OAAS,EACrDF,GAGPC,QAA0C,IAAlBA,GAA0D,iBAAzB,IAAOA,EAAP,cAAOA,MAChElD,WAAa,CAACkD,IAGXA,KAhQI,uCAqQEE,GAAQ,MACiBtE,KAAKJ,MAApCC,EADc,EACdA,eADc,EACEC,YAMvB,IAJsBwE,EAAOC,MAAK,SAAUC,GACxC,MAAwB,iBAAVA,IAAuB3E,EAAe2E,MAWxD,OAJiBF,EAAOnB,KAAI,SAAUqB,GAClC,MAAwB,iBAAVA,EAAqB3E,EAAe2E,GAASA,KAG7CrB,KAAI,SAACd,GAAD,OAASA,EAAIC,QApRxB,8BAuRPxB,GACJ,IAAI2D,EAAU,IAAI1D,KAGlB,OAFA0D,EAAQpD,QAAQN,KAAK2D,MAAM5D,IAC3B2D,EAAQpD,QAAQoD,EAAQ7C,UAA6C,IAAjC,IAAIb,MAAOO,oBAA2B,KACjEmD,EAAQ7C,UAAa,QA3RnB,GAUgBzC,KAVvC,CAqSGwF,OAAOzG,GAAIC","file":"block.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","(function (wp, config) {\n\n const {registerPlugin} = wp.plugins;\n const {__} = wp.i18n;\n const {PluginDocumentSettingPanel} = wp.editPost;\n const {PanelRow, DateTimePicker, CheckboxControl, SelectControl, FormTokenField, Spinner} = wp.components;\n const {Fragment, Component} = wp.element;\n const {decodeEntities} = wp.htmlEntities;\n const {isEmpty, keys, compact} = lodash;\n\n class PostExpiratorSidebar extends Component {\n constructor() {\n super(...arguments);\n\n this.state = {\n categoriesList: [],\n catIdVsName: [],\n }\n }\n\n componentWillMount() {\n const {attributes} = this.state;\n\n const postMeta = wp.data.select('core/editor').getEditedPostAttribute('meta');\n const postType = wp.data.select('core/editor').getCurrentPostType();\n const setPostMeta = (newMeta) => wp.data.dispatch('core/editor').editPost({meta: newMeta});\n\n let enabled = config.defaults.autoEnable == 1;\n let date = new Date();\n\n let expireAction = this.getExpireType(postMeta);\n\n let categories = [];\n if (expireAction.includes('category')) {\n categories = this.getCategories(postMeta);\n }\n\n if (postMeta['_expiration-date-status'] && postMeta['_expiration-date-status'] === 'saved') {\n enabled = true;\n }\n\n if (postMeta['_expiration-date']) {\n date.setTime((postMeta['_expiration-date'] + date.getTimezoneOffset() * 60) * 1000);\n } else {\n categories = config.default_categories;\n if (config.default_date) {\n date.setTime((parseInt(config.default_date) + date.getTimezoneOffset() * 60) * 1000);\n }\n }\n\n let taxonomy = config.defaults.taxonomy || 'category';\n\n this.setState({\n enabled: enabled,\n date: date,\n expireAction: expireAction,\n categories: categories,\n taxonomy: taxonomy,\n });\n\n // Force all the metadata to be saved. Required for making sure the default settings are stored correctly.\n setPostMeta({'_expiration-date-status': (enabled ? 'saved' : '')});\n setPostMeta({'_expiration-date': (date.getTime()) / 1000});\n setPostMeta({'_expiration-date-type': expireAction});\n setPostMeta({'_expiration-date-categories': categories});\n\n let categoriesList = [];\n let catIdVsName = [];\n\n if ((!taxonomy && postType === 'post') || taxonomy === 'category') {\n wp.apiFetch({\n path: wp.url.addQueryArgs('wp/v2/categories', {per_page: -1}),\n }).then((list) => {\n list.forEach(cat => {\n categoriesList[cat.name] = cat;\n catIdVsName[cat.id] = cat.name;\n });\n this.setState({categoriesList: categoriesList, catIdVsName: catIdVsName, taxonomy: __('Category')});\n });\n } else if (postType !== 'page') {\n wp.apiFetch({\n path: wp.url.addQueryArgs(`wp/v2/taxonomies/${taxonomy}`, {context: 'edit'}),\n }).then((taxAttributes) => {\n // fetch all terms\n wp.apiFetch({\n path: wp.url.addQueryArgs(`wp/v2/${taxAttributes.rest_base}`, {context: 'edit'}),\n }).then((terms) => {\n terms.forEach(term => {\n categoriesList[decodeEntities(term.name)] = term;\n catIdVsName[term.id] = decodeEntities(term.name);\n });\n this.setState({\n categoriesList: categoriesList,\n catIdVsName: catIdVsName,\n taxonomy: decodeEntities(taxAttributes.name)\n });\n });\n });\n }\n\n }\n\n componentDidUpdate() {\n const {enabled, date, expireAction, categories, attribute} = this.state;\n const setPostMeta = (newMeta) => wp.data.dispatch('core/editor').editPost({meta: newMeta});\n const postMeta = wp.data.select('core/editor').getEditedPostAttribute('meta');\n\n switch (attribute) {\n case 'enabled':\n setPostMeta({'_expiration-date-status': (enabled ? 'saved' : '')});\n // if date is not set when the checkbox is enabled, set it to the default date\n // this is to prevent the user from having to click the date to set it\n if (!postMeta['_expiration-date']) {\n setPostMeta({'_expiration-date': this.getDate(date)});\n }\n break;\n case 'date':\n if (typeof date === 'string') {\n setPostMeta({'_expiration-date': this.getDate(date)});\n }\n break;\n case 'action':\n setPostMeta({'_expiration-date-type': expireAction});\n if (!expireAction.includes('category')) {\n setPostMeta({'_expiration-date-categories': []});\n }\n break;\n case 'category':\n setPostMeta({'_expiration-date-categories': categories});\n break;\n }\n\n }\n\n render() {\n const {categoriesList, catIdVsName} = this.state;\n const {enabled, date, expireAction, categories, taxonomy} = this.state;\n\n const postType = wp.data.select('core/editor').getCurrentPostType();\n\n let actionsList = [\n {label: __('Draft', 'post-expirator'), value: 'draft'},\n {label: __('Delete', 'post-expirator'), value: 'delete'},\n {label: __('Trash', 'post-expirator'), value: 'trash'},\n {label: __('Private', 'post-expirator'), value: 'private'},\n {label: __('Stick', 'post-expirator'), value: 'stick'},\n {label: __('Unstick', 'post-expirator'), value: 'unstick'},\n ];\n\n if (postType !== 'page') {\n actionsList = _.union(actionsList, [\n {label: __('Category: Replace', 'post-expirator'), value: 'category'},\n {label: __('Category: Add', 'post-expirator'), value: 'category-add'},\n {label: __('Category: Remove', 'post-expirator'), value: 'category-remove'},\n ]);\n }\n\n let selectedCats = categories && compact(categories.map((id) => catIdVsName[id] || false));\n if (typeof selectedCats === 'string') {\n selectedCats = [];\n }\n\n return (\n <PluginDocumentSettingPanel title={__('Post Expirator', 'post-expirator')} icon=\"calendar\"\n initialOpen={enabled} className={'post-expirator-panel'}>\n <PanelRow>\n <CheckboxControl\n label={__('Enable Post Expiration', 'post-expirator')}\n checked={enabled}\n onChange={(value) => {\n this.setState({enabled: !enabled, attribute: 'enabled'})\n }}\n />\n </PanelRow>\n {enabled && (\n <Fragment>\n <PanelRow>\n <DateTimePicker\n currentDate={date}\n onChange={(value) => this.setState({date: value, attribute: 'date'})}\n is12Hour={true}\n />\n </PanelRow>\n <SelectControl\n label={__('How to expire', 'post-expirator')}\n value={expireAction}\n options={actionsList}\n onChange={(value) => {\n this.setState({expireAction: value, attribute: 'action'})\n }}\n />\n {expireAction.includes('category') &&\n (\n (isEmpty(keys(categoriesList)) && (\n <Fragment>\n {__('Loading', 'post-expirator') + ` (${taxonomy})`}\n <Spinner/>\n </Fragment>\n ))\n ||\n (\n <FormTokenField\n label={__('Expiration Categories', 'post-expirator') + ` (${taxonomy})`}\n value={selectedCats}\n suggestions={Object.keys(categoriesList)}\n onChange={(value) => {\n this.setState({\n categories: this.selectCategories(value),\n attribute: 'category'\n })\n }}\n maxSuggestions={10}\n />\n )\n )}\n </Fragment>\n )}\n </PluginDocumentSettingPanel>\n );\n }\n\n // what action to take on expiration\n getExpireType(postMeta) {\n let typeNew = postMeta['_expiration-date-type'];\n let typeOld = postMeta['_expiration-date-options'] && postMeta['_expiration-date-options']['expireType'];\n\n\n\n if (typeNew) {\n return typeNew;\n }\n\n if (typeOld) {\n return typeOld;\n }\n\n if (config && config.defaults && config.defaults.expireType) {\n return config.defaults.expireType;\n }\n\n return 'draft';\n }\n\n // what categories to add/remove/replace\n getCategories(postMeta) {\n let categoriesNew = postMeta['_expiration-date-categories'] && postMeta['_expiration-date-categories'];\n let categoriesOld = postMeta['_expiration-date-options'] && postMeta['_expiration-date-options']['category'];\n\n if (typeof categoriesNew === 'object' && categoriesNew.length > 0) {\n return categoriesNew;\n }\n\n if (categoriesOld && typeof categoriesOld !== 'undefined' && typeof categoriesOld !== 'object') {\n categories = [categoriesOld];\n }\n\n return categoriesOld;\n\n }\n\n // fired for the autocomplete\n selectCategories(tokens) {\n const {categoriesList, catIdVsName} = this.state;\n\n var hasNoSuggestion = tokens.some(function (token) {\n return typeof token === 'string' && !categoriesList[token];\n });\n\n if (hasNoSuggestion) {\n return;\n }\n\n var categories = tokens.map(function (token) {\n return typeof token === 'string' ? categoriesList[token] : token;\n })\n\n return categories.map((cat) => cat.id);\n }\n\n getDate(date) {\n let newDate = new Date();\n newDate.setTime(Date.parse(date));\n newDate.setTime(newDate.getTime() - new Date().getTimezoneOffset() * 60 * 1000);\n return ((newDate.getTime()) / 1000);\n }\n\n }\n\n registerPlugin('postexpirator-sidebar', {\n render: PostExpiratorSidebar\n });\n\n\n})(window.wp, config);\n"],"sourceRoot":""}
assets/jsx/block.jsx CHANGED
@@ -23,6 +23,7 @@
23
 
24
  const postMeta = wp.data.select('core/editor').getEditedPostAttribute('meta');
25
  const postType = wp.data.select('core/editor').getCurrentPostType();
 
26
 
27
  let enabled = config.defaults.autoEnable == 1;
28
  let date = new Date();
@@ -57,12 +58,18 @@
57
  taxonomy: taxonomy,
58
  });
59
 
 
 
 
 
 
 
60
  let categoriesList = [];
61
  let catIdVsName = [];
62
 
63
  if ((!taxonomy && postType === 'post') || taxonomy === 'category') {
64
  wp.apiFetch({
65
- path: wp.url.addQueryArgs('wp/v2/categories', {per_page: -1, hide_empty: false}),
66
  }).then((list) => {
67
  list.forEach(cat => {
68
  categoriesList[cat.name] = cat;
@@ -155,7 +162,7 @@
155
 
156
  return (
157
  <PluginDocumentSettingPanel title={__('Post Expirator', 'post-expirator')} icon="calendar"
158
- initialOpen={enabled}>
159
  <PanelRow>
160
  <CheckboxControl
161
  label={__('Enable Post Expiration', 'post-expirator')}
@@ -217,6 +224,8 @@
217
  let typeNew = postMeta['_expiration-date-type'];
218
  let typeOld = postMeta['_expiration-date-options'] && postMeta['_expiration-date-options']['expireType'];
219
 
 
 
220
  if (typeNew) {
221
  return typeNew;
222
  }
@@ -225,6 +234,10 @@
225
  return typeOld;
226
  }
227
 
 
 
 
 
228
  return 'draft';
229
  }
230
 
23
 
24
  const postMeta = wp.data.select('core/editor').getEditedPostAttribute('meta');
25
  const postType = wp.data.select('core/editor').getCurrentPostType();
26
+ const setPostMeta = (newMeta) => wp.data.dispatch('core/editor').editPost({meta: newMeta});
27
 
28
  let enabled = config.defaults.autoEnable == 1;
29
  let date = new Date();
58
  taxonomy: taxonomy,
59
  });
60
 
61
+ // Force all the metadata to be saved. Required for making sure the default settings are stored correctly.
62
+ setPostMeta({'_expiration-date-status': (enabled ? 'saved' : '')});
63
+ setPostMeta({'_expiration-date': (date.getTime()) / 1000});
64
+ setPostMeta({'_expiration-date-type': expireAction});
65
+ setPostMeta({'_expiration-date-categories': categories});
66
+
67
  let categoriesList = [];
68
  let catIdVsName = [];
69
 
70
  if ((!taxonomy && postType === 'post') || taxonomy === 'category') {
71
  wp.apiFetch({
72
+ path: wp.url.addQueryArgs('wp/v2/categories', {per_page: -1}),
73
  }).then((list) => {
74
  list.forEach(cat => {
75
  categoriesList[cat.name] = cat;
162
 
163
  return (
164
  <PluginDocumentSettingPanel title={__('Post Expirator', 'post-expirator')} icon="calendar"
165
+ initialOpen={enabled} className={'post-expirator-panel'}>
166
  <PanelRow>
167
  <CheckboxControl
168
  label={__('Enable Post Expiration', 'post-expirator')}
224
  let typeNew = postMeta['_expiration-date-type'];
225
  let typeOld = postMeta['_expiration-date-options'] && postMeta['_expiration-date-options']['expireType'];
226
 
227
+
228
+
229
  if (typeNew) {
230
  return typeNew;
231
  }
234
  return typeOld;
235
  }
236
 
237
+ if (config && config.defaults && config.defaults.expireType) {
238
+ return config.defaults.expireType;
239
+ }
240
+
241
  return 'draft';
242
  }
243
 
classes/CronFacade.class.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Utility functions.
5
+ */
6
+ class PostExpirator_CronFacade
7
+ {
8
+ /**
9
+ * @return array
10
+ */
11
+ public static function get_plugin_cron_events()
12
+ {
13
+ $cron = _get_cron_array();
14
+ $events = [];
15
+
16
+ $plugin_valid_events = self::get_valid_events();
17
+
18
+ foreach ($cron as $time => $value) {
19
+ foreach ($value as $event_key => $event_value) {
20
+ if (in_array($event_key, $plugin_valid_events)) {
21
+ if (! isset($events[$time])) {
22
+ $events[$time] = [];
23
+ }
24
+
25
+ $events[$time][$event_key] = $event_value;
26
+ }
27
+ }
28
+ }
29
+
30
+ return $events;
31
+ }
32
+
33
+ /**
34
+ * @return bool
35
+ */
36
+ public static function is_cron_enabled()
37
+ {
38
+ return ! defined('DISABLE_WP_CRON') || DISABLE_WP_CRON == false;
39
+ }
40
+
41
+ private static function get_valid_events()
42
+ {
43
+ return [
44
+ 'postExpiratorExpire',
45
+ ];
46
+ }
47
+ }
classes/Display.class.php CHANGED
@@ -3,284 +3,322 @@
3
  /**
4
  * The class that is responsible for all the displays.
5
  */
6
- class PostExpirator_Display {
7
-
8
- /**
9
- * The singleton instance.
10
- */
11
- private static $_instance = null;
12
-
13
- /**
14
- * Constructor.
15
- */
16
- private function __construct() {
17
- $this->hooks();
18
- }
19
-
20
- /**
21
- * Returns instance of the singleton.
22
- */
23
- public static function getInstance() {
24
- if ( is_null( self::$_instance ) ) {
25
- self::$_instance = new self();
26
- }
27
-
28
- return self::$_instance;
29
- }
30
-
31
- /**
32
- * Initialize the hooks.
33
- */
34
- private function hooks() {
35
- add_action( 'admin_menu', array( $this, 'add_menu' ) );
36
- }
37
-
38
- /**
39
- * Add plugin page menu.
40
- */
41
- function add_menu() {
42
- add_submenu_page( 'options-general.php', __( 'Post Expirator Options', 'post-expirator' ), __( 'Post Expirator', 'post-expirator' ), 'manage_options', POSTEXPIRATOR_BASENAME, array(
43
- self::$_instance,
44
- 'settings_tabs'
45
- ) );
46
- }
47
-
48
- /**
49
- * Loads the specified tab.
50
- */
51
- public function load_tab( $tab ) {
52
- switch ( $tab ) {
53
- case 'general':
54
- $this->menu_general();
55
- break;
56
- case 'defaults':
57
- $this->menu_defaults();
58
- break;
59
- case 'diagnostics':
60
- $this->menu_diagnostics();
61
- break;
62
- case 'viewdebug':
63
- $this->menu_viewdebug();
64
- break;
65
- }
66
- }
67
-
68
- /**
69
- * Creates the settings page.
70
- */
71
- public function settings_tabs() {
72
- PostExpirator_Facade::load_assets( 'settings' );
73
-
74
- $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : '';
75
- if ( empty( $tab ) ) {
76
- $tab = 'general';
77
- }
78
-
79
- $tab_index = 0;
80
-
81
- ob_start();
82
-
83
- switch ( $tab ) {
84
- case 'general':
85
- $tab_index = 0;
86
- $this->load_tab( 'general' );
87
- break;
88
- case 'defaults':
89
- $this->load_tab( 'defaults' );
90
- $tab_index = 1;
91
- break;
92
- case 'diagnostics':
93
- $this->load_tab( 'diagnostics' );
94
- $tab_index = 2;
95
- break;
96
- case 'viewdebug':
97
- $this->load_tab( 'viewdebug' );
98
- $tab_index = 3;
99
- break;
100
- }
101
-
102
- $html = ob_get_clean();
103
-
104
- $debug = postexpirator_debug(); // check for/load debug
105
-
106
- $tabs = array( 'general', 'defaults', 'diagnostics' );
107
- if ( POSTEXPIRATOR_DEBUG ) {
108
- $tabs[] = 'viewdebug';
109
- }
110
-
111
- $this->render_template( 'tabs', array(
112
- 'tabs' => $tabs,
113
- 'tab_index' => $tab_index,
114
- 'html' => $html,
115
- 'tab' => $tab
116
- ) );
117
-
118
- }
119
-
120
- /**
121
- * Diagnostics menu.
122
- */
123
- private function menu_diagnostics() {
124
- if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) {
125
- if ( ! isset( $_POST['_postExpiratorMenuDiagnostics_nonce'] ) || ! wp_verify_nonce( $_POST['_postExpiratorMenuDiagnostics_nonce'], 'postexpirator_menu_diagnostics' ) ) {
126
- print 'Form Validation Failure: Sorry, your nonce did not verify.';
127
- exit;
128
- }
129
- if ( isset( $_POST['debugging-disable'] ) ) {
130
- update_option( 'expirationdateDebug', 0 );
131
- echo "<div id='message' class='updated fade'><p>";
132
- _e( 'Debugging Disabled', 'post-expirator' );
133
- echo '</p></div>';
134
- } elseif ( isset( $_POST['debugging-enable'] ) ) {
135
- update_option( 'expirationdateDebug', 1 );
136
- echo "<div id='message' class='updated fade'><p>";
137
- _e( 'Debugging Enabled', 'post-expirator' );
138
- echo '</p></div>';
139
- } elseif ( isset( $_POST['purge-debug'] ) ) {
140
- require_once( plugin_dir_path( __FILE__ ) . 'post-expirator-debug.php' );
141
- $debug = new PostExpiratorDebug();
142
- $debug->purge();
143
- echo "<div id='message' class='updated fade'><p>";
144
- _e( 'Debugging Table Emptied', 'post-expirator' );
145
- echo '</p></div>';
146
- }
147
- }
148
-
149
- $debug = postexpirator_debug();
150
-
151
- $this->render_template( 'menu-diagnostics' );
152
- }
153
-
154
- /**
155
- * Debug menu.
156
- */
157
- private function menu_viewdebug() {
158
- require_once POSTEXPIRATOR_BASEDIR . '/post-expirator-debug.php';
159
- print '<p>' . __( 'Below is a dump of the debugging table, this should be useful for troubleshooting.', 'post-expirator' ) . '</p>';
160
- $debug = new PostExpiratorDebug();
161
- $debug->getTable();
162
- }
163
-
164
- /**
165
- * The default menu.
166
- */
167
- private function menu_defaults() {
168
- $debug = postexpirator_debug();
169
- $types = postexpirator_get_post_types();
170
- $defaults = array();
171
-
172
- if ( isset( $_POST['expirationdateSaveDefaults'] ) ) {
173
- if ( ! isset( $_POST['_postExpiratorMenuDefaults_nonce'] ) || ! wp_verify_nonce( $_POST['_postExpiratorMenuDefaults_nonce'], 'postexpirator_menu_defaults' ) ) {
174
- print 'Form Validation Failure: Sorry, your nonce did not verify.';
175
- exit;
176
- } else {
177
- // Filter Content
178
- $_POST = filter_input_array( INPUT_POST, FILTER_SANITIZE_STRING );
179
-
180
- foreach ( $types as $type ) {
181
- if ( isset( $_POST[ 'expirationdate_expiretype-' . $type ] ) ) {
182
- $defaults[ $type ]['expireType'] = $_POST[ 'expirationdate_expiretype-' . $type ];
183
- }
184
- if ( isset( $_POST[ 'expirationdate_autoenable-' . $type ] ) ) {
185
- $defaults[ $type ]['autoEnable'] = intval( $_POST[ 'expirationdate_autoenable-' . $type ] );
186
- }
187
- if ( isset( $_POST[ 'expirationdate_taxonomy-' . $type ] ) ) {
188
- $defaults[ $type ]['taxonomy'] = $_POST[ 'expirationdate_taxonomy-' . $type ];
189
- }
190
- if ( isset( $_POST[ 'expirationdate_activemeta-' . $type ] ) ) {
191
- $defaults[ $type ]['activeMetaBox'] = $_POST[ 'expirationdate_activemeta-' . $type ];
192
- }
193
- $defaults[ $type ]['emailnotification'] = trim( $_POST[ 'expirationdate_emailnotification-' . $type ] );
194
-
195
- if ( isset( $_POST[ 'expired-default-date-' . $type ] ) ) {
196
- $defaults[ $type ]['default-expire-type'] = $_POST[ 'expired-default-date-' . $type ];
197
- }
198
- if ( isset( $_POST[ 'expired-custom-date-' . $type ] ) ) {
199
- $defaults[ $type ]['default-custom-date'] = $_POST[ 'expired-custom-date-' . $type ];
200
- }
201
-
202
- // Save Settings
203
- update_option( 'expirationdateDefaults' . ucfirst( $type ), $defaults[ $type ] );
204
- }
205
- echo "<div id='message' class='updated fade'><p>";
206
- _e( 'Saved Options!', 'post-expirator' );
207
- echo '</p></div>';
208
- }
209
- }
210
-
211
- $this->render_template( 'menu-defaults', array( 'types' => $types, 'defaults' => $defaults ) );
212
- }
213
-
214
- /**
215
- * Show the Expiration Date options page
216
- */
217
- private function menu_general() {
218
- if ( isset( $_POST['expirationdateSave'] ) && $_POST['expirationdateSave'] ) {
219
- if ( ! isset( $_POST['_postExpiratorMenuGeneral_nonce'] ) || ! wp_verify_nonce( $_POST['_postExpiratorMenuGeneral_nonce'], 'postexpirator_menu_general' ) ) {
220
- print 'Form Validation Failure: Sorry, your nonce did not verify.';
221
- exit;
222
- } else {
223
- // Filter Content
224
- $_POST = filter_input_array( INPUT_POST, FILTER_SANITIZE_STRING );
225
-
226
- update_option( 'expirationdateDefaultDateFormat', $_POST['expired-default-date-format'] );
227
- update_option( 'expirationdateDefaultTimeFormat', $_POST['expired-default-time-format'] );
228
- update_option( 'expirationdateDisplayFooter', $_POST['expired-display-footer'] );
229
- update_option( 'expirationdateEmailNotification', $_POST['expired-email-notification'] );
230
- update_option( 'expirationdateEmailNotificationAdmins', $_POST['expired-email-notification-admins'] );
231
- update_option( 'expirationdateEmailNotificationList', trim( $_POST['expired-email-notification-list'] ) );
232
- update_option( 'expirationdateFooterContents', $_POST['expired-footer-contents'] );
233
- update_option( 'expirationdateFooterStyle', $_POST['expired-footer-style'] );
234
- update_option( 'expirationdateGutenbergSupport', $_POST['gutenberg-support'] );
235
- update_option( 'expirationdateCategoryDefaults', isset( $_POST['expirationdate_category'] ) ? $_POST['expirationdate_category'] : array() );
236
- update_option( 'expirationdateDefaultDate', $_POST['expired-default-expiration-date'] );
237
- if ( $_POST['expired-custom-expiration-date'] ) {
238
- update_option( 'expirationdateDefaultDateCustom', $_POST['expired-custom-expiration-date'] );
239
- }
240
-
241
- if ( ! isset( $_POST['allow-user-roles'] ) || ! is_array( $_POST['allow-user-roles'] ) ) {
242
- $_POST['allow-user-roles'] = array();
243
- }
244
-
245
- $user_roles = wp_roles()->get_names();
246
-
247
- foreach ( $user_roles as $role_name => $role_label ) {
248
- $role = get_role( $role_name );
249
-
250
- if ( ! is_a( $role, WP_Role::class ) ) {
251
- continue;
252
- }
253
-
254
- if ( $role_name === 'administrator' || in_array( $role_name, $_POST['allow-user-roles'], true ) ) {
255
- $role->add_cap( PostExpirator_Facade::DEFAULT_CAPABILITY_EXPIRE_POST );
256
- } else {
257
- $role->remove_cap( PostExpirator_Facade::DEFAULT_CAPABILITY_EXPIRE_POST );
258
- }
259
- }
260
-
261
- echo "<div id='message' class='updated fade'><p>";
262
- _e( 'Saved Options!', 'post-expirator' );
263
- echo '</p></div>';
264
- }
265
- }
266
-
267
- $this->render_template( 'menu-general' );
268
- }
269
-
270
- /**
271
- * Renders a named template, if it is found.
272
- */
273
- public function render_template( $name, $params = null ) {
274
- $template = POSTEXPIRATOR_BASEDIR . "/views/{$name}.php";
275
- if ( file_exists( $template ) ) {
276
- // expand all parameters so that they can be directly accessed with their name.
277
- if ( $params ) {
278
- foreach ( $params as $param => $value ) {
279
- $$param = $value;
280
- }
281
- }
282
- include $template;
283
- }
284
- }
285
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
286
  }
3
  /**
4
  * The class that is responsible for all the displays.
5
  */
6
+ class PostExpirator_Display
7
+ {
8
+
9
+ /**
10
+ * The singleton instance.
11
+ */
12
+ private static $instance = null;
13
+
14
+ /**
15
+ * Constructor.
16
+ */
17
+ private function __construct()
18
+ {
19
+ $this->hooks();
20
+ }
21
+
22
+ /**
23
+ * Initialize the hooks.
24
+ */
25
+ private function hooks()
26
+ {
27
+ add_action('admin_menu', array($this, 'add_menu'));
28
+ }
29
+
30
+ /**
31
+ * Returns instance of the singleton.
32
+ */
33
+ public static function getInstance()
34
+ {
35
+ if (is_null(self::$instance)) {
36
+ self::$instance = new self();
37
+ }
38
+
39
+ return self::$instance;
40
+ }
41
+
42
+ /**
43
+ * Add plugin page menu.
44
+ */
45
+ public function add_menu()
46
+ {
47
+ add_submenu_page(
48
+ 'options-general.php',
49
+ __('Post Expirator Options', 'post-expirator'),
50
+ __('Post Expirator', 'post-expirator'),
51
+ 'manage_options',
52
+ POSTEXPIRATOR_BASENAME,
53
+ array(
54
+ self::$instance,
55
+ 'settings_tabs'
56
+ )
57
+ );
58
+ }
59
+
60
+ /**
61
+ * Creates the settings page.
62
+ */
63
+ public function settings_tabs()
64
+ {
65
+ PostExpirator_Facade::load_assets('settings');
66
+
67
+ $tab = isset($_GET['tab']) ? $_GET['tab'] : '';
68
+ if (empty($tab)) {
69
+ $tab = 'general';
70
+ }
71
+
72
+ $tab_index = 0;
73
+
74
+ ob_start();
75
+
76
+ switch ($tab) {
77
+ case 'general':
78
+ $tab_index = 0;
79
+ $this->load_tab('general');
80
+ break;
81
+ case 'defaults':
82
+ $this->load_tab('defaults');
83
+ $tab_index = 1;
84
+ break;
85
+ case 'diagnostics':
86
+ $this->load_tab('diagnostics');
87
+ $tab_index = 2;
88
+ break;
89
+ case 'viewdebug':
90
+ $this->load_tab('viewdebug');
91
+ $tab_index = 3;
92
+ break;
93
+ }
94
+
95
+ $html = ob_get_clean();
96
+
97
+ $debug = postexpirator_debug(); // check for/load debug
98
+
99
+ $tabs = array('general', 'defaults', 'diagnostics');
100
+ if (POSTEXPIRATOR_DEBUG) {
101
+ $tabs[] = 'viewdebug';
102
+ }
103
+
104
+ $this->render_template('tabs', array(
105
+ 'tabs' => $tabs,
106
+ 'tab_index' => $tab_index,
107
+ 'html' => $html,
108
+ 'tab' => $tab
109
+ ));
110
+ }
111
+
112
+ /**
113
+ * Loads the specified tab.
114
+ */
115
+ public function load_tab($tab)
116
+ {
117
+ switch ($tab) {
118
+ case 'general':
119
+ $this->menu_general();
120
+ break;
121
+ case 'defaults':
122
+ $this->menu_defaults();
123
+ break;
124
+ case 'diagnostics':
125
+ $this->menu_diagnostics();
126
+ break;
127
+ case 'viewdebug':
128
+ $this->menu_viewdebug();
129
+ break;
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Show the Expiration Date options page
135
+ */
136
+ private function menu_general()
137
+ {
138
+ if (isset($_POST['expirationdateSave']) && $_POST['expirationdateSave']) {
139
+ if (
140
+ ! isset($_POST['_postExpiratorMenuGeneral_nonce']) || ! wp_verify_nonce(
141
+ $_POST['_postExpiratorMenuGeneral_nonce'],
142
+ 'postexpirator_menu_general'
143
+ )
144
+ ) {
145
+ print 'Form Validation Failure: Sorry, your nonce did not verify.';
146
+ exit;
147
+ } else {
148
+ // Filter Content
149
+ $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
150
+
151
+ update_option('expirationdateDefaultDateFormat', $_POST['expired-default-date-format']);
152
+ update_option('expirationdateDefaultTimeFormat', $_POST['expired-default-time-format']);
153
+ update_option('expirationdateDisplayFooter', $_POST['expired-display-footer']);
154
+ update_option('expirationdateEmailNotification', $_POST['expired-email-notification']);
155
+ update_option('expirationdateEmailNotificationAdmins', $_POST['expired-email-notification-admins']);
156
+ update_option('expirationdateEmailNotificationList', trim($_POST['expired-email-notification-list']));
157
+ update_option('expirationdateFooterContents', $_POST['expired-footer-contents']);
158
+ update_option('expirationdateFooterStyle', $_POST['expired-footer-style']);
159
+ update_option('expirationdateGutenbergSupport', $_POST['gutenberg-support']);
160
+ update_option(
161
+ 'expirationdateCategoryDefaults',
162
+ isset($_POST['expirationdate_category']) ? $_POST['expirationdate_category'] : array()
163
+ );
164
+ update_option('expirationdateDefaultDate', $_POST['expired-default-expiration-date']);
165
+ if ($_POST['expired-custom-expiration-date']) {
166
+ update_option('expirationdateDefaultDateCustom', $_POST['expired-custom-expiration-date']);
167
+ }
168
+
169
+ if (! isset($_POST['allow-user-roles']) || ! is_array($_POST['allow-user-roles'])) {
170
+ $_POST['allow-user-roles'] = array();
171
+ }
172
+
173
+ $user_roles = wp_roles()->get_names();
174
+
175
+ foreach ($user_roles as $role_name => $role_label) {
176
+ $role = get_role($role_name);
177
+
178
+ if (! is_a($role, WP_Role::class)) {
179
+ continue;
180
+ }
181
+
182
+ if ($role_name === 'administrator' || in_array($role_name, $_POST['allow-user-roles'], true)) {
183
+ $role->add_cap(PostExpirator_Facade::DEFAULT_CAPABILITY_EXPIRE_POST);
184
+ } else {
185
+ $role->remove_cap(PostExpirator_Facade::DEFAULT_CAPABILITY_EXPIRE_POST);
186
+ }
187
+ }
188
+
189
+ echo "<div id='message' class='updated fade'><p>";
190
+ _e('Saved Options!', 'post-expirator');
191
+ echo '</p></div>';
192
+ }
193
+ }
194
+
195
+ $this->render_template('menu-general');
196
+ }
197
+
198
+ /**
199
+ * Renders a named template, if it is found.
200
+ */
201
+ public function render_template($name, $params = null)
202
+ {
203
+ $template = POSTEXPIRATOR_BASEDIR . "/views/{$name}.php";
204
+ if (file_exists($template)) {
205
+ // expand all parameters so that they can be directly accessed with their name.
206
+ if ($params) {
207
+ foreach ($params as $param => $value) {
208
+ $$param = $value;
209
+ }
210
+ }
211
+ include $template;
212
+ }
213
+ }
214
+
215
+ /**
216
+ * The default menu.
217
+ */
218
+ private function menu_defaults()
219
+ {
220
+ $debug = postexpirator_debug();
221
+ $types = postexpirator_get_post_types();
222
+ $defaults = array();
223
+
224
+ if (isset($_POST['expirationdateSaveDefaults'])) {
225
+ if (
226
+ ! isset($_POST['_postExpiratorMenuDefaults_nonce']) || ! wp_verify_nonce(
227
+ $_POST['_postExpiratorMenuDefaults_nonce'],
228
+ 'postexpirator_menu_defaults'
229
+ )
230
+ ) {
231
+ print 'Form Validation Failure: Sorry, your nonce did not verify.';
232
+ exit;
233
+ } else {
234
+ // Filter Content
235
+ $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
236
+
237
+ foreach ($types as $type) {
238
+ if (isset($_POST['expirationdate_expiretype-' . $type])) {
239
+ $defaults[$type]['expireType'] = $_POST['expirationdate_expiretype-' . $type];
240
+ }
241
+ if (isset($_POST['expirationdate_autoenable-' . $type])) {
242
+ $defaults[$type]['autoEnable'] = intval($_POST['expirationdate_autoenable-' . $type]);
243
+ }
244
+ if (isset($_POST['expirationdate_taxonomy-' . $type])) {
245
+ $defaults[$type]['taxonomy'] = $_POST['expirationdate_taxonomy-' . $type];
246
+ }
247
+ if (isset($_POST['expirationdate_activemeta-' . $type])) {
248
+ $defaults[$type]['activeMetaBox'] = $_POST['expirationdate_activemeta-' . $type];
249
+ }
250
+ $defaults[$type]['emailnotification'] = trim($_POST['expirationdate_emailnotification-' . $type]);
251
+
252
+ if (isset($_POST['expired-default-date-' . $type])) {
253
+ $defaults[$type]['default-expire-type'] = $_POST['expired-default-date-' . $type];
254
+ }
255
+ if (isset($_POST['expired-custom-date-' . $type])) {
256
+ $defaults[$type]['default-custom-date'] = $_POST['expired-custom-date-' . $type];
257
+ }
258
+
259
+ // Save Settings
260
+ update_option('expirationdateDefaults' . ucfirst($type), $defaults[$type]);
261
+ }
262
+ echo "<div id='message' class='updated fade'><p>";
263
+ _e('Saved Options!', 'post-expirator');
264
+ echo '</p></div>';
265
+ }
266
+ }
267
+
268
+ $this->render_template('menu-defaults', array('types' => $types, 'defaults' => $defaults));
269
+ }
270
+
271
+ /**
272
+ * Diagnostics menu.
273
+ */
274
+ private function menu_diagnostics()
275
+ {
276
+ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
277
+ if (
278
+ ! isset($_POST['_postExpiratorMenuDiagnostics_nonce']) || ! wp_verify_nonce(
279
+ $_POST['_postExpiratorMenuDiagnostics_nonce'],
280
+ 'postexpirator_menu_diagnostics'
281
+ )
282
+ ) {
283
+ print 'Form Validation Failure: Sorry, your nonce did not verify.';
284
+ exit;
285
+ }
286
+ if (isset($_POST['debugging-disable'])) {
287
+ update_option('expirationdateDebug', 0);
288
+ echo "<div id='message' class='updated fade'><p>";
289
+ _e('Debugging Disabled', 'post-expirator');
290
+ echo '</p></div>';
291
+ } elseif (isset($_POST['debugging-enable'])) {
292
+ update_option('expirationdateDebug', 1);
293
+ echo "<div id='message' class='updated fade'><p>";
294
+ _e('Debugging Enabled', 'post-expirator');
295
+ echo '</p></div>';
296
+ } elseif (isset($_POST['purge-debug'])) {
297
+ require_once(plugin_dir_path(__FILE__) . 'post-expirator-debug.php');
298
+ $debug = new PostExpiratorDebug();
299
+ $debug->purge();
300
+ echo "<div id='message' class='updated fade'><p>";
301
+ _e('Debugging Table Emptied', 'post-expirator');
302
+ echo '</p></div>';
303
+ }
304
+ }
305
+
306
+ $debug = postexpirator_debug();
307
+
308
+ $this->render_template('menu-diagnostics');
309
+ }
310
+
311
+ /**
312
+ * Debug menu.
313
+ */
314
+ private function menu_viewdebug()
315
+ {
316
+ require_once POSTEXPIRATOR_BASEDIR . '/post-expirator-debug.php';
317
+ print '<p>' . __(
318
+ 'Below is a dump of the debugging table, this should be useful for troubleshooting.',
319
+ 'post-expirator'
320
+ ) . '</p>';
321
+ $debug = new PostExpiratorDebug();
322
+ $debug->getTable();
323
+ }
324
  }
classes/Facade.class.php CHANGED
@@ -5,449 +5,490 @@
5
  *
6
  * Eventually, everything should move here.
7
  */
8
- class PostExpirator_Facade {
9
-
10
- /**
11
- * The singleton instance.
12
- */
13
- private static $_instance = null;
14
-
15
- const DEFAULT_CAPABILITY_EXPIRE_POST = 'publishpress_future_expire_post';
16
-
17
- /**
18
- * List of capabilities used by the plugin.
19
- *
20
- * @var string[]
21
- */
22
- private $capabilities = array(
23
- 'expire_post' => self::DEFAULT_CAPABILITY_EXPIRE_POST,
24
- );
25
-
26
- /**
27
- * Constructor.
28
- */
29
- private function __construct() {
30
- PostExpirator_Display::getInstance();
31
- $this->hooks();
32
-
33
- if ( ! $this->user_role_can_expire_posts( 'administrator' ) ) {
34
- $this->set_default_capabilities();
35
- }
36
- }
37
-
38
- /**
39
- * Returns instance of the singleton.
40
- */
41
- public static function getInstance() {
42
- if ( is_null( self::$_instance ) ) {
43
- self::$_instance = new self();
44
- }
45
-
46
- return self::$_instance;
47
- }
48
-
49
- /**
50
- * Initialize the hooks.
51
- */
52
- private function hooks() {
53
- add_action( 'init', array( $this, 'register_post_meta' ), 11 );
54
- add_action( 'enqueue_block_editor_assets', array( $this, 'block_editor_assets' ) );
55
- add_action( 'updated_postmeta', array( $this, 'updatedmeta' ), 10, 4 );
56
- add_filter( 'cme_plugin_capabilities', [ $this, 'filter_cme_capabilities' ], 20 );
57
- }
58
-
59
- /**
60
- * Loads the assets for the particular page.
61
- */
62
- public static function load_assets( $for ) {
63
- switch ( $for ) {
64
- case 'settings':
65
- wp_enqueue_script(
66
- 'pe-settings', POSTEXPIRATOR_BASEURL . '/assets/js/settings.js', array(
67
- 'jquery',
68
- 'jquery-ui-tabs',
69
- ), POSTEXPIRATOR_VERSION, false
70
- );
71
- wp_localize_script( 'pe-settings', 'config', array() );
72
- wp_enqueue_style( 'pe-settings', POSTEXPIRATOR_BASEURL . '/assets/css/settings.css', array(), POSTEXPIRATOR_VERSION, false );
73
- wp_enqueue_style( 'pe-jquery-ui', POSTEXPIRATOR_BASEURL . '/assets/css/lib/jquery-ui/jquery-ui.min.css', array( 'pe-settings' ), POSTEXPIRATOR_VERSION );
74
- break;
75
- }
76
- }
77
-
78
-
79
- /**
80
- * Fires when the post meta is updated (in the gutenberg block).
81
- */
82
- function updatedmeta( $meta_id, $post_id, $meta_key, $meta_value ) {
83
- // allow only through gutenberg
84
- if ( ! PostExpirator_Util::is_gutenberg_active() ) {
85
- return;
86
- }
87
-
88
- // not through bulk edit.
89
- if ( isset( $_POST['post_ids'] ) ) {
90
- return;
91
- }
92
-
93
- // not through quick edit.
94
- if ( isset( $_POST['expirationdate_quickedit'] ) ) {
95
- return;
96
- }
97
-
98
- $unschedule = $schedule = false;
99
- switch ( $meta_key ) {
100
- case '_expiration-date-status':
101
- $unschedule = empty( $meta_value );
102
- break;
103
- case '_expiration-date':
104
- $schedule = true;
105
- break;
106
- }
107
-
108
- remove_action( 'updated_postmeta', array( $this, 'updatedmeta' ), 10, 4 );
109
- if ( $unschedule ) {
110
- // @TODO the below delete_post_meta do not seem to work
111
- delete_post_meta( $post_id, '_expiration-date' );
112
- delete_post_meta( $post_id, '_expiration-date-options' );
113
- delete_post_meta( $post_id, '_expiration-date-type' );
114
- delete_post_meta( $post_id, '_expiration-date-categories' );
115
- delete_post_meta( $post_id, '_expiration-date-taxonomy' );
116
-
117
- $this->unschedule_event( $post_id );
118
- }
119
-
120
- if ( $schedule ) {
121
- $opts = self::get_expire_principles( $post_id );
122
- $ts = $meta_value;
123
- $this->schedule_event( $post_id, $ts, $opts );
124
- }
125
- }
126
-
127
- /**
128
- * Calculates the default expiry date as set in the options.
129
- */
130
- public static function get_default_expiry( $post_type ) {
131
- $defaultmonth = date_i18n( 'm' );
132
- $defaultday = date_i18n( 'd' );
133
- $defaulthour = date_i18n( 'H' );
134
- $defaultyear = date_i18n( 'Y' );
135
- $defaultminute = date_i18n( 'i' );
136
- $ts = time();
137
-
138
- $default_date_expiry = $custom_date = '';
139
- $general_date_expiry = $general_custom_date = '';
140
-
141
- // get the values from the general settings
142
- $general_date_expiry = get_option( 'expirationdateDefaultDate', POSTEXPIRATOR_EXPIREDEFAULT );
143
- if ( 'custom' === $general_date_expiry ) {
144
- $custom = get_option( 'expirationdateDefaultDateCustom' );
145
- if ( $custom !== false ) {
146
- $general_custom_date = $custom;
147
- }
148
- }
149
-
150
- // get the values from the post_type
151
- $defaults = get_option( 'expirationdateDefaults' . ucfirst( $post_type ) );
152
-
153
- if ( isset( $defaults['default-expire-type'] ) ) {
154
- $default_date_expiry = $defaults['default-expire-type'];
155
- switch ( $default_date_expiry ) {
156
- case 'custom':
157
- $custom_date = $defaults['default-custom-date'];
158
- break;
159
- case 'inherit':
160
- $custom_date = $general_custom_date;
161
- $default_date_expiry = $general_date_expiry;
162
- break;
163
- }
164
- } else {
165
- $default_date_expiry = $general_date_expiry;
166
- $custom_date = $general_custom_date;
167
- }
168
-
169
- if ( 'custom' === $default_date_expiry ) {
170
- $custom = get_option( 'expirationdateDefaultDateCustom' );
171
- if ( ! empty( $custom_date ) ) {
172
- $tz = get_option( 'timezone_string' );
173
- if ( $tz ) {
174
- // @TODO Using date_default_timezone_set() and similar isn't allowed, instead use WP internal timezone support.
175
- // phpcs:ignore WordPress.DateTime.RestrictedFunctions.timezone_change_date_default_timezone_set
176
- date_default_timezone_set( $tz );
177
- }
178
-
179
- // strip the quotes in case the user provides them.
180
- $custom_date = str_replace( '"', '', html_entity_decode( $custom_date, ENT_QUOTES ) );
181
-
182
- $ts = time() + ( strtotime( $custom_date ) - time() );
183
- if ( $tz ) {
184
- // @TODO Using date_default_timezone_set() and similar isn't allowed, instead use WP internal timezone support.
185
- // phpcs:ignore WordPress.DateTime.RestrictedFunctions.timezone_change_date_default_timezone_set
186
- date_default_timezone_set( 'UTC' );
187
- }
188
- }
189
- $defaultmonth = get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $ts ), 'm' );
190
- $defaultday = get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $ts ), 'd' );
191
- $defaultyear = get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $ts ), 'Y' );
192
- $defaulthour = get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $ts ), 'H' );
193
- $defaultminute = get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $ts ), 'i' );
194
- }
195
-
196
- return array(
197
- 'month' => $defaultmonth,
198
- 'day' => $defaultday,
199
- 'year' => $defaultyear,
200
- 'hour' => $defaulthour,
201
- 'minute' => $defaultminute,
202
- 'ts' => $ts,
203
- );
204
- }
205
-
206
- /**
207
- * Set the expire type, categories etc. corresponding to the new (gutenberg) structure.
208
- */
209
- public static function set_expire_principles( $id, $opts ) {
210
- update_post_meta( $id, '_expiration-date-options', $opts );
211
- update_post_meta( $id, '_expiration-date-type', $opts['expireType'] );
212
- update_post_meta( $id, '_expiration-date-categories', isset( $opts['category'] ) ? $opts['category'] : array() );
213
- update_post_meta( $id, '_expiration-date-taxonomy', isset( $opts['categoryTaxonomy'] ) ? $opts['categoryTaxonomy'] : '' );
214
- }
215
-
216
- /**
217
- * Get the expire type, categories etc.
218
- *
219
- * Keeps in mind the old (classic editor) and new (gutenberg) structure.
220
- */
221
- public static function get_expire_principles( $id ) {
222
- $expireType = $categories = $taxonomyName = '';
223
-
224
- $expireTypeNew = get_post_meta( $id, '_expiration-date-type', true );
225
- if ( ! empty( $expireTypeNew ) ) {
226
- $expireType = $expireTypeNew;
227
- }
228
-
229
- $categoriesNew = get_post_meta( $id, '_expiration-date-categories', true );
230
- if ( ! empty( $categoriesNew ) ) {
231
- $categories = $categoriesNew;
232
- }
233
-
234
- $taxonomyNameNew = get_post_meta( $id, '_expiration-date-taxonomy', true );
235
- if ( ! empty( $taxonomyNameNew ) ) {
236
- $taxonomyName = $taxonomyNameNew;
237
- }
238
-
239
- // _expiration-date-options is deprecated when using block editor
240
- $opts = get_post_meta( $id, '_expiration-date-options', true );
241
- if ( empty( $expireType ) && isset( $opts['expireType'] ) ) {
242
- $expireType = $opts['expireType'];
243
- }
244
- if ( empty( $categories ) ) {
245
- $categories = isset( $opts['category'] ) ? $opts['category'] : false;
246
- }
247
-
248
- if ( empty( $taxonomyName ) ) {
249
- $taxonomyName = isset( $opts['categoryTaxonomy'] ) ? $opts['categoryTaxonomy'] : '';
250
- }
251
-
252
- return array(
253
- 'expireType' => $expireType,
254
- 'category' => $categories,
255
- 'categoryTaxonomy' => $taxonomyName,
256
- );
257
- }
258
-
259
-
260
- /**
261
- * Register the post meta to use in the block.
262
- */
263
- function register_post_meta() {
264
- $post_types = get_post_types( array( 'public' => true ) );
265
- foreach ( $post_types as $post_type ) {
266
-
267
- // this is important for CPTs to show the postMeta.
268
- add_post_type_support( $post_type, array( 'custom-fields' ) );
269
-
270
- register_post_meta(
271
- $post_type, '_expiration-date-status', array(
272
- 'single' => true,
273
- 'type' => 'string',
274
- 'auth_callback' => function () {
275
- return current_user_can( 'edit_posts' );
276
- },
277
- 'show_in_rest' => true,
278
- )
279
- );
280
- register_post_meta(
281
- $post_type, '_expiration-date', array(
282
- 'single' => true,
283
- 'type' => 'number',
284
- 'auth_callback' => function () {
285
- return current_user_can( 'edit_posts' );
286
- },
287
- 'show_in_rest' => true,
288
- )
289
- );
290
- register_post_meta(
291
- $post_type, '_expiration-date-type', array(
292
- 'single' => true,
293
- 'type' => 'string',
294
- 'auth_callback' => function () {
295
- return current_user_can( 'edit_posts' );
296
- },
297
- 'show_in_rest' => true,
298
- )
299
- );
300
- register_post_meta(
301
- $post_type, '_expiration-date-categories', array(
302
- 'single' => true,
303
- 'type' => 'array',
304
- 'auth_callback' => function () {
305
- return current_user_can( 'edit_posts' );
306
- },
307
- 'show_in_rest' => array(
308
- 'schema' => array(
309
- 'type' => 'array',
310
- 'items' => array(
311
- 'type' => 'number',
312
- ),
313
- ),
314
- ),
315
- )
316
- );
317
-
318
- // this is the old complex field that we are now deprecating
319
- // as it cannot be used easily in the block editor
320
- register_post_meta(
321
- $post_type, '_expiration-date-options', array(
322
- 'single' => true,
323
- 'type' => 'object',
324
- 'auth_callback' => function () {
325
- return current_user_can( 'edit_posts' );
326
- },
327
- 'show_in_rest' => array(
328
- 'schema' => array(
329
- 'type' => 'object',
330
- 'additionalProperties' => true,
331
- ),
332
- ),
333
- )
334
- );
335
-
336
- }
337
- }
338
-
339
- /**
340
- * Load the block's backend assets only if the meta box is active for this post type.
341
- */
342
- function block_editor_assets() {
343
- global $post;
344
-
345
- if ( ! $post || ! self::show_gutenberg_metabox() ) {
346
- return;
347
- }
348
-
349
- $defaults = get_option( 'expirationdateDefaults' . ucfirst( $post->post_type ) );
350
- // if settings are not configured, show the metabox by default only for posts and pages
351
- if ( ( ! isset( $defaults['activeMetaBox'] ) && in_array(
352
- $post->post_type, array(
353
- 'post',
354
- 'page',
355
- ), true
356
- ) ) || $defaults['activeMetaBox'] === 'active' ) {
357
- wp_enqueue_script(
358
- 'postexpirator-block',
359
- POSTEXPIRATOR_BASEURL . 'assets/js/block.js',
360
- array( 'wp-edit-post' ),
361
- POSTEXPIRATOR_VERSION,
362
- true
363
- );
364
-
365
- $default_expiry = PostExpirator_Facade::get_default_expiry( $post->post_type );
366
- wp_localize_script(
367
- 'postexpirator-block', 'config', array(
368
- 'defaults' => $defaults,
369
- 'default_date' => $default_expiry['ts'],
370
- 'default_categories' => get_option( 'expirationdateCategoryDefaults' ),
371
- )
372
- );
373
-
374
- }
375
- }
376
-
377
- /**
378
- * Is the (default) Gutenberg-style box enabled in options?
379
- */
380
- public static function show_gutenberg_metabox() {
381
- $gutenberg = get_option( 'expirationdateGutenbergSupport', 1 );
382
-
383
- $facade = PostExpirator_Facade::getInstance();
384
-
385
- return intval( $gutenberg ) === 1 && $facade->current_user_can_expire_posts();
386
- }
387
-
388
- /**
389
- * Wrapper for unscheduling event.
390
- */
391
- private function unschedule_event( $post_id ) {
392
- postexpirator_unschedule_event( $post_id );
393
- }
394
-
395
- /**
396
- * Wrapper for scheduling event.
397
- */
398
- private function schedule_event( $post_id, $ts, $opts ) {
399
- postexpirator_schedule_event( $post_id, $ts, $opts );
400
- }
401
-
402
- /**
403
- * Return true if the specific user role can expire posts.
404
- *
405
- * @return bool
406
- */
407
- public function user_role_can_expire_posts( $user_role ) {
408
- $user_role_instance = get_role( $user_role );
409
-
410
- if ( ! is_a( $user_role_instance, WP_Role::class ) ) {
411
- return false;
412
- }
413
-
414
- return $user_role_instance->has_cap( $this->capabilities['expire_post'] )
415
- && $user_role_instance->capabilities[ $this->capabilities['expire_post'] ] === true;
416
- }
417
-
418
- /**
419
- * Returns true if the current user can expire posts.
420
- *
421
- * @return bool
422
- */
423
- public function current_user_can_expire_posts() {
424
- $current_user = wp_get_current_user();
425
-
426
- return is_a( $current_user, WP_User::class )
427
- && $current_user->has_cap( $this->capabilities['expire_post'] );
428
- }
429
-
430
- /**
431
- * Set the default capabilities.
432
- */
433
- public function set_default_capabilities() {
434
- $admin_role = get_role( 'administrator' );
435
- $admin_role->add_cap( self::DEFAULT_CAPABILITY_EXPIRE_POST );
436
- }
437
-
438
- /**
439
- * Add the plugin capabilities to the PublishPress Capabilities plugin.
440
- *
441
- * @param array $capabilities Array of capabilities.
442
- *
443
- * @return array
444
- */
445
- public function filter_cme_capabilities( $capabilities ) {
446
- return array_merge(
447
- $capabilities,
448
- array(
449
- 'Post Expirator' => array( self::DEFAULT_CAPABILITY_EXPIRE_POST ),
450
- )
451
- );
452
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
453
  }
5
  *
6
  * Eventually, everything should move here.
7
  */
8
+ class PostExpirator_Facade
9
+ {
10
+
11
+ const DEFAULT_CAPABILITY_EXPIRE_POST = 'publishpress_future_expire_post';
12
+
13
+ /**
14
+ * The singleton instance.
15
+ */
16
+ private static $instance = null;
17
+ /**
18
+ * List of capabilities used by the plugin.
19
+ *
20
+ * @var string[]
21
+ */
22
+ private $capabilities = array(
23
+ 'expire_post' => self::DEFAULT_CAPABILITY_EXPIRE_POST,
24
+ );
25
+
26
+ /**
27
+ * Constructor.
28
+ */
29
+ private function __construct()
30
+ {
31
+ PostExpirator_Display::getInstance();
32
+ $this->hooks();
33
+
34
+ if (! $this->user_role_can_expire_posts('administrator')) {
35
+ $this->set_default_capabilities();
36
+ }
37
+ }
38
+
39
+ /**
40
+ * Initialize the hooks.
41
+ */
42
+ private function hooks()
43
+ {
44
+ add_action('init', array($this, 'register_post_meta'), 11);
45
+ add_action('enqueue_block_editor_assets', array($this, 'block_editor_assets'));
46
+ add_action('updated_postmeta', array($this, 'updatedmeta'), 10, 4);
47
+ add_filter('cme_plugin_capabilities', [$this, 'filter_cme_capabilities'], 20);
48
+ }
49
+
50
+ /**
51
+ * Return true if the specific user role can expire posts.
52
+ *
53
+ * @return bool
54
+ */
55
+ public function user_role_can_expire_posts($user_role)
56
+ {
57
+ $user_role_instance = get_role($user_role);
58
+
59
+ if (! is_a($user_role_instance, WP_Role::class)) {
60
+ return false;
61
+ }
62
+
63
+ return $user_role_instance->has_cap($this->capabilities['expire_post'])
64
+ && $user_role_instance->capabilities[$this->capabilities['expire_post']] === true;
65
+ }
66
+
67
+ /**
68
+ * Set the default capabilities.
69
+ */
70
+ public function set_default_capabilities()
71
+ {
72
+ $admin_role = get_role('administrator');
73
+ $admin_role->add_cap(self::DEFAULT_CAPABILITY_EXPIRE_POST);
74
+ }
75
+
76
+ /**
77
+ * Loads the assets for the particular page.
78
+ */
79
+ public static function load_assets($for)
80
+ {
81
+ switch ($for) {
82
+ case 'settings':
83
+ wp_enqueue_script(
84
+ 'pe-settings',
85
+ POSTEXPIRATOR_BASEURL . '/assets/js/settings.js',
86
+ array(
87
+ 'jquery',
88
+ 'jquery-ui-tabs',
89
+ ),
90
+ POSTEXPIRATOR_VERSION,
91
+ false
92
+ );
93
+ wp_localize_script('pe-settings', 'config', array());
94
+ wp_enqueue_style(
95
+ 'pe-settings',
96
+ POSTEXPIRATOR_BASEURL . '/assets/css/settings.css',
97
+ array(),
98
+ POSTEXPIRATOR_VERSION,
99
+ false
100
+ );
101
+ wp_enqueue_style(
102
+ 'pe-jquery-ui',
103
+ POSTEXPIRATOR_BASEURL . '/assets/css/lib/jquery-ui/jquery-ui.min.css',
104
+ array('pe-settings'),
105
+ POSTEXPIRATOR_VERSION
106
+ );
107
+ break;
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Set the expire type, categories etc. corresponding to the new (gutenberg) structure.
113
+ */
114
+ public static function set_expire_principles($id, $opts)
115
+ {
116
+ update_post_meta($id, '_expiration-date-options', $opts);
117
+ update_post_meta($id, '_expiration-date-type', $opts['expireType']);
118
+ update_post_meta($id, '_expiration-date-categories', isset($opts['category']) ? $opts['category'] : array());
119
+ update_post_meta(
120
+ $id,
121
+ '_expiration-date-taxonomy',
122
+ isset($opts['categoryTaxonomy']) ? $opts['categoryTaxonomy'] : ''
123
+ );
124
+ }
125
+
126
+ /**
127
+ * Fires when the post meta is updated (in the gutenberg block).
128
+ */
129
+ function updatedmeta($meta_id, $post_id, $meta_key, $meta_value)
130
+ {
131
+ // allow only through gutenberg
132
+ if (! PostExpirator_Util::is_gutenberg_active()) {
133
+ return;
134
+ }
135
+
136
+ // not through bulk edit.
137
+ if (isset($_POST['post_ids'])) {
138
+ return;
139
+ }
140
+
141
+ // not through quick edit.
142
+ if (isset($_POST['expirationdate_quickedit'])) {
143
+ return;
144
+ }
145
+
146
+ switch ($meta_key) {
147
+ case '_expiration-date-status':
148
+ if (empty($meta_value)) {
149
+ $this->unschedule_event($post_id);
150
+ }
151
+
152
+
153
+ break;
154
+ case '_expiration-date':
155
+ $opts = self::get_expire_principles($post_id);
156
+ $this->schedule_event($post_id, $meta_value, $opts);
157
+
158
+ break;
159
+ }
160
+ //remove_action('updated_postmeta', array($this, 'updatedmeta'), 10, 4);
161
+ }
162
+
163
+ /**
164
+ * Wrapper for unscheduling event.
165
+ */
166
+ private function unschedule_event($post_id)
167
+ {
168
+ delete_post_meta($post_id, '_expiration-date');
169
+ delete_post_meta($post_id, '_expiration-date-options');
170
+ delete_post_meta($post_id, '_expiration-date-type');
171
+ delete_post_meta($post_id, '_expiration-date-categories');
172
+ delete_post_meta($post_id, '_expiration-date-taxonomy');
173
+
174
+ postexpirator_unschedule_event($post_id);
175
+ }
176
+
177
+ /**
178
+ * Get the expire type, categories etc.
179
+ *
180
+ * Keeps in mind the old (classic editor) and new (gutenberg) structure.
181
+ */
182
+ public static function get_expire_principles($id)
183
+ {
184
+ $expireType = $categories = $taxonomyName = '';
185
+
186
+ $expireTypeNew = get_post_meta($id, '_expiration-date-type', true);
187
+ if (! empty($expireTypeNew)) {
188
+ $expireType = $expireTypeNew;
189
+ }
190
+
191
+ $categoriesNew = get_post_meta($id, '_expiration-date-categories', true);
192
+ if (! empty($categoriesNew)) {
193
+ $categories = $categoriesNew;
194
+ }
195
+
196
+ $taxonomyNameNew = get_post_meta($id, '_expiration-date-taxonomy', true);
197
+ if (! empty($taxonomyNameNew)) {
198
+ $taxonomyName = $taxonomyNameNew;
199
+ }
200
+
201
+ // _expiration-date-options is deprecated when using block editor
202
+ $opts = get_post_meta($id, '_expiration-date-options', true);
203
+ if (empty($expireType) && isset($opts['expireType'])) {
204
+ $expireType = $opts['expireType'];
205
+ }
206
+ if (empty($categories)) {
207
+ $categories = isset($opts['category']) ? $opts['category'] : false;
208
+ }
209
+
210
+ if (empty($taxonomyName)) {
211
+ $taxonomyName = isset($opts['categoryTaxonomy']) ? $opts['categoryTaxonomy'] : '';
212
+ }
213
+
214
+ return array(
215
+ 'expireType' => $expireType,
216
+ 'category' => $categories,
217
+ 'categoryTaxonomy' => $taxonomyName,
218
+ );
219
+ }
220
+
221
+ /**
222
+ * Wrapper for scheduling event.
223
+ */
224
+ private function schedule_event($post_id, $ts, $opts)
225
+ {
226
+ postexpirator_schedule_event($post_id, $ts, $opts);
227
+ }
228
+
229
+ /**
230
+ * Register the post meta to use in the block.
231
+ */
232
+ function register_post_meta()
233
+ {
234
+ $post_types = get_post_types(array('public' => true));
235
+ foreach ($post_types as $post_type) {
236
+ // this is important for CPTs to show the postMeta.
237
+ add_post_type_support($post_type, array('custom-fields'));
238
+
239
+ register_post_meta(
240
+ $post_type,
241
+ '_expiration-date-status',
242
+ array(
243
+ 'single' => true,
244
+ 'type' => 'string',
245
+ 'auth_callback' => function () {
246
+ return current_user_can('edit_posts');
247
+ },
248
+ 'show_in_rest' => true,
249
+ )
250
+ );
251
+ register_post_meta(
252
+ $post_type,
253
+ '_expiration-date',
254
+ array(
255
+ 'single' => true,
256
+ 'type' => 'number',
257
+ 'auth_callback' => function () {
258
+ return current_user_can('edit_posts');
259
+ },
260
+ 'show_in_rest' => true,
261
+ )
262
+ );
263
+ register_post_meta(
264
+ $post_type,
265
+ '_expiration-date-type',
266
+ array(
267
+ 'single' => true,
268
+ 'type' => 'string',
269
+ 'auth_callback' => function () {
270
+ return current_user_can('edit_posts');
271
+ },
272
+ 'show_in_rest' => true,
273
+ )
274
+ );
275
+ register_post_meta(
276
+ $post_type,
277
+ '_expiration-date-categories',
278
+ array(
279
+ 'single' => true,
280
+ 'type' => 'array',
281
+ 'auth_callback' => function () {
282
+ return current_user_can('edit_posts');
283
+ },
284
+ 'show_in_rest' => array(
285
+ 'schema' => array(
286
+ 'type' => 'array',
287
+ 'items' => array(
288
+ 'type' => 'number',
289
+ ),
290
+ ),
291
+ ),
292
+ )
293
+ );
294
+
295
+ // this is the old complex field that we are now deprecating
296
+ // as it cannot be used easily in the block editor
297
+ register_post_meta(
298
+ $post_type,
299
+ '_expiration-date-options',
300
+ array(
301
+ 'single' => true,
302
+ 'type' => 'object',
303
+ 'auth_callback' => function () {
304
+ return current_user_can('edit_posts');
305
+ },
306
+ 'show_in_rest' => array(
307
+ 'schema' => array(
308
+ 'type' => 'object',
309
+ 'additionalProperties' => true,
310
+ ),
311
+ ),
312
+ )
313
+ );
314
+ }
315
+ }
316
+
317
+ /**
318
+ * Load the block's backend assets only if the meta box is active for this post type.
319
+ */
320
+ function block_editor_assets()
321
+ {
322
+ global $post;
323
+
324
+ if (! $post || ! self::show_gutenberg_metabox()) {
325
+ return;
326
+ }
327
+
328
+ $defaults = get_option('expirationdateDefaults' . ucfirst($post->post_type));
329
+ // if settings are not configured, show the metabox by default only for posts and pages
330
+ if (
331
+ (! isset($defaults['activeMetaBox']) && in_array(
332
+ $post->post_type,
333
+ array(
334
+ 'post',
335
+ 'page',
336
+ ),
337
+ true
338
+ )) || $defaults['activeMetaBox'] === 'active'
339
+ ) {
340
+ wp_enqueue_script(
341
+ 'postexpirator-block',
342
+ POSTEXPIRATOR_BASEURL . 'assets/js/block.js',
343
+ array('wp-edit-post'),
344
+ POSTEXPIRATOR_VERSION,
345
+ true
346
+ );
347
+
348
+ $default_expiry = PostExpirator_Facade::get_default_expiry($post->post_type);
349
+ wp_localize_script(
350
+ 'postexpirator-block',
351
+ 'config',
352
+ array(
353
+ 'defaults' => $defaults,
354
+ 'default_date' => $default_expiry['ts'],
355
+ 'default_categories' => get_option('expirationdateCategoryDefaults'),
356
+ )
357
+ );
358
+ }
359
+ }
360
+
361
+ /**
362
+ * Is the (default) Gutenberg-style box enabled in options?
363
+ */
364
+ public static function show_gutenberg_metabox()
365
+ {
366
+ $gutenberg = get_option('expirationdateGutenbergSupport', 1);
367
+
368
+ $facade = PostExpirator_Facade::getInstance();
369
+
370
+ return intval($gutenberg) === 1 && $facade->current_user_can_expire_posts();
371
+ }
372
+
373
+ /**
374
+ * Returns instance of the singleton.
375
+ */
376
+ public static function getInstance()
377
+ {
378
+ if (is_null(self::$instance)) {
379
+ self::$instance = new self();
380
+ }
381
+
382
+ return self::$instance;
383
+ }
384
+
385
+ /**
386
+ * Returns true if the current user can expire posts.
387
+ *
388
+ * @return bool
389
+ */
390
+ public function current_user_can_expire_posts()
391
+ {
392
+ $current_user = wp_get_current_user();
393
+
394
+ return is_a($current_user, WP_User::class)
395
+ && $current_user->has_cap($this->capabilities['expire_post']);
396
+ }
397
+
398
+ /**
399
+ * Calculates the default expiry date as set in the options.
400
+ */
401
+ public static function get_default_expiry($post_type)
402
+ {
403
+ $defaultmonth = date_i18n('m');
404
+ $defaultday = date_i18n('d');
405
+ $defaulthour = date_i18n('H');
406
+ $defaultyear = date_i18n('Y');
407
+ $defaultminute = date_i18n('i');
408
+ $ts = time();
409
+
410
+ $default_date_expiry = $custom_date = '';
411
+ $general_date_expiry = $general_custom_date = '';
412
+
413
+ // get the values from the general settings
414
+ $general_date_expiry = get_option('expirationdateDefaultDate', POSTEXPIRATOR_EXPIREDEFAULT);
415
+ if ('custom' === $general_date_expiry) {
416
+ $custom = get_option('expirationdateDefaultDateCustom');
417
+ if ($custom !== false) {
418
+ $general_custom_date = $custom;
419
+ }
420
+ }
421
+
422
+ // get the values from the post_type
423
+ $defaults = get_option('expirationdateDefaults' . ucfirst($post_type));
424
+
425
+ if (isset($defaults['default-expire-type'])) {
426
+ $default_date_expiry = $defaults['default-expire-type'];
427
+ switch ($default_date_expiry) {
428
+ case 'custom':
429
+ $custom_date = $defaults['default-custom-date'];
430
+ break;
431
+ case 'inherit':
432
+ $custom_date = $general_custom_date;
433
+ $default_date_expiry = $general_date_expiry;
434
+ break;
435
+ }
436
+ } else {
437
+ $default_date_expiry = $general_date_expiry;
438
+ $custom_date = $general_custom_date;
439
+ }
440
+
441
+ if ('custom' === $default_date_expiry) {
442
+ $custom = get_option('expirationdateDefaultDateCustom');
443
+ if (! empty($custom_date)) {
444
+ $tz = get_option('timezone_string');
445
+ if ($tz) {
446
+ // @TODO Using date_default_timezone_set() and similar isn't allowed, instead use WP internal timezone support.
447
+ // phpcs:ignore WordPress.DateTime.RestrictedFunctions.timezone_change_date_default_timezone_set
448
+ date_default_timezone_set($tz);
449
+ }
450
+
451
+ // strip the quotes in case the user provides them.
452
+ $custom_date = str_replace('"', '', html_entity_decode($custom_date, ENT_QUOTES));
453
+
454
+ $ts = time() + (strtotime($custom_date) - time());
455
+ if ($tz) {
456
+ // @TODO Using date_default_timezone_set() and similar isn't allowed, instead use WP internal timezone support.
457
+ // phpcs:ignore WordPress.DateTime.RestrictedFunctions.timezone_change_date_default_timezone_set
458
+ date_default_timezone_set('UTC');
459
+ }
460
+ }
461
+ $defaultmonth = get_date_from_gmt(gmdate('Y-m-d H:i:s', $ts), 'm');
462
+ $defaultday = get_date_from_gmt(gmdate('Y-m-d H:i:s', $ts), 'd');
463
+ $defaultyear = get_date_from_gmt(gmdate('Y-m-d H:i:s', $ts), 'Y');
464
+ $defaulthour = get_date_from_gmt(gmdate('Y-m-d H:i:s', $ts), 'H');
465
+ $defaultminute = get_date_from_gmt(gmdate('Y-m-d H:i:s', $ts), 'i');
466
+ }
467
+
468
+ return array(
469
+ 'month' => $defaultmonth,
470
+ 'day' => $defaultday,
471
+ 'year' => $defaultyear,
472
+ 'hour' => $defaulthour,
473
+ 'minute' => $defaultminute,
474
+ 'ts' => $ts,
475
+ );
476
+ }
477
+
478
+ /**
479
+ * Add the plugin capabilities to the PublishPress Capabilities plugin.
480
+ *
481
+ * @param array $capabilities Array of capabilities.
482
+ *
483
+ * @return array
484
+ */
485
+ public function filter_cme_capabilities($capabilities)
486
+ {
487
+ return array_merge(
488
+ $capabilities,
489
+ array(
490
+ 'Post Expirator' => array(self::DEFAULT_CAPABILITY_EXPIRE_POST),
491
+ )
492
+ );
493
+ }
494
  }
classes/Reviews.class.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use PublishPress\WordPressReviews\ReviewsController;
4
+
5
+ /**
6
+ * WordPress reviews functions.
7
+ */
8
+ abstract class PostExpirator_Reviews
9
+ {
10
+ /**
11
+ * @var ReviewsController
12
+ */
13
+ private static $reviewController = null;
14
+
15
+ public static function init()
16
+ {
17
+ if (is_null(static::$reviewController)) {
18
+ add_filter('post-expirator_wp_reviews_allow_display_notice', [self::class, 'shouldDisplayBanner']);
19
+
20
+ self::$reviewController = new ReviewsController(
21
+ 'post-expirator',
22
+ 'Post Expirator',
23
+ POSTEXPIRATOR_BASEURL . 'assets/img/post-expirator-wp-logo.png'
24
+ );
25
+
26
+ self::$reviewController->init();
27
+ }
28
+ }
29
+
30
+ public static function shouldDisplayBanner($shouldDisplay)
31
+ {
32
+ global $pagenow;
33
+
34
+ if (! is_admin() || ! current_user_can('manage_options')) {
35
+ return false;
36
+ }
37
+
38
+ if ($pagenow === 'options-general.php' && isset($_GET['page'])) {
39
+ if ($_GET['page'] === 'post-expirator.php') {
40
+ return true;
41
+ }
42
+ }
43
+
44
+ return false;
45
+ }
46
+ }
classes/Util.class.php CHANGED
@@ -3,49 +3,52 @@
3
  /**
4
  * Utility functions.
5
  */
6
- class PostExpirator_Util {
7
-
8
- /**
9
- * Check if Block Editor is active.
10
- * Must only be used after plugins_loaded action is fired.
11
- *
12
- * @return bool
13
- */
14
- public static function is_gutenberg_active() {
15
- // Gutenberg plugin is installed and activated.
16
- $gutenberg = ! ( false === has_filter( 'replace_editor', 'gutenberg_init' ) );
17
-
18
- // Block editor since 5.0.
19
- $block_editor = version_compare( $GLOBALS['wp_version'], '5.0-beta', '>' );
20
-
21
- if ( ! $gutenberg && ! $block_editor ) {
22
- return false;
23
- }
24
-
25
- if ( self::is_classic_editor_plugin_active() ) {
26
- $editor_option = get_option( 'classic-editor-replace' );
27
- $block_editor_active = array( 'no-replace', 'block' );
28
-
29
- return in_array( $editor_option, $block_editor_active, true );
30
- }
31
-
32
- return true;
33
- }
34
-
35
- /**
36
- * Check if Classic Editor plugin is active.
37
- *
38
- * @return bool
39
- */
40
- private static function is_classic_editor_plugin_active() {
41
- if ( ! function_exists( 'is_plugin_active' ) ) {
42
- include_once ABSPATH . 'wp-admin/includes/plugin.php';
43
- }
44
-
45
- if ( is_plugin_active( 'classic-editor/classic-editor.php' ) ) {
46
- return true;
47
- }
48
-
49
- return false;
50
- }
 
 
 
51
  }
3
  /**
4
  * Utility functions.
5
  */
6
+ class PostExpirator_Util
7
+ {
8
+
9
+ /**
10
+ * Check if Block Editor is active.
11
+ * Must only be used after plugins_loaded action is fired.
12
+ *
13
+ * @return bool
14
+ */
15
+ public static function is_gutenberg_active()
16
+ {
17
+ // Gutenberg plugin is installed and activated.
18
+ $gutenberg = ! (false === has_filter('replace_editor', 'gutenberg_init'));
19
+
20
+ // Block editor since 5.0.
21
+ $block_editor = version_compare($GLOBALS['wp_version'], '5.0-beta', '>');
22
+
23
+ if (! $gutenberg && ! $block_editor) {
24
+ return false;
25
+ }
26
+
27
+ if (self::is_classic_editor_plugin_active()) {
28
+ $editor_option = get_option('classic-editor-replace');
29
+ $block_editor_active = array('no-replace', 'block');
30
+
31
+ return in_array($editor_option, $block_editor_active, true);
32
+ }
33
+
34
+ return true;
35
+ }
36
+
37
+ /**
38
+ * Check if Classic Editor plugin is active.
39
+ *
40
+ * @return bool
41
+ */
42
+ private static function is_classic_editor_plugin_active()
43
+ {
44
+ if (! function_exists('is_plugin_active')) {
45
+ include_once ABSPATH . 'wp-admin/includes/plugin.php';
46
+ }
47
+
48
+ if (is_plugin_active('classic-editor/classic-editor.php')) {
49
+ return true;
50
+ }
51
+
52
+ return false;
53
+ }
54
  }
composer.json CHANGED
@@ -1,39 +1,54 @@
1
  {
2
- "name": "publishpress/post-expirator",
3
- "type": "wordpress-plugin",
4
- "license": "GPL-2.0-or-later",
5
- "description": "",
6
- "authors": [
7
- {
8
- "name": "PublishPress",
9
- "email": "help@publishpress.com",
10
- "homepage": "https://publishpress.com",
11
- "role": "Developer"
12
- },
13
- {
14
- "name": "Aaron Axelsen",
15
- "homepage": "http://postexpirator.tuxdocs.net/"
16
- }
17
- ],
18
- "config": {
19
- "preferred-install": "dist"
20
  },
21
- "minimum-stability": "stable",
22
- "repositories": [
23
- {
24
- "type": "git",
25
- "url": "https://github.com/publishpress/PublishPress-Plugin-Builder"
26
- }
27
- ],
28
- "dist": {
29
- "url": "https://github.com/publishpress/PublishPress-Future/releases/download/v2.5.2-beta.1/post-expirator-2.5.2-beta.1.zip",
30
- "type": "zip"
31
- },
32
- "require-dev": {
33
- "dealerdirect/phpcodesniffer-composer-installer": "*",
34
- "squizlabs/php_codesniffer": "3.*",
35
- "phpcompatibility/php-compatibility": "*",
36
- "wp-coding-standards/wpcs": "*",
37
- "publishpress/publishpress-plugin-builder": "^1.3"
38
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  }
1
  {
2
+ "name": "publishpress/post-expirator",
3
+ "type": "wordpress-plugin",
4
+ "license": "GPL-2.0-or-later",
5
+ "description": "",
6
+ "authors": [
7
+ {
8
+ "name": "PublishPress",
9
+ "email": "help@publishpress.com",
10
+ "homepage": "https://publishpress.com",
11
+ "role": "Developer"
 
 
 
 
 
 
 
 
12
  },
13
+ {
14
+ "name": "Aaron Axelsen",
15
+ "homepage": "http://postexpirator.tuxdocs.net/"
16
+ }
17
+ ],
18
+ "config": {
19
+ "preferred-install": "dist"
20
+ },
21
+ "minimum-stability": "stable",
22
+ "repositories": [
23
+ {
24
+ "type": "git",
25
+ "url": "https://github.com/publishpress/PublishPress-Plugin-Builder"
 
 
 
 
26
  }
27
+ ],
28
+ "dist": {
29
+ "url": "https://github.com/publishpress/PublishPress-Future/releases/download/v2.5.2-beta.1/post-expirator-2.5.2-beta.1.zip",
30
+ "type": "zip"
31
+ },
32
+ "require-dev": {
33
+ "lucatume/wp-browser": "^3",
34
+ "codeception/module-asserts": "^1.0",
35
+ "codeception/module-phpbrowser": "^1.0",
36
+ "codeception/module-webdriver": "^1.0",
37
+ "codeception/module-db": "^1.0",
38
+ "codeception/module-filesystem": "^1.0",
39
+ "codeception/module-cli": "^1.0",
40
+ "codeception/util-universalframework": "^1.0",
41
+ "codeception/module-rest": "^1.3",
42
+ "dealerdirect/phpcodesniffer-composer-installer": "*",
43
+ "phpcompatibility/php-compatibility": "*",
44
+ "wp-coding-standards/wpcs": "*",
45
+ "publishpress/publishpress-plugin-builder": "^1.3",
46
+ "phpmd/phpmd": "^2.8",
47
+ "squizlabs/php_codesniffer": "^3.5",
48
+ "sebastian/phpcpd": "^5.0",
49
+ "overtrue/phplint": "^2.1"
50
+ },
51
+ "require": {
52
+ "publishpress/wordpress-reviews": "^1.1"
53
+ }
54
  }
composer.lock CHANGED
@@ -4,157 +4,145 @@
4
  "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
  "This file is @generated automatically"
6
  ],
7
- "content-hash": "0795226c327436b714b82f47a10656a1",
8
- "packages": [],
9
- "packages-dev": [
10
  {
11
- "name": "consolidation/annotated-command",
12
- "version": "4.3.2",
13
  "source": {
14
  "type": "git",
15
- "url": "https://github.com/consolidation/annotated-command.git",
16
- "reference": "101c7dd0388259cfbba41b705b9255d2b1976bbf"
17
  },
18
  "dist": {
19
  "type": "zip",
20
- "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/101c7dd0388259cfbba41b705b9255d2b1976bbf",
21
- "reference": "101c7dd0388259cfbba41b705b9255d2b1976bbf",
22
  "shasum": ""
23
  },
24
  "require": {
25
- "consolidation/output-formatters": "^4.1.1",
26
- "php": ">=7.1.3",
27
- "psr/log": "^1|^2",
28
- "symfony/console": "^4.4.8|~5.1.0",
29
- "symfony/event-dispatcher": "^4.4.8|^5",
30
- "symfony/finder": "^4.4.8|^5"
31
  },
32
  "require-dev": {
33
- "phpunit/phpunit": "^7.5.20 || ^8 || ^9",
34
- "squizlabs/php_codesniffer": "^3",
35
- "yoast/phpunit-polyfills": "^0.2.0"
36
  },
37
  "type": "library",
38
- "extra": {
39
- "branch-alias": {
40
- "dev-main": "4.x-dev"
41
- }
42
- },
43
  "autoload": {
44
- "psr-4": {
45
- "Consolidation\\AnnotatedCommand\\": "src"
46
- }
47
  },
48
  "notification-url": "https://packagist.org/downloads/",
49
  "license": [
50
- "MIT"
51
  ],
52
  "authors": [
53
  {
54
- "name": "Greg Anderson",
55
- "email": "greg.1.anderson@greenknowe.org"
 
 
 
 
56
  }
57
  ],
58
- "description": "Initialize Symfony Console commands from annotated command class methods.",
 
 
 
 
 
 
59
  "support": {
60
- "issues": "https://github.com/consolidation/annotated-command/issues",
61
- "source": "https://github.com/consolidation/annotated-command/tree/4.3.2"
62
  },
63
- "time": "2021-09-19T14:35:36+00:00"
64
- },
 
 
65
  {
66
- "name": "consolidation/config",
67
- "version": "2.0.1",
68
  "source": {
69
  "type": "git",
70
- "url": "https://github.com/consolidation/config.git",
71
- "reference": "9a2c2a7b2aea1b3525984a4378743a8b74c14e1c"
72
  },
73
  "dist": {
74
  "type": "zip",
75
- "url": "https://api.github.com/repos/consolidation/config/zipball/9a2c2a7b2aea1b3525984a4378743a8b74c14e1c",
76
- "reference": "9a2c2a7b2aea1b3525984a4378743a8b74c14e1c",
77
  "shasum": ""
78
  },
79
  "require": {
80
- "dflydev/dot-access-data": "^1.1.0",
81
- "grasmash/expander": "^1",
82
- "php": ">=7.1.3",
83
- "psr/log": "^1.1",
84
- "symfony/event-dispatcher": "^4||^5"
85
  },
86
  "require-dev": {
87
- "phpunit/phpunit": ">=7.5.20",
88
- "squizlabs/php_codesniffer": "^3",
89
- "symfony/console": "^4||^5",
90
- "symfony/yaml": "^4||^5",
91
- "yoast/phpunit-polyfills": "^0.2.0"
92
- },
93
- "suggest": {
94
- "symfony/event-dispatcher": "Required to inject configuration into Command options",
95
- "symfony/yaml": "Required to use Consolidation\\Config\\Loader\\YamlConfigLoader"
96
  },
97
  "type": "library",
98
- "extra": {
99
- "branch-alias": {
100
- "dev-main": "2.x-dev"
101
- }
102
- },
103
- "autoload": {
104
- "psr-4": {
105
- "Consolidation\\Config\\": "src"
106
- }
107
- },
108
  "notification-url": "https://packagist.org/downloads/",
109
  "license": [
110
  "MIT"
111
  ],
112
  "authors": [
113
  {
114
- "name": "Greg Anderson",
115
- "email": "greg.1.anderson@greenknowe.org"
116
  }
117
  ],
118
- "description": "Provide configuration services for a commandline tool.",
 
 
 
 
 
 
 
 
 
 
119
  "support": {
120
- "issues": "https://github.com/consolidation/config/issues",
121
- "source": "https://github.com/consolidation/config/tree/2.0.1"
122
  },
123
- "time": "2020-12-06T00:03:30+00:00"
124
  },
125
  {
126
- "name": "consolidation/log",
127
- "version": "2.0.2",
128
  "source": {
129
  "type": "git",
130
- "url": "https://github.com/consolidation/log.git",
131
- "reference": "82a2aaaa621a7b976e50a745a8d249d5085ee2b1"
132
  },
133
  "dist": {
134
  "type": "zip",
135
- "url": "https://api.github.com/repos/consolidation/log/zipball/82a2aaaa621a7b976e50a745a8d249d5085ee2b1",
136
- "reference": "82a2aaaa621a7b976e50a745a8d249d5085ee2b1",
137
  "shasum": ""
138
  },
139
  "require": {
140
- "php": ">=7.1.3",
141
- "psr/log": "^1.0",
142
- "symfony/console": "^4|^5"
143
  },
144
  "require-dev": {
145
- "phpunit/phpunit": ">=7.5.20",
146
- "squizlabs/php_codesniffer": "^3",
147
- "yoast/phpunit-polyfills": "^0.2.0"
 
 
 
148
  },
149
  "type": "library",
150
  "extra": {
151
  "branch-alias": {
152
- "dev-main": "2.x-dev"
153
  }
154
  },
155
  "autoload": {
156
- "psr-4": {
157
- "Consolidation\\Log\\": "src"
158
  }
159
  },
160
  "notification-url": "https://packagist.org/downloads/",
@@ -163,158 +151,144 @@
163
  ],
164
  "authors": [
165
  {
166
- "name": "Greg Anderson",
167
- "email": "greg.1.anderson@greenknowe.org"
 
168
  }
169
  ],
170
- "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.",
 
 
 
 
 
 
 
 
 
171
  "support": {
172
- "issues": "https://github.com/consolidation/log/issues",
173
- "source": "https://github.com/consolidation/log/tree/2.0.2"
174
  },
175
- "time": "2020-12-10T16:26:23+00:00"
176
  },
177
  {
178
- "name": "consolidation/output-formatters",
179
- "version": "4.1.2",
180
  "source": {
181
  "type": "git",
182
- "url": "https://github.com/consolidation/output-formatters.git",
183
- "reference": "5821e6ae076bf690058a4de6c94dce97398a69c9"
184
  },
185
  "dist": {
186
  "type": "zip",
187
- "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/5821e6ae076bf690058a4de6c94dce97398a69c9",
188
- "reference": "5821e6ae076bf690058a4de6c94dce97398a69c9",
189
  "shasum": ""
190
  },
191
  "require": {
192
- "dflydev/dot-access-data": "^1.1.0",
193
- "php": ">=7.1.3",
194
- "symfony/console": "^4|^5",
195
- "symfony/finder": "^4|^5"
196
  },
197
- "require-dev": {
198
- "php-coveralls/php-coveralls": "^2.4.2",
199
- "phpunit/phpunit": ">=7",
200
- "squizlabs/php_codesniffer": "^3",
201
- "symfony/var-dumper": "^4",
202
- "symfony/yaml": "^4",
203
- "yoast/phpunit-polyfills": "^0.2.0"
204
- },
205
- "suggest": {
206
- "symfony/var-dumper": "For using the var_dump formatter"
207
  },
208
  "type": "library",
209
- "extra": {
210
- "branch-alias": {
211
- "dev-main": "4.x-dev"
212
- }
213
- },
214
  "autoload": {
215
- "psr-4": {
216
- "Consolidation\\OutputFormatters\\": "src"
217
  }
218
  },
219
  "notification-url": "https://packagist.org/downloads/",
220
  "license": [
221
- "MIT"
222
  ],
223
  "authors": [
224
  {
225
- "name": "Greg Anderson",
226
- "email": "greg.1.anderson@greenknowe.org"
 
 
 
 
 
 
227
  }
228
  ],
229
- "description": "Format text by applying transformations provided by plug-in formatters.",
 
 
 
 
 
 
 
230
  "support": {
231
- "issues": "https://github.com/consolidation/output-formatters/issues",
232
- "source": "https://github.com/consolidation/output-formatters/tree/4.1.2"
233
  },
234
- "time": "2020-12-12T19:04:59+00:00"
235
  },
236
  {
237
- "name": "consolidation/robo",
238
- "version": "2.2.2",
239
  "source": {
240
  "type": "git",
241
- "url": "https://github.com/consolidation/Robo.git",
242
- "reference": "b365df174d9cfb0f5814e4f3275a1c558b17bc4c"
243
  },
244
  "dist": {
245
  "type": "zip",
246
- "url": "https://api.github.com/repos/consolidation/Robo/zipball/b365df174d9cfb0f5814e4f3275a1c558b17bc4c",
247
- "reference": "b365df174d9cfb0f5814e4f3275a1c558b17bc4c",
248
  "shasum": ""
249
  },
250
  "require": {
251
- "consolidation/annotated-command": "^4.2.1",
252
- "consolidation/config": "^1.2.1|^2",
253
- "consolidation/log": "^1.1.1|^2.0.1",
254
- "consolidation/output-formatters": "^4.1.1",
255
- "consolidation/self-update": "^1.2",
256
- "league/container": "^2.4.1",
257
- "php": ">=7.1.3",
258
- "symfony/console": "^4.4.11|^5",
259
- "symfony/event-dispatcher": "^4.4.11|^5",
260
- "symfony/filesystem": "^4.4.11|^5",
261
- "symfony/finder": "^4.4.11|^5",
262
- "symfony/process": "^4.4.11|^5",
263
- "symfony/yaml": "^4.0 || ^5.0"
264
- },
265
- "conflict": {
266
- "codegyre/robo": "*"
267
  },
268
  "require-dev": {
269
- "g1a/composer-test-scenarios": "^3",
270
- "natxet/cssmin": "3.0.4",
271
- "patchwork/jsqueeze": "^2",
272
- "pear/archive_tar": "^1.4.4",
273
- "php-coveralls/php-coveralls": "^2.2",
274
- "phpdocumentor/reflection-docblock": "^4.3.2",
275
- "phpunit/phpunit": "^6.5.14",
276
- "squizlabs/php_codesniffer": "^3"
 
 
 
277
  },
278
  "suggest": {
279
- "henrikbjorn/lurker": "For monitoring filesystem changes in taskWatch",
280
- "natxet/cssmin": "For minifying CSS files in taskMinify",
281
- "patchwork/jsqueeze": "For minifying JS files in taskMinify",
282
- "pear/archive_tar": "Allows tar archives to be created and extracted in taskPack and taskExtract, respectively."
 
283
  },
284
  "bin": [
285
- "robo"
286
  ],
287
  "type": "library",
288
  "extra": {
289
- "scenarios": {
290
- "symfony4": {
291
- "require": {
292
- "symfony/console": "^4.4.11",
293
- "symfony/event-dispatcher": "^4.4.11",
294
- "symfony/filesystem": "^4.4.11",
295
- "symfony/finder": "^4.4.11",
296
- "symfony/process": "^4.4.11",
297
- "phpunit/phpunit": "^6",
298
- "nikic/php-parser": "^2"
299
- },
300
- "remove": [
301
- "codeception/phpunit-wrapper"
302
- ],
303
- "config": {
304
- "platform": {
305
- "php": "7.1.3"
306
- }
307
- }
308
- }
309
- },
310
- "branch-alias": {
311
- "dev-master": "2.x-dev",
312
- "dev-main": "2.x-dev"
313
- }
314
  },
315
  "autoload": {
316
  "psr-4": {
317
- "Robo\\": "src"
 
318
  }
319
  },
320
  "notification-url": "https://packagist.org/downloads/",
@@ -323,49 +297,56 @@
323
  ],
324
  "authors": [
325
  {
326
- "name": "Davert",
327
- "email": "davert.php@resend.cc"
 
328
  }
329
  ],
330
- "description": "Modern task runner",
 
 
 
 
 
 
 
 
331
  "support": {
332
- "issues": "https://github.com/consolidation/Robo/issues",
333
- "source": "https://github.com/consolidation/Robo/tree/2.2.2"
334
  },
335
- "time": "2020-12-18T22:09:18+00:00"
 
 
 
 
 
 
336
  },
337
  {
338
- "name": "consolidation/self-update",
339
- "version": "1.2.0",
340
  "source": {
341
  "type": "git",
342
- "url": "https://github.com/consolidation/self-update.git",
343
- "reference": "dba6b2c0708f20fa3ba8008a2353b637578849b4"
344
  },
345
  "dist": {
346
  "type": "zip",
347
- "url": "https://api.github.com/repos/consolidation/self-update/zipball/dba6b2c0708f20fa3ba8008a2353b637578849b4",
348
- "reference": "dba6b2c0708f20fa3ba8008a2353b637578849b4",
349
  "shasum": ""
350
  },
351
  "require": {
352
- "php": ">=5.5.0",
353
- "symfony/console": "^2.8|^3|^4|^5",
354
- "symfony/filesystem": "^2.5|^3|^4|^5"
355
  },
356
- "bin": [
357
- "scripts/release"
358
- ],
359
  "type": "library",
360
- "extra": {
361
- "branch-alias": {
362
- "dev-master": "1.x-dev"
363
- }
364
- },
365
  "autoload": {
366
- "psr-4": {
367
- "SelfUpdate\\": "src"
368
- }
369
  },
370
  "notification-url": "https://packagist.org/downloads/",
371
  "license": [
@@ -373,89 +354,116 @@
373
  ],
374
  "authors": [
375
  {
376
- "name": "Alexander Menk",
377
- "email": "menk@mestrona.net"
 
378
  },
379
  {
380
- "name": "Greg Anderson",
381
- "email": "greg.1.anderson@greenknowe.org"
 
 
 
382
  }
383
  ],
384
- "description": "Provides a self:update command for Symfony Console applications.",
 
 
 
 
385
  "support": {
386
- "issues": "https://github.com/consolidation/self-update/issues",
387
- "source": "https://github.com/consolidation/self-update/tree/1.2.0"
388
  },
389
- "time": "2020-04-13T02:49:20+00:00"
390
  },
391
  {
392
- "name": "container-interop/container-interop",
393
- "version": "1.2.0",
394
  "source": {
395
  "type": "git",
396
- "url": "https://github.com/container-interop/container-interop.git",
397
- "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
398
  },
399
  "dist": {
400
  "type": "zip",
401
- "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8",
402
- "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
403
  "shasum": ""
404
  },
405
  "require": {
406
- "psr/container": "^1.0"
 
 
 
 
 
 
 
 
 
 
 
 
407
  },
408
  "type": "library",
409
  "autoload": {
410
- "psr-4": {
411
- "Interop\\Container\\": "src/Interop/Container/"
412
- }
413
  },
414
  "notification-url": "https://packagist.org/downloads/",
415
  "license": [
416
  "MIT"
417
  ],
418
- "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
419
- "homepage": "https://github.com/container-interop/container-interop",
 
 
 
 
 
 
 
 
 
 
 
 
 
420
  "support": {
421
- "issues": "https://github.com/container-interop/container-interop/issues",
422
- "source": "https://github.com/container-interop/container-interop/tree/master"
423
  },
424
- "abandoned": "psr/container",
425
- "time": "2017-02-14T19:40:03+00:00"
426
  },
427
  {
428
- "name": "dealerdirect/phpcodesniffer-composer-installer",
429
- "version": "v0.7.1",
430
  "source": {
431
  "type": "git",
432
- "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git",
433
- "reference": "fe390591e0241955f22eb9ba327d137e501c771c"
434
  },
435
  "dist": {
436
  "type": "zip",
437
- "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/fe390591e0241955f22eb9ba327d137e501c771c",
438
- "reference": "fe390591e0241955f22eb9ba327d137e501c771c",
439
  "shasum": ""
440
  },
441
  "require": {
442
- "composer-plugin-api": "^1.0 || ^2.0",
443
- "php": ">=5.3",
444
- "squizlabs/php_codesniffer": "^2.0 || ^3.0 || ^4.0"
445
- },
446
- "require-dev": {
447
- "composer/composer": "*",
448
- "phpcompatibility/php-compatibility": "^9.0",
449
- "sensiolabs/security-checker": "^4.1.0"
450
  },
451
- "type": "composer-plugin",
452
- "extra": {
453
- "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
454
  },
 
455
  "autoload": {
456
- "psr-4": {
457
- "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
458
- }
459
  },
460
  "notification-url": "https://packagist.org/downloads/",
461
  "license": [
@@ -463,64 +471,55 @@
463
  ],
464
  "authors": [
465
  {
466
- "name": "Franck Nijhof",
467
- "email": "franck.nijhof@dealerdirect.com",
468
- "homepage": "http://www.frenck.nl",
469
- "role": "Developer / IT Manager"
 
 
 
 
470
  }
471
  ],
472
- "description": "PHP_CodeSniffer Standards Composer Installer Plugin",
473
- "homepage": "http://www.dealerdirect.com",
474
  "keywords": [
475
- "PHPCodeSniffer",
476
- "PHP_CodeSniffer",
477
- "code quality",
478
- "codesniffer",
479
- "composer",
480
- "installer",
481
- "phpcs",
482
- "plugin",
483
- "qa",
484
- "quality",
485
- "standard",
486
- "standards",
487
- "style guide",
488
- "stylecheck",
489
- "tests"
490
  ],
491
  "support": {
492
- "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues",
493
- "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer"
494
  },
495
- "time": "2020-12-07T18:04:37+00:00"
496
  },
497
  {
498
- "name": "dflydev/dot-access-data",
499
- "version": "v1.1.0",
500
  "source": {
501
  "type": "git",
502
- "url": "https://github.com/dflydev/dflydev-dot-access-data.git",
503
- "reference": "3fbd874921ab2c041e899d044585a2ab9795df8a"
504
  },
505
  "dist": {
506
  "type": "zip",
507
- "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/3fbd874921ab2c041e899d044585a2ab9795df8a",
508
- "reference": "3fbd874921ab2c041e899d044585a2ab9795df8a",
509
  "shasum": ""
510
  },
511
  "require": {
512
- "php": ">=5.3.2"
 
513
  },
514
- "type": "library",
515
- "extra": {
516
- "branch-alias": {
517
- "dev-master": "1.0-dev"
518
- }
519
  },
 
520
  "autoload": {
521
- "psr-0": {
522
- "Dflydev\\DotAccessData": "src"
523
- }
524
  },
525
  "notification-url": "https://packagist.org/downloads/",
526
  "license": [
@@ -528,69 +527,46 @@
528
  ],
529
  "authors": [
530
  {
531
- "name": "Dragonfly Development Inc.",
532
- "email": "info@dflydev.com",
533
- "homepage": "http://dflydev.com"
534
- },
535
- {
536
- "name": "Beau Simensen",
537
- "email": "beau@dflydev.com",
538
- "homepage": "http://beausimensen.com"
539
- },
540
- {
541
- "name": "Carlos Frutos",
542
- "email": "carlos@kiwing.it",
543
- "homepage": "https://github.com/cfrutos"
544
  }
545
  ],
546
- "description": "Given a deep data structure, access data by dot notation.",
547
- "homepage": "https://github.com/dflydev/dflydev-dot-access-data",
548
  "keywords": [
549
- "access",
550
- "data",
551
- "dot",
552
- "notation"
553
  ],
554
  "support": {
555
- "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
556
- "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/master"
557
  },
558
- "time": "2017-01-20T21:14:22+00:00"
559
  },
560
  {
561
- "name": "grasmash/expander",
562
- "version": "1.0.0",
563
  "source": {
564
  "type": "git",
565
- "url": "https://github.com/grasmash/expander.git",
566
- "reference": "95d6037344a4be1dd5f8e0b0b2571a28c397578f"
567
  },
568
  "dist": {
569
  "type": "zip",
570
- "url": "https://api.github.com/repos/grasmash/expander/zipball/95d6037344a4be1dd5f8e0b0b2571a28c397578f",
571
- "reference": "95d6037344a4be1dd5f8e0b0b2571a28c397578f",
572
  "shasum": ""
573
  },
574
  "require": {
575
- "dflydev/dot-access-data": "^1.1.0",
576
- "php": ">=5.4"
577
  },
578
- "require-dev": {
579
- "greg-1-anderson/composer-test-scenarios": "^1",
580
- "phpunit/phpunit": "^4|^5.5.4",
581
- "satooshi/php-coveralls": "^1.0.2|dev-master",
582
- "squizlabs/php_codesniffer": "^2.7"
583
  },
584
  "type": "library",
585
- "extra": {
586
- "branch-alias": {
587
- "dev-master": "1.x-dev"
588
- }
589
- },
590
  "autoload": {
591
- "psr-4": {
592
- "Grasmash\\Expander\\": "src/"
593
- }
594
  },
595
  "notification-url": "https://packagist.org/downloads/",
596
  "license": [
@@ -598,57 +574,52 @@
598
  ],
599
  "authors": [
600
  {
601
- "name": "Matthew Grasmick"
 
 
 
602
  }
603
  ],
604
- "description": "Expands internal property references in PHP arrays file.",
 
 
 
 
 
 
605
  "support": {
606
- "issues": "https://github.com/grasmash/expander/issues",
607
- "source": "https://github.com/grasmash/expander/tree/master"
608
  },
609
- "time": "2017-12-21T22:14:55+00:00"
610
  },
611
  {
612
- "name": "league/container",
613
- "version": "2.5.0",
614
  "source": {
615
  "type": "git",
616
- "url": "https://github.com/thephpleague/container.git",
617
- "reference": "8438dc47a0674e3378bcce893a0a04d79a2c22b3"
618
  },
619
  "dist": {
620
  "type": "zip",
621
- "url": "https://api.github.com/repos/thephpleague/container/zipball/8438dc47a0674e3378bcce893a0a04d79a2c22b3",
622
- "reference": "8438dc47a0674e3378bcce893a0a04d79a2c22b3",
623
  "shasum": ""
624
  },
625
  "require": {
626
- "container-interop/container-interop": "^1.2",
627
- "php": "^5.4 || ^7.0 || ^8.0"
628
- },
629
- "provide": {
630
- "container-interop/container-interop-implementation": "^1.2",
631
- "psr/container-implementation": "^1.0"
632
- },
633
- "replace": {
634
- "orno/di": "~2.0"
635
  },
636
- "require-dev": {
637
- "phpunit/phpunit": "^4.8.36",
638
- "scrutinizer/ocular": "^1.3",
639
- "squizlabs/php_codesniffer": "^3.5"
640
  },
641
  "type": "library",
642
- "extra": {
643
- "branch-alias": {
644
- "dev-2.x": "2.x-dev",
645
- "dev-1.x": "1.x-dev"
646
- }
647
- },
648
  "autoload": {
649
- "psr-4": {
650
- "League\\Container\\": "src"
651
- }
652
  },
653
  "notification-url": "https://packagist.org/downloads/",
654
  "license": [
@@ -656,76 +627,58 @@
656
  ],
657
  "authors": [
658
  {
659
- "name": "Phil Bennett",
660
- "email": "philipobenito@gmail.com",
661
- "homepage": "http://www.philipobenito.com",
662
- "role": "Developer"
663
  }
664
  ],
665
- "description": "A fast and intuitive dependency injection container.",
666
- "homepage": "https://github.com/thephpleague/container",
667
  "keywords": [
668
- "container",
669
- "dependency",
670
- "di",
671
- "injection",
672
- "league",
673
- "provider",
674
- "service"
675
  ],
676
  "support": {
677
- "issues": "https://github.com/thephpleague/container/issues",
678
- "source": "https://github.com/thephpleague/container/tree/2.5.0"
679
  },
680
- "funding": [
681
- {
682
- "url": "https://github.com/philipobenito",
683
- "type": "github"
684
- }
685
- ],
686
- "time": "2021-02-22T09:20:06+00:00"
687
  },
688
  {
689
- "name": "nelexa/zip",
690
- "version": "3.3.3",
691
  "source": {
692
  "type": "git",
693
- "url": "https://github.com/Ne-Lexa/php-zip.git",
694
- "reference": "501b52f6fc393a599b44ff348a42740e1eaac7c6"
695
  },
696
  "dist": {
697
  "type": "zip",
698
- "url": "https://api.github.com/repos/Ne-Lexa/php-zip/zipball/501b52f6fc393a599b44ff348a42740e1eaac7c6",
699
- "reference": "501b52f6fc393a599b44ff348a42740e1eaac7c6",
700
  "shasum": ""
701
  },
702
  "require": {
703
- "ext-zlib": "*",
704
- "paragonie/random_compat": "*",
705
- "php": "^5.5.9 || ^7.0",
706
- "psr/http-message": "^1.0",
707
- "symfony/finder": "^3.0|^4.0|^5.0"
 
 
708
  },
709
  "require-dev": {
710
- "ext-bz2": "*",
711
- "ext-fileinfo": "*",
712
- "ext-openssl": "*",
713
- "ext-xml": "*",
714
- "guzzlehttp/psr7": "^1.6",
715
- "phpunit/phpunit": "^4.8|^5.7",
716
- "symfony/var-dumper": "^3.0|^4.0|^5.0"
717
  },
718
  "suggest": {
719
- "ext-bz2": "Needed to support BZIP2 compression",
720
- "ext-fileinfo": "Needed to get mime-type file",
721
- "ext-mcrypt": "Needed to support encrypt zip entries or use ext-openssl",
722
- "ext-openssl": "Needed to support encrypt zip entries or use ext-mcrypt"
723
  },
724
  "type": "library",
725
  "autoload": {
726
- "psr-4": {
727
- "PhpZip\\": "src/"
728
- }
729
  },
730
  "notification-url": "https://packagist.org/downloads/",
731
  "license": [
@@ -733,161 +686,162 @@
733
  ],
734
  "authors": [
735
  {
736
- "name": "Ne-Lexa",
737
- "email": "alexey@nelexa.ru",
738
- "role": "Developer"
 
739
  }
740
  ],
741
- "description": "PhpZip is a php-library for extended work with ZIP-archives. Open, create, update, delete, extract and get info tool. Supports appending to existing ZIP files, WinZip AES encryption, Traditional PKWARE Encryption, ZipAlign tool, BZIP2 compression, external file attributes and ZIP64 extensions. Alternative ZipArchive. It does not require php-zip extension.",
742
- "homepage": "https://github.com/Ne-Lexa/php-zip",
743
  "keywords": [
744
- "archive",
745
- "extract",
746
- "unzip",
747
- "winzip",
748
- "zip",
749
- "zipalign",
750
- "ziparchive"
751
  ],
752
  "support": {
753
- "issues": "https://github.com/Ne-Lexa/php-zip/issues",
754
- "source": "https://github.com/Ne-Lexa/php-zip/tree/3.3.3"
755
  },
756
- "time": "2020-07-11T21:01:42+00:00"
757
  },
758
  {
759
- "name": "paragonie/random_compat",
760
- "version": "v9.99.100",
761
  "source": {
762
  "type": "git",
763
- "url": "https://github.com/paragonie/random_compat.git",
764
- "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
765
  },
766
  "dist": {
767
  "type": "zip",
768
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
769
- "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
770
  "shasum": ""
771
  },
772
  "require": {
773
- "php": ">= 7"
 
 
 
774
  },
775
  "require-dev": {
776
- "phpunit/phpunit": "4.*|5.*",
777
- "vimeo/psalm": "^1"
778
  },
779
  "suggest": {
780
- "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
781
  },
782
  "type": "library",
 
 
 
 
 
783
  "notification-url": "https://packagist.org/downloads/",
784
  "license": [
785
  "MIT"
786
  ],
787
  "authors": [
788
  {
789
- "name": "Paragon Initiative Enterprises",
790
- "email": "security@paragonie.com",
791
- "homepage": "https://paragonie.com"
792
  }
793
  ],
794
- "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
 
795
  "keywords": [
796
- "csprng",
797
- "polyfill",
798
- "pseudorandom",
799
- "random"
800
  ],
801
  "support": {
802
- "email": "info@paragonie.com",
803
- "issues": "https://github.com/paragonie/random_compat/issues",
804
- "source": "https://github.com/paragonie/random_compat"
805
  },
806
- "time": "2020-10-15T08:29:30+00:00"
807
  },
808
  {
809
- "name": "phpcompatibility/php-compatibility",
810
- "version": "9.3.5",
811
  "source": {
812
  "type": "git",
813
- "url": "https://github.com/PHPCompatibility/PHPCompatibility.git",
814
- "reference": "9fb324479acf6f39452e0655d2429cc0d3914243"
815
  },
816
  "dist": {
817
  "type": "zip",
818
- "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243",
819
- "reference": "9fb324479acf6f39452e0655d2429cc0d3914243",
820
  "shasum": ""
821
  },
822
  "require": {
823
- "php": ">=5.3",
824
- "squizlabs/php_codesniffer": "^2.3 || ^3.0.2"
825
- },
826
- "conflict": {
827
- "squizlabs/php_codesniffer": "2.6.2"
828
- },
829
- "require-dev": {
830
- "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0"
831
  },
832
  "suggest": {
833
- "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.",
834
- "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues."
 
 
 
 
 
835
  },
836
- "type": "phpcodesniffer-standard",
837
  "notification-url": "https://packagist.org/downloads/",
838
  "license": [
839
- "LGPL-3.0-or-later"
840
  ],
841
  "authors": [
842
  {
843
- "name": "Wim Godden",
844
- "homepage": "https://github.com/wimg",
845
- "role": "lead"
846
  },
847
  {
848
- "name": "Juliette Reinders Folmer",
849
- "homepage": "https://github.com/jrfnl",
850
- "role": "lead"
851
  },
852
  {
853
- "name": "Contributors",
854
- "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors"
855
  }
856
  ],
857
- "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.",
858
- "homepage": "http://techblog.wimgodden.be/tag/codesniffer/",
859
  "keywords": [
860
- "compatibility",
861
- "phpcs",
862
- "standards"
863
  ],
864
  "support": {
865
- "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues",
866
- "source": "https://github.com/PHPCompatibility/PHPCompatibility"
867
  },
868
- "time": "2019-12-27T09:44:58+00:00"
869
  },
870
  {
871
- "name": "psr/container",
872
- "version": "1.1.1",
873
  "source": {
874
  "type": "git",
875
- "url": "https://github.com/php-fig/container.git",
876
- "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
877
  },
878
  "dist": {
879
  "type": "zip",
880
- "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
881
- "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
882
  "shasum": ""
883
  },
884
  "require": {
885
- "php": ">=7.2.0"
 
 
 
 
 
 
886
  },
887
  "type": "library",
888
  "autoload": {
889
  "psr-4": {
890
- "Psr\\Container\\": "src/"
891
  }
892
  },
893
  "notification-url": "https://packagist.org/downloads/",
@@ -896,102 +850,73 @@
896
  ],
897
  "authors": [
898
  {
899
- "name": "PHP-FIG",
900
- "homepage": "https://www.php-fig.org/"
 
 
 
901
  }
902
  ],
903
- "description": "Common Container Interface (PHP FIG PSR-11)",
904
- "homepage": "https://github.com/php-fig/container",
905
- "keywords": [
906
- "PSR-11",
907
- "container",
908
- "container-interface",
909
- "container-interop",
910
- "psr"
911
- ],
912
  "support": {
913
- "issues": "https://github.com/php-fig/container/issues",
914
- "source": "https://github.com/php-fig/container/tree/1.1.1"
915
  },
916
- "time": "2021-03-05T17:36:06+00:00"
917
  },
918
  {
919
- "name": "psr/event-dispatcher",
920
- "version": "1.0.0",
921
  "source": {
922
  "type": "git",
923
- "url": "https://github.com/php-fig/event-dispatcher.git",
924
- "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
925
  },
926
  "dist": {
927
  "type": "zip",
928
- "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
929
- "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
930
  "shasum": ""
931
  },
932
  "require": {
933
- "php": ">=7.2.0"
934
  },
935
  "type": "library",
936
- "extra": {
937
- "branch-alias": {
938
- "dev-master": "1.0.x-dev"
939
- }
940
- },
941
  "autoload": {
942
  "psr-4": {
943
- "Psr\\EventDispatcher\\": "src/"
944
  }
945
  },
946
  "notification-url": "https://packagist.org/downloads/",
947
  "license": [
948
  "MIT"
949
  ],
950
- "authors": [
951
- {
952
- "name": "PHP-FIG",
953
- "homepage": "http://www.php-fig.org/"
954
- }
955
- ],
956
- "description": "Standard interfaces for event handling.",
957
- "keywords": [
958
- "events",
959
- "psr",
960
- "psr-14"
961
- ],
962
  "support": {
963
- "issues": "https://github.com/php-fig/event-dispatcher/issues",
964
- "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
965
  },
966
- "time": "2019-01-08T18:20:26+00:00"
967
  },
968
  {
969
- "name": "psr/http-message",
970
- "version": "1.0.1",
971
  "source": {
972
  "type": "git",
973
- "url": "https://github.com/php-fig/http-message.git",
974
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
975
  },
976
  "dist": {
977
  "type": "zip",
978
- "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
979
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
980
  "shasum": ""
981
  },
982
- "require": {
983
- "php": ">=5.3.0"
984
- },
985
  "type": "library",
986
- "extra": {
987
- "branch-alias": {
988
- "dev-master": "1.0.x-dev"
989
- }
990
- },
991
  "autoload": {
992
- "psr-4": {
993
- "Psr\\Http\\Message\\": "src/"
994
- }
995
  },
996
  "notification-url": "https://packagist.org/downloads/",
997
  "license": [
@@ -999,51 +924,47 @@
999
  ],
1000
  "authors": [
1001
  {
1002
- "name": "PHP-FIG",
1003
- "homepage": "http://www.php-fig.org/"
1004
  }
1005
  ],
1006
- "description": "Common interface for HTTP messages",
1007
- "homepage": "https://github.com/php-fig/http-message",
1008
- "keywords": [
1009
- "http",
1010
- "http-message",
1011
- "psr",
1012
- "psr-7",
1013
- "request",
1014
- "response"
1015
- ],
1016
  "support": {
1017
- "source": "https://github.com/php-fig/http-message/tree/master"
 
1018
  },
1019
- "time": "2016-08-06T14:39:51+00:00"
1020
  },
1021
  {
1022
- "name": "psr/log",
1023
- "version": "1.1.4",
1024
  "source": {
1025
  "type": "git",
1026
- "url": "https://github.com/php-fig/log.git",
1027
- "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
1028
  },
1029
  "dist": {
1030
  "type": "zip",
1031
- "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
1032
- "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
1033
  "shasum": ""
1034
  },
1035
  "require": {
1036
- "php": ">=5.3.0"
 
 
 
 
1037
  },
1038
  "type": "library",
1039
  "extra": {
1040
  "branch-alias": {
1041
- "dev-master": "1.1.x-dev"
1042
  }
1043
  },
1044
  "autoload": {
1045
  "psr-4": {
1046
- "Psr\\Log\\": "Psr/Log/"
1047
  }
1048
  },
1049
  "notification-url": "https://packagist.org/downloads/",
@@ -1052,171 +973,5748 @@
1052
  ],
1053
  "authors": [
1054
  {
1055
- "name": "PHP-FIG",
1056
- "homepage": "https://www.php-fig.org/"
 
 
 
 
 
 
 
 
 
 
 
1057
  }
1058
  ],
1059
- "description": "Common interface for logging libraries",
1060
- "homepage": "https://github.com/php-fig/log",
1061
  "keywords": [
1062
- "log",
1063
- "psr",
1064
- "psr-3"
 
1065
  ],
1066
  "support": {
1067
- "source": "https://github.com/php-fig/log/tree/1.1.4"
 
 
1068
  },
1069
- "time": "2021-05-03T11:20:27+00:00"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1070
  },
1071
  {
1072
- "name": "publishpress/publishpress-plugin-builder",
1073
- "version": "v1.3.3",
1074
  "source": {
1075
  "type": "git",
1076
- "url": "https://github.com/publishpress/PublishPress-Plugin-Builder",
1077
- "reference": "9496b6042d4461b884ea1d7d75a2b6246fb88665"
 
 
 
 
 
 
1078
  },
1079
  "require": {
1080
- "consolidation/robo": "^2.0",
1081
- "nelexa/zip": "^3.3",
1082
- "php": "~7.3",
1083
- "symfony/yaml": "^4"
1084
  },
1085
  "require-dev": {
1086
- "codeception/codeception": "^4.0",
1087
- "codeception/module-asserts": "^1.0.0",
1088
- "phpmd/phpmd": "^2.8",
1089
- "phpmetrics/phpmetrics": "^2.7",
1090
- "squizlabs/php_codesniffer": "^3.5"
1091
  },
1092
  "type": "library",
1093
  "autoload": {
1094
  "psr-4": {
1095
- "PublishPressBuilder\\": "src/"
1096
  }
1097
  },
 
1098
  "license": [
1099
- "GPL-2.0-or-later"
1100
  ],
1101
  "authors": [
1102
  {
1103
- "name": "PublishPress",
1104
- "email": "help@publishpress.com"
1105
  }
1106
  ],
1107
- "description": "Robo tasks for building WordPress plugins",
1108
- "time": "2021-07-12T16:44:13+00:00"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1109
  },
1110
  {
1111
- "name": "squizlabs/php_codesniffer",
1112
- "version": "3.6.0",
1113
  "source": {
1114
  "type": "git",
1115
- "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
1116
- "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625"
1117
  },
1118
  "dist": {
1119
  "type": "zip",
1120
- "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625",
1121
- "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625",
1122
  "shasum": ""
1123
  },
1124
  "require": {
1125
- "ext-simplexml": "*",
1126
- "ext-tokenizer": "*",
1127
- "ext-xmlwriter": "*",
1128
- "php": ">=5.4.0"
 
 
1129
  },
1130
  "require-dev": {
1131
- "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
 
 
1132
  },
1133
- "bin": [
1134
- "bin/phpcs",
1135
- "bin/phpcbf"
1136
- ],
1137
  "type": "library",
1138
  "extra": {
1139
  "branch-alias": {
1140
- "dev-master": "3.x-dev"
 
 
 
 
 
1141
  }
1142
  },
1143
  "notification-url": "https://packagist.org/downloads/",
1144
  "license": [
1145
- "BSD-3-Clause"
1146
  ],
1147
  "authors": [
1148
  {
1149
- "name": "Greg Sherwood",
1150
- "role": "lead"
1151
  }
1152
  ],
1153
- "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
1154
- "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
1155
- "keywords": [
1156
- "phpcs",
1157
- "standards"
1158
- ],
1159
  "support": {
1160
- "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
1161
- "source": "https://github.com/squizlabs/PHP_CodeSniffer",
1162
- "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
1163
  },
1164
- "time": "2021-04-09T00:54:41+00:00"
1165
  },
1166
  {
1167
- "name": "symfony/console",
1168
- "version": "v5.1.11",
1169
  "source": {
1170
  "type": "git",
1171
- "url": "https://github.com/symfony/console.git",
1172
- "reference": "d9a267b621c5082e0a6c659d73633b6fd28a8a08"
1173
  },
1174
  "dist": {
1175
  "type": "zip",
1176
- "url": "https://api.github.com/repos/symfony/console/zipball/d9a267b621c5082e0a6c659d73633b6fd28a8a08",
1177
- "reference": "d9a267b621c5082e0a6c659d73633b6fd28a8a08",
1178
  "shasum": ""
1179
  },
1180
  "require": {
1181
- "php": ">=7.2.5",
1182
- "symfony/polyfill-mbstring": "~1.0",
1183
- "symfony/polyfill-php73": "^1.8",
1184
- "symfony/polyfill-php80": "^1.15",
1185
- "symfony/service-contracts": "^1.1|^2",
1186
- "symfony/string": "^5.1"
1187
- },
1188
- "conflict": {
1189
- "symfony/dependency-injection": "<4.4",
1190
- "symfony/dotenv": "<5.1",
1191
- "symfony/event-dispatcher": "<4.4",
1192
- "symfony/lock": "<4.4",
1193
- "symfony/process": "<4.4"
1194
- },
1195
- "provide": {
1196
- "psr/log-implementation": "1.0"
1197
  },
1198
  "require-dev": {
1199
- "psr/log": "~1.0",
1200
- "symfony/config": "^4.4|^5.0",
1201
- "symfony/dependency-injection": "^4.4|^5.0",
1202
- "symfony/event-dispatcher": "^4.4|^5.0",
1203
- "symfony/lock": "^4.4|^5.0",
1204
- "symfony/process": "^4.4|^5.0",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1205
  "symfony/var-dumper": "^4.4|^5.0"
1206
  },
1207
  "suggest": {
1208
- "psr/log": "For using the console logger",
1209
- "symfony/event-dispatcher": "",
1210
- "symfony/lock": "",
1211
- "symfony/process": ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1212
  },
1213
  "type": "library",
 
 
 
 
 
 
 
 
 
1214
  "autoload": {
1215
  "psr-4": {
1216
- "Symfony\\Component\\Console\\": ""
1217
  },
1218
- "exclude-from-classmap": [
1219
- "/Tests/"
1220
  ]
1221
  },
1222
  "notification-url": "https://packagist.org/downloads/",
@@ -1225,18 +6723,26 @@
1225
  ],
1226
  "authors": [
1227
  {
1228
- "name": "Fabien Potencier",
1229
- "email": "fabien@symfony.com"
1230
  },
1231
  {
1232
  "name": "Symfony Community",
1233
  "homepage": "https://symfony.com/contributors"
1234
  }
1235
  ],
1236
- "description": "Eases the creation of beautiful and testable command line interfaces",
1237
  "homepage": "https://symfony.com",
 
 
 
 
 
 
 
 
1238
  "support": {
1239
- "source": "https://github.com/symfony/console/tree/v5.1.11"
1240
  },
1241
  "funding": [
1242
  {
@@ -1252,38 +6758,47 @@
1252
  "type": "tidelift"
1253
  }
1254
  ],
1255
- "time": "2021-01-27T10:01:46+00:00"
1256
  },
1257
  {
1258
- "name": "symfony/deprecation-contracts",
1259
- "version": "v2.4.0",
1260
  "source": {
1261
  "type": "git",
1262
- "url": "https://github.com/symfony/deprecation-contracts.git",
1263
- "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627"
1264
  },
1265
  "dist": {
1266
  "type": "zip",
1267
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627",
1268
- "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627",
1269
  "shasum": ""
1270
  },
1271
  "require": {
1272
  "php": ">=7.1"
1273
  },
 
 
 
1274
  "type": "library",
1275
  "extra": {
1276
  "branch-alias": {
1277
- "dev-main": "2.4-dev"
1278
  },
1279
  "thanks": {
1280
- "name": "symfony/contracts",
1281
- "url": "https://github.com/symfony/contracts"
1282
  }
1283
  },
1284
  "autoload": {
 
 
 
1285
  "files": [
1286
- "function.php"
 
 
 
1287
  ]
1288
  },
1289
  "notification-url": "https://packagist.org/downloads/",
@@ -1300,10 +6815,18 @@
1300
  "homepage": "https://symfony.com/contributors"
1301
  }
1302
  ],
1303
- "description": "A generic function and convention to trigger deprecation notices",
1304
  "homepage": "https://symfony.com",
 
 
 
 
 
 
 
 
1305
  "support": {
1306
- "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0"
1307
  },
1308
  "funding": [
1309
  {
@@ -1319,56 +6842,203 @@
1319
  "type": "tidelift"
1320
  }
1321
  ],
1322
- "time": "2021-03-23T23:28:01+00:00"
1323
  },
1324
  {
1325
- "name": "symfony/event-dispatcher",
1326
- "version": "v5.3.7",
1327
  "source": {
1328
  "type": "git",
1329
- "url": "https://github.com/symfony/event-dispatcher.git",
1330
- "reference": "ce7b20d69c66a20939d8952b617506a44d102130"
1331
  },
1332
  "dist": {
1333
  "type": "zip",
1334
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ce7b20d69c66a20939d8952b617506a44d102130",
1335
- "reference": "ce7b20d69c66a20939d8952b617506a44d102130",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1336
  "shasum": ""
1337
  },
1338
  "require": {
1339
- "php": ">=7.2.5",
1340
- "symfony/deprecation-contracts": "^2.1",
1341
- "symfony/event-dispatcher-contracts": "^2",
1342
- "symfony/polyfill-php80": "^1.16"
1343
- },
1344
- "conflict": {
1345
- "symfony/dependency-injection": "<4.4"
1346
- },
1347
- "provide": {
1348
- "psr/event-dispatcher-implementation": "1.0",
1349
- "symfony/event-dispatcher-implementation": "2.0"
1350
- },
1351
- "require-dev": {
1352
- "psr/log": "^1|^2|^3",
1353
- "symfony/config": "^4.4|^5.0",
1354
- "symfony/dependency-injection": "^4.4|^5.0",
1355
- "symfony/error-handler": "^4.4|^5.0",
1356
- "symfony/expression-language": "^4.4|^5.0",
1357
- "symfony/http-foundation": "^4.4|^5.0",
1358
- "symfony/service-contracts": "^1.1|^2",
1359
- "symfony/stopwatch": "^4.4|^5.0"
1360
- },
1361
- "suggest": {
1362
- "symfony/dependency-injection": "",
1363
- "symfony/http-kernel": ""
1364
  },
1365
  "type": "library",
 
 
 
 
 
 
 
 
 
1366
  "autoload": {
1367
  "psr-4": {
1368
- "Symfony\\Component\\EventDispatcher\\": ""
1369
  },
1370
- "exclude-from-classmap": [
1371
- "/Tests/"
 
 
 
1372
  ]
1373
  },
1374
  "notification-url": "https://packagist.org/downloads/",
@@ -1377,18 +7047,28 @@
1377
  ],
1378
  "authors": [
1379
  {
1380
- "name": "Fabien Potencier",
1381
- "email": "fabien@symfony.com"
 
 
 
 
1382
  },
1383
  {
1384
  "name": "Symfony Community",
1385
  "homepage": "https://symfony.com/contributors"
1386
  }
1387
  ],
1388
- "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
1389
  "homepage": "https://symfony.com",
 
 
 
 
 
 
1390
  "support": {
1391
- "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.7"
1392
  },
1393
  "funding": [
1394
  {
@@ -1404,43 +7084,45 @@
1404
  "type": "tidelift"
1405
  }
1406
  ],
1407
- "time": "2021-08-04T21:20:46+00:00"
1408
  },
1409
  {
1410
- "name": "symfony/event-dispatcher-contracts",
1411
- "version": "v2.4.0",
1412
  "source": {
1413
  "type": "git",
1414
- "url": "https://github.com/symfony/event-dispatcher-contracts.git",
1415
- "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11"
1416
  },
1417
  "dist": {
1418
  "type": "zip",
1419
- "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11",
1420
- "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11",
1421
  "shasum": ""
1422
  },
1423
  "require": {
1424
- "php": ">=7.2.5",
1425
- "psr/event-dispatcher": "^1"
1426
- },
1427
- "suggest": {
1428
- "symfony/event-dispatcher-implementation": ""
1429
  },
1430
  "type": "library",
1431
  "extra": {
1432
  "branch-alias": {
1433
- "dev-main": "2.4-dev"
1434
  },
1435
  "thanks": {
1436
- "name": "symfony/contracts",
1437
- "url": "https://github.com/symfony/contracts"
1438
  }
1439
  },
1440
  "autoload": {
1441
  "psr-4": {
1442
- "Symfony\\Contracts\\EventDispatcher\\": ""
1443
- }
 
 
 
 
 
 
1444
  },
1445
  "notification-url": "https://packagist.org/downloads/",
1446
  "license": [
@@ -1456,18 +7138,16 @@
1456
  "homepage": "https://symfony.com/contributors"
1457
  }
1458
  ],
1459
- "description": "Generic abstractions related to dispatching event",
1460
  "homepage": "https://symfony.com",
1461
  "keywords": [
1462
- "abstractions",
1463
- "contracts",
1464
- "decoupling",
1465
- "interfaces",
1466
- "interoperability",
1467
- "standards"
1468
  ],
1469
  "support": {
1470
- "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0"
1471
  },
1472
  "funding": [
1473
  {
@@ -1483,31 +7163,30 @@
1483
  "type": "tidelift"
1484
  }
1485
  ],
1486
- "time": "2021-03-23T23:28:01+00:00"
1487
  },
1488
  {
1489
- "name": "symfony/filesystem",
1490
- "version": "v5.3.4",
1491
  "source": {
1492
  "type": "git",
1493
- "url": "https://github.com/symfony/filesystem.git",
1494
- "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32"
1495
  },
1496
  "dist": {
1497
  "type": "zip",
1498
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32",
1499
- "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32",
1500
  "shasum": ""
1501
  },
1502
  "require": {
1503
  "php": ">=7.2.5",
1504
- "symfony/polyfill-ctype": "~1.8",
1505
  "symfony/polyfill-php80": "^1.16"
1506
  },
1507
  "type": "library",
1508
  "autoload": {
1509
  "psr-4": {
1510
- "Symfony\\Component\\Filesystem\\": ""
1511
  },
1512
  "exclude-from-classmap": [
1513
  "/Tests/"
@@ -1527,10 +7206,10 @@
1527
  "homepage": "https://symfony.com/contributors"
1528
  }
1529
  ],
1530
- "description": "Provides basic utilities for the filesystem",
1531
  "homepage": "https://symfony.com",
1532
  "support": {
1533
- "source": "https://github.com/symfony/filesystem/tree/v5.3.4"
1534
  },
1535
  "funding": [
1536
  {
@@ -1546,34 +7225,43 @@
1546
  "type": "tidelift"
1547
  }
1548
  ],
1549
- "time": "2021-07-21T12:40:44+00:00"
1550
  },
1551
  {
1552
- "name": "symfony/finder",
1553
- "version": "v5.3.7",
1554
  "source": {
1555
  "type": "git",
1556
- "url": "https://github.com/symfony/finder.git",
1557
- "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93"
1558
  },
1559
  "dist": {
1560
  "type": "zip",
1561
- "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93",
1562
- "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93",
1563
  "shasum": ""
1564
  },
1565
  "require": {
1566
  "php": ">=7.2.5",
1567
- "symfony/polyfill-php80": "^1.16"
 
 
 
1568
  },
1569
  "type": "library",
 
 
 
 
 
 
 
 
 
1570
  "autoload": {
1571
  "psr-4": {
1572
- "Symfony\\Component\\Finder\\": ""
1573
- },
1574
- "exclude-from-classmap": [
1575
- "/Tests/"
1576
- ]
1577
  },
1578
  "notification-url": "https://packagist.org/downloads/",
1579
  "license": [
@@ -1581,18 +7269,26 @@
1581
  ],
1582
  "authors": [
1583
  {
1584
- "name": "Fabien Potencier",
1585
- "email": "fabien@symfony.com"
1586
  },
1587
  {
1588
  "name": "Symfony Community",
1589
  "homepage": "https://symfony.com/contributors"
1590
  }
1591
  ],
1592
- "description": "Finds files and directories via an intuitive fluent interface",
1593
  "homepage": "https://symfony.com",
 
 
 
 
 
 
 
 
1594
  "support": {
1595
- "source": "https://github.com/symfony/finder/tree/v5.3.7"
1596
  },
1597
  "funding": [
1598
  {
@@ -1608,44 +7304,46 @@
1608
  "type": "tidelift"
1609
  }
1610
  ],
1611
- "time": "2021-08-04T21:20:46+00:00"
1612
  },
1613
  {
1614
- "name": "symfony/polyfill-ctype",
1615
- "version": "v1.23.0",
1616
  "source": {
1617
  "type": "git",
1618
- "url": "https://github.com/symfony/polyfill-ctype.git",
1619
- "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce"
1620
  },
1621
  "dist": {
1622
  "type": "zip",
1623
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce",
1624
- "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce",
1625
  "shasum": ""
1626
  },
1627
  "require": {
1628
- "php": ">=7.1"
 
 
 
 
 
1629
  },
1630
- "suggest": {
1631
- "ext-ctype": "For best performance"
 
 
 
1632
  },
1633
  "type": "library",
1634
- "extra": {
1635
- "branch-alias": {
1636
- "dev-main": "1.23-dev"
1637
- },
1638
- "thanks": {
1639
- "name": "symfony/polyfill",
1640
- "url": "https://github.com/symfony/polyfill"
1641
- }
1642
- },
1643
  "autoload": {
1644
  "psr-4": {
1645
- "Symfony\\Polyfill\\Ctype\\": ""
1646
  },
1647
  "files": [
1648
- "bootstrap.php"
 
 
 
1649
  ]
1650
  },
1651
  "notification-url": "https://packagist.org/downloads/",
@@ -1654,24 +7352,26 @@
1654
  ],
1655
  "authors": [
1656
  {
1657
- "name": "Gert de Pagter",
1658
- "email": "BackEndTea@gmail.com"
1659
  },
1660
  {
1661
  "name": "Symfony Community",
1662
  "homepage": "https://symfony.com/contributors"
1663
  }
1664
  ],
1665
- "description": "Symfony polyfill for ctype functions",
1666
  "homepage": "https://symfony.com",
1667
  "keywords": [
1668
- "compatibility",
1669
- "ctype",
1670
- "polyfill",
1671
- "portable"
 
 
1672
  ],
1673
  "support": {
1674
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0"
1675
  },
1676
  "funding": [
1677
  {
@@ -1687,44 +7387,66 @@
1687
  "type": "tidelift"
1688
  }
1689
  ],
1690
- "time": "2021-02-19T12:13:01+00:00"
1691
  },
1692
  {
1693
- "name": "symfony/polyfill-intl-grapheme",
1694
- "version": "v1.23.1",
1695
  "source": {
1696
  "type": "git",
1697
- "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
1698
- "reference": "16880ba9c5ebe3642d1995ab866db29270b36535"
1699
  },
1700
  "dist": {
1701
  "type": "zip",
1702
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535",
1703
- "reference": "16880ba9c5ebe3642d1995ab866db29270b36535",
1704
  "shasum": ""
1705
  },
1706
- "require": {
1707
- "php": ">=7.1"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1708
  },
1709
  "suggest": {
1710
- "ext-intl": "For best performance"
 
 
1711
  },
1712
  "type": "library",
1713
- "extra": {
1714
- "branch-alias": {
1715
- "dev-main": "1.23-dev"
1716
- },
1717
- "thanks": {
1718
- "name": "symfony/polyfill",
1719
- "url": "https://github.com/symfony/polyfill"
1720
- }
1721
- },
1722
  "autoload": {
 
 
 
1723
  "psr-4": {
1724
- "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
1725
  },
1726
- "files": [
1727
- "bootstrap.php"
1728
  ]
1729
  },
1730
  "notification-url": "https://packagist.org/downloads/",
@@ -1733,26 +7455,18 @@
1733
  ],
1734
  "authors": [
1735
  {
1736
- "name": "Nicolas Grekas",
1737
- "email": "p@tchwork.com"
1738
  },
1739
  {
1740
  "name": "Symfony Community",
1741
  "homepage": "https://symfony.com/contributors"
1742
  }
1743
  ],
1744
- "description": "Symfony polyfill for intl's grapheme_* functions",
1745
  "homepage": "https://symfony.com",
1746
- "keywords": [
1747
- "compatibility",
1748
- "grapheme",
1749
- "intl",
1750
- "polyfill",
1751
- "portable",
1752
- "shim"
1753
- ],
1754
  "support": {
1755
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1"
1756
  },
1757
  "funding": [
1758
  {
@@ -1768,48 +7482,42 @@
1768
  "type": "tidelift"
1769
  }
1770
  ],
1771
- "time": "2021-05-27T12:26:48+00:00"
1772
  },
1773
  {
1774
- "name": "symfony/polyfill-intl-normalizer",
1775
- "version": "v1.23.0",
1776
  "source": {
1777
  "type": "git",
1778
- "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
1779
- "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8"
1780
  },
1781
  "dist": {
1782
  "type": "zip",
1783
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8",
1784
- "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8",
1785
  "shasum": ""
1786
  },
1787
  "require": {
1788
- "php": ">=7.1"
1789
  },
1790
  "suggest": {
1791
- "ext-intl": "For best performance"
1792
  },
1793
  "type": "library",
1794
  "extra": {
1795
  "branch-alias": {
1796
- "dev-main": "1.23-dev"
1797
  },
1798
  "thanks": {
1799
- "name": "symfony/polyfill",
1800
- "url": "https://github.com/symfony/polyfill"
1801
  }
1802
  },
1803
  "autoload": {
1804
  "psr-4": {
1805
- "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
1806
- },
1807
- "files": [
1808
- "bootstrap.php"
1809
- ],
1810
- "classmap": [
1811
- "Resources/stubs"
1812
- ]
1813
  },
1814
  "notification-url": "https://packagist.org/downloads/",
1815
  "license": [
@@ -1825,18 +7533,18 @@
1825
  "homepage": "https://symfony.com/contributors"
1826
  }
1827
  ],
1828
- "description": "Symfony polyfill for intl's Normalizer class and related functions",
1829
  "homepage": "https://symfony.com",
1830
  "keywords": [
1831
- "compatibility",
1832
- "intl",
1833
- "normalizer",
1834
- "polyfill",
1835
- "portable",
1836
- "shim"
1837
  ],
1838
  "support": {
1839
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0"
1840
  },
1841
  "funding": [
1842
  {
@@ -1852,44 +7560,46 @@
1852
  "type": "tidelift"
1853
  }
1854
  ],
1855
- "time": "2021-02-19T12:13:01+00:00"
1856
  },
1857
  {
1858
- "name": "symfony/polyfill-mbstring",
1859
- "version": "v1.23.1",
1860
  "source": {
1861
  "type": "git",
1862
- "url": "https://github.com/symfony/polyfill-mbstring.git",
1863
- "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6"
1864
  },
1865
  "dist": {
1866
  "type": "zip",
1867
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6",
1868
- "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6",
1869
  "shasum": ""
1870
  },
1871
  "require": {
1872
- "php": ">=7.1"
 
 
 
 
 
 
 
 
1873
  },
1874
  "suggest": {
1875
- "ext-mbstring": "For best performance"
1876
  },
 
 
 
1877
  "type": "library",
1878
- "extra": {
1879
- "branch-alias": {
1880
- "dev-main": "1.23-dev"
1881
- },
1882
- "thanks": {
1883
- "name": "symfony/polyfill",
1884
- "url": "https://github.com/symfony/polyfill"
1885
- }
1886
- },
1887
  "autoload": {
1888
  "psr-4": {
1889
- "Symfony\\Polyfill\\Mbstring\\": ""
1890
  },
1891
- "files": [
1892
- "bootstrap.php"
1893
  ]
1894
  },
1895
  "notification-url": "https://packagist.org/downloads/",
@@ -1898,25 +7608,18 @@
1898
  ],
1899
  "authors": [
1900
  {
1901
- "name": "Nicolas Grekas",
1902
- "email": "p@tchwork.com"
1903
  },
1904
  {
1905
  "name": "Symfony Community",
1906
  "homepage": "https://symfony.com/contributors"
1907
  }
1908
  ],
1909
- "description": "Symfony polyfill for the Mbstring extension",
1910
  "homepage": "https://symfony.com",
1911
- "keywords": [
1912
- "compatibility",
1913
- "mbstring",
1914
- "polyfill",
1915
- "portable",
1916
- "shim"
1917
- ],
1918
  "support": {
1919
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1"
1920
  },
1921
  "funding": [
1922
  {
@@ -1932,124 +7635,130 @@
1932
  "type": "tidelift"
1933
  }
1934
  ],
1935
- "time": "2021-05-27T12:26:48+00:00"
1936
  },
1937
  {
1938
- "name": "symfony/polyfill-php73",
1939
- "version": "v1.23.0",
1940
  "source": {
1941
  "type": "git",
1942
- "url": "https://github.com/symfony/polyfill-php73.git",
1943
- "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010"
1944
  },
1945
  "dist": {
1946
  "type": "zip",
1947
- "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010",
1948
- "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010",
1949
  "shasum": ""
1950
  },
1951
  "require": {
1952
- "php": ">=7.1"
 
 
1953
  },
1954
  "type": "library",
1955
- "extra": {
1956
- "branch-alias": {
1957
- "dev-main": "1.23-dev"
1958
- },
1959
- "thanks": {
1960
- "name": "symfony/polyfill",
1961
- "url": "https://github.com/symfony/polyfill"
 
 
 
 
 
 
 
1962
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1963
  },
 
1964
  "autoload": {
1965
- "psr-4": {
1966
- "Symfony\\Polyfill\\Php73\\": ""
1967
- },
1968
- "files": [
1969
- "bootstrap.php"
1970
- ],
1971
  "classmap": [
1972
- "Resources/stubs"
1973
  ]
1974
  },
1975
  "notification-url": "https://packagist.org/downloads/",
1976
  "license": [
1977
- "MIT"
1978
  ],
1979
  "authors": [
1980
  {
1981
- "name": "Nicolas Grekas",
1982
- "email": "p@tchwork.com"
1983
- },
1984
- {
1985
- "name": "Symfony Community",
1986
- "homepage": "https://symfony.com/contributors"
1987
  }
1988
  ],
1989
- "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
1990
- "homepage": "https://symfony.com",
1991
- "keywords": [
1992
- "compatibility",
1993
- "polyfill",
1994
- "portable",
1995
- "shim"
1996
- ],
1997
  "support": {
1998
- "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0"
 
1999
  },
2000
  "funding": [
2001
  {
2002
- "url": "https://symfony.com/sponsor",
2003
- "type": "custom"
2004
- },
2005
- {
2006
- "url": "https://github.com/fabpot",
2007
  "type": "github"
2008
- },
2009
- {
2010
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2011
- "type": "tidelift"
2012
  }
2013
  ],
2014
- "time": "2021-02-19T12:13:01+00:00"
2015
  },
2016
  {
2017
- "name": "symfony/polyfill-php80",
2018
- "version": "v1.23.1",
2019
  "source": {
2020
  "type": "git",
2021
- "url": "https://github.com/symfony/polyfill-php80.git",
2022
- "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be"
2023
  },
2024
  "dist": {
2025
  "type": "zip",
2026
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be",
2027
- "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be",
2028
  "shasum": ""
2029
  },
2030
  "require": {
2031
- "php": ">=7.1"
2032
  },
2033
- "type": "library",
2034
- "extra": {
2035
- "branch-alias": {
2036
- "dev-main": "1.23-dev"
2037
- },
2038
- "thanks": {
2039
- "name": "symfony/polyfill",
2040
- "url": "https://github.com/symfony/polyfill"
2041
- }
2042
  },
 
2043
  "autoload": {
2044
  "psr-4": {
2045
- "Symfony\\Polyfill\\Php80\\": ""
2046
- },
2047
- "files": [
2048
- "bootstrap.php"
2049
- ],
2050
- "classmap": [
2051
- "Resources/stubs"
2052
- ]
2053
  },
2054
  "notification-url": "https://packagist.org/downloads/",
2055
  "license": [
@@ -2057,141 +7766,132 @@
2057
  ],
2058
  "authors": [
2059
  {
2060
- "name": "Ion Bazan",
2061
- "email": "ion.bazan@gmail.com"
2062
- },
2063
- {
2064
- "name": "Nicolas Grekas",
2065
- "email": "p@tchwork.com"
2066
- },
2067
- {
2068
- "name": "Symfony Community",
2069
- "homepage": "https://symfony.com/contributors"
2070
  }
2071
  ],
2072
- "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
2073
- "homepage": "https://symfony.com",
2074
  "keywords": [
2075
- "compatibility",
2076
- "polyfill",
2077
- "portable",
2078
- "shim"
2079
  ],
2080
  "support": {
2081
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1"
 
2082
  },
2083
  "funding": [
2084
  {
2085
- "url": "https://symfony.com/sponsor",
2086
  "type": "custom"
2087
  },
2088
  {
2089
- "url": "https://github.com/fabpot",
2090
- "type": "github"
 
 
 
 
 
 
 
 
2091
  },
2092
  {
2093
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2094
  "type": "tidelift"
2095
  }
2096
  ],
2097
- "time": "2021-07-28T13:41:28+00:00"
2098
  },
2099
  {
2100
- "name": "symfony/process",
2101
- "version": "v5.3.7",
2102
  "source": {
2103
  "type": "git",
2104
- "url": "https://github.com/symfony/process.git",
2105
- "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967"
2106
  },
2107
  "dist": {
2108
  "type": "zip",
2109
- "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967",
2110
- "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967",
2111
  "shasum": ""
2112
  },
2113
  "require": {
2114
- "php": ">=7.2.5",
2115
- "symfony/polyfill-php80": "^1.16"
 
 
2116
  },
2117
  "type": "library",
2118
  "autoload": {
2119
  "psr-4": {
2120
- "Symfony\\Component\\Process\\": ""
2121
- },
2122
- "exclude-from-classmap": [
2123
- "/Tests/"
2124
- ]
2125
  },
2126
  "notification-url": "https://packagist.org/downloads/",
2127
  "license": [
2128
- "MIT"
2129
  ],
2130
  "authors": [
2131
  {
2132
- "name": "Fabien Potencier",
2133
- "email": "fabien@symfony.com"
2134
- },
2135
- {
2136
- "name": "Symfony Community",
2137
- "homepage": "https://symfony.com/contributors"
2138
  }
2139
  ],
2140
- "description": "Executes commands in sub-processes",
2141
- "homepage": "https://symfony.com",
 
 
 
 
 
 
 
2142
  "support": {
2143
- "source": "https://github.com/symfony/process/tree/v5.3.7"
 
 
2144
  },
2145
- "funding": [
2146
- {
2147
- "url": "https://symfony.com/sponsor",
2148
- "type": "custom"
2149
- },
2150
- {
2151
- "url": "https://github.com/fabpot",
2152
- "type": "github"
2153
- },
2154
- {
2155
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2156
- "type": "tidelift"
2157
- }
2158
- ],
2159
- "time": "2021-08-04T21:20:46+00:00"
2160
  },
2161
  {
2162
- "name": "symfony/service-contracts",
2163
- "version": "v2.4.0",
2164
  "source": {
2165
  "type": "git",
2166
- "url": "https://github.com/symfony/service-contracts.git",
2167
- "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb"
2168
  },
2169
  "dist": {
2170
  "type": "zip",
2171
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb",
2172
- "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb",
2173
  "shasum": ""
2174
  },
2175
  "require": {
2176
- "php": ">=7.2.5",
2177
- "psr/container": "^1.1"
2178
  },
2179
- "suggest": {
2180
- "symfony/service-implementation": ""
 
 
 
 
2181
  },
2182
  "type": "library",
2183
  "extra": {
2184
  "branch-alias": {
2185
- "dev-main": "2.4-dev"
2186
- },
2187
- "thanks": {
2188
- "name": "symfony/contracts",
2189
- "url": "https://github.com/symfony/contracts"
2190
  }
2191
  },
2192
  "autoload": {
2193
  "psr-4": {
2194
- "Symfony\\Contracts\\Service\\": ""
2195
  }
2196
  },
2197
  "notification-url": "https://packagist.org/downloads/",
@@ -2200,81 +7900,54 @@
2200
  ],
2201
  "authors": [
2202
  {
2203
- "name": "Nicolas Grekas",
2204
- "email": "p@tchwork.com"
2205
- },
2206
- {
2207
- "name": "Symfony Community",
2208
- "homepage": "https://symfony.com/contributors"
2209
  }
2210
  ],
2211
- "description": "Generic abstractions related to writing services",
2212
- "homepage": "https://symfony.com",
2213
  "keywords": [
2214
- "abstractions",
2215
- "contracts",
2216
- "decoupling",
2217
- "interfaces",
2218
- "interoperability",
2219
- "standards"
2220
  ],
2221
  "support": {
2222
- "source": "https://github.com/symfony/service-contracts/tree/v2.4.0"
 
2223
  },
2224
- "funding": [
2225
- {
2226
- "url": "https://symfony.com/sponsor",
2227
- "type": "custom"
2228
- },
2229
- {
2230
- "url": "https://github.com/fabpot",
2231
- "type": "github"
2232
- },
2233
- {
2234
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2235
- "type": "tidelift"
2236
- }
2237
- ],
2238
- "time": "2021-04-01T10:43:52+00:00"
2239
  },
2240
  {
2241
- "name": "symfony/string",
2242
- "version": "v5.3.7",
2243
  "source": {
2244
  "type": "git",
2245
- "url": "https://github.com/symfony/string.git",
2246
- "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5"
2247
  },
2248
  "dist": {
2249
  "type": "zip",
2250
- "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5",
2251
- "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5",
2252
  "shasum": ""
2253
  },
2254
  "require": {
2255
- "php": ">=7.2.5",
2256
- "symfony/polyfill-ctype": "~1.8",
2257
- "symfony/polyfill-intl-grapheme": "~1.0",
2258
- "symfony/polyfill-intl-normalizer": "~1.0",
2259
- "symfony/polyfill-mbstring": "~1.0",
2260
- "symfony/polyfill-php80": "~1.15"
2261
  },
2262
  "require-dev": {
2263
- "symfony/error-handler": "^4.4|^5.0",
2264
- "symfony/http-client": "^4.4|^5.0",
2265
- "symfony/translation-contracts": "^1.1|^2",
2266
- "symfony/var-exporter": "^4.4|^5.0"
2267
  },
2268
  "type": "library",
 
 
 
 
 
2269
  "autoload": {
2270
  "psr-4": {
2271
- "Symfony\\Component\\String\\": ""
2272
  },
2273
  "files": [
2274
- "Resources/functions.php"
2275
- ],
2276
- "exclude-from-classmap": [
2277
- "/Tests/"
2278
  ]
2279
  },
2280
  "notification-url": "https://packagist.org/downloads/",
@@ -2283,113 +7956,141 @@
2283
  ],
2284
  "authors": [
2285
  {
2286
- "name": "Nicolas Grekas",
2287
- "email": "p@tchwork.com"
2288
- },
2289
- {
2290
- "name": "Symfony Community",
2291
- "homepage": "https://symfony.com/contributors"
2292
  }
2293
  ],
2294
- "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
2295
- "homepage": "https://symfony.com",
2296
- "keywords": [
2297
- "grapheme",
2298
- "i18n",
2299
- "string",
2300
- "unicode",
2301
- "utf-8",
2302
- "utf8"
2303
- ],
2304
  "support": {
2305
- "source": "https://github.com/symfony/string/tree/v5.3.7"
2306
  },
2307
- "funding": [
2308
- {
2309
- "url": "https://symfony.com/sponsor",
2310
- "type": "custom"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2311
  },
 
 
 
 
 
 
 
 
 
2312
  {
2313
- "url": "https://github.com/fabpot",
2314
- "type": "github"
 
2315
  },
2316
  {
2317
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2318
- "type": "tidelift"
 
2319
  }
2320
  ],
2321
- "time": "2021-08-26T08:00:08+00:00"
 
 
 
 
 
 
 
 
 
 
2322
  },
2323
  {
2324
- "name": "symfony/yaml",
2325
- "version": "v4.4.29",
2326
  "source": {
2327
  "type": "git",
2328
- "url": "https://github.com/symfony/yaml.git",
2329
- "reference": "3abcc4db06d4e776825eaa3ed8ad924d5bc7432a"
2330
  },
2331
  "dist": {
2332
  "type": "zip",
2333
- "url": "https://api.github.com/repos/symfony/yaml/zipball/3abcc4db06d4e776825eaa3ed8ad924d5bc7432a",
2334
- "reference": "3abcc4db06d4e776825eaa3ed8ad924d5bc7432a",
2335
  "shasum": ""
2336
  },
2337
  "require": {
2338
- "php": ">=7.1.3",
2339
- "symfony/polyfill-ctype": "~1.8"
2340
- },
2341
- "conflict": {
2342
- "symfony/console": "<3.4"
 
 
2343
  },
2344
  "require-dev": {
2345
- "symfony/console": "^3.4|^4.0|^5.0"
 
 
 
 
 
2346
  },
2347
  "suggest": {
2348
- "symfony/console": "For validating YAML files using the lint command"
 
2349
  },
 
 
 
 
2350
  "type": "library",
 
 
 
 
 
2351
  "autoload": {
2352
- "psr-4": {
2353
- "Symfony\\Component\\Yaml\\": ""
2354
  },
2355
- "exclude-from-classmap": [
2356
- "/Tests/"
 
2357
  ]
2358
  },
2359
  "notification-url": "https://packagist.org/downloads/",
2360
  "license": [
2361
  "MIT"
2362
  ],
2363
- "authors": [
2364
- {
2365
- "name": "Fabien Potencier",
2366
- "email": "fabien@symfony.com"
2367
- },
2368
- {
2369
- "name": "Symfony Community",
2370
- "homepage": "https://symfony.com/contributors"
2371
- }
2372
  ],
2373
- "description": "Loads and dumps YAML files",
2374
- "homepage": "https://symfony.com",
2375
  "support": {
2376
- "source": "https://github.com/symfony/yaml/tree/v4.4.29"
 
 
2377
  },
2378
- "funding": [
2379
- {
2380
- "url": "https://symfony.com/sponsor",
2381
- "type": "custom"
2382
- },
2383
- {
2384
- "url": "https://github.com/fabpot",
2385
- "type": "github"
2386
- },
2387
- {
2388
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2389
- "type": "tidelift"
2390
- }
2391
- ],
2392
- "time": "2021-07-27T16:19:30+00:00"
2393
  },
2394
  {
2395
  "name": "wp-coding-standards/wpcs",
@@ -2441,6 +8142,62 @@
2441
  "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki"
2442
  },
2443
  "time": "2020-05-13T23:57:56+00:00"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2444
  }
2445
  ],
2446
  "aliases": [],
@@ -2450,5 +8207,5 @@
2450
  "prefer-lowest": false,
2451
  "platform": [],
2452
  "platform-dev": [],
2453
- "plugin-api-version": "2.0.0"
2454
  }
4
  "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
  "This file is @generated automatically"
6
  ],
7
+ "content-hash": "abf095edcee978db708c437a7ebb65b1",
8
+ "packages": [
 
9
  {
10
+ "name": "publishpress/wordpress-reviews",
11
+ "version": "v1.1.11",
12
  "source": {
13
  "type": "git",
14
+ "url": "https://github.com/publishpress/wordpress-reviews.git",
15
+ "reference": "eb913d04f5cc18769b9b415324305a2f9695d30e"
16
  },
17
  "dist": {
18
  "type": "zip",
19
+ "url": "https://api.github.com/repos/publishpress/wordpress-reviews/zipball/eb913d04f5cc18769b9b415324305a2f9695d30e",
20
+ "reference": "eb913d04f5cc18769b9b415324305a2f9695d30e",
21
  "shasum": ""
22
  },
23
  "require": {
24
+ "php": ">=5.6.20"
 
 
 
 
 
25
  },
26
  "require-dev": {
27
+ "overtrue/phplint": "^2.1"
 
 
28
  },
29
  "type": "library",
 
 
 
 
 
30
  "autoload": {
31
+ "files": [
32
+ "ReviewsController.php"
33
+ ]
34
  },
35
  "notification-url": "https://packagist.org/downloads/",
36
  "license": [
37
+ "GPL-3.0-or-later"
38
  ],
39
  "authors": [
40
  {
41
+ "name": "PublishPress",
42
+ "email": "help@publishpress.com"
43
+ },
44
+ {
45
+ "name": "Daniel Iser",
46
+ "homepage": "https://github.com/danieliser/WP-Product-In-Dash-Review-Requests"
47
  }
48
  ],
49
+ "description": "Library for showing a five-star review banner.",
50
+ "homepage": "http://publishpress.com/",
51
+ "keywords": [
52
+ "review",
53
+ "reviews",
54
+ "wordpress plugin"
55
+ ],
56
  "support": {
57
+ "issues": "https://github.com/publishpress/wordpress-reviews/issues",
58
+ "source": "https://github.com/publishpress/wordpress-reviews/tree/v1.1.11"
59
  },
60
+ "time": "2021-10-26T15:47:36+00:00"
61
+ }
62
+ ],
63
+ "packages-dev": [
64
  {
65
+ "name": "antecedent/patchwork",
66
+ "version": "2.1.17",
67
  "source": {
68
  "type": "git",
69
+ "url": "https://github.com/antecedent/patchwork.git",
70
+ "reference": "df5aba175a44c2996ced4edf8ec9f9081b5348c0"
71
  },
72
  "dist": {
73
  "type": "zip",
74
+ "url": "https://api.github.com/repos/antecedent/patchwork/zipball/df5aba175a44c2996ced4edf8ec9f9081b5348c0",
75
+ "reference": "df5aba175a44c2996ced4edf8ec9f9081b5348c0",
76
  "shasum": ""
77
  },
78
  "require": {
79
+ "php": ">=5.4.0"
 
 
 
 
80
  },
81
  "require-dev": {
82
+ "phpunit/phpunit": ">=4"
 
 
 
 
 
 
 
 
83
  },
84
  "type": "library",
 
 
 
 
 
 
 
 
 
 
85
  "notification-url": "https://packagist.org/downloads/",
86
  "license": [
87
  "MIT"
88
  ],
89
  "authors": [
90
  {
91
+ "name": "Ignas Rudaitis",
92
+ "email": "ignas.rudaitis@gmail.com"
93
  }
94
  ],
95
+ "description": "Method redefinition (monkey-patching) functionality for PHP.",
96
+ "homepage": "http://patchwork2.org/",
97
+ "keywords": [
98
+ "aop",
99
+ "aspect",
100
+ "interception",
101
+ "monkeypatching",
102
+ "redefinition",
103
+ "runkit",
104
+ "testing"
105
+ ],
106
  "support": {
107
+ "issues": "https://github.com/antecedent/patchwork/issues",
108
+ "source": "https://github.com/antecedent/patchwork/tree/2.1.17"
109
  },
110
+ "time": "2021-10-21T14:22:43+00:00"
111
  },
112
  {
113
+ "name": "behat/gherkin",
114
+ "version": "v4.9.0",
115
  "source": {
116
  "type": "git",
117
+ "url": "https://github.com/Behat/Gherkin.git",
118
+ "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4"
119
  },
120
  "dist": {
121
  "type": "zip",
122
+ "url": "https://api.github.com/repos/Behat/Gherkin/zipball/0bc8d1e30e96183e4f36db9dc79caead300beff4",
123
+ "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4",
124
  "shasum": ""
125
  },
126
  "require": {
127
+ "php": "~7.2|~8.0"
 
 
128
  },
129
  "require-dev": {
130
+ "cucumber/cucumber": "dev-gherkin-22.0.0",
131
+ "phpunit/phpunit": "~8|~9",
132
+ "symfony/yaml": "~3|~4|~5"
133
+ },
134
+ "suggest": {
135
+ "symfony/yaml": "If you want to parse features, represented in YAML files"
136
  },
137
  "type": "library",
138
  "extra": {
139
  "branch-alias": {
140
+ "dev-master": "4.x-dev"
141
  }
142
  },
143
  "autoload": {
144
+ "psr-0": {
145
+ "Behat\\Gherkin": "src/"
146
  }
147
  },
148
  "notification-url": "https://packagist.org/downloads/",
151
  ],
152
  "authors": [
153
  {
154
+ "name": "Konstantin Kudryashov",
155
+ "email": "ever.zet@gmail.com",
156
+ "homepage": "http://everzet.com"
157
  }
158
  ],
159
+ "description": "Gherkin DSL parser for PHP",
160
+ "homepage": "http://behat.org/",
161
+ "keywords": [
162
+ "BDD",
163
+ "Behat",
164
+ "Cucumber",
165
+ "DSL",
166
+ "gherkin",
167
+ "parser"
168
+ ],
169
  "support": {
170
+ "issues": "https://github.com/Behat/Gherkin/issues",
171
+ "source": "https://github.com/Behat/Gherkin/tree/v4.9.0"
172
  },
173
+ "time": "2021-10-12T13:05:09+00:00"
174
  },
175
  {
176
+ "name": "bordoni/phpass",
177
+ "version": "0.3.5",
178
  "source": {
179
  "type": "git",
180
+ "url": "https://github.com/bordoni/phpass.git",
181
+ "reference": "fd57c109213e95150b7de1dc8908c55605cd8e55"
182
  },
183
  "dist": {
184
  "type": "zip",
185
+ "url": "https://api.github.com/repos/bordoni/phpass/zipball/fd57c109213e95150b7de1dc8908c55605cd8e55",
186
+ "reference": "fd57c109213e95150b7de1dc8908c55605cd8e55",
187
  "shasum": ""
188
  },
189
  "require": {
190
+ "php": ">=5.3.3"
 
 
 
191
  },
192
+ "replace": {
193
+ "hautelook/phpass": "0.3.*"
 
 
 
 
 
 
 
 
194
  },
195
  "type": "library",
 
 
 
 
 
196
  "autoload": {
197
+ "psr-0": {
198
+ "Hautelook": "src/"
199
  }
200
  },
201
  "notification-url": "https://packagist.org/downloads/",
202
  "license": [
203
+ "Public Domain"
204
  ],
205
  "authors": [
206
  {
207
+ "name": "Solar Designer",
208
+ "email": "solar@openwall.com",
209
+ "homepage": "http://openwall.com/phpass/"
210
+ },
211
+ {
212
+ "name": "Gustavo Bordoni",
213
+ "email": "gustavo@bordoni.me",
214
+ "homepage": "https://bordoni.me"
215
  }
216
  ],
217
+ "description": "Portable PHP password hashing framework",
218
+ "homepage": "http://github.com/hautelook/phpass/",
219
+ "keywords": [
220
+ "blowfish",
221
+ "crypt",
222
+ "password",
223
+ "security"
224
+ ],
225
  "support": {
226
+ "issues": "https://github.com/bordoni/phpass/issues",
227
+ "source": "https://github.com/bordoni/phpass/tree/0.3.5"
228
  },
229
+ "time": "2012-08-31T00:00:00+00:00"
230
  },
231
  {
232
+ "name": "codeception/codeception",
233
+ "version": "4.1.22",
234
  "source": {
235
  "type": "git",
236
+ "url": "https://github.com/Codeception/Codeception.git",
237
+ "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f"
238
  },
239
  "dist": {
240
  "type": "zip",
241
+ "url": "https://api.github.com/repos/Codeception/Codeception/zipball/9777ec3690ceedc4bce2ed13af7af4ca4ee3088f",
242
+ "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f",
243
  "shasum": ""
244
  },
245
  "require": {
246
+ "behat/gherkin": "^4.4.0",
247
+ "codeception/lib-asserts": "^1.0",
248
+ "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.1.1 | ^9.0",
249
+ "codeception/stub": "^2.0 | ^3.0",
250
+ "ext-curl": "*",
251
+ "ext-json": "*",
252
+ "ext-mbstring": "*",
253
+ "guzzlehttp/psr7": "^1.4 | ^2.0",
254
+ "php": ">=5.6.0 <9.0",
255
+ "symfony/console": ">=2.7 <6.0",
256
+ "symfony/css-selector": ">=2.7 <6.0",
257
+ "symfony/event-dispatcher": ">=2.7 <6.0",
258
+ "symfony/finder": ">=2.7 <6.0",
259
+ "symfony/yaml": ">=2.7 <6.0"
 
 
260
  },
261
  "require-dev": {
262
+ "codeception/module-asserts": "1.*@dev",
263
+ "codeception/module-cli": "1.*@dev",
264
+ "codeception/module-db": "1.*@dev",
265
+ "codeception/module-filesystem": "1.*@dev",
266
+ "codeception/module-phpbrowser": "1.*@dev",
267
+ "codeception/specify": "~0.3",
268
+ "codeception/util-universalframework": "*@dev",
269
+ "monolog/monolog": "~1.8",
270
+ "squizlabs/php_codesniffer": "~2.0",
271
+ "symfony/process": ">=2.7 <6.0",
272
+ "vlucas/phpdotenv": "^2.0 | ^3.0 | ^4.0 | ^5.0"
273
  },
274
  "suggest": {
275
+ "codeception/specify": "BDD-style code blocks",
276
+ "codeception/verify": "BDD-style assertions",
277
+ "hoa/console": "For interactive console functionality",
278
+ "stecman/symfony-console-completion": "For BASH autocompletion",
279
+ "symfony/phpunit-bridge": "For phpunit-bridge support"
280
  },
281
  "bin": [
282
+ "codecept"
283
  ],
284
  "type": "library",
285
  "extra": {
286
+ "branch-alias": []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
287
  },
288
  "autoload": {
289
  "psr-4": {
290
+ "Codeception\\": "src/Codeception",
291
+ "Codeception\\Extension\\": "ext"
292
  }
293
  },
294
  "notification-url": "https://packagist.org/downloads/",
297
  ],
298
  "authors": [
299
  {
300
+ "name": "Michael Bodnarchuk",
301
+ "email": "davert@mail.ua",
302
+ "homepage": "http://codegyre.com"
303
  }
304
  ],
305
+ "description": "BDD-style testing framework",
306
+ "homepage": "http://codeception.com/",
307
+ "keywords": [
308
+ "BDD",
309
+ "TDD",
310
+ "acceptance testing",
311
+ "functional testing",
312
+ "unit testing"
313
+ ],
314
  "support": {
315
+ "issues": "https://github.com/Codeception/Codeception/issues",
316
+ "source": "https://github.com/Codeception/Codeception/tree/4.1.22"
317
  },
318
+ "funding": [
319
+ {
320
+ "url": "https://opencollective.com/codeception",
321
+ "type": "open_collective"
322
+ }
323
+ ],
324
+ "time": "2021-08-06T17:15:34+00:00"
325
  },
326
  {
327
+ "name": "codeception/lib-asserts",
328
+ "version": "1.13.2",
329
  "source": {
330
  "type": "git",
331
+ "url": "https://github.com/Codeception/lib-asserts.git",
332
+ "reference": "184231d5eab66bc69afd6b9429344d80c67a33b6"
333
  },
334
  "dist": {
335
  "type": "zip",
336
+ "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/184231d5eab66bc69afd6b9429344d80c67a33b6",
337
+ "reference": "184231d5eab66bc69afd6b9429344d80c67a33b6",
338
  "shasum": ""
339
  },
340
  "require": {
341
+ "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.0.3 | ^9.0",
342
+ "ext-dom": "*",
343
+ "php": ">=5.6.0 <9.0"
344
  },
 
 
 
345
  "type": "library",
 
 
 
 
 
346
  "autoload": {
347
+ "classmap": [
348
+ "src/"
349
+ ]
350
  },
351
  "notification-url": "https://packagist.org/downloads/",
352
  "license": [
354
  ],
355
  "authors": [
356
  {
357
+ "name": "Michael Bodnarchuk",
358
+ "email": "davert@mail.ua",
359
+ "homepage": "http://codegyre.com"
360
  },
361
  {
362
+ "name": "Gintautas Miselis"
363
+ },
364
+ {
365
+ "name": "Gustavo Nieves",
366
+ "homepage": "https://medium.com/@ganieves"
367
  }
368
  ],
369
+ "description": "Assertion methods used by Codeception core and Asserts module",
370
+ "homepage": "https://codeception.com/",
371
+ "keywords": [
372
+ "codeception"
373
+ ],
374
  "support": {
375
+ "issues": "https://github.com/Codeception/lib-asserts/issues",
376
+ "source": "https://github.com/Codeception/lib-asserts/tree/1.13.2"
377
  },
378
+ "time": "2020-10-21T16:26:20+00:00"
379
  },
380
  {
381
+ "name": "codeception/lib-innerbrowser",
382
+ "version": "1.5.1",
383
  "source": {
384
  "type": "git",
385
+ "url": "https://github.com/Codeception/lib-innerbrowser.git",
386
+ "reference": "31b4b56ad53c3464fcb2c0a14d55a51a201bd3c2"
387
  },
388
  "dist": {
389
  "type": "zip",
390
+ "url": "https://api.github.com/repos/Codeception/lib-innerbrowser/zipball/31b4b56ad53c3464fcb2c0a14d55a51a201bd3c2",
391
+ "reference": "31b4b56ad53c3464fcb2c0a14d55a51a201bd3c2",
392
  "shasum": ""
393
  },
394
  "require": {
395
+ "codeception/codeception": "4.*@dev",
396
+ "ext-dom": "*",
397
+ "ext-json": "*",
398
+ "ext-mbstring": "*",
399
+ "php": ">=5.6.0 <9.0",
400
+ "symfony/browser-kit": ">=2.7 <6.0",
401
+ "symfony/dom-crawler": ">=2.7 <6.0"
402
+ },
403
+ "conflict": {
404
+ "codeception/codeception": "<4.0"
405
+ },
406
+ "require-dev": {
407
+ "codeception/util-universalframework": "dev-master"
408
  },
409
  "type": "library",
410
  "autoload": {
411
+ "classmap": [
412
+ "src/"
413
+ ]
414
  },
415
  "notification-url": "https://packagist.org/downloads/",
416
  "license": [
417
  "MIT"
418
  ],
419
+ "authors": [
420
+ {
421
+ "name": "Michael Bodnarchuk",
422
+ "email": "davert@mail.ua",
423
+ "homepage": "http://codegyre.com"
424
+ },
425
+ {
426
+ "name": "Gintautas Miselis"
427
+ }
428
+ ],
429
+ "description": "Parent library for all Codeception framework modules and PhpBrowser",
430
+ "homepage": "https://codeception.com/",
431
+ "keywords": [
432
+ "codeception"
433
+ ],
434
  "support": {
435
+ "issues": "https://github.com/Codeception/lib-innerbrowser/issues",
436
+ "source": "https://github.com/Codeception/lib-innerbrowser/tree/1.5.1"
437
  },
438
+ "time": "2021-08-30T15:21:42+00:00"
 
439
  },
440
  {
441
+ "name": "codeception/module-asserts",
442
+ "version": "1.3.1",
443
  "source": {
444
  "type": "git",
445
+ "url": "https://github.com/Codeception/module-asserts.git",
446
+ "reference": "59374f2fef0cabb9e8ddb53277e85cdca74328de"
447
  },
448
  "dist": {
449
  "type": "zip",
450
+ "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/59374f2fef0cabb9e8ddb53277e85cdca74328de",
451
+ "reference": "59374f2fef0cabb9e8ddb53277e85cdca74328de",
452
  "shasum": ""
453
  },
454
  "require": {
455
+ "codeception/codeception": "*@dev",
456
+ "codeception/lib-asserts": "^1.13.1",
457
+ "php": ">=5.6.0 <9.0"
 
 
 
 
 
458
  },
459
+ "conflict": {
460
+ "codeception/codeception": "<4.0"
 
461
  },
462
+ "type": "library",
463
  "autoload": {
464
+ "classmap": [
465
+ "src/"
466
+ ]
467
  },
468
  "notification-url": "https://packagist.org/downloads/",
469
  "license": [
471
  ],
472
  "authors": [
473
  {
474
+ "name": "Michael Bodnarchuk"
475
+ },
476
+ {
477
+ "name": "Gintautas Miselis"
478
+ },
479
+ {
480
+ "name": "Gustavo Nieves",
481
+ "homepage": "https://medium.com/@ganieves"
482
  }
483
  ],
484
+ "description": "Codeception module containing various assertions",
485
+ "homepage": "https://codeception.com/",
486
  "keywords": [
487
+ "assertions",
488
+ "asserts",
489
+ "codeception"
 
 
 
 
 
 
 
 
 
 
 
 
490
  ],
491
  "support": {
492
+ "issues": "https://github.com/Codeception/module-asserts/issues",
493
+ "source": "https://github.com/Codeception/module-asserts/tree/1.3.1"
494
  },
495
+ "time": "2020-10-21T16:48:15+00:00"
496
  },
497
  {
498
+ "name": "codeception/module-cli",
499
+ "version": "1.1.1",
500
  "source": {
501
  "type": "git",
502
+ "url": "https://github.com/Codeception/module-cli.git",
503
+ "reference": "1f841ad4a1d43e5d9e60a43c4cc9e5af8008024f"
504
  },
505
  "dist": {
506
  "type": "zip",
507
+ "url": "https://api.github.com/repos/Codeception/module-cli/zipball/1f841ad4a1d43e5d9e60a43c4cc9e5af8008024f",
508
+ "reference": "1f841ad4a1d43e5d9e60a43c4cc9e5af8008024f",
509
  "shasum": ""
510
  },
511
  "require": {
512
+ "codeception/codeception": "*@dev",
513
+ "php": ">=5.6.0 <9.0"
514
  },
515
+ "conflict": {
516
+ "codeception/codeception": "<4.0"
 
 
 
517
  },
518
+ "type": "library",
519
  "autoload": {
520
+ "classmap": [
521
+ "src/"
522
+ ]
523
  },
524
  "notification-url": "https://packagist.org/downloads/",
525
  "license": [
527
  ],
528
  "authors": [
529
  {
530
+ "name": "Michael Bodnarchuk"
 
 
 
 
 
 
 
 
 
 
 
 
531
  }
532
  ],
533
+ "description": "Codeception module for testing basic shell commands and shell output",
534
+ "homepage": "http://codeception.com/",
535
  "keywords": [
536
+ "codeception"
 
 
 
537
  ],
538
  "support": {
539
+ "issues": "https://github.com/Codeception/module-cli/issues",
540
+ "source": "https://github.com/Codeception/module-cli/tree/1.1.1"
541
  },
542
+ "time": "2020-12-26T16:56:19+00:00"
543
  },
544
  {
545
+ "name": "codeception/module-db",
546
+ "version": "1.1.0",
547
  "source": {
548
  "type": "git",
549
+ "url": "https://github.com/Codeception/module-db.git",
550
+ "reference": "8c8076cd05d4db95798acd7dba2a56578210982c"
551
  },
552
  "dist": {
553
  "type": "zip",
554
+ "url": "https://api.github.com/repos/Codeception/module-db/zipball/8c8076cd05d4db95798acd7dba2a56578210982c",
555
+ "reference": "8c8076cd05d4db95798acd7dba2a56578210982c",
556
  "shasum": ""
557
  },
558
  "require": {
559
+ "codeception/codeception": "*@dev",
560
+ "php": ">=5.6.0 <9.0"
561
  },
562
+ "conflict": {
563
+ "codeception/codeception": "<4.0"
 
 
 
564
  },
565
  "type": "library",
 
 
 
 
 
566
  "autoload": {
567
+ "classmap": [
568
+ "src/"
569
+ ]
570
  },
571
  "notification-url": "https://packagist.org/downloads/",
572
  "license": [
574
  ],
575
  "authors": [
576
  {
577
+ "name": "Michael Bodnarchuk"
578
+ },
579
+ {
580
+ "name": "Gintautas Miselis"
581
  }
582
  ],
583
+ "description": "DB module for Codeception",
584
+ "homepage": "http://codeception.com/",
585
+ "keywords": [
586
+ "codeception",
587
+ "database-testing",
588
+ "db-testing"
589
+ ],
590
  "support": {
591
+ "issues": "https://github.com/Codeception/module-db/issues",
592
+ "source": "https://github.com/Codeception/module-db/tree/1.1.0"
593
  },
594
+ "time": "2020-12-20T13:37:07+00:00"
595
  },
596
  {
597
+ "name": "codeception/module-filesystem",
598
+ "version": "1.0.3",
599
  "source": {
600
  "type": "git",
601
+ "url": "https://github.com/Codeception/module-filesystem.git",
602
+ "reference": "781be167fb1557bfc9b61e0a4eac60a32c534ec1"
603
  },
604
  "dist": {
605
  "type": "zip",
606
+ "url": "https://api.github.com/repos/Codeception/module-filesystem/zipball/781be167fb1557bfc9b61e0a4eac60a32c534ec1",
607
+ "reference": "781be167fb1557bfc9b61e0a4eac60a32c534ec1",
608
  "shasum": ""
609
  },
610
  "require": {
611
+ "codeception/codeception": "^4.0",
612
+ "php": ">=5.6.0 <9.0",
613
+ "symfony/finder": ">=2.7 <6.0"
 
 
 
 
 
 
614
  },
615
+ "conflict": {
616
+ "codeception/codeception": "<4.0"
 
 
617
  },
618
  "type": "library",
 
 
 
 
 
 
619
  "autoload": {
620
+ "classmap": [
621
+ "src/"
622
+ ]
623
  },
624
  "notification-url": "https://packagist.org/downloads/",
625
  "license": [
627
  ],
628
  "authors": [
629
  {
630
+ "name": "Michael Bodnarchuk"
631
+ },
632
+ {
633
+ "name": "Gintautas Miselis"
634
  }
635
  ],
636
+ "description": "Codeception module for testing local filesystem",
637
+ "homepage": "http://codeception.com/",
638
  "keywords": [
639
+ "codeception",
640
+ "filesystem"
 
 
 
 
 
641
  ],
642
  "support": {
643
+ "issues": "https://github.com/Codeception/module-filesystem/issues",
644
+ "source": "https://github.com/Codeception/module-filesystem/tree/1.0.3"
645
  },
646
+ "time": "2020-10-24T14:46:40+00:00"
 
 
 
 
 
 
647
  },
648
  {
649
+ "name": "codeception/module-phpbrowser",
650
+ "version": "1.0.2",
651
  "source": {
652
  "type": "git",
653
+ "url": "https://github.com/Codeception/module-phpbrowser.git",
654
+ "reference": "770a6be4160a5c0c08d100dd51bff35f6056bbf1"
655
  },
656
  "dist": {
657
  "type": "zip",
658
+ "url": "https://api.github.com/repos/Codeception/module-phpbrowser/zipball/770a6be4160a5c0c08d100dd51bff35f6056bbf1",
659
+ "reference": "770a6be4160a5c0c08d100dd51bff35f6056bbf1",
660
  "shasum": ""
661
  },
662
  "require": {
663
+ "codeception/codeception": "^4.0",
664
+ "codeception/lib-innerbrowser": "^1.3",
665
+ "guzzlehttp/guzzle": "^6.3|^7.0",
666
+ "php": ">=5.6.0 <9.0"
667
+ },
668
+ "conflict": {
669
+ "codeception/codeception": "<4.0"
670
  },
671
  "require-dev": {
672
+ "codeception/module-rest": "^1.0"
 
 
 
 
 
 
673
  },
674
  "suggest": {
675
+ "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests"
 
 
 
676
  },
677
  "type": "library",
678
  "autoload": {
679
+ "classmap": [
680
+ "src/"
681
+ ]
682
  },
683
  "notification-url": "https://packagist.org/downloads/",
684
  "license": [
686
  ],
687
  "authors": [
688
  {
689
+ "name": "Michael Bodnarchuk"
690
+ },
691
+ {
692
+ "name": "Gintautas Miselis"
693
  }
694
  ],
695
+ "description": "Codeception module for testing web application over HTTP",
696
+ "homepage": "http://codeception.com/",
697
  "keywords": [
698
+ "codeception",
699
+ "functional-testing",
700
+ "http"
 
 
 
 
701
  ],
702
  "support": {
703
+ "issues": "https://github.com/Codeception/module-phpbrowser/issues",
704
+ "source": "https://github.com/Codeception/module-phpbrowser/tree/1.0.2"
705
  },
706
+ "time": "2020-10-24T15:29:28+00:00"
707
  },
708
  {
709
+ "name": "codeception/module-rest",
710
+ "version": "1.3.2",
711
  "source": {
712
  "type": "git",
713
+ "url": "https://github.com/Codeception/module-rest.git",
714
+ "reference": "2f35e75d4a5a7fd1fe77d7f5bd56a9123c453e3b"
715
  },
716
  "dist": {
717
  "type": "zip",
718
+ "url": "https://api.github.com/repos/Codeception/module-rest/zipball/2f35e75d4a5a7fd1fe77d7f5bd56a9123c453e3b",
719
+ "reference": "2f35e75d4a5a7fd1fe77d7f5bd56a9123c453e3b",
720
  "shasum": ""
721
  },
722
  "require": {
723
+ "codeception/codeception": "^4.0",
724
+ "justinrainbow/json-schema": "~5.2.9",
725
+ "php": ">=5.6.6 <9.0",
726
+ "softcreatr/jsonpath": "^0.5 || ^0.7"
727
  },
728
  "require-dev": {
729
+ "codeception/lib-innerbrowser": "^1.0",
730
+ "codeception/util-universalframework": "^1.0"
731
  },
732
  "suggest": {
733
+ "aws/aws-sdk-php": "For using AWS Auth"
734
  },
735
  "type": "library",
736
+ "autoload": {
737
+ "classmap": [
738
+ "src/"
739
+ ]
740
+ },
741
  "notification-url": "https://packagist.org/downloads/",
742
  "license": [
743
  "MIT"
744
  ],
745
  "authors": [
746
  {
747
+ "name": "Gintautas Miselis"
 
 
748
  }
749
  ],
750
+ "description": "REST module for Codeception",
751
+ "homepage": "http://codeception.com/",
752
  "keywords": [
753
+ "codeception",
754
+ "rest"
 
 
755
  ],
756
  "support": {
757
+ "issues": "https://github.com/Codeception/module-rest/issues",
758
+ "source": "https://github.com/Codeception/module-rest/tree/1.3.2"
 
759
  },
760
+ "time": "2021-10-08T09:33:46+00:00"
761
  },
762
  {
763
+ "name": "codeception/module-webdriver",
764
+ "version": "1.4.0",
765
  "source": {
766
  "type": "git",
767
+ "url": "https://github.com/Codeception/module-webdriver.git",
768
+ "reference": "baa18b7bf70aa024012f967b5ce5021e1faa9151"
769
  },
770
  "dist": {
771
  "type": "zip",
772
+ "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/baa18b7bf70aa024012f967b5ce5021e1faa9151",
773
+ "reference": "baa18b7bf70aa024012f967b5ce5021e1faa9151",
774
  "shasum": ""
775
  },
776
  "require": {
777
+ "codeception/codeception": "^4.0",
778
+ "php": ">=5.6.0 <9.0",
779
+ "php-webdriver/webdriver": "^1.8.0"
 
 
 
 
 
780
  },
781
  "suggest": {
782
+ "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests"
783
+ },
784
+ "type": "library",
785
+ "autoload": {
786
+ "classmap": [
787
+ "src/"
788
+ ]
789
  },
 
790
  "notification-url": "https://packagist.org/downloads/",
791
  "license": [
792
+ "MIT"
793
  ],
794
  "authors": [
795
  {
796
+ "name": "Michael Bodnarchuk"
 
 
797
  },
798
  {
799
+ "name": "Gintautas Miselis"
 
 
800
  },
801
  {
802
+ "name": "Zaahid Bateson"
 
803
  }
804
  ],
805
+ "description": "WebDriver module for Codeception",
806
+ "homepage": "http://codeception.com/",
807
  "keywords": [
808
+ "acceptance-testing",
809
+ "browser-testing",
810
+ "codeception"
811
  ],
812
  "support": {
813
+ "issues": "https://github.com/Codeception/module-webdriver/issues",
814
+ "source": "https://github.com/Codeception/module-webdriver/tree/1.4.0"
815
  },
816
+ "time": "2021-09-02T12:01:02+00:00"
817
  },
818
  {
819
+ "name": "codeception/phpunit-wrapper",
820
+ "version": "9.0.6",
821
  "source": {
822
  "type": "git",
823
+ "url": "https://github.com/Codeception/phpunit-wrapper.git",
824
+ "reference": "b0c06abb3181eedca690170f7ed0fd26a70bfacc"
825
  },
826
  "dist": {
827
  "type": "zip",
828
+ "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/b0c06abb3181eedca690170f7ed0fd26a70bfacc",
829
+ "reference": "b0c06abb3181eedca690170f7ed0fd26a70bfacc",
830
  "shasum": ""
831
  },
832
  "require": {
833
+ "php": ">=7.2",
834
+ "phpunit/phpunit": "^9.0"
835
+ },
836
+ "require-dev": {
837
+ "codeception/specify": "*",
838
+ "consolidation/robo": "^3.0.0-alpha3",
839
+ "vlucas/phpdotenv": "^3.0"
840
  },
841
  "type": "library",
842
  "autoload": {
843
  "psr-4": {
844
+ "Codeception\\PHPUnit\\": "src/"
845
  }
846
  },
847
  "notification-url": "https://packagist.org/downloads/",
850
  ],
851
  "authors": [
852
  {
853
+ "name": "Davert",
854
+ "email": "davert.php@resend.cc"
855
+ },
856
+ {
857
+ "name": "Naktibalda"
858
  }
859
  ],
860
+ "description": "PHPUnit classes used by Codeception",
 
 
 
 
 
 
 
 
861
  "support": {
862
+ "issues": "https://github.com/Codeception/phpunit-wrapper/issues",
863
+ "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.6"
864
  },
865
+ "time": "2020-12-28T13:59:47+00:00"
866
  },
867
  {
868
+ "name": "codeception/stub",
869
+ "version": "3.7.0",
870
  "source": {
871
  "type": "git",
872
+ "url": "https://github.com/Codeception/Stub.git",
873
+ "reference": "468dd5fe659f131fc997f5196aad87512f9b1304"
874
  },
875
  "dist": {
876
  "type": "zip",
877
+ "url": "https://api.github.com/repos/Codeception/Stub/zipball/468dd5fe659f131fc997f5196aad87512f9b1304",
878
+ "reference": "468dd5fe659f131fc997f5196aad87512f9b1304",
879
  "shasum": ""
880
  },
881
  "require": {
882
+ "phpunit/phpunit": "^8.4 | ^9.0"
883
  },
884
  "type": "library",
 
 
 
 
 
885
  "autoload": {
886
  "psr-4": {
887
+ "Codeception\\": "src/"
888
  }
889
  },
890
  "notification-url": "https://packagist.org/downloads/",
891
  "license": [
892
  "MIT"
893
  ],
894
+ "description": "Flexible Stub wrapper for PHPUnit's Mock Builder",
 
 
 
 
 
 
 
 
 
 
 
895
  "support": {
896
+ "issues": "https://github.com/Codeception/Stub/issues",
897
+ "source": "https://github.com/Codeception/Stub/tree/3.7.0"
898
  },
899
+ "time": "2020-07-03T15:54:43+00:00"
900
  },
901
  {
902
+ "name": "codeception/util-universalframework",
903
+ "version": "1.0.0",
904
  "source": {
905
  "type": "git",
906
+ "url": "https://github.com/Codeception/util-universalframework.git",
907
+ "reference": "cc381f364c6d24f9b9c7b70a4c724949725f491a"
908
  },
909
  "dist": {
910
  "type": "zip",
911
+ "url": "https://api.github.com/repos/Codeception/util-universalframework/zipball/cc381f364c6d24f9b9c7b70a4c724949725f491a",
912
+ "reference": "cc381f364c6d24f9b9c7b70a4c724949725f491a",
913
  "shasum": ""
914
  },
 
 
 
915
  "type": "library",
 
 
 
 
 
916
  "autoload": {
917
+ "classmap": [
918
+ "src/"
919
+ ]
920
  },
921
  "notification-url": "https://packagist.org/downloads/",
922
  "license": [
924
  ],
925
  "authors": [
926
  {
927
+ "name": "Gintautas Miselis"
 
928
  }
929
  ],
930
+ "description": "Mock framework module used in internal Codeception tests",
931
+ "homepage": "http://codeception.com/",
 
 
 
 
 
 
 
 
932
  "support": {
933
+ "issues": "https://github.com/Codeception/util-universalframework/issues",
934
+ "source": "https://github.com/Codeception/util-universalframework/tree/1.0.0"
935
  },
936
+ "time": "2019-09-22T06:06:49+00:00"
937
  },
938
  {
939
+ "name": "composer/semver",
940
+ "version": "3.2.6",
941
  "source": {
942
  "type": "git",
943
+ "url": "https://github.com/composer/semver.git",
944
+ "reference": "83e511e247de329283478496f7a1e114c9517506"
945
  },
946
  "dist": {
947
  "type": "zip",
948
+ "url": "https://api.github.com/repos/composer/semver/zipball/83e511e247de329283478496f7a1e114c9517506",
949
+ "reference": "83e511e247de329283478496f7a1e114c9517506",
950
  "shasum": ""
951
  },
952
  "require": {
953
+ "php": "^5.3.2 || ^7.0 || ^8.0"
954
+ },
955
+ "require-dev": {
956
+ "phpstan/phpstan": "^0.12.54",
957
+ "symfony/phpunit-bridge": "^4.2 || ^5"
958
  },
959
  "type": "library",
960
  "extra": {
961
  "branch-alias": {
962
+ "dev-main": "3.x-dev"
963
  }
964
  },
965
  "autoload": {
966
  "psr-4": {
967
+ "Composer\\Semver\\": "src"
968
  }
969
  },
970
  "notification-url": "https://packagist.org/downloads/",
973
  ],
974
  "authors": [
975
  {
976
+ "name": "Nils Adermann",
977
+ "email": "naderman@naderman.de",
978
+ "homepage": "http://www.naderman.de"
979
+ },
980
+ {
981
+ "name": "Jordi Boggiano",
982
+ "email": "j.boggiano@seld.be",
983
+ "homepage": "http://seld.be"
984
+ },
985
+ {
986
+ "name": "Rob Bast",
987
+ "email": "rob.bast@gmail.com",
988
+ "homepage": "http://robbast.nl"
989
  }
990
  ],
991
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
 
992
  "keywords": [
993
+ "semantic",
994
+ "semver",
995
+ "validation",
996
+ "versioning"
997
  ],
998
  "support": {
999
+ "irc": "irc://irc.freenode.org/composer",
1000
+ "issues": "https://github.com/composer/semver/issues",
1001
+ "source": "https://github.com/composer/semver/tree/3.2.6"
1002
  },
1003
+ "funding": [
1004
+ {
1005
+ "url": "https://packagist.com",
1006
+ "type": "custom"
1007
+ },
1008
+ {
1009
+ "url": "https://github.com/composer",
1010
+ "type": "github"
1011
+ },
1012
+ {
1013
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
1014
+ "type": "tidelift"
1015
+ }
1016
+ ],
1017
+ "time": "2021-10-25T11:34:17+00:00"
1018
  },
1019
  {
1020
+ "name": "composer/xdebug-handler",
1021
+ "version": "2.0.2",
1022
  "source": {
1023
  "type": "git",
1024
+ "url": "https://github.com/composer/xdebug-handler.git",
1025
+ "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339"
1026
+ },
1027
+ "dist": {
1028
+ "type": "zip",
1029
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339",
1030
+ "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339",
1031
+ "shasum": ""
1032
  },
1033
  "require": {
1034
+ "php": "^5.3.2 || ^7.0 || ^8.0",
1035
+ "psr/log": "^1 || ^2 || ^3"
 
 
1036
  },
1037
  "require-dev": {
1038
+ "phpstan/phpstan": "^0.12.55",
1039
+ "symfony/phpunit-bridge": "^4.2 || ^5"
 
 
 
1040
  },
1041
  "type": "library",
1042
  "autoload": {
1043
  "psr-4": {
1044
+ "Composer\\XdebugHandler\\": "src"
1045
  }
1046
  },
1047
+ "notification-url": "https://packagist.org/downloads/",
1048
  "license": [
1049
+ "MIT"
1050
  ],
1051
  "authors": [
1052
  {
1053
+ "name": "John Stevenson",
1054
+ "email": "john-stevenson@blueyonder.co.uk"
1055
  }
1056
  ],
1057
+ "description": "Restarts a process without Xdebug.",
1058
+ "keywords": [
1059
+ "Xdebug",
1060
+ "performance"
1061
+ ],
1062
+ "support": {
1063
+ "irc": "irc://irc.freenode.org/composer",
1064
+ "issues": "https://github.com/composer/xdebug-handler/issues",
1065
+ "source": "https://github.com/composer/xdebug-handler/tree/2.0.2"
1066
+ },
1067
+ "funding": [
1068
+ {
1069
+ "url": "https://packagist.com",
1070
+ "type": "custom"
1071
+ },
1072
+ {
1073
+ "url": "https://github.com/composer",
1074
+ "type": "github"
1075
+ },
1076
+ {
1077
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
1078
+ "type": "tidelift"
1079
+ }
1080
+ ],
1081
+ "time": "2021-07-31T17:03:58+00:00"
1082
  },
1083
  {
1084
+ "name": "consolidation/annotated-command",
1085
+ "version": "4.4.0",
1086
  "source": {
1087
  "type": "git",
1088
+ "url": "https://github.com/consolidation/annotated-command.git",
1089
+ "reference": "308f6ac178566a1ce9aa90ed908dac90a2c1e707"
1090
  },
1091
  "dist": {
1092
  "type": "zip",
1093
+ "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/308f6ac178566a1ce9aa90ed908dac90a2c1e707",
1094
+ "reference": "308f6ac178566a1ce9aa90ed908dac90a2c1e707",
1095
  "shasum": ""
1096
  },
1097
  "require": {
1098
+ "consolidation/output-formatters": "^4.1.1",
1099
+ "php": ">=7.1.3",
1100
+ "psr/log": "^1|^2",
1101
+ "symfony/console": "^4.4.8|~5.1.0",
1102
+ "symfony/event-dispatcher": "^4.4.8|^5",
1103
+ "symfony/finder": "^4.4.8|^5"
1104
  },
1105
  "require-dev": {
1106
+ "phpunit/phpunit": "^7.5.20 || ^8 || ^9",
1107
+ "squizlabs/php_codesniffer": "^3",
1108
+ "yoast/phpunit-polyfills": "^0.2.0"
1109
  },
 
 
 
 
1110
  "type": "library",
1111
  "extra": {
1112
  "branch-alias": {
1113
+ "dev-main": "4.x-dev"
1114
+ }
1115
+ },
1116
+ "autoload": {
1117
+ "psr-4": {
1118
+ "Consolidation\\AnnotatedCommand\\": "src"
1119
  }
1120
  },
1121
  "notification-url": "https://packagist.org/downloads/",
1122
  "license": [
1123
+ "MIT"
1124
  ],
1125
  "authors": [
1126
  {
1127
+ "name": "Greg Anderson",
1128
+ "email": "greg.1.anderson@greenknowe.org"
1129
  }
1130
  ],
1131
+ "description": "Initialize Symfony Console commands from annotated command class methods.",
 
 
 
 
 
1132
  "support": {
1133
+ "issues": "https://github.com/consolidation/annotated-command/issues",
1134
+ "source": "https://github.com/consolidation/annotated-command/tree/4.4.0"
 
1135
  },
1136
+ "time": "2021-09-30T01:08:15+00:00"
1137
  },
1138
  {
1139
+ "name": "consolidation/config",
1140
+ "version": "2.0.1",
1141
  "source": {
1142
  "type": "git",
1143
+ "url": "https://github.com/consolidation/config.git",
1144
+ "reference": "9a2c2a7b2aea1b3525984a4378743a8b74c14e1c"
1145
  },
1146
  "dist": {
1147
  "type": "zip",
1148
+ "url": "https://api.github.com/repos/consolidation/config/zipball/9a2c2a7b2aea1b3525984a4378743a8b74c14e1c",
1149
+ "reference": "9a2c2a7b2aea1b3525984a4378743a8b74c14e1c",
1150
  "shasum": ""
1151
  },
1152
  "require": {
1153
+ "dflydev/dot-access-data": "^1.1.0",
1154
+ "grasmash/expander": "^1",
1155
+ "php": ">=7.1.3",
1156
+ "psr/log": "^1.1",
1157
+ "symfony/event-dispatcher": "^4||^5"
 
 
 
 
 
 
 
 
 
 
 
1158
  },
1159
  "require-dev": {
1160
+ "phpunit/phpunit": ">=7.5.20",
1161
+ "squizlabs/php_codesniffer": "^3",
1162
+ "symfony/console": "^4||^5",
1163
+ "symfony/yaml": "^4||^5",
1164
+ "yoast/phpunit-polyfills": "^0.2.0"
1165
+ },
1166
+ "suggest": {
1167
+ "symfony/event-dispatcher": "Required to inject configuration into Command options",
1168
+ "symfony/yaml": "Required to use Consolidation\\Config\\Loader\\YamlConfigLoader"
1169
+ },
1170
+ "type": "library",
1171
+ "extra": {
1172
+ "branch-alias": {
1173
+ "dev-main": "2.x-dev"
1174
+ }
1175
+ },
1176
+ "autoload": {
1177
+ "psr-4": {
1178
+ "Consolidation\\Config\\": "src"
1179
+ }
1180
+ },
1181
+ "notification-url": "https://packagist.org/downloads/",
1182
+ "license": [
1183
+ "MIT"
1184
+ ],
1185
+ "authors": [
1186
+ {
1187
+ "name": "Greg Anderson",
1188
+ "email": "greg.1.anderson@greenknowe.org"
1189
+ }
1190
+ ],
1191
+ "description": "Provide configuration services for a commandline tool.",
1192
+ "support": {
1193
+ "issues": "https://github.com/consolidation/config/issues",
1194
+ "source": "https://github.com/consolidation/config/tree/2.0.1"
1195
+ },
1196
+ "time": "2020-12-06T00:03:30+00:00"
1197
+ },
1198
+ {
1199
+ "name": "consolidation/log",
1200
+ "version": "2.0.2",
1201
+ "source": {
1202
+ "type": "git",
1203
+ "url": "https://github.com/consolidation/log.git",
1204
+ "reference": "82a2aaaa621a7b976e50a745a8d249d5085ee2b1"
1205
+ },
1206
+ "dist": {
1207
+ "type": "zip",
1208
+ "url": "https://api.github.com/repos/consolidation/log/zipball/82a2aaaa621a7b976e50a745a8d249d5085ee2b1",
1209
+ "reference": "82a2aaaa621a7b976e50a745a8d249d5085ee2b1",
1210
+ "shasum": ""
1211
+ },
1212
+ "require": {
1213
+ "php": ">=7.1.3",
1214
+ "psr/log": "^1.0",
1215
+ "symfony/console": "^4|^5"
1216
+ },
1217
+ "require-dev": {
1218
+ "phpunit/phpunit": ">=7.5.20",
1219
+ "squizlabs/php_codesniffer": "^3",
1220
+ "yoast/phpunit-polyfills": "^0.2.0"
1221
+ },
1222
+ "type": "library",
1223
+ "extra": {
1224
+ "branch-alias": {
1225
+ "dev-main": "2.x-dev"
1226
+ }
1227
+ },
1228
+ "autoload": {
1229
+ "psr-4": {
1230
+ "Consolidation\\Log\\": "src"
1231
+ }
1232
+ },
1233
+ "notification-url": "https://packagist.org/downloads/",
1234
+ "license": [
1235
+ "MIT"
1236
+ ],
1237
+ "authors": [
1238
+ {
1239
+ "name": "Greg Anderson",
1240
+ "email": "greg.1.anderson@greenknowe.org"
1241
+ }
1242
+ ],
1243
+ "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.",
1244
+ "support": {
1245
+ "issues": "https://github.com/consolidation/log/issues",
1246
+ "source": "https://github.com/consolidation/log/tree/2.0.2"
1247
+ },
1248
+ "time": "2020-12-10T16:26:23+00:00"
1249
+ },
1250
+ {
1251
+ "name": "consolidation/output-formatters",
1252
+ "version": "4.1.2",
1253
+ "source": {
1254
+ "type": "git",
1255
+ "url": "https://github.com/consolidation/output-formatters.git",
1256
+ "reference": "5821e6ae076bf690058a4de6c94dce97398a69c9"
1257
+ },
1258
+ "dist": {
1259
+ "type": "zip",
1260
+ "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/5821e6ae076bf690058a4de6c94dce97398a69c9",
1261
+ "reference": "5821e6ae076bf690058a4de6c94dce97398a69c9",
1262
+ "shasum": ""
1263
+ },
1264
+ "require": {
1265
+ "dflydev/dot-access-data": "^1.1.0",
1266
+ "php": ">=7.1.3",
1267
+ "symfony/console": "^4|^5",
1268
+ "symfony/finder": "^4|^5"
1269
+ },
1270
+ "require-dev": {
1271
+ "php-coveralls/php-coveralls": "^2.4.2",
1272
+ "phpunit/phpunit": ">=7",
1273
+ "squizlabs/php_codesniffer": "^3",
1274
+ "symfony/var-dumper": "^4",
1275
+ "symfony/yaml": "^4",
1276
+ "yoast/phpunit-polyfills": "^0.2.0"
1277
+ },
1278
+ "suggest": {
1279
+ "symfony/var-dumper": "For using the var_dump formatter"
1280
+ },
1281
+ "type": "library",
1282
+ "extra": {
1283
+ "branch-alias": {
1284
+ "dev-main": "4.x-dev"
1285
+ }
1286
+ },
1287
+ "autoload": {
1288
+ "psr-4": {
1289
+ "Consolidation\\OutputFormatters\\": "src"
1290
+ }
1291
+ },
1292
+ "notification-url": "https://packagist.org/downloads/",
1293
+ "license": [
1294
+ "MIT"
1295
+ ],
1296
+ "authors": [
1297
+ {
1298
+ "name": "Greg Anderson",
1299
+ "email": "greg.1.anderson@greenknowe.org"
1300
+ }
1301
+ ],
1302
+ "description": "Format text by applying transformations provided by plug-in formatters.",
1303
+ "support": {
1304
+ "issues": "https://github.com/consolidation/output-formatters/issues",
1305
+ "source": "https://github.com/consolidation/output-formatters/tree/4.1.2"
1306
+ },
1307
+ "time": "2020-12-12T19:04:59+00:00"
1308
+ },
1309
+ {
1310
+ "name": "consolidation/robo",
1311
+ "version": "3.0.6",
1312
+ "source": {
1313
+ "type": "git",
1314
+ "url": "https://github.com/consolidation/Robo.git",
1315
+ "reference": "36dce2965a67abe5cf91f2bc36d2582a64a11258"
1316
+ },
1317
+ "dist": {
1318
+ "type": "zip",
1319
+ "url": "https://api.github.com/repos/consolidation/Robo/zipball/36dce2965a67abe5cf91f2bc36d2582a64a11258",
1320
+ "reference": "36dce2965a67abe5cf91f2bc36d2582a64a11258",
1321
+ "shasum": ""
1322
+ },
1323
+ "require": {
1324
+ "consolidation/annotated-command": "^4.3",
1325
+ "consolidation/config": "^1.2.1|^2.0.1",
1326
+ "consolidation/log": "^1.1.1|^2.0.2",
1327
+ "consolidation/output-formatters": "^4.1.2",
1328
+ "consolidation/self-update": "^2.0",
1329
+ "league/container": "^3.3.1",
1330
+ "php": ">=7.1.3",
1331
+ "symfony/console": "^4.4.19 || ^5",
1332
+ "symfony/event-dispatcher": "^4.4.19 || ^5",
1333
+ "symfony/filesystem": "^4.4.9 || ^5",
1334
+ "symfony/finder": "^4.4.9 || ^5",
1335
+ "symfony/process": "^4.4.9 || ^5",
1336
+ "symfony/yaml": "^4.4 || ^5"
1337
+ },
1338
+ "conflict": {
1339
+ "codegyre/robo": "*"
1340
+ },
1341
+ "require-dev": {
1342
+ "natxet/cssmin": "3.0.4",
1343
+ "patchwork/jsqueeze": "^2",
1344
+ "pear/archive_tar": "^1.4.4",
1345
+ "phpunit/phpunit": "^7.5.20 | ^8",
1346
+ "squizlabs/php_codesniffer": "^3.6",
1347
+ "yoast/phpunit-polyfills": "^0.2.0"
1348
+ },
1349
+ "suggest": {
1350
+ "natxet/cssmin": "For minifying CSS files in taskMinify",
1351
+ "patchwork/jsqueeze": "For minifying JS files in taskMinify",
1352
+ "pear/archive_tar": "Allows tar archives to be created and extracted in taskPack and taskExtract, respectively.",
1353
+ "totten/lurkerlite": "For monitoring filesystem changes in taskWatch"
1354
+ },
1355
+ "bin": [
1356
+ "robo"
1357
+ ],
1358
+ "type": "library",
1359
+ "extra": {
1360
+ "scenarios": {
1361
+ "symfony4": {
1362
+ "require": {
1363
+ "symfony/console": "^4.4.11",
1364
+ "symfony/event-dispatcher": "^4.4.11",
1365
+ "symfony/filesystem": "^4.4.11",
1366
+ "symfony/finder": "^4.4.11",
1367
+ "symfony/process": "^4.4.11",
1368
+ "phpunit/phpunit": "^6",
1369
+ "nikic/php-parser": "^2"
1370
+ },
1371
+ "remove": [
1372
+ "codeception/phpunit-wrapper"
1373
+ ],
1374
+ "config": {
1375
+ "platform": {
1376
+ "php": "7.1.3"
1377
+ }
1378
+ }
1379
+ }
1380
+ },
1381
+ "branch-alias": {
1382
+ "dev-master": "2.x-dev",
1383
+ "dev-main": "2.x-dev"
1384
+ }
1385
+ },
1386
+ "autoload": {
1387
+ "psr-4": {
1388
+ "Robo\\": "src"
1389
+ }
1390
+ },
1391
+ "notification-url": "https://packagist.org/downloads/",
1392
+ "license": [
1393
+ "MIT"
1394
+ ],
1395
+ "authors": [
1396
+ {
1397
+ "name": "Davert",
1398
+ "email": "davert.php@resend.cc"
1399
+ }
1400
+ ],
1401
+ "description": "Modern task runner",
1402
+ "support": {
1403
+ "issues": "https://github.com/consolidation/Robo/issues",
1404
+ "source": "https://github.com/consolidation/Robo/tree/3.0.6"
1405
+ },
1406
+ "time": "2021-10-05T23:56:45+00:00"
1407
+ },
1408
+ {
1409
+ "name": "consolidation/self-update",
1410
+ "version": "2.0.0",
1411
+ "source": {
1412
+ "type": "git",
1413
+ "url": "https://github.com/consolidation/self-update.git",
1414
+ "reference": "7d6877f8006c51069e1469a9c57b1435640f74b7"
1415
+ },
1416
+ "dist": {
1417
+ "type": "zip",
1418
+ "url": "https://api.github.com/repos/consolidation/self-update/zipball/7d6877f8006c51069e1469a9c57b1435640f74b7",
1419
+ "reference": "7d6877f8006c51069e1469a9c57b1435640f74b7",
1420
+ "shasum": ""
1421
+ },
1422
+ "require": {
1423
+ "composer/semver": "^3.2",
1424
+ "php": ">=5.5.0",
1425
+ "symfony/console": "^2.8|^3|^4|^5",
1426
+ "symfony/filesystem": "^2.5|^3|^4|^5"
1427
+ },
1428
+ "bin": [
1429
+ "scripts/release"
1430
+ ],
1431
+ "type": "library",
1432
+ "extra": {
1433
+ "branch-alias": {
1434
+ "dev-main": "2.x-dev"
1435
+ }
1436
+ },
1437
+ "autoload": {
1438
+ "psr-4": {
1439
+ "SelfUpdate\\": "src"
1440
+ }
1441
+ },
1442
+ "notification-url": "https://packagist.org/downloads/",
1443
+ "license": [
1444
+ "MIT"
1445
+ ],
1446
+ "authors": [
1447
+ {
1448
+ "name": "Alexander Menk",
1449
+ "email": "menk@mestrona.net"
1450
+ },
1451
+ {
1452
+ "name": "Greg Anderson",
1453
+ "email": "greg.1.anderson@greenknowe.org"
1454
+ }
1455
+ ],
1456
+ "description": "Provides a self:update command for Symfony Console applications.",
1457
+ "support": {
1458
+ "issues": "https://github.com/consolidation/self-update/issues",
1459
+ "source": "https://github.com/consolidation/self-update/tree/2.0.0"
1460
+ },
1461
+ "time": "2021-10-05T23:29:47+00:00"
1462
+ },
1463
+ {
1464
+ "name": "dealerdirect/phpcodesniffer-composer-installer",
1465
+ "version": "v0.7.1",
1466
+ "source": {
1467
+ "type": "git",
1468
+ "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git",
1469
+ "reference": "fe390591e0241955f22eb9ba327d137e501c771c"
1470
+ },
1471
+ "dist": {
1472
+ "type": "zip",
1473
+ "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/fe390591e0241955f22eb9ba327d137e501c771c",
1474
+ "reference": "fe390591e0241955f22eb9ba327d137e501c771c",
1475
+ "shasum": ""
1476
+ },
1477
+ "require": {
1478
+ "composer-plugin-api": "^1.0 || ^2.0",
1479
+ "php": ">=5.3",
1480
+ "squizlabs/php_codesniffer": "^2.0 || ^3.0 || ^4.0"
1481
+ },
1482
+ "require-dev": {
1483
+ "composer/composer": "*",
1484
+ "phpcompatibility/php-compatibility": "^9.0",
1485
+ "sensiolabs/security-checker": "^4.1.0"
1486
+ },
1487
+ "type": "composer-plugin",
1488
+ "extra": {
1489
+ "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
1490
+ },
1491
+ "autoload": {
1492
+ "psr-4": {
1493
+ "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
1494
+ }
1495
+ },
1496
+ "notification-url": "https://packagist.org/downloads/",
1497
+ "license": [
1498
+ "MIT"
1499
+ ],
1500
+ "authors": [
1501
+ {
1502
+ "name": "Franck Nijhof",
1503
+ "email": "franck.nijhof@dealerdirect.com",
1504
+ "homepage": "http://www.frenck.nl",
1505
+ "role": "Developer / IT Manager"
1506
+ }
1507
+ ],
1508
+ "description": "PHP_CodeSniffer Standards Composer Installer Plugin",
1509
+ "homepage": "http://www.dealerdirect.com",
1510
+ "keywords": [
1511
+ "PHPCodeSniffer",
1512
+ "PHP_CodeSniffer",
1513
+ "code quality",
1514
+ "codesniffer",
1515
+ "composer",
1516
+ "installer",
1517
+ "phpcs",
1518
+ "plugin",
1519
+ "qa",
1520
+ "quality",
1521
+ "standard",
1522
+ "standards",
1523
+ "style guide",
1524
+ "stylecheck",
1525
+ "tests"
1526
+ ],
1527
+ "support": {
1528
+ "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues",
1529
+ "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer"
1530
+ },
1531
+ "time": "2020-12-07T18:04:37+00:00"
1532
+ },
1533
+ {
1534
+ "name": "dflydev/dot-access-data",
1535
+ "version": "v1.1.0",
1536
+ "source": {
1537
+ "type": "git",
1538
+ "url": "https://github.com/dflydev/dflydev-dot-access-data.git",
1539
+ "reference": "3fbd874921ab2c041e899d044585a2ab9795df8a"
1540
+ },
1541
+ "dist": {
1542
+ "type": "zip",
1543
+ "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/3fbd874921ab2c041e899d044585a2ab9795df8a",
1544
+ "reference": "3fbd874921ab2c041e899d044585a2ab9795df8a",
1545
+ "shasum": ""
1546
+ },
1547
+ "require": {
1548
+ "php": ">=5.3.2"
1549
+ },
1550
+ "type": "library",
1551
+ "extra": {
1552
+ "branch-alias": {
1553
+ "dev-master": "1.0-dev"
1554
+ }
1555
+ },
1556
+ "autoload": {
1557
+ "psr-0": {
1558
+ "Dflydev\\DotAccessData": "src"
1559
+ }
1560
+ },
1561
+ "notification-url": "https://packagist.org/downloads/",
1562
+ "license": [
1563
+ "MIT"
1564
+ ],
1565
+ "authors": [
1566
+ {
1567
+ "name": "Dragonfly Development Inc.",
1568
+ "email": "info@dflydev.com",
1569
+ "homepage": "http://dflydev.com"
1570
+ },
1571
+ {
1572
+ "name": "Beau Simensen",
1573
+ "email": "beau@dflydev.com",
1574
+ "homepage": "http://beausimensen.com"
1575
+ },
1576
+ {
1577
+ "name": "Carlos Frutos",
1578
+ "email": "carlos@kiwing.it",
1579
+ "homepage": "https://github.com/cfrutos"
1580
+ }
1581
+ ],
1582
+ "description": "Given a deep data structure, access data by dot notation.",
1583
+ "homepage": "https://github.com/dflydev/dflydev-dot-access-data",
1584
+ "keywords": [
1585
+ "access",
1586
+ "data",
1587
+ "dot",
1588
+ "notation"
1589
+ ],
1590
+ "support": {
1591
+ "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
1592
+ "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/master"
1593
+ },
1594
+ "time": "2017-01-20T21:14:22+00:00"
1595
+ },
1596
+ {
1597
+ "name": "dg/mysql-dump",
1598
+ "version": "v1.5.1",
1599
+ "source": {
1600
+ "type": "git",
1601
+ "url": "https://github.com/dg/MySQL-dump.git",
1602
+ "reference": "e0e287b715b43293773a8b0edf8514f606e01780"
1603
+ },
1604
+ "dist": {
1605
+ "type": "zip",
1606
+ "url": "https://api.github.com/repos/dg/MySQL-dump/zipball/e0e287b715b43293773a8b0edf8514f606e01780",
1607
+ "reference": "e0e287b715b43293773a8b0edf8514f606e01780",
1608
+ "shasum": ""
1609
+ },
1610
+ "require": {
1611
+ "php": ">=5.6"
1612
+ },
1613
+ "type": "library",
1614
+ "autoload": {
1615
+ "classmap": [
1616
+ "src/"
1617
+ ]
1618
+ },
1619
+ "notification-url": "https://packagist.org/downloads/",
1620
+ "license": [
1621
+ "BSD-3-Clause"
1622
+ ],
1623
+ "authors": [
1624
+ {
1625
+ "name": "David Grudl",
1626
+ "homepage": "http://davidgrudl.com"
1627
+ }
1628
+ ],
1629
+ "description": "MySQL database dump.",
1630
+ "homepage": "https://github.com/dg/MySQL-dump",
1631
+ "keywords": [
1632
+ "mysql"
1633
+ ],
1634
+ "support": {
1635
+ "source": "https://github.com/dg/MySQL-dump/tree/master"
1636
+ },
1637
+ "time": "2019-09-10T21:36:25+00:00"
1638
+ },
1639
+ {
1640
+ "name": "doctrine/inflector",
1641
+ "version": "2.0.4",
1642
+ "source": {
1643
+ "type": "git",
1644
+ "url": "https://github.com/doctrine/inflector.git",
1645
+ "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89"
1646
+ },
1647
+ "dist": {
1648
+ "type": "zip",
1649
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89",
1650
+ "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89",
1651
+ "shasum": ""
1652
+ },
1653
+ "require": {
1654
+ "php": "^7.2 || ^8.0"
1655
+ },
1656
+ "require-dev": {
1657
+ "doctrine/coding-standard": "^8.2",
1658
+ "phpstan/phpstan": "^0.12",
1659
+ "phpstan/phpstan-phpunit": "^0.12",
1660
+ "phpstan/phpstan-strict-rules": "^0.12",
1661
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
1662
+ "vimeo/psalm": "^4.10"
1663
+ },
1664
+ "type": "library",
1665
+ "autoload": {
1666
+ "psr-4": {
1667
+ "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
1668
+ }
1669
+ },
1670
+ "notification-url": "https://packagist.org/downloads/",
1671
+ "license": [
1672
+ "MIT"
1673
+ ],
1674
+ "authors": [
1675
+ {
1676
+ "name": "Guilherme Blanco",
1677
+ "email": "guilhermeblanco@gmail.com"
1678
+ },
1679
+ {
1680
+ "name": "Roman Borschel",
1681
+ "email": "roman@code-factory.org"
1682
+ },
1683
+ {
1684
+ "name": "Benjamin Eberlei",
1685
+ "email": "kontakt@beberlei.de"
1686
+ },
1687
+ {
1688
+ "name": "Jonathan Wage",
1689
+ "email": "jonwage@gmail.com"
1690
+ },
1691
+ {
1692
+ "name": "Johannes Schmitt",
1693
+ "email": "schmittjoh@gmail.com"
1694
+ }
1695
+ ],
1696
+ "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
1697
+ "homepage": "https://www.doctrine-project.org/projects/inflector.html",
1698
+ "keywords": [
1699
+ "inflection",
1700
+ "inflector",
1701
+ "lowercase",
1702
+ "manipulation",
1703
+ "php",
1704
+ "plural",
1705
+ "singular",
1706
+ "strings",
1707
+ "uppercase",
1708
+ "words"
1709
+ ],
1710
+ "support": {
1711
+ "issues": "https://github.com/doctrine/inflector/issues",
1712
+ "source": "https://github.com/doctrine/inflector/tree/2.0.4"
1713
+ },
1714
+ "funding": [
1715
+ {
1716
+ "url": "https://www.doctrine-project.org/sponsorship.html",
1717
+ "type": "custom"
1718
+ },
1719
+ {
1720
+ "url": "https://www.patreon.com/phpdoctrine",
1721
+ "type": "patreon"
1722
+ },
1723
+ {
1724
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
1725
+ "type": "tidelift"
1726
+ }
1727
+ ],
1728
+ "time": "2021-10-22T20:16:43+00:00"
1729
+ },
1730
+ {
1731
+ "name": "doctrine/instantiator",
1732
+ "version": "1.4.0",
1733
+ "source": {
1734
+ "type": "git",
1735
+ "url": "https://github.com/doctrine/instantiator.git",
1736
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
1737
+ },
1738
+ "dist": {
1739
+ "type": "zip",
1740
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
1741
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
1742
+ "shasum": ""
1743
+ },
1744
+ "require": {
1745
+ "php": "^7.1 || ^8.0"
1746
+ },
1747
+ "require-dev": {
1748
+ "doctrine/coding-standard": "^8.0",
1749
+ "ext-pdo": "*",
1750
+ "ext-phar": "*",
1751
+ "phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
1752
+ "phpstan/phpstan": "^0.12",
1753
+ "phpstan/phpstan-phpunit": "^0.12",
1754
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
1755
+ },
1756
+ "type": "library",
1757
+ "autoload": {
1758
+ "psr-4": {
1759
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
1760
+ }
1761
+ },
1762
+ "notification-url": "https://packagist.org/downloads/",
1763
+ "license": [
1764
+ "MIT"
1765
+ ],
1766
+ "authors": [
1767
+ {
1768
+ "name": "Marco Pivetta",
1769
+ "email": "ocramius@gmail.com",
1770
+ "homepage": "https://ocramius.github.io/"
1771
+ }
1772
+ ],
1773
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
1774
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
1775
+ "keywords": [
1776
+ "constructor",
1777
+ "instantiate"
1778
+ ],
1779
+ "support": {
1780
+ "issues": "https://github.com/doctrine/instantiator/issues",
1781
+ "source": "https://github.com/doctrine/instantiator/tree/1.4.0"
1782
+ },
1783
+ "funding": [
1784
+ {
1785
+ "url": "https://www.doctrine-project.org/sponsorship.html",
1786
+ "type": "custom"
1787
+ },
1788
+ {
1789
+ "url": "https://www.patreon.com/phpdoctrine",
1790
+ "type": "patreon"
1791
+ },
1792
+ {
1793
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
1794
+ "type": "tidelift"
1795
+ }
1796
+ ],
1797
+ "time": "2020-11-10T18:47:58+00:00"
1798
+ },
1799
+ {
1800
+ "name": "grasmash/expander",
1801
+ "version": "1.0.0",
1802
+ "source": {
1803
+ "type": "git",
1804
+ "url": "https://github.com/grasmash/expander.git",
1805
+ "reference": "95d6037344a4be1dd5f8e0b0b2571a28c397578f"
1806
+ },
1807
+ "dist": {
1808
+ "type": "zip",
1809
+ "url": "https://api.github.com/repos/grasmash/expander/zipball/95d6037344a4be1dd5f8e0b0b2571a28c397578f",
1810
+ "reference": "95d6037344a4be1dd5f8e0b0b2571a28c397578f",
1811
+ "shasum": ""
1812
+ },
1813
+ "require": {
1814
+ "dflydev/dot-access-data": "^1.1.0",
1815
+ "php": ">=5.4"
1816
+ },
1817
+ "require-dev": {
1818
+ "greg-1-anderson/composer-test-scenarios": "^1",
1819
+ "phpunit/phpunit": "^4|^5.5.4",
1820
+ "satooshi/php-coveralls": "^1.0.2|dev-master",
1821
+ "squizlabs/php_codesniffer": "^2.7"
1822
+ },
1823
+ "type": "library",
1824
+ "extra": {
1825
+ "branch-alias": {
1826
+ "dev-master": "1.x-dev"
1827
+ }
1828
+ },
1829
+ "autoload": {
1830
+ "psr-4": {
1831
+ "Grasmash\\Expander\\": "src/"
1832
+ }
1833
+ },
1834
+ "notification-url": "https://packagist.org/downloads/",
1835
+ "license": [
1836
+ "MIT"
1837
+ ],
1838
+ "authors": [
1839
+ {
1840
+ "name": "Matthew Grasmick"
1841
+ }
1842
+ ],
1843
+ "description": "Expands internal property references in PHP arrays file.",
1844
+ "support": {
1845
+ "issues": "https://github.com/grasmash/expander/issues",
1846
+ "source": "https://github.com/grasmash/expander/tree/master"
1847
+ },
1848
+ "time": "2017-12-21T22:14:55+00:00"
1849
+ },
1850
+ {
1851
+ "name": "guzzlehttp/guzzle",
1852
+ "version": "7.4.0",
1853
+ "source": {
1854
+ "type": "git",
1855
+ "url": "https://github.com/guzzle/guzzle.git",
1856
+ "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94"
1857
+ },
1858
+ "dist": {
1859
+ "type": "zip",
1860
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/868b3571a039f0ebc11ac8f344f4080babe2cb94",
1861
+ "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94",
1862
+ "shasum": ""
1863
+ },
1864
+ "require": {
1865
+ "ext-json": "*",
1866
+ "guzzlehttp/promises": "^1.5",
1867
+ "guzzlehttp/psr7": "^1.8.3 || ^2.1",
1868
+ "php": "^7.2.5 || ^8.0",
1869
+ "psr/http-client": "^1.0",
1870
+ "symfony/deprecation-contracts": "^2.2"
1871
+ },
1872
+ "provide": {
1873
+ "psr/http-client-implementation": "1.0"
1874
+ },
1875
+ "require-dev": {
1876
+ "bamarni/composer-bin-plugin": "^1.4.1",
1877
+ "ext-curl": "*",
1878
+ "php-http/client-integration-tests": "^3.0",
1879
+ "phpunit/phpunit": "^8.5.5 || ^9.3.5",
1880
+ "psr/log": "^1.1 || ^2.0 || ^3.0"
1881
+ },
1882
+ "suggest": {
1883
+ "ext-curl": "Required for CURL handler support",
1884
+ "ext-intl": "Required for Internationalized Domain Name (IDN) support",
1885
+ "psr/log": "Required for using the Log middleware"
1886
+ },
1887
+ "type": "library",
1888
+ "extra": {
1889
+ "branch-alias": {
1890
+ "dev-master": "7.4-dev"
1891
+ }
1892
+ },
1893
+ "autoload": {
1894
+ "psr-4": {
1895
+ "GuzzleHttp\\": "src/"
1896
+ },
1897
+ "files": [
1898
+ "src/functions_include.php"
1899
+ ]
1900
+ },
1901
+ "notification-url": "https://packagist.org/downloads/",
1902
+ "license": [
1903
+ "MIT"
1904
+ ],
1905
+ "authors": [
1906
+ {
1907
+ "name": "Graham Campbell",
1908
+ "email": "hello@gjcampbell.co.uk",
1909
+ "homepage": "https://github.com/GrahamCampbell"
1910
+ },
1911
+ {
1912
+ "name": "Michael Dowling",
1913
+ "email": "mtdowling@gmail.com",
1914
+ "homepage": "https://github.com/mtdowling"
1915
+ },
1916
+ {
1917
+ "name": "Jeremy Lindblom",
1918
+ "email": "jeremeamia@gmail.com",
1919
+ "homepage": "https://github.com/jeremeamia"
1920
+ },
1921
+ {
1922
+ "name": "George Mponos",
1923
+ "email": "gmponos@gmail.com",
1924
+ "homepage": "https://github.com/gmponos"
1925
+ },
1926
+ {
1927
+ "name": "Tobias Nyholm",
1928
+ "email": "tobias.nyholm@gmail.com",
1929
+ "homepage": "https://github.com/Nyholm"
1930
+ },
1931
+ {
1932
+ "name": "Márk Sági-Kazár",
1933
+ "email": "mark.sagikazar@gmail.com",
1934
+ "homepage": "https://github.com/sagikazarmark"
1935
+ },
1936
+ {
1937
+ "name": "Tobias Schultze",
1938
+ "email": "webmaster@tubo-world.de",
1939
+ "homepage": "https://github.com/Tobion"
1940
+ }
1941
+ ],
1942
+ "description": "Guzzle is a PHP HTTP client library",
1943
+ "keywords": [
1944
+ "client",
1945
+ "curl",
1946
+ "framework",
1947
+ "http",
1948
+ "http client",
1949
+ "psr-18",
1950
+ "psr-7",
1951
+ "rest",
1952
+ "web service"
1953
+ ],
1954
+ "support": {
1955
+ "issues": "https://github.com/guzzle/guzzle/issues",
1956
+ "source": "https://github.com/guzzle/guzzle/tree/7.4.0"
1957
+ },
1958
+ "funding": [
1959
+ {
1960
+ "url": "https://github.com/GrahamCampbell",
1961
+ "type": "github"
1962
+ },
1963
+ {
1964
+ "url": "https://github.com/Nyholm",
1965
+ "type": "github"
1966
+ },
1967
+ {
1968
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
1969
+ "type": "tidelift"
1970
+ }
1971
+ ],
1972
+ "time": "2021-10-18T09:52:00+00:00"
1973
+ },
1974
+ {
1975
+ "name": "guzzlehttp/promises",
1976
+ "version": "1.5.1",
1977
+ "source": {
1978
+ "type": "git",
1979
+ "url": "https://github.com/guzzle/promises.git",
1980
+ "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da"
1981
+ },
1982
+ "dist": {
1983
+ "type": "zip",
1984
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
1985
+ "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
1986
+ "shasum": ""
1987
+ },
1988
+ "require": {
1989
+ "php": ">=5.5"
1990
+ },
1991
+ "require-dev": {
1992
+ "symfony/phpunit-bridge": "^4.4 || ^5.1"
1993
+ },
1994
+ "type": "library",
1995
+ "extra": {
1996
+ "branch-alias": {
1997
+ "dev-master": "1.5-dev"
1998
+ }
1999
+ },
2000
+ "autoload": {
2001
+ "psr-4": {
2002
+ "GuzzleHttp\\Promise\\": "src/"
2003
+ },
2004
+ "files": [
2005
+ "src/functions_include.php"
2006
+ ]
2007
+ },
2008
+ "notification-url": "https://packagist.org/downloads/",
2009
+ "license": [
2010
+ "MIT"
2011
+ ],
2012
+ "authors": [
2013
+ {
2014
+ "name": "Graham Campbell",
2015
+ "email": "hello@gjcampbell.co.uk",
2016
+ "homepage": "https://github.com/GrahamCampbell"
2017
+ },
2018
+ {
2019
+ "name": "Michael Dowling",
2020
+ "email": "mtdowling@gmail.com",
2021
+ "homepage": "https://github.com/mtdowling"
2022
+ },
2023
+ {
2024
+ "name": "Tobias Nyholm",
2025
+ "email": "tobias.nyholm@gmail.com",
2026
+ "homepage": "https://github.com/Nyholm"
2027
+ },
2028
+ {
2029
+ "name": "Tobias Schultze",
2030
+ "email": "webmaster@tubo-world.de",
2031
+ "homepage": "https://github.com/Tobion"
2032
+ }
2033
+ ],
2034
+ "description": "Guzzle promises library",
2035
+ "keywords": [
2036
+ "promise"
2037
+ ],
2038
+ "support": {
2039
+ "issues": "https://github.com/guzzle/promises/issues",
2040
+ "source": "https://github.com/guzzle/promises/tree/1.5.1"
2041
+ },
2042
+ "funding": [
2043
+ {
2044
+ "url": "https://github.com/GrahamCampbell",
2045
+ "type": "github"
2046
+ },
2047
+ {
2048
+ "url": "https://github.com/Nyholm",
2049
+ "type": "github"
2050
+ },
2051
+ {
2052
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
2053
+ "type": "tidelift"
2054
+ }
2055
+ ],
2056
+ "time": "2021-10-22T20:56:57+00:00"
2057
+ },
2058
+ {
2059
+ "name": "guzzlehttp/psr7",
2060
+ "version": "2.1.0",
2061
+ "source": {
2062
+ "type": "git",
2063
+ "url": "https://github.com/guzzle/psr7.git",
2064
+ "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72"
2065
+ },
2066
+ "dist": {
2067
+ "type": "zip",
2068
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/089edd38f5b8abba6cb01567c2a8aaa47cec4c72",
2069
+ "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72",
2070
+ "shasum": ""
2071
+ },
2072
+ "require": {
2073
+ "php": "^7.2.5 || ^8.0",
2074
+ "psr/http-factory": "^1.0",
2075
+ "psr/http-message": "^1.0",
2076
+ "ralouphie/getallheaders": "^3.0"
2077
+ },
2078
+ "provide": {
2079
+ "psr/http-factory-implementation": "1.0",
2080
+ "psr/http-message-implementation": "1.0"
2081
+ },
2082
+ "require-dev": {
2083
+ "bamarni/composer-bin-plugin": "^1.4.1",
2084
+ "http-interop/http-factory-tests": "^0.9",
2085
+ "phpunit/phpunit": "^8.5.8 || ^9.3.10"
2086
+ },
2087
+ "suggest": {
2088
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
2089
+ },
2090
+ "type": "library",
2091
+ "extra": {
2092
+ "branch-alias": {
2093
+ "dev-master": "2.1-dev"
2094
+ }
2095
+ },
2096
+ "autoload": {
2097
+ "psr-4": {
2098
+ "GuzzleHttp\\Psr7\\": "src/"
2099
+ }
2100
+ },
2101
+ "notification-url": "https://packagist.org/downloads/",
2102
+ "license": [
2103
+ "MIT"
2104
+ ],
2105
+ "authors": [
2106
+ {
2107
+ "name": "Graham Campbell",
2108
+ "email": "hello@gjcampbell.co.uk",
2109
+ "homepage": "https://github.com/GrahamCampbell"
2110
+ },
2111
+ {
2112
+ "name": "Michael Dowling",
2113
+ "email": "mtdowling@gmail.com",
2114
+ "homepage": "https://github.com/mtdowling"
2115
+ },
2116
+ {
2117
+ "name": "George Mponos",
2118
+ "email": "gmponos@gmail.com",
2119
+ "homepage": "https://github.com/gmponos"
2120
+ },
2121
+ {
2122
+ "name": "Tobias Nyholm",
2123
+ "email": "tobias.nyholm@gmail.com",
2124
+ "homepage": "https://github.com/Nyholm"
2125
+ },
2126
+ {
2127
+ "name": "Márk Sági-Kazár",
2128
+ "email": "mark.sagikazar@gmail.com",
2129
+ "homepage": "https://github.com/sagikazarmark"
2130
+ },
2131
+ {
2132
+ "name": "Tobias Schultze",
2133
+ "email": "webmaster@tubo-world.de",
2134
+ "homepage": "https://github.com/Tobion"
2135
+ },
2136
+ {
2137
+ "name": "Márk Sági-Kazár",
2138
+ "email": "mark.sagikazar@gmail.com",
2139
+ "homepage": "https://sagikazarmark.hu"
2140
+ }
2141
+ ],
2142
+ "description": "PSR-7 message implementation that also provides common utility methods",
2143
+ "keywords": [
2144
+ "http",
2145
+ "message",
2146
+ "psr-7",
2147
+ "request",
2148
+ "response",
2149
+ "stream",
2150
+ "uri",
2151
+ "url"
2152
+ ],
2153
+ "support": {
2154
+ "issues": "https://github.com/guzzle/psr7/issues",
2155
+ "source": "https://github.com/guzzle/psr7/tree/2.1.0"
2156
+ },
2157
+ "funding": [
2158
+ {
2159
+ "url": "https://github.com/GrahamCampbell",
2160
+ "type": "github"
2161
+ },
2162
+ {
2163
+ "url": "https://github.com/Nyholm",
2164
+ "type": "github"
2165
+ },
2166
+ {
2167
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
2168
+ "type": "tidelift"
2169
+ }
2170
+ ],
2171
+ "time": "2021-10-06T17:43:30+00:00"
2172
+ },
2173
+ {
2174
+ "name": "illuminate/collections",
2175
+ "version": "v8.68.1",
2176
+ "source": {
2177
+ "type": "git",
2178
+ "url": "https://github.com/illuminate/collections.git",
2179
+ "reference": "05f286ec5fd2dd286e8384577047efc375c8954c"
2180
+ },
2181
+ "dist": {
2182
+ "type": "zip",
2183
+ "url": "https://api.github.com/repos/illuminate/collections/zipball/05f286ec5fd2dd286e8384577047efc375c8954c",
2184
+ "reference": "05f286ec5fd2dd286e8384577047efc375c8954c",
2185
+ "shasum": ""
2186
+ },
2187
+ "require": {
2188
+ "illuminate/contracts": "^8.0",
2189
+ "illuminate/macroable": "^8.0",
2190
+ "php": "^7.3|^8.0"
2191
+ },
2192
+ "suggest": {
2193
+ "symfony/var-dumper": "Required to use the dump method (^5.1.4)."
2194
+ },
2195
+ "type": "library",
2196
+ "extra": {
2197
+ "branch-alias": {
2198
+ "dev-master": "8.x-dev"
2199
+ }
2200
+ },
2201
+ "autoload": {
2202
+ "psr-4": {
2203
+ "Illuminate\\Support\\": ""
2204
+ },
2205
+ "files": [
2206
+ "helpers.php"
2207
+ ]
2208
+ },
2209
+ "notification-url": "https://packagist.org/downloads/",
2210
+ "license": [
2211
+ "MIT"
2212
+ ],
2213
+ "authors": [
2214
+ {
2215
+ "name": "Taylor Otwell",
2216
+ "email": "taylor@laravel.com"
2217
+ }
2218
+ ],
2219
+ "description": "The Illuminate Collections package.",
2220
+ "homepage": "https://laravel.com",
2221
+ "support": {
2222
+ "issues": "https://github.com/laravel/framework/issues",
2223
+ "source": "https://github.com/laravel/framework"
2224
+ },
2225
+ "time": "2021-10-22T18:01:46+00:00"
2226
+ },
2227
+ {
2228
+ "name": "illuminate/contracts",
2229
+ "version": "v8.68.1",
2230
+ "source": {
2231
+ "type": "git",
2232
+ "url": "https://github.com/illuminate/contracts.git",
2233
+ "reference": "e76f4bce73a2a1656add24bd5210ebc4b8af49c0"
2234
+ },
2235
+ "dist": {
2236
+ "type": "zip",
2237
+ "url": "https://api.github.com/repos/illuminate/contracts/zipball/e76f4bce73a2a1656add24bd5210ebc4b8af49c0",
2238
+ "reference": "e76f4bce73a2a1656add24bd5210ebc4b8af49c0",
2239
+ "shasum": ""
2240
+ },
2241
+ "require": {
2242
+ "php": "^7.3|^8.0",
2243
+ "psr/container": "^1.0",
2244
+ "psr/simple-cache": "^1.0"
2245
+ },
2246
+ "type": "library",
2247
+ "extra": {
2248
+ "branch-alias": {
2249
+ "dev-master": "8.x-dev"
2250
+ }
2251
+ },
2252
+ "autoload": {
2253
+ "psr-4": {
2254
+ "Illuminate\\Contracts\\": ""
2255
+ }
2256
+ },
2257
+ "notification-url": "https://packagist.org/downloads/",
2258
+ "license": [
2259
+ "MIT"
2260
+ ],
2261
+ "authors": [
2262
+ {
2263
+ "name": "Taylor Otwell",
2264
+ "email": "taylor@laravel.com"
2265
+ }
2266
+ ],
2267
+ "description": "The Illuminate Contracts package.",
2268
+ "homepage": "https://laravel.com",
2269
+ "support": {
2270
+ "issues": "https://github.com/laravel/framework/issues",
2271
+ "source": "https://github.com/laravel/framework"
2272
+ },
2273
+ "time": "2021-10-22T18:01:46+00:00"
2274
+ },
2275
+ {
2276
+ "name": "illuminate/macroable",
2277
+ "version": "v8.68.1",
2278
+ "source": {
2279
+ "type": "git",
2280
+ "url": "https://github.com/illuminate/macroable.git",
2281
+ "reference": "300aa13c086f25116b5f3cde3ca54ff5c822fb05"
2282
+ },
2283
+ "dist": {
2284
+ "type": "zip",
2285
+ "url": "https://api.github.com/repos/illuminate/macroable/zipball/300aa13c086f25116b5f3cde3ca54ff5c822fb05",
2286
+ "reference": "300aa13c086f25116b5f3cde3ca54ff5c822fb05",
2287
+ "shasum": ""
2288
+ },
2289
+ "require": {
2290
+ "php": "^7.3|^8.0"
2291
+ },
2292
+ "type": "library",
2293
+ "extra": {
2294
+ "branch-alias": {
2295
+ "dev-master": "8.x-dev"
2296
+ }
2297
+ },
2298
+ "autoload": {
2299
+ "psr-4": {
2300
+ "Illuminate\\Support\\": ""
2301
+ }
2302
+ },
2303
+ "notification-url": "https://packagist.org/downloads/",
2304
+ "license": [
2305
+ "MIT"
2306
+ ],
2307
+ "authors": [
2308
+ {
2309
+ "name": "Taylor Otwell",
2310
+ "email": "taylor@laravel.com"
2311
+ }
2312
+ ],
2313
+ "description": "The Illuminate Macroable package.",
2314
+ "homepage": "https://laravel.com",
2315
+ "support": {
2316
+ "issues": "https://github.com/laravel/framework/issues",
2317
+ "source": "https://github.com/laravel/framework"
2318
+ },
2319
+ "time": "2020-10-27T15:20:30+00:00"
2320
+ },
2321
+ {
2322
+ "name": "illuminate/support",
2323
+ "version": "v8.68.1",
2324
+ "source": {
2325
+ "type": "git",
2326
+ "url": "https://github.com/illuminate/support.git",
2327
+ "reference": "f0a1ffbfd93a24758f39cc76821ce5a408e20b53"
2328
+ },
2329
+ "dist": {
2330
+ "type": "zip",
2331
+ "url": "https://api.github.com/repos/illuminate/support/zipball/f0a1ffbfd93a24758f39cc76821ce5a408e20b53",
2332
+ "reference": "f0a1ffbfd93a24758f39cc76821ce5a408e20b53",
2333
+ "shasum": ""
2334
+ },
2335
+ "require": {
2336
+ "doctrine/inflector": "^1.4|^2.0",
2337
+ "ext-json": "*",
2338
+ "ext-mbstring": "*",
2339
+ "illuminate/collections": "^8.0",
2340
+ "illuminate/contracts": "^8.0",
2341
+ "illuminate/macroable": "^8.0",
2342
+ "nesbot/carbon": "^2.53.1",
2343
+ "php": "^7.3|^8.0",
2344
+ "voku/portable-ascii": "^1.4.8"
2345
+ },
2346
+ "conflict": {
2347
+ "tightenco/collect": "<5.5.33"
2348
+ },
2349
+ "suggest": {
2350
+ "illuminate/filesystem": "Required to use the composer class (^8.0).",
2351
+ "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0.2).",
2352
+ "ramsey/uuid": "Required to use Str::uuid() (^4.2.2).",
2353
+ "symfony/process": "Required to use the composer class (^5.1.4).",
2354
+ "symfony/var-dumper": "Required to use the dd function (^5.1.4).",
2355
+ "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)."
2356
+ },
2357
+ "type": "library",
2358
+ "extra": {
2359
+ "branch-alias": {
2360
+ "dev-master": "8.x-dev"
2361
+ }
2362
+ },
2363
+ "autoload": {
2364
+ "psr-4": {
2365
+ "Illuminate\\Support\\": ""
2366
+ },
2367
+ "files": [
2368
+ "helpers.php"
2369
+ ]
2370
+ },
2371
+ "notification-url": "https://packagist.org/downloads/",
2372
+ "license": [
2373
+ "MIT"
2374
+ ],
2375
+ "authors": [
2376
+ {
2377
+ "name": "Taylor Otwell",
2378
+ "email": "taylor@laravel.com"
2379
+ }
2380
+ ],
2381
+ "description": "The Illuminate Support package.",
2382
+ "homepage": "https://laravel.com",
2383
+ "support": {
2384
+ "issues": "https://github.com/laravel/framework/issues",
2385
+ "source": "https://github.com/laravel/framework"
2386
+ },
2387
+ "time": "2021-10-24T14:32:18+00:00"
2388
+ },
2389
+ {
2390
+ "name": "justinrainbow/json-schema",
2391
+ "version": "5.2.11",
2392
+ "source": {
2393
+ "type": "git",
2394
+ "url": "https://github.com/justinrainbow/json-schema.git",
2395
+ "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa"
2396
+ },
2397
+ "dist": {
2398
+ "type": "zip",
2399
+ "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa",
2400
+ "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa",
2401
+ "shasum": ""
2402
+ },
2403
+ "require": {
2404
+ "php": ">=5.3.3"
2405
+ },
2406
+ "require-dev": {
2407
+ "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
2408
+ "json-schema/json-schema-test-suite": "1.2.0",
2409
+ "phpunit/phpunit": "^4.8.35"
2410
+ },
2411
+ "bin": [
2412
+ "bin/validate-json"
2413
+ ],
2414
+ "type": "library",
2415
+ "extra": {
2416
+ "branch-alias": {
2417
+ "dev-master": "5.0.x-dev"
2418
+ }
2419
+ },
2420
+ "autoload": {
2421
+ "psr-4": {
2422
+ "JsonSchema\\": "src/JsonSchema/"
2423
+ }
2424
+ },
2425
+ "notification-url": "https://packagist.org/downloads/",
2426
+ "license": [
2427
+ "MIT"
2428
+ ],
2429
+ "authors": [
2430
+ {
2431
+ "name": "Bruno Prieto Reis",
2432
+ "email": "bruno.p.reis@gmail.com"
2433
+ },
2434
+ {
2435
+ "name": "Justin Rainbow",
2436
+ "email": "justin.rainbow@gmail.com"
2437
+ },
2438
+ {
2439
+ "name": "Igor Wiedler",
2440
+ "email": "igor@wiedler.ch"
2441
+ },
2442
+ {
2443
+ "name": "Robert Schönthal",
2444
+ "email": "seroscho@googlemail.com"
2445
+ }
2446
+ ],
2447
+ "description": "A library to validate a json schema.",
2448
+ "homepage": "https://github.com/justinrainbow/json-schema",
2449
+ "keywords": [
2450
+ "json",
2451
+ "schema"
2452
+ ],
2453
+ "support": {
2454
+ "issues": "https://github.com/justinrainbow/json-schema/issues",
2455
+ "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11"
2456
+ },
2457
+ "time": "2021-07-22T09:24:00+00:00"
2458
+ },
2459
+ {
2460
+ "name": "league/container",
2461
+ "version": "3.4.1",
2462
+ "source": {
2463
+ "type": "git",
2464
+ "url": "https://github.com/thephpleague/container.git",
2465
+ "reference": "84ecbc2dbecc31bd23faf759a0e329ee49abddbd"
2466
+ },
2467
+ "dist": {
2468
+ "type": "zip",
2469
+ "url": "https://api.github.com/repos/thephpleague/container/zipball/84ecbc2dbecc31bd23faf759a0e329ee49abddbd",
2470
+ "reference": "84ecbc2dbecc31bd23faf759a0e329ee49abddbd",
2471
+ "shasum": ""
2472
+ },
2473
+ "require": {
2474
+ "php": "^7.0 || ^8.0",
2475
+ "psr/container": "^1.0.0"
2476
+ },
2477
+ "provide": {
2478
+ "psr/container-implementation": "^1.0"
2479
+ },
2480
+ "replace": {
2481
+ "orno/di": "~2.0"
2482
+ },
2483
+ "require-dev": {
2484
+ "phpunit/phpunit": "^6.0 || ^7.0",
2485
+ "roave/security-advisories": "dev-latest",
2486
+ "scrutinizer/ocular": "^1.8",
2487
+ "squizlabs/php_codesniffer": "^3.5"
2488
+ },
2489
+ "type": "library",
2490
+ "extra": {
2491
+ "branch-alias": {
2492
+ "dev-master": "3.x-dev",
2493
+ "dev-3.x": "3.x-dev",
2494
+ "dev-2.x": "2.x-dev",
2495
+ "dev-1.x": "1.x-dev"
2496
+ }
2497
+ },
2498
+ "autoload": {
2499
+ "psr-4": {
2500
+ "League\\Container\\": "src"
2501
+ }
2502
+ },
2503
+ "notification-url": "https://packagist.org/downloads/",
2504
+ "license": [
2505
+ "MIT"
2506
+ ],
2507
+ "authors": [
2508
+ {
2509
+ "name": "Phil Bennett",
2510
+ "email": "philipobenito@gmail.com",
2511
+ "homepage": "http://www.philipobenito.com",
2512
+ "role": "Developer"
2513
+ }
2514
+ ],
2515
+ "description": "A fast and intuitive dependency injection container.",
2516
+ "homepage": "https://github.com/thephpleague/container",
2517
+ "keywords": [
2518
+ "container",
2519
+ "dependency",
2520
+ "di",
2521
+ "injection",
2522
+ "league",
2523
+ "provider",
2524
+ "service"
2525
+ ],
2526
+ "support": {
2527
+ "issues": "https://github.com/thephpleague/container/issues",
2528
+ "source": "https://github.com/thephpleague/container/tree/3.4.1"
2529
+ },
2530
+ "funding": [
2531
+ {
2532
+ "url": "https://github.com/philipobenito",
2533
+ "type": "github"
2534
+ }
2535
+ ],
2536
+ "time": "2021-07-09T08:23:52+00:00"
2537
+ },
2538
+ {
2539
+ "name": "lucatume/wp-browser",
2540
+ "version": "3.0.11",
2541
+ "source": {
2542
+ "type": "git",
2543
+ "url": "https://github.com/lucatume/wp-browser.git",
2544
+ "reference": "c215ae0aff4a4ea58e2172e7014a2a7b0c160e25"
2545
+ },
2546
+ "dist": {
2547
+ "type": "zip",
2548
+ "url": "https://api.github.com/repos/lucatume/wp-browser/zipball/c215ae0aff4a4ea58e2172e7014a2a7b0c160e25",
2549
+ "reference": "c215ae0aff4a4ea58e2172e7014a2a7b0c160e25",
2550
+ "shasum": ""
2551
+ },
2552
+ "require": {
2553
+ "antecedent/patchwork": "^2.0",
2554
+ "bordoni/phpass": "^0.3",
2555
+ "codeception/codeception": "^2.5 || ^3.0 || ^4.0",
2556
+ "dg/mysql-dump": "^1.3",
2557
+ "ext-fileinfo": "*",
2558
+ "ext-iconv": "*",
2559
+ "ext-json": "*",
2560
+ "ext-pdo": "*",
2561
+ "mikehaertl/php-shellcommand": "^1.6",
2562
+ "mikemclin/laravel-wp-password": "~2.0.0",
2563
+ "php": ">=5.6.0",
2564
+ "vria/nodiacritic": "^0.1.2",
2565
+ "wp-cli/wp-cli": ">=2.0 <3.0.0",
2566
+ "zordius/lightncandy": "^1.2"
2567
+ },
2568
+ "require-dev": {
2569
+ "erusev/parsedown": "^1.7",
2570
+ "gumlet/php-image-resize": "^1.6",
2571
+ "lucatume/codeception-snapshot-assertions": "^0.2",
2572
+ "mikey179/vfsstream": "^1.6",
2573
+ "victorjonsson/markdowndocs": "dev-master",
2574
+ "vlucas/phpdotenv": "^3.0",
2575
+ "wp-cli/wp-cli-bundle": "*"
2576
+ },
2577
+ "suggest": {
2578
+ "codeception/module-asserts": "Codeception 4.0 compatibility.",
2579
+ "codeception/module-cli": "Codeception 4.0 compatibility; required by the WPCLI module.",
2580
+ "codeception/module-db": "Codeception 4.0 compatibility; required by the WPDb module.",
2581
+ "codeception/module-filesystem": "Codeception 4.0 compatibility; required by the WPFilesystem module.",
2582
+ "codeception/module-phpbrowser": "Codeception 4.0 compatibility; required by the WPBrowser module.",
2583
+ "codeception/module-webdriver": "Codeception 4.0 compatibility; required by the WPWebDriver module.",
2584
+ "codeception/util-universalframework": "Codeception 4.0 compatibility; required by the WordPress framework module.",
2585
+ "gumlet/php-image-resize": "To handle runtime image modification in the WPDb::haveAttachmentInDatabase method.",
2586
+ "vlucas/phpdotenv:^4.0": "To manage more complex environment file based configuration of the suites."
2587
+ },
2588
+ "type": "library",
2589
+ "extra": {
2590
+ "_hash": "484f861f69198089cab0e642f27e5653"
2591
+ },
2592
+ "autoload": {
2593
+ "psr-4": {
2594
+ "Codeception\\": "src/Codeception",
2595
+ "tad\\": "src/tad"
2596
+ },
2597
+ "files": [
2598
+ "src/tad/WPBrowser/utils.php",
2599
+ "src/tad/WPBrowser/wp-polyfills.php"
2600
+ ]
2601
+ },
2602
+ "notification-url": "https://packagist.org/downloads/",
2603
+ "license": [
2604
+ "MIT"
2605
+ ],
2606
+ "authors": [
2607
+ {
2608
+ "name": "theAverageDev (Luca Tumedei)",
2609
+ "email": "luca@theaveragedev.com",
2610
+ "homepage": "http://theaveragedev.com",
2611
+ "role": "Developer"
2612
+ }
2613
+ ],
2614
+ "description": "WordPress extension of the PhpBrowser class.",
2615
+ "homepage": "http://github.com/lucatume/wp-browser",
2616
+ "keywords": [
2617
+ "codeception",
2618
+ "wordpress"
2619
+ ],
2620
+ "support": {
2621
+ "issues": "https://github.com/lucatume/wp-browser/issues",
2622
+ "source": "https://github.com/lucatume/wp-browser/tree/3.0.11"
2623
+ },
2624
+ "funding": [
2625
+ {
2626
+ "url": "https://github.com/lucatume",
2627
+ "type": "github"
2628
+ }
2629
+ ],
2630
+ "time": "2021-09-20T17:00:45+00:00"
2631
+ },
2632
+ {
2633
+ "name": "mikehaertl/php-shellcommand",
2634
+ "version": "1.6.4",
2635
+ "source": {
2636
+ "type": "git",
2637
+ "url": "https://github.com/mikehaertl/php-shellcommand.git",
2638
+ "reference": "3488d7803df1e8f1a343d3d0ca452d527ad8d5e5"
2639
+ },
2640
+ "dist": {
2641
+ "type": "zip",
2642
+ "url": "https://api.github.com/repos/mikehaertl/php-shellcommand/zipball/3488d7803df1e8f1a343d3d0ca452d527ad8d5e5",
2643
+ "reference": "3488d7803df1e8f1a343d3d0ca452d527ad8d5e5",
2644
+ "shasum": ""
2645
+ },
2646
+ "require": {
2647
+ "php": ">= 5.3.0"
2648
+ },
2649
+ "require-dev": {
2650
+ "phpunit/phpunit": ">4.0 <=9.4"
2651
+ },
2652
+ "type": "library",
2653
+ "autoload": {
2654
+ "psr-4": {
2655
+ "mikehaertl\\shellcommand\\": "src/"
2656
+ }
2657
+ },
2658
+ "notification-url": "https://packagist.org/downloads/",
2659
+ "license": [
2660
+ "MIT"
2661
+ ],
2662
+ "authors": [
2663
+ {
2664
+ "name": "Michael Härtl",
2665
+ "email": "haertl.mike@gmail.com"
2666
+ }
2667
+ ],
2668
+ "description": "An object oriented interface to shell commands",
2669
+ "keywords": [
2670
+ "shell"
2671
+ ],
2672
+ "support": {
2673
+ "issues": "https://github.com/mikehaertl/php-shellcommand/issues",
2674
+ "source": "https://github.com/mikehaertl/php-shellcommand/tree/1.6.4"
2675
+ },
2676
+ "time": "2021-03-17T06:54:33+00:00"
2677
+ },
2678
+ {
2679
+ "name": "mikemclin/laravel-wp-password",
2680
+ "version": "2.0.3",
2681
+ "source": {
2682
+ "type": "git",
2683
+ "url": "https://github.com/mikemclin/laravel-wp-password.git",
2684
+ "reference": "5225c95f75aa0a5ad4040ec2074d1c8d7f10b5f4"
2685
+ },
2686
+ "dist": {
2687
+ "type": "zip",
2688
+ "url": "https://api.github.com/repos/mikemclin/laravel-wp-password/zipball/5225c95f75aa0a5ad4040ec2074d1c8d7f10b5f4",
2689
+ "reference": "5225c95f75aa0a5ad4040ec2074d1c8d7f10b5f4",
2690
+ "shasum": ""
2691
+ },
2692
+ "require": {
2693
+ "bordoni/phpass": "0.3.*",
2694
+ "illuminate/support": ">=4.0.0",
2695
+ "php": ">=5.3.0"
2696
+ },
2697
+ "replace": {
2698
+ "mikemclin/laravel-wp-password": "self.version"
2699
+ },
2700
+ "require-dev": {
2701
+ "mockery/mockery": "~0.9",
2702
+ "phpunit/phpunit": "~4.0",
2703
+ "satooshi/php-coveralls": "^2.2"
2704
+ },
2705
+ "type": "laravel-package",
2706
+ "extra": {
2707
+ "laravel": {
2708
+ "providers": [
2709
+ "MikeMcLin\\WpPassword\\WpPasswordProvider"
2710
+ ],
2711
+ "aliases": {
2712
+ "WpPassword": "MikeMcLin\\WpPassword\\Facades\\WpPassword"
2713
+ }
2714
+ }
2715
+ },
2716
+ "autoload": {
2717
+ "psr-4": {
2718
+ "MikeMcLin\\WpPassword\\": "src/"
2719
+ }
2720
+ },
2721
+ "notification-url": "https://packagist.org/downloads/",
2722
+ "license": [
2723
+ "MIT"
2724
+ ],
2725
+ "authors": [
2726
+ {
2727
+ "name": "Mike McLin",
2728
+ "email": "mike@mikemclin.com",
2729
+ "homepage": "http://mikemclin.net"
2730
+ }
2731
+ ],
2732
+ "description": "Laravel package that checks and creates WordPress password hashes",
2733
+ "homepage": "https://github.com/mikemclin/laravel-wp-password",
2734
+ "keywords": [
2735
+ "hashing",
2736
+ "laravel",
2737
+ "password",
2738
+ "wordpress"
2739
+ ],
2740
+ "support": {
2741
+ "issues": "https://github.com/mikemclin/laravel-wp-password/issues",
2742
+ "source": "https://github.com/mikemclin/laravel-wp-password/tree/2.0.3"
2743
+ },
2744
+ "time": "2021-09-30T13:48:57+00:00"
2745
+ },
2746
+ {
2747
+ "name": "mustache/mustache",
2748
+ "version": "v2.13.0",
2749
+ "source": {
2750
+ "type": "git",
2751
+ "url": "https://github.com/bobthecow/mustache.php.git",
2752
+ "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4"
2753
+ },
2754
+ "dist": {
2755
+ "type": "zip",
2756
+ "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e95c5a008c23d3151d59ea72484d4f72049ab7f4",
2757
+ "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4",
2758
+ "shasum": ""
2759
+ },
2760
+ "require": {
2761
+ "php": ">=5.2.4"
2762
+ },
2763
+ "require-dev": {
2764
+ "friendsofphp/php-cs-fixer": "~1.11",
2765
+ "phpunit/phpunit": "~3.7|~4.0|~5.0"
2766
+ },
2767
+ "type": "library",
2768
+ "autoload": {
2769
+ "psr-0": {
2770
+ "Mustache": "src/"
2771
+ }
2772
+ },
2773
+ "notification-url": "https://packagist.org/downloads/",
2774
+ "license": [
2775
+ "MIT"
2776
+ ],
2777
+ "authors": [
2778
+ {
2779
+ "name": "Justin Hileman",
2780
+ "email": "justin@justinhileman.info",
2781
+ "homepage": "http://justinhileman.com"
2782
+ }
2783
+ ],
2784
+ "description": "A Mustache implementation in PHP.",
2785
+ "homepage": "https://github.com/bobthecow/mustache.php",
2786
+ "keywords": [
2787
+ "mustache",
2788
+ "templating"
2789
+ ],
2790
+ "support": {
2791
+ "issues": "https://github.com/bobthecow/mustache.php/issues",
2792
+ "source": "https://github.com/bobthecow/mustache.php/tree/master"
2793
+ },
2794
+ "time": "2019-11-23T21:40:31+00:00"
2795
+ },
2796
+ {
2797
+ "name": "myclabs/deep-copy",
2798
+ "version": "1.10.2",
2799
+ "source": {
2800
+ "type": "git",
2801
+ "url": "https://github.com/myclabs/DeepCopy.git",
2802
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
2803
+ },
2804
+ "dist": {
2805
+ "type": "zip",
2806
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
2807
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
2808
+ "shasum": ""
2809
+ },
2810
+ "require": {
2811
+ "php": "^7.1 || ^8.0"
2812
+ },
2813
+ "replace": {
2814
+ "myclabs/deep-copy": "self.version"
2815
+ },
2816
+ "require-dev": {
2817
+ "doctrine/collections": "^1.0",
2818
+ "doctrine/common": "^2.6",
2819
+ "phpunit/phpunit": "^7.1"
2820
+ },
2821
+ "type": "library",
2822
+ "autoload": {
2823
+ "psr-4": {
2824
+ "DeepCopy\\": "src/DeepCopy/"
2825
+ },
2826
+ "files": [
2827
+ "src/DeepCopy/deep_copy.php"
2828
+ ]
2829
+ },
2830
+ "notification-url": "https://packagist.org/downloads/",
2831
+ "license": [
2832
+ "MIT"
2833
+ ],
2834
+ "description": "Create deep copies (clones) of your objects",
2835
+ "keywords": [
2836
+ "clone",
2837
+ "copy",
2838
+ "duplicate",
2839
+ "object",
2840
+ "object graph"
2841
+ ],
2842
+ "support": {
2843
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
2844
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
2845
+ },
2846
+ "funding": [
2847
+ {
2848
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
2849
+ "type": "tidelift"
2850
+ }
2851
+ ],
2852
+ "time": "2020-11-13T09:40:50+00:00"
2853
+ },
2854
+ {
2855
+ "name": "n98/junit-xml",
2856
+ "version": "1.1.0",
2857
+ "source": {
2858
+ "type": "git",
2859
+ "url": "https://github.com/cmuench/junit-xml.git",
2860
+ "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73"
2861
+ },
2862
+ "dist": {
2863
+ "type": "zip",
2864
+ "url": "https://api.github.com/repos/cmuench/junit-xml/zipball/0017dd92ac8cb619f02e32f4cffd768cfe327c73",
2865
+ "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73",
2866
+ "shasum": ""
2867
+ },
2868
+ "require-dev": {
2869
+ "phpunit/phpunit": "^9.5.0"
2870
+ },
2871
+ "type": "library",
2872
+ "autoload": {
2873
+ "psr-4": {
2874
+ "N98\\JUnitXml\\": "src/N98/JUnitXml"
2875
+ }
2876
+ },
2877
+ "notification-url": "https://packagist.org/downloads/",
2878
+ "license": [
2879
+ "MIT"
2880
+ ],
2881
+ "authors": [
2882
+ {
2883
+ "name": "Christian Münch",
2884
+ "email": "c.muench@netz98.de"
2885
+ }
2886
+ ],
2887
+ "description": "JUnit XML Document generation library",
2888
+ "support": {
2889
+ "issues": "https://github.com/cmuench/junit-xml/issues",
2890
+ "source": "https://github.com/cmuench/junit-xml/tree/1.1.0"
2891
+ },
2892
+ "time": "2020-12-25T09:08:58+00:00"
2893
+ },
2894
+ {
2895
+ "name": "nelexa/zip",
2896
+ "version": "3.3.3",
2897
+ "source": {
2898
+ "type": "git",
2899
+ "url": "https://github.com/Ne-Lexa/php-zip.git",
2900
+ "reference": "501b52f6fc393a599b44ff348a42740e1eaac7c6"
2901
+ },
2902
+ "dist": {
2903
+ "type": "zip",
2904
+ "url": "https://api.github.com/repos/Ne-Lexa/php-zip/zipball/501b52f6fc393a599b44ff348a42740e1eaac7c6",
2905
+ "reference": "501b52f6fc393a599b44ff348a42740e1eaac7c6",
2906
+ "shasum": ""
2907
+ },
2908
+ "require": {
2909
+ "ext-zlib": "*",
2910
+ "paragonie/random_compat": "*",
2911
+ "php": "^5.5.9 || ^7.0",
2912
+ "psr/http-message": "^1.0",
2913
+ "symfony/finder": "^3.0|^4.0|^5.0"
2914
+ },
2915
+ "require-dev": {
2916
+ "ext-bz2": "*",
2917
+ "ext-fileinfo": "*",
2918
+ "ext-openssl": "*",
2919
+ "ext-xml": "*",
2920
+ "guzzlehttp/psr7": "^1.6",
2921
+ "phpunit/phpunit": "^4.8|^5.7",
2922
+ "symfony/var-dumper": "^3.0|^4.0|^5.0"
2923
+ },
2924
+ "suggest": {
2925
+ "ext-bz2": "Needed to support BZIP2 compression",
2926
+ "ext-fileinfo": "Needed to get mime-type file",
2927
+ "ext-mcrypt": "Needed to support encrypt zip entries or use ext-openssl",
2928
+ "ext-openssl": "Needed to support encrypt zip entries or use ext-mcrypt"
2929
+ },
2930
+ "type": "library",
2931
+ "autoload": {
2932
+ "psr-4": {
2933
+ "PhpZip\\": "src/"
2934
+ }
2935
+ },
2936
+ "notification-url": "https://packagist.org/downloads/",
2937
+ "license": [
2938
+ "MIT"
2939
+ ],
2940
+ "authors": [
2941
+ {
2942
+ "name": "Ne-Lexa",
2943
+ "email": "alexey@nelexa.ru",
2944
+ "role": "Developer"
2945
+ }
2946
+ ],
2947
+ "description": "PhpZip is a php-library for extended work with ZIP-archives. Open, create, update, delete, extract and get info tool. Supports appending to existing ZIP files, WinZip AES encryption, Traditional PKWARE Encryption, ZipAlign tool, BZIP2 compression, external file attributes and ZIP64 extensions. Alternative ZipArchive. It does not require php-zip extension.",
2948
+ "homepage": "https://github.com/Ne-Lexa/php-zip",
2949
+ "keywords": [
2950
+ "archive",
2951
+ "extract",
2952
+ "unzip",
2953
+ "winzip",
2954
+ "zip",
2955
+ "zipalign",
2956
+ "ziparchive"
2957
+ ],
2958
+ "support": {
2959
+ "issues": "https://github.com/Ne-Lexa/php-zip/issues",
2960
+ "source": "https://github.com/Ne-Lexa/php-zip/tree/3.3.3"
2961
+ },
2962
+ "time": "2020-07-11T21:01:42+00:00"
2963
+ },
2964
+ {
2965
+ "name": "nesbot/carbon",
2966
+ "version": "2.53.1",
2967
+ "source": {
2968
+ "type": "git",
2969
+ "url": "https://github.com/briannesbitt/Carbon.git",
2970
+ "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045"
2971
+ },
2972
+ "dist": {
2973
+ "type": "zip",
2974
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f4655858a784988f880c1b8c7feabbf02dfdf045",
2975
+ "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045",
2976
+ "shasum": ""
2977
+ },
2978
+ "require": {
2979
+ "ext-json": "*",
2980
+ "php": "^7.1.8 || ^8.0",
2981
+ "symfony/polyfill-mbstring": "^1.0",
2982
+ "symfony/polyfill-php80": "^1.16",
2983
+ "symfony/translation": "^3.4 || ^4.0 || ^5.0"
2984
+ },
2985
+ "require-dev": {
2986
+ "doctrine/orm": "^2.7",
2987
+ "friendsofphp/php-cs-fixer": "^3.0",
2988
+ "kylekatarnls/multi-tester": "^2.0",
2989
+ "phpmd/phpmd": "^2.9",
2990
+ "phpstan/extension-installer": "^1.0",
2991
+ "phpstan/phpstan": "^0.12.54",
2992
+ "phpunit/phpunit": "^7.5.20 || ^8.5.14",
2993
+ "squizlabs/php_codesniffer": "^3.4"
2994
+ },
2995
+ "bin": [
2996
+ "bin/carbon"
2997
+ ],
2998
+ "type": "library",
2999
+ "extra": {
3000
+ "branch-alias": {
3001
+ "dev-3.x": "3.x-dev",
3002
+ "dev-master": "2.x-dev"
3003
+ },
3004
+ "laravel": {
3005
+ "providers": [
3006
+ "Carbon\\Laravel\\ServiceProvider"
3007
+ ]
3008
+ },
3009
+ "phpstan": {
3010
+ "includes": [
3011
+ "extension.neon"
3012
+ ]
3013
+ }
3014
+ },
3015
+ "autoload": {
3016
+ "psr-4": {
3017
+ "Carbon\\": "src/Carbon/"
3018
+ }
3019
+ },
3020
+ "notification-url": "https://packagist.org/downloads/",
3021
+ "license": [
3022
+ "MIT"
3023
+ ],
3024
+ "authors": [
3025
+ {
3026
+ "name": "Brian Nesbitt",
3027
+ "email": "brian@nesbot.com",
3028
+ "homepage": "https://markido.com"
3029
+ },
3030
+ {
3031
+ "name": "kylekatarnls",
3032
+ "homepage": "https://github.com/kylekatarnls"
3033
+ }
3034
+ ],
3035
+ "description": "An API extension for DateTime that supports 281 different languages.",
3036
+ "homepage": "https://carbon.nesbot.com",
3037
+ "keywords": [
3038
+ "date",
3039
+ "datetime",
3040
+ "time"
3041
+ ],
3042
+ "support": {
3043
+ "issues": "https://github.com/briannesbitt/Carbon/issues",
3044
+ "source": "https://github.com/briannesbitt/Carbon"
3045
+ },
3046
+ "funding": [
3047
+ {
3048
+ "url": "https://opencollective.com/Carbon",
3049
+ "type": "open_collective"
3050
+ },
3051
+ {
3052
+ "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
3053
+ "type": "tidelift"
3054
+ }
3055
+ ],
3056
+ "time": "2021-09-06T09:29:23+00:00"
3057
+ },
3058
+ {
3059
+ "name": "overtrue/phplint",
3060
+ "version": "2.4.1",
3061
+ "source": {
3062
+ "type": "git",
3063
+ "url": "https://github.com/overtrue/phplint.git",
3064
+ "reference": "59affacd0b09a1460e39acf2c64c963ddbf734cf"
3065
+ },
3066
+ "dist": {
3067
+ "type": "zip",
3068
+ "url": "https://api.github.com/repos/overtrue/phplint/zipball/59affacd0b09a1460e39acf2c64c963ddbf734cf",
3069
+ "reference": "59affacd0b09a1460e39acf2c64c963ddbf734cf",
3070
+ "shasum": ""
3071
+ },
3072
+ "require": {
3073
+ "ext-json": "*",
3074
+ "n98/junit-xml": "1.1.0",
3075
+ "php": ">=5.5.9",
3076
+ "symfony/console": "^3.2|^4.0|^5.0",
3077
+ "symfony/finder": "^3.0|^4.0|^5.0",
3078
+ "symfony/process": "^3.3|^4.0|^5.0",
3079
+ "symfony/yaml": "^3.0|^4.0|^5.0"
3080
+ },
3081
+ "require-dev": {
3082
+ "brainmaestro/composer-git-hooks": "^2.7",
3083
+ "friendsofphp/php-cs-fixer": "^2.16",
3084
+ "jakub-onderka/php-console-highlighter": "^0.3.2 || ^0.4"
3085
+ },
3086
+ "bin": [
3087
+ "bin/phplint"
3088
+ ],
3089
+ "type": "library",
3090
+ "extra": {
3091
+ "hooks": {
3092
+ "pre-commit": [
3093
+ "composer fix-style"
3094
+ ],
3095
+ "pre-push": [
3096
+ "composer check-style"
3097
+ ]
3098
+ }
3099
+ },
3100
+ "autoload": {
3101
+ "psr-4": {
3102
+ "Overtrue\\PHPLint\\": "src/"
3103
+ }
3104
+ },
3105
+ "notification-url": "https://packagist.org/downloads/",
3106
+ "license": [
3107
+ "MIT"
3108
+ ],
3109
+ "authors": [
3110
+ {
3111
+ "name": "overtrue",
3112
+ "email": "anzhengchao@gmail.com"
3113
+ }
3114
+ ],
3115
+ "description": "`phplint` is a tool that can speed up linting of php files by running several lint processes at once.",
3116
+ "keywords": [
3117
+ "check",
3118
+ "lint",
3119
+ "phplint",
3120
+ "syntax"
3121
+ ],
3122
+ "support": {
3123
+ "issues": "https://github.com/overtrue/phplint/issues",
3124
+ "source": "https://github.com/overtrue/phplint/tree/2.4.1"
3125
+ },
3126
+ "time": "2021-06-02T16:18:33+00:00"
3127
+ },
3128
+ {
3129
+ "name": "paragonie/random_compat",
3130
+ "version": "v9.99.100",
3131
+ "source": {
3132
+ "type": "git",
3133
+ "url": "https://github.com/paragonie/random_compat.git",
3134
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
3135
+ },
3136
+ "dist": {
3137
+ "type": "zip",
3138
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
3139
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
3140
+ "shasum": ""
3141
+ },
3142
+ "require": {
3143
+ "php": ">= 7"
3144
+ },
3145
+ "require-dev": {
3146
+ "phpunit/phpunit": "4.*|5.*",
3147
+ "vimeo/psalm": "^1"
3148
+ },
3149
+ "suggest": {
3150
+ "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
3151
+ },
3152
+ "type": "library",
3153
+ "notification-url": "https://packagist.org/downloads/",
3154
+ "license": [
3155
+ "MIT"
3156
+ ],
3157
+ "authors": [
3158
+ {
3159
+ "name": "Paragon Initiative Enterprises",
3160
+ "email": "security@paragonie.com",
3161
+ "homepage": "https://paragonie.com"
3162
+ }
3163
+ ],
3164
+ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
3165
+ "keywords": [
3166
+ "csprng",
3167
+ "polyfill",
3168
+ "pseudorandom",
3169
+ "random"
3170
+ ],
3171
+ "support": {
3172
+ "email": "info@paragonie.com",
3173
+ "issues": "https://github.com/paragonie/random_compat/issues",
3174
+ "source": "https://github.com/paragonie/random_compat"
3175
+ },
3176
+ "time": "2020-10-15T08:29:30+00:00"
3177
+ },
3178
+ {
3179
+ "name": "pdepend/pdepend",
3180
+ "version": "2.10.1",
3181
+ "source": {
3182
+ "type": "git",
3183
+ "url": "https://github.com/pdepend/pdepend.git",
3184
+ "reference": "30452fdabb3dfca89f4bf977abc44adc5391e062"
3185
+ },
3186
+ "dist": {
3187
+ "type": "zip",
3188
+ "url": "https://api.github.com/repos/pdepend/pdepend/zipball/30452fdabb3dfca89f4bf977abc44adc5391e062",
3189
+ "reference": "30452fdabb3dfca89f4bf977abc44adc5391e062",
3190
+ "shasum": ""
3191
+ },
3192
+ "require": {
3193
+ "php": ">=5.3.7",
3194
+ "symfony/config": "^2.3.0|^3|^4|^5",
3195
+ "symfony/dependency-injection": "^2.3.0|^3|^4|^5",
3196
+ "symfony/filesystem": "^2.3.0|^3|^4|^5"
3197
+ },
3198
+ "require-dev": {
3199
+ "easy-doc/easy-doc": "0.0.0|^1.2.3",
3200
+ "gregwar/rst": "^1.0",
3201
+ "phpunit/phpunit": "^4.8.36|^5.7.27",
3202
+ "squizlabs/php_codesniffer": "^2.0.0"
3203
+ },
3204
+ "bin": [
3205
+ "src/bin/pdepend"
3206
+ ],
3207
+ "type": "library",
3208
+ "extra": {
3209
+ "branch-alias": {
3210
+ "dev-master": "2.x-dev"
3211
+ }
3212
+ },
3213
+ "autoload": {
3214
+ "psr-4": {
3215
+ "PDepend\\": "src/main/php/PDepend"
3216
+ }
3217
+ },
3218
+ "notification-url": "https://packagist.org/downloads/",
3219
+ "license": [
3220
+ "BSD-3-Clause"
3221
+ ],
3222
+ "description": "Official version of pdepend to be handled with Composer",
3223
+ "support": {
3224
+ "issues": "https://github.com/pdepend/pdepend/issues",
3225
+ "source": "https://github.com/pdepend/pdepend/tree/2.10.1"
3226
+ },
3227
+ "funding": [
3228
+ {
3229
+ "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend",
3230
+ "type": "tidelift"
3231
+ }
3232
+ ],
3233
+ "time": "2021-10-11T12:15:18+00:00"
3234
+ },
3235
+ {
3236
+ "name": "phar-io/manifest",
3237
+ "version": "1.0.3",
3238
+ "source": {
3239
+ "type": "git",
3240
+ "url": "https://github.com/phar-io/manifest.git",
3241
+ "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
3242
+ },
3243
+ "dist": {
3244
+ "type": "zip",
3245
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
3246
+ "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
3247
+ "shasum": ""
3248
+ },
3249
+ "require": {
3250
+ "ext-dom": "*",
3251
+ "ext-phar": "*",
3252
+ "phar-io/version": "^2.0",
3253
+ "php": "^5.6 || ^7.0"
3254
+ },
3255
+ "type": "library",
3256
+ "extra": {
3257
+ "branch-alias": {
3258
+ "dev-master": "1.0.x-dev"
3259
+ }
3260
+ },
3261
+ "autoload": {
3262
+ "classmap": [
3263
+ "src/"
3264
+ ]
3265
+ },
3266
+ "notification-url": "https://packagist.org/downloads/",
3267
+ "license": [
3268
+ "BSD-3-Clause"
3269
+ ],
3270
+ "authors": [
3271
+ {
3272
+ "name": "Arne Blankerts",
3273
+ "email": "arne@blankerts.de",
3274
+ "role": "Developer"
3275
+ },
3276
+ {
3277
+ "name": "Sebastian Heuer",
3278
+ "email": "sebastian@phpeople.de",
3279
+ "role": "Developer"
3280
+ },
3281
+ {
3282
+ "name": "Sebastian Bergmann",
3283
+ "email": "sebastian@phpunit.de",
3284
+ "role": "Developer"
3285
+ }
3286
+ ],
3287
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
3288
+ "support": {
3289
+ "issues": "https://github.com/phar-io/manifest/issues",
3290
+ "source": "https://github.com/phar-io/manifest/tree/master"
3291
+ },
3292
+ "time": "2018-07-08T19:23:20+00:00"
3293
+ },
3294
+ {
3295
+ "name": "phar-io/version",
3296
+ "version": "2.0.1",
3297
+ "source": {
3298
+ "type": "git",
3299
+ "url": "https://github.com/phar-io/version.git",
3300
+ "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
3301
+ },
3302
+ "dist": {
3303
+ "type": "zip",
3304
+ "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
3305
+ "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
3306
+ "shasum": ""
3307
+ },
3308
+ "require": {
3309
+ "php": "^5.6 || ^7.0"
3310
+ },
3311
+ "type": "library",
3312
+ "autoload": {
3313
+ "classmap": [
3314
+ "src/"
3315
+ ]
3316
+ },
3317
+ "notification-url": "https://packagist.org/downloads/",
3318
+ "license": [
3319
+ "BSD-3-Clause"
3320
+ ],
3321
+ "authors": [
3322
+ {
3323
+ "name": "Arne Blankerts",
3324
+ "email": "arne@blankerts.de",
3325
+ "role": "Developer"
3326
+ },
3327
+ {
3328
+ "name": "Sebastian Heuer",
3329
+ "email": "sebastian@phpeople.de",
3330
+ "role": "Developer"
3331
+ },
3332
+ {
3333
+ "name": "Sebastian Bergmann",
3334
+ "email": "sebastian@phpunit.de",
3335
+ "role": "Developer"
3336
+ }
3337
+ ],
3338
+ "description": "Library for handling version information and constraints",
3339
+ "support": {
3340
+ "issues": "https://github.com/phar-io/version/issues",
3341
+ "source": "https://github.com/phar-io/version/tree/master"
3342
+ },
3343
+ "time": "2018-07-08T19:19:57+00:00"
3344
+ },
3345
+ {
3346
+ "name": "php-webdriver/webdriver",
3347
+ "version": "1.12.0",
3348
+ "source": {
3349
+ "type": "git",
3350
+ "url": "https://github.com/php-webdriver/php-webdriver.git",
3351
+ "reference": "99d4856ed7dffcdf6a52eccd6551e83d8d557ceb"
3352
+ },
3353
+ "dist": {
3354
+ "type": "zip",
3355
+ "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/99d4856ed7dffcdf6a52eccd6551e83d8d557ceb",
3356
+ "reference": "99d4856ed7dffcdf6a52eccd6551e83d8d557ceb",
3357
+ "shasum": ""
3358
+ },
3359
+ "require": {
3360
+ "ext-curl": "*",
3361
+ "ext-json": "*",
3362
+ "ext-zip": "*",
3363
+ "php": "^5.6 || ~7.0 || ^8.0",
3364
+ "symfony/polyfill-mbstring": "^1.12",
3365
+ "symfony/process": "^2.8 || ^3.1 || ^4.0 || ^5.0 || ^6.0"
3366
+ },
3367
+ "replace": {
3368
+ "facebook/webdriver": "*"
3369
+ },
3370
+ "require-dev": {
3371
+ "ondram/ci-detector": "^2.1 || ^3.5 || ^4.0",
3372
+ "php-coveralls/php-coveralls": "^2.4",
3373
+ "php-mock/php-mock-phpunit": "^1.1 || ^2.0",
3374
+ "php-parallel-lint/php-parallel-lint": "^1.2",
3375
+ "phpunit/phpunit": "^5.7 || ^7 || ^8 || ^9",
3376
+ "squizlabs/php_codesniffer": "^3.5",
3377
+ "symfony/var-dumper": "^3.3 || ^4.0 || ^5.0 || ^6.0"
3378
+ },
3379
+ "suggest": {
3380
+ "ext-SimpleXML": "For Firefox profile creation"
3381
+ },
3382
+ "type": "library",
3383
+ "autoload": {
3384
+ "psr-4": {
3385
+ "Facebook\\WebDriver\\": "lib/"
3386
+ },
3387
+ "files": [
3388
+ "lib/Exception/TimeoutException.php"
3389
+ ]
3390
+ },
3391
+ "notification-url": "https://packagist.org/downloads/",
3392
+ "license": [
3393
+ "MIT"
3394
+ ],
3395
+ "description": "A PHP client for Selenium WebDriver. Previously facebook/webdriver.",
3396
+ "homepage": "https://github.com/php-webdriver/php-webdriver",
3397
+ "keywords": [
3398
+ "Chromedriver",
3399
+ "geckodriver",
3400
+ "php",
3401
+ "selenium",
3402
+ "webdriver"
3403
+ ],
3404
+ "support": {
3405
+ "issues": "https://github.com/php-webdriver/php-webdriver/issues",
3406
+ "source": "https://github.com/php-webdriver/php-webdriver/tree/1.12.0"
3407
+ },
3408
+ "time": "2021-10-14T09:30:02+00:00"
3409
+ },
3410
+ {
3411
+ "name": "phpcompatibility/php-compatibility",
3412
+ "version": "9.3.5",
3413
+ "source": {
3414
+ "type": "git",
3415
+ "url": "https://github.com/PHPCompatibility/PHPCompatibility.git",
3416
+ "reference": "9fb324479acf6f39452e0655d2429cc0d3914243"
3417
+ },
3418
+ "dist": {
3419
+ "type": "zip",
3420
+ "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243",
3421
+ "reference": "9fb324479acf6f39452e0655d2429cc0d3914243",
3422
+ "shasum": ""
3423
+ },
3424
+ "require": {
3425
+ "php": ">=5.3",
3426
+ "squizlabs/php_codesniffer": "^2.3 || ^3.0.2"
3427
+ },
3428
+ "conflict": {
3429
+ "squizlabs/php_codesniffer": "2.6.2"
3430
+ },
3431
+ "require-dev": {
3432
+ "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0"
3433
+ },
3434
+ "suggest": {
3435
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.",
3436
+ "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues."
3437
+ },
3438
+ "type": "phpcodesniffer-standard",
3439
+ "notification-url": "https://packagist.org/downloads/",
3440
+ "license": [
3441
+ "LGPL-3.0-or-later"
3442
+ ],
3443
+ "authors": [
3444
+ {
3445
+ "name": "Wim Godden",
3446
+ "homepage": "https://github.com/wimg",
3447
+ "role": "lead"
3448
+ },
3449
+ {
3450
+ "name": "Juliette Reinders Folmer",
3451
+ "homepage": "https://github.com/jrfnl",
3452
+ "role": "lead"
3453
+ },
3454
+ {
3455
+ "name": "Contributors",
3456
+ "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors"
3457
+ }
3458
+ ],
3459
+ "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.",
3460
+ "homepage": "http://techblog.wimgodden.be/tag/codesniffer/",
3461
+ "keywords": [
3462
+ "compatibility",
3463
+ "phpcs",
3464
+ "standards"
3465
+ ],
3466
+ "support": {
3467
+ "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues",
3468
+ "source": "https://github.com/PHPCompatibility/PHPCompatibility"
3469
+ },
3470
+ "time": "2019-12-27T09:44:58+00:00"
3471
+ },
3472
+ {
3473
+ "name": "phpdocumentor/reflection-common",
3474
+ "version": "2.2.0",
3475
+ "source": {
3476
+ "type": "git",
3477
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
3478
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
3479
+ },
3480
+ "dist": {
3481
+ "type": "zip",
3482
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
3483
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
3484
+ "shasum": ""
3485
+ },
3486
+ "require": {
3487
+ "php": "^7.2 || ^8.0"
3488
+ },
3489
+ "type": "library",
3490
+ "extra": {
3491
+ "branch-alias": {
3492
+ "dev-2.x": "2.x-dev"
3493
+ }
3494
+ },
3495
+ "autoload": {
3496
+ "psr-4": {
3497
+ "phpDocumentor\\Reflection\\": "src/"
3498
+ }
3499
+ },
3500
+ "notification-url": "https://packagist.org/downloads/",
3501
+ "license": [
3502
+ "MIT"
3503
+ ],
3504
+ "authors": [
3505
+ {
3506
+ "name": "Jaap van Otterdijk",
3507
+ "email": "opensource@ijaap.nl"
3508
+ }
3509
+ ],
3510
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
3511
+ "homepage": "http://www.phpdoc.org",
3512
+ "keywords": [
3513
+ "FQSEN",
3514
+ "phpDocumentor",
3515
+ "phpdoc",
3516
+ "reflection",
3517
+ "static analysis"
3518
+ ],
3519
+ "support": {
3520
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
3521
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
3522
+ },
3523
+ "time": "2020-06-27T09:03:43+00:00"
3524
+ },
3525
+ {
3526
+ "name": "phpdocumentor/reflection-docblock",
3527
+ "version": "5.3.0",
3528
+ "source": {
3529
+ "type": "git",
3530
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
3531
+ "reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
3532
+ },
3533
+ "dist": {
3534
+ "type": "zip",
3535
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
3536
+ "reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
3537
+ "shasum": ""
3538
+ },
3539
+ "require": {
3540
+ "ext-filter": "*",
3541
+ "php": "^7.2 || ^8.0",
3542
+ "phpdocumentor/reflection-common": "^2.2",
3543
+ "phpdocumentor/type-resolver": "^1.3",
3544
+ "webmozart/assert": "^1.9.1"
3545
+ },
3546
+ "require-dev": {
3547
+ "mockery/mockery": "~1.3.2",
3548
+ "psalm/phar": "^4.8"
3549
+ },
3550
+ "type": "library",
3551
+ "extra": {
3552
+ "branch-alias": {
3553
+ "dev-master": "5.x-dev"
3554
+ }
3555
+ },
3556
+ "autoload": {
3557
+ "psr-4": {
3558
+ "phpDocumentor\\Reflection\\": "src"
3559
+ }
3560
+ },
3561
+ "notification-url": "https://packagist.org/downloads/",
3562
+ "license": [
3563
+ "MIT"
3564
+ ],
3565
+ "authors": [
3566
+ {
3567
+ "name": "Mike van Riel",
3568
+ "email": "me@mikevanriel.com"
3569
+ },
3570
+ {
3571
+ "name": "Jaap van Otterdijk",
3572
+ "email": "account@ijaap.nl"
3573
+ }
3574
+ ],
3575
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
3576
+ "support": {
3577
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
3578
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
3579
+ },
3580
+ "time": "2021-10-19T17:43:47+00:00"
3581
+ },
3582
+ {
3583
+ "name": "phpdocumentor/type-resolver",
3584
+ "version": "1.5.1",
3585
+ "source": {
3586
+ "type": "git",
3587
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
3588
+ "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae"
3589
+ },
3590
+ "dist": {
3591
+ "type": "zip",
3592
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae",
3593
+ "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae",
3594
+ "shasum": ""
3595
+ },
3596
+ "require": {
3597
+ "php": "^7.2 || ^8.0",
3598
+ "phpdocumentor/reflection-common": "^2.0"
3599
+ },
3600
+ "require-dev": {
3601
+ "ext-tokenizer": "*",
3602
+ "psalm/phar": "^4.8"
3603
+ },
3604
+ "type": "library",
3605
+ "extra": {
3606
+ "branch-alias": {
3607
+ "dev-1.x": "1.x-dev"
3608
+ }
3609
+ },
3610
+ "autoload": {
3611
+ "psr-4": {
3612
+ "phpDocumentor\\Reflection\\": "src"
3613
+ }
3614
+ },
3615
+ "notification-url": "https://packagist.org/downloads/",
3616
+ "license": [
3617
+ "MIT"
3618
+ ],
3619
+ "authors": [
3620
+ {
3621
+ "name": "Mike van Riel",
3622
+ "email": "me@mikevanriel.com"
3623
+ }
3624
+ ],
3625
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
3626
+ "support": {
3627
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
3628
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1"
3629
+ },
3630
+ "time": "2021-10-02T14:08:47+00:00"
3631
+ },
3632
+ {
3633
+ "name": "phpmd/phpmd",
3634
+ "version": "2.10.2",
3635
+ "source": {
3636
+ "type": "git",
3637
+ "url": "https://github.com/phpmd/phpmd.git",
3638
+ "reference": "1bc74db7cf834662d83abebae265be11bb2eec3a"
3639
+ },
3640
+ "dist": {
3641
+ "type": "zip",
3642
+ "url": "https://api.github.com/repos/phpmd/phpmd/zipball/1bc74db7cf834662d83abebae265be11bb2eec3a",
3643
+ "reference": "1bc74db7cf834662d83abebae265be11bb2eec3a",
3644
+ "shasum": ""
3645
+ },
3646
+ "require": {
3647
+ "composer/xdebug-handler": "^1.0 || ^2.0",
3648
+ "ext-xml": "*",
3649
+ "pdepend/pdepend": "^2.10.0",
3650
+ "php": ">=5.3.9"
3651
+ },
3652
+ "require-dev": {
3653
+ "easy-doc/easy-doc": "0.0.0 || ^1.3.2",
3654
+ "ext-json": "*",
3655
+ "ext-simplexml": "*",
3656
+ "gregwar/rst": "^1.0",
3657
+ "mikey179/vfsstream": "^1.6.8",
3658
+ "phpunit/phpunit": "^4.8.36 || ^5.7.27",
3659
+ "squizlabs/php_codesniffer": "^2.0"
3660
+ },
3661
+ "bin": [
3662
+ "src/bin/phpmd"
3663
+ ],
3664
+ "type": "library",
3665
+ "autoload": {
3666
+ "psr-0": {
3667
+ "PHPMD\\": "src/main/php"
3668
+ }
3669
+ },
3670
+ "notification-url": "https://packagist.org/downloads/",
3671
+ "license": [
3672
+ "BSD-3-Clause"
3673
+ ],
3674
+ "authors": [
3675
+ {
3676
+ "name": "Manuel Pichler",
3677
+ "email": "github@manuel-pichler.de",
3678
+ "homepage": "https://github.com/manuelpichler",
3679
+ "role": "Project Founder"
3680
+ },
3681
+ {
3682
+ "name": "Marc Würth",
3683
+ "email": "ravage@bluewin.ch",
3684
+ "homepage": "https://github.com/ravage84",
3685
+ "role": "Project Maintainer"
3686
+ },
3687
+ {
3688
+ "name": "Other contributors",
3689
+ "homepage": "https://github.com/phpmd/phpmd/graphs/contributors",
3690
+ "role": "Contributors"
3691
+ }
3692
+ ],
3693
+ "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.",
3694
+ "homepage": "https://phpmd.org/",
3695
+ "keywords": [
3696
+ "mess detection",
3697
+ "mess detector",
3698
+ "pdepend",
3699
+ "phpmd",
3700
+ "pmd"
3701
+ ],
3702
+ "support": {
3703
+ "irc": "irc://irc.freenode.org/phpmd",
3704
+ "issues": "https://github.com/phpmd/phpmd/issues",
3705
+ "source": "https://github.com/phpmd/phpmd/tree/2.10.2"
3706
+ },
3707
+ "funding": [
3708
+ {
3709
+ "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd",
3710
+ "type": "tidelift"
3711
+ }
3712
+ ],
3713
+ "time": "2021-07-22T09:56:23+00:00"
3714
+ },
3715
+ {
3716
+ "name": "phpspec/prophecy",
3717
+ "version": "1.14.0",
3718
+ "source": {
3719
+ "type": "git",
3720
+ "url": "https://github.com/phpspec/prophecy.git",
3721
+ "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e"
3722
+ },
3723
+ "dist": {
3724
+ "type": "zip",
3725
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e",
3726
+ "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e",
3727
+ "shasum": ""
3728
+ },
3729
+ "require": {
3730
+ "doctrine/instantiator": "^1.2",
3731
+ "php": "^7.2 || ~8.0, <8.2",
3732
+ "phpdocumentor/reflection-docblock": "^5.2",
3733
+ "sebastian/comparator": "^3.0 || ^4.0",
3734
+ "sebastian/recursion-context": "^3.0 || ^4.0"
3735
+ },
3736
+ "require-dev": {
3737
+ "phpspec/phpspec": "^6.0 || ^7.0",
3738
+ "phpunit/phpunit": "^8.0 || ^9.0"
3739
+ },
3740
+ "type": "library",
3741
+ "extra": {
3742
+ "branch-alias": {
3743
+ "dev-master": "1.x-dev"
3744
+ }
3745
+ },
3746
+ "autoload": {
3747
+ "psr-4": {
3748
+ "Prophecy\\": "src/Prophecy"
3749
+ }
3750
+ },
3751
+ "notification-url": "https://packagist.org/downloads/",
3752
+ "license": [
3753
+ "MIT"
3754
+ ],
3755
+ "authors": [
3756
+ {
3757
+ "name": "Konstantin Kudryashov",
3758
+ "email": "ever.zet@gmail.com",
3759
+ "homepage": "http://everzet.com"
3760
+ },
3761
+ {
3762
+ "name": "Marcello Duarte",
3763
+ "email": "marcello.duarte@gmail.com"
3764
+ }
3765
+ ],
3766
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
3767
+ "homepage": "https://github.com/phpspec/prophecy",
3768
+ "keywords": [
3769
+ "Double",
3770
+ "Dummy",
3771
+ "fake",
3772
+ "mock",
3773
+ "spy",
3774
+ "stub"
3775
+ ],
3776
+ "support": {
3777
+ "issues": "https://github.com/phpspec/prophecy/issues",
3778
+ "source": "https://github.com/phpspec/prophecy/tree/1.14.0"
3779
+ },
3780
+ "time": "2021-09-10T09:02:12+00:00"
3781
+ },
3782
+ {
3783
+ "name": "phpunit/php-code-coverage",
3784
+ "version": "8.0.2",
3785
+ "source": {
3786
+ "type": "git",
3787
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
3788
+ "reference": "ca6647ffddd2add025ab3f21644a441d7c146cdc"
3789
+ },
3790
+ "dist": {
3791
+ "type": "zip",
3792
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca6647ffddd2add025ab3f21644a441d7c146cdc",
3793
+ "reference": "ca6647ffddd2add025ab3f21644a441d7c146cdc",
3794
+ "shasum": ""
3795
+ },
3796
+ "require": {
3797
+ "ext-dom": "*",
3798
+ "ext-xmlwriter": "*",
3799
+ "php": "^7.3",
3800
+ "phpunit/php-file-iterator": "^3.0",
3801
+ "phpunit/php-text-template": "^2.0",
3802
+ "phpunit/php-token-stream": "^4.0",
3803
+ "sebastian/code-unit-reverse-lookup": "^2.0",
3804
+ "sebastian/environment": "^5.0",
3805
+ "sebastian/version": "^3.0",
3806
+ "theseer/tokenizer": "^1.1.3"
3807
+ },
3808
+ "require-dev": {
3809
+ "phpunit/phpunit": "^9.0"
3810
+ },
3811
+ "suggest": {
3812
+ "ext-pcov": "*",
3813
+ "ext-xdebug": "*"
3814
+ },
3815
+ "type": "library",
3816
+ "extra": {
3817
+ "branch-alias": {
3818
+ "dev-master": "8.0-dev"
3819
+ }
3820
+ },
3821
+ "autoload": {
3822
+ "classmap": [
3823
+ "src/"
3824
+ ]
3825
+ },
3826
+ "notification-url": "https://packagist.org/downloads/",
3827
+ "license": [
3828
+ "BSD-3-Clause"
3829
+ ],
3830
+ "authors": [
3831
+ {
3832
+ "name": "Sebastian Bergmann",
3833
+ "email": "sebastian@phpunit.de",
3834
+ "role": "lead"
3835
+ }
3836
+ ],
3837
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
3838
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
3839
+ "keywords": [
3840
+ "coverage",
3841
+ "testing",
3842
+ "xunit"
3843
+ ],
3844
+ "support": {
3845
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
3846
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/8.0.2"
3847
+ },
3848
+ "funding": [
3849
+ {
3850
+ "url": "https://github.com/sebastianbergmann",
3851
+ "type": "github"
3852
+ }
3853
+ ],
3854
+ "time": "2020-05-23T08:02:54+00:00"
3855
+ },
3856
+ {
3857
+ "name": "phpunit/php-file-iterator",
3858
+ "version": "3.0.5",
3859
+ "source": {
3860
+ "type": "git",
3861
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
3862
+ "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
3863
+ },
3864
+ "dist": {
3865
+ "type": "zip",
3866
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
3867
+ "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
3868
+ "shasum": ""
3869
+ },
3870
+ "require": {
3871
+ "php": ">=7.3"
3872
+ },
3873
+ "require-dev": {
3874
+ "phpunit/phpunit": "^9.3"
3875
+ },
3876
+ "type": "library",
3877
+ "extra": {
3878
+ "branch-alias": {
3879
+ "dev-master": "3.0-dev"
3880
+ }
3881
+ },
3882
+ "autoload": {
3883
+ "classmap": [
3884
+ "src/"
3885
+ ]
3886
+ },
3887
+ "notification-url": "https://packagist.org/downloads/",
3888
+ "license": [
3889
+ "BSD-3-Clause"
3890
+ ],
3891
+ "authors": [
3892
+ {
3893
+ "name": "Sebastian Bergmann",
3894
+ "email": "sebastian@phpunit.de",
3895
+ "role": "lead"
3896
+ }
3897
+ ],
3898
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
3899
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
3900
+ "keywords": [
3901
+ "filesystem",
3902
+ "iterator"
3903
+ ],
3904
+ "support": {
3905
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
3906
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5"
3907
+ },
3908
+ "funding": [
3909
+ {
3910
+ "url": "https://github.com/sebastianbergmann",
3911
+ "type": "github"
3912
+ }
3913
+ ],
3914
+ "time": "2020-09-28T05:57:25+00:00"
3915
+ },
3916
+ {
3917
+ "name": "phpunit/php-invoker",
3918
+ "version": "3.1.1",
3919
+ "source": {
3920
+ "type": "git",
3921
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
3922
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
3923
+ },
3924
+ "dist": {
3925
+ "type": "zip",
3926
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
3927
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
3928
+ "shasum": ""
3929
+ },
3930
+ "require": {
3931
+ "php": ">=7.3"
3932
+ },
3933
+ "require-dev": {
3934
+ "ext-pcntl": "*",
3935
+ "phpunit/phpunit": "^9.3"
3936
+ },
3937
+ "suggest": {
3938
+ "ext-pcntl": "*"
3939
+ },
3940
+ "type": "library",
3941
+ "extra": {
3942
+ "branch-alias": {
3943
+ "dev-master": "3.1-dev"
3944
+ }
3945
+ },
3946
+ "autoload": {
3947
+ "classmap": [
3948
+ "src/"
3949
+ ]
3950
+ },
3951
+ "notification-url": "https://packagist.org/downloads/",
3952
+ "license": [
3953
+ "BSD-3-Clause"
3954
+ ],
3955
+ "authors": [
3956
+ {
3957
+ "name": "Sebastian Bergmann",
3958
+ "email": "sebastian@phpunit.de",
3959
+ "role": "lead"
3960
+ }
3961
+ ],
3962
+ "description": "Invoke callables with a timeout",
3963
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
3964
+ "keywords": [
3965
+ "process"
3966
+ ],
3967
+ "support": {
3968
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
3969
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
3970
+ },
3971
+ "funding": [
3972
+ {
3973
+ "url": "https://github.com/sebastianbergmann",
3974
+ "type": "github"
3975
+ }
3976
+ ],
3977
+ "time": "2020-09-28T05:58:55+00:00"
3978
+ },
3979
+ {
3980
+ "name": "phpunit/php-text-template",
3981
+ "version": "2.0.4",
3982
+ "source": {
3983
+ "type": "git",
3984
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
3985
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
3986
+ },
3987
+ "dist": {
3988
+ "type": "zip",
3989
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
3990
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
3991
+ "shasum": ""
3992
+ },
3993
+ "require": {
3994
+ "php": ">=7.3"
3995
+ },
3996
+ "require-dev": {
3997
+ "phpunit/phpunit": "^9.3"
3998
+ },
3999
+ "type": "library",
4000
+ "extra": {
4001
+ "branch-alias": {
4002
+ "dev-master": "2.0-dev"
4003
+ }
4004
+ },
4005
+ "autoload": {
4006
+ "classmap": [
4007
+ "src/"
4008
+ ]
4009
+ },
4010
+ "notification-url": "https://packagist.org/downloads/",
4011
+ "license": [
4012
+ "BSD-3-Clause"
4013
+ ],
4014
+ "authors": [
4015
+ {
4016
+ "name": "Sebastian Bergmann",
4017
+ "email": "sebastian@phpunit.de",
4018
+ "role": "lead"
4019
+ }
4020
+ ],
4021
+ "description": "Simple template engine.",
4022
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
4023
+ "keywords": [
4024
+ "template"
4025
+ ],
4026
+ "support": {
4027
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
4028
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
4029
+ },
4030
+ "funding": [
4031
+ {
4032
+ "url": "https://github.com/sebastianbergmann",
4033
+ "type": "github"
4034
+ }
4035
+ ],
4036
+ "time": "2020-10-26T05:33:50+00:00"
4037
+ },
4038
+ {
4039
+ "name": "phpunit/php-timer",
4040
+ "version": "3.1.4",
4041
+ "source": {
4042
+ "type": "git",
4043
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
4044
+ "reference": "dc9368fae6ef2ffa57eba80a7410bcef81df6258"
4045
+ },
4046
+ "dist": {
4047
+ "type": "zip",
4048
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/dc9368fae6ef2ffa57eba80a7410bcef81df6258",
4049
+ "reference": "dc9368fae6ef2ffa57eba80a7410bcef81df6258",
4050
+ "shasum": ""
4051
+ },
4052
+ "require": {
4053
+ "php": "^7.3"
4054
+ },
4055
+ "require-dev": {
4056
+ "phpunit/phpunit": "^9.0"
4057
+ },
4058
+ "type": "library",
4059
+ "extra": {
4060
+ "branch-alias": {
4061
+ "dev-master": "3.1-dev"
4062
+ }
4063
+ },
4064
+ "autoload": {
4065
+ "classmap": [
4066
+ "src/"
4067
+ ]
4068
+ },
4069
+ "notification-url": "https://packagist.org/downloads/",
4070
+ "license": [
4071
+ "BSD-3-Clause"
4072
+ ],
4073
+ "authors": [
4074
+ {
4075
+ "name": "Sebastian Bergmann",
4076
+ "email": "sebastian@phpunit.de",
4077
+ "role": "lead"
4078
+ }
4079
+ ],
4080
+ "description": "Utility class for timing",
4081
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
4082
+ "keywords": [
4083
+ "timer"
4084
+ ],
4085
+ "support": {
4086
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
4087
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/master"
4088
+ },
4089
+ "funding": [
4090
+ {
4091
+ "url": "https://github.com/sebastianbergmann",
4092
+ "type": "github"
4093
+ }
4094
+ ],
4095
+ "time": "2020-04-20T06:00:37+00:00"
4096
+ },
4097
+ {
4098
+ "name": "phpunit/php-token-stream",
4099
+ "version": "4.0.4",
4100
+ "source": {
4101
+ "type": "git",
4102
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
4103
+ "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3"
4104
+ },
4105
+ "dist": {
4106
+ "type": "zip",
4107
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/a853a0e183b9db7eed023d7933a858fa1c8d25a3",
4108
+ "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3",
4109
+ "shasum": ""
4110
+ },
4111
+ "require": {
4112
+ "ext-tokenizer": "*",
4113
+ "php": "^7.3 || ^8.0"
4114
+ },
4115
+ "require-dev": {
4116
+ "phpunit/phpunit": "^9.0"
4117
+ },
4118
+ "type": "library",
4119
+ "extra": {
4120
+ "branch-alias": {
4121
+ "dev-master": "4.0-dev"
4122
+ }
4123
+ },
4124
+ "autoload": {
4125
+ "classmap": [
4126
+ "src/"
4127
+ ]
4128
+ },
4129
+ "notification-url": "https://packagist.org/downloads/",
4130
+ "license": [
4131
+ "BSD-3-Clause"
4132
+ ],
4133
+ "authors": [
4134
+ {
4135
+ "name": "Sebastian Bergmann",
4136
+ "email": "sebastian@phpunit.de"
4137
+ }
4138
+ ],
4139
+ "description": "Wrapper around PHP's tokenizer extension.",
4140
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
4141
+ "keywords": [
4142
+ "tokenizer"
4143
+ ],
4144
+ "support": {
4145
+ "issues": "https://github.com/sebastianbergmann/php-token-stream/issues",
4146
+ "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master"
4147
+ },
4148
+ "funding": [
4149
+ {
4150
+ "url": "https://github.com/sebastianbergmann",
4151
+ "type": "github"
4152
+ }
4153
+ ],
4154
+ "abandoned": true,
4155
+ "time": "2020-08-04T08:28:15+00:00"
4156
+ },
4157
+ {
4158
+ "name": "phpunit/phpunit",
4159
+ "version": "9.1.5",
4160
+ "source": {
4161
+ "type": "git",
4162
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
4163
+ "reference": "1b570cd7edbe136055bf5f651857dc8af6b829d2"
4164
+ },
4165
+ "dist": {
4166
+ "type": "zip",
4167
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1b570cd7edbe136055bf5f651857dc8af6b829d2",
4168
+ "reference": "1b570cd7edbe136055bf5f651857dc8af6b829d2",
4169
+ "shasum": ""
4170
+ },
4171
+ "require": {
4172
+ "doctrine/instantiator": "^1.2.0",
4173
+ "ext-dom": "*",
4174
+ "ext-json": "*",
4175
+ "ext-libxml": "*",
4176
+ "ext-mbstring": "*",
4177
+ "ext-xml": "*",
4178
+ "ext-xmlwriter": "*",
4179
+ "myclabs/deep-copy": "^1.9.1",
4180
+ "phar-io/manifest": "^1.0.3",
4181
+ "phar-io/version": "^2.0.1",
4182
+ "php": "^7.3",
4183
+ "phpspec/prophecy": "^1.8.1",
4184
+ "phpunit/php-code-coverage": "^8.0.1",
4185
+ "phpunit/php-file-iterator": "^3.0",
4186
+ "phpunit/php-invoker": "^3.0",
4187
+ "phpunit/php-text-template": "^2.0",
4188
+ "phpunit/php-timer": "^3.1.4",
4189
+ "sebastian/code-unit": "^1.0.2",
4190
+ "sebastian/comparator": "^4.0",
4191
+ "sebastian/diff": "^4.0",
4192
+ "sebastian/environment": "^5.0.1",
4193
+ "sebastian/exporter": "^4.0",
4194
+ "sebastian/global-state": "^4.0",
4195
+ "sebastian/object-enumerator": "^4.0",
4196
+ "sebastian/resource-operations": "^3.0",
4197
+ "sebastian/type": "^2.0",
4198
+ "sebastian/version": "^3.0"
4199
+ },
4200
+ "require-dev": {
4201
+ "ext-pdo": "*",
4202
+ "phpspec/prophecy-phpunit": "^2.0"
4203
+ },
4204
+ "suggest": {
4205
+ "ext-soap": "*",
4206
+ "ext-xdebug": "*"
4207
+ },
4208
+ "bin": [
4209
+ "phpunit"
4210
+ ],
4211
+ "type": "library",
4212
+ "extra": {
4213
+ "branch-alias": {
4214
+ "dev-master": "9.1-dev"
4215
+ }
4216
+ },
4217
+ "autoload": {
4218
+ "classmap": [
4219
+ "src/"
4220
+ ],
4221
+ "files": [
4222
+ "src/Framework/Assert/Functions.php"
4223
+ ]
4224
+ },
4225
+ "notification-url": "https://packagist.org/downloads/",
4226
+ "license": [
4227
+ "BSD-3-Clause"
4228
+ ],
4229
+ "authors": [
4230
+ {
4231
+ "name": "Sebastian Bergmann",
4232
+ "email": "sebastian@phpunit.de",
4233
+ "role": "lead"
4234
+ }
4235
+ ],
4236
+ "description": "The PHP Unit Testing framework.",
4237
+ "homepage": "https://phpunit.de/",
4238
+ "keywords": [
4239
+ "phpunit",
4240
+ "testing",
4241
+ "xunit"
4242
+ ],
4243
+ "support": {
4244
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
4245
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.1.5"
4246
+ },
4247
+ "funding": [
4248
+ {
4249
+ "url": "https://phpunit.de/donate.html",
4250
+ "type": "custom"
4251
+ },
4252
+ {
4253
+ "url": "https://github.com/sebastianbergmann",
4254
+ "type": "github"
4255
+ }
4256
+ ],
4257
+ "time": "2020-05-22T13:54:05+00:00"
4258
+ },
4259
+ {
4260
+ "name": "psr/container",
4261
+ "version": "1.1.1",
4262
+ "source": {
4263
+ "type": "git",
4264
+ "url": "https://github.com/php-fig/container.git",
4265
+ "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
4266
+ },
4267
+ "dist": {
4268
+ "type": "zip",
4269
+ "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
4270
+ "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
4271
+ "shasum": ""
4272
+ },
4273
+ "require": {
4274
+ "php": ">=7.2.0"
4275
+ },
4276
+ "type": "library",
4277
+ "autoload": {
4278
+ "psr-4": {
4279
+ "Psr\\Container\\": "src/"
4280
+ }
4281
+ },
4282
+ "notification-url": "https://packagist.org/downloads/",
4283
+ "license": [
4284
+ "MIT"
4285
+ ],
4286
+ "authors": [
4287
+ {
4288
+ "name": "PHP-FIG",
4289
+ "homepage": "https://www.php-fig.org/"
4290
+ }
4291
+ ],
4292
+ "description": "Common Container Interface (PHP FIG PSR-11)",
4293
+ "homepage": "https://github.com/php-fig/container",
4294
+ "keywords": [
4295
+ "PSR-11",
4296
+ "container",
4297
+ "container-interface",
4298
+ "container-interop",
4299
+ "psr"
4300
+ ],
4301
+ "support": {
4302
+ "issues": "https://github.com/php-fig/container/issues",
4303
+ "source": "https://github.com/php-fig/container/tree/1.1.1"
4304
+ },
4305
+ "time": "2021-03-05T17:36:06+00:00"
4306
+ },
4307
+ {
4308
+ "name": "psr/event-dispatcher",
4309
+ "version": "1.0.0",
4310
+ "source": {
4311
+ "type": "git",
4312
+ "url": "https://github.com/php-fig/event-dispatcher.git",
4313
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
4314
+ },
4315
+ "dist": {
4316
+ "type": "zip",
4317
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
4318
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
4319
+ "shasum": ""
4320
+ },
4321
+ "require": {
4322
+ "php": ">=7.2.0"
4323
+ },
4324
+ "type": "library",
4325
+ "extra": {
4326
+ "branch-alias": {
4327
+ "dev-master": "1.0.x-dev"
4328
+ }
4329
+ },
4330
+ "autoload": {
4331
+ "psr-4": {
4332
+ "Psr\\EventDispatcher\\": "src/"
4333
+ }
4334
+ },
4335
+ "notification-url": "https://packagist.org/downloads/",
4336
+ "license": [
4337
+ "MIT"
4338
+ ],
4339
+ "authors": [
4340
+ {
4341
+ "name": "PHP-FIG",
4342
+ "homepage": "http://www.php-fig.org/"
4343
+ }
4344
+ ],
4345
+ "description": "Standard interfaces for event handling.",
4346
+ "keywords": [
4347
+ "events",
4348
+ "psr",
4349
+ "psr-14"
4350
+ ],
4351
+ "support": {
4352
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
4353
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
4354
+ },
4355
+ "time": "2019-01-08T18:20:26+00:00"
4356
+ },
4357
+ {
4358
+ "name": "psr/http-client",
4359
+ "version": "1.0.1",
4360
+ "source": {
4361
+ "type": "git",
4362
+ "url": "https://github.com/php-fig/http-client.git",
4363
+ "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
4364
+ },
4365
+ "dist": {
4366
+ "type": "zip",
4367
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
4368
+ "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
4369
+ "shasum": ""
4370
+ },
4371
+ "require": {
4372
+ "php": "^7.0 || ^8.0",
4373
+ "psr/http-message": "^1.0"
4374
+ },
4375
+ "type": "library",
4376
+ "extra": {
4377
+ "branch-alias": {
4378
+ "dev-master": "1.0.x-dev"
4379
+ }
4380
+ },
4381
+ "autoload": {
4382
+ "psr-4": {
4383
+ "Psr\\Http\\Client\\": "src/"
4384
+ }
4385
+ },
4386
+ "notification-url": "https://packagist.org/downloads/",
4387
+ "license": [
4388
+ "MIT"
4389
+ ],
4390
+ "authors": [
4391
+ {
4392
+ "name": "PHP-FIG",
4393
+ "homepage": "http://www.php-fig.org/"
4394
+ }
4395
+ ],
4396
+ "description": "Common interface for HTTP clients",
4397
+ "homepage": "https://github.com/php-fig/http-client",
4398
+ "keywords": [
4399
+ "http",
4400
+ "http-client",
4401
+ "psr",
4402
+ "psr-18"
4403
+ ],
4404
+ "support": {
4405
+ "source": "https://github.com/php-fig/http-client/tree/master"
4406
+ },
4407
+ "time": "2020-06-29T06:28:15+00:00"
4408
+ },
4409
+ {
4410
+ "name": "psr/http-factory",
4411
+ "version": "1.0.1",
4412
+ "source": {
4413
+ "type": "git",
4414
+ "url": "https://github.com/php-fig/http-factory.git",
4415
+ "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
4416
+ },
4417
+ "dist": {
4418
+ "type": "zip",
4419
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
4420
+ "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
4421
+ "shasum": ""
4422
+ },
4423
+ "require": {
4424
+ "php": ">=7.0.0",
4425
+ "psr/http-message": "^1.0"
4426
+ },
4427
+ "type": "library",
4428
+ "extra": {
4429
+ "branch-alias": {
4430
+ "dev-master": "1.0.x-dev"
4431
+ }
4432
+ },
4433
+ "autoload": {
4434
+ "psr-4": {
4435
+ "Psr\\Http\\Message\\": "src/"
4436
+ }
4437
+ },
4438
+ "notification-url": "https://packagist.org/downloads/",
4439
+ "license": [
4440
+ "MIT"
4441
+ ],
4442
+ "authors": [
4443
+ {
4444
+ "name": "PHP-FIG",
4445
+ "homepage": "http://www.php-fig.org/"
4446
+ }
4447
+ ],
4448
+ "description": "Common interfaces for PSR-7 HTTP message factories",
4449
+ "keywords": [
4450
+ "factory",
4451
+ "http",
4452
+ "message",
4453
+ "psr",
4454
+ "psr-17",
4455
+ "psr-7",
4456
+ "request",
4457
+ "response"
4458
+ ],
4459
+ "support": {
4460
+ "source": "https://github.com/php-fig/http-factory/tree/master"
4461
+ },
4462
+ "time": "2019-04-30T12:38:16+00:00"
4463
+ },
4464
+ {
4465
+ "name": "psr/http-message",
4466
+ "version": "1.0.1",
4467
+ "source": {
4468
+ "type": "git",
4469
+ "url": "https://github.com/php-fig/http-message.git",
4470
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
4471
+ },
4472
+ "dist": {
4473
+ "type": "zip",
4474
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
4475
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
4476
+ "shasum": ""
4477
+ },
4478
+ "require": {
4479
+ "php": ">=5.3.0"
4480
+ },
4481
+ "type": "library",
4482
+ "extra": {
4483
+ "branch-alias": {
4484
+ "dev-master": "1.0.x-dev"
4485
+ }
4486
+ },
4487
+ "autoload": {
4488
+ "psr-4": {
4489
+ "Psr\\Http\\Message\\": "src/"
4490
+ }
4491
+ },
4492
+ "notification-url": "https://packagist.org/downloads/",
4493
+ "license": [
4494
+ "MIT"
4495
+ ],
4496
+ "authors": [
4497
+ {
4498
+ "name": "PHP-FIG",
4499
+ "homepage": "http://www.php-fig.org/"
4500
+ }
4501
+ ],
4502
+ "description": "Common interface for HTTP messages",
4503
+ "homepage": "https://github.com/php-fig/http-message",
4504
+ "keywords": [
4505
+ "http",
4506
+ "http-message",
4507
+ "psr",
4508
+ "psr-7",
4509
+ "request",
4510
+ "response"
4511
+ ],
4512
+ "support": {
4513
+ "source": "https://github.com/php-fig/http-message/tree/master"
4514
+ },
4515
+ "time": "2016-08-06T14:39:51+00:00"
4516
+ },
4517
+ {
4518
+ "name": "psr/log",
4519
+ "version": "1.1.4",
4520
+ "source": {
4521
+ "type": "git",
4522
+ "url": "https://github.com/php-fig/log.git",
4523
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
4524
+ },
4525
+ "dist": {
4526
+ "type": "zip",
4527
+ "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
4528
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
4529
+ "shasum": ""
4530
+ },
4531
+ "require": {
4532
+ "php": ">=5.3.0"
4533
+ },
4534
+ "type": "library",
4535
+ "extra": {
4536
+ "branch-alias": {
4537
+ "dev-master": "1.1.x-dev"
4538
+ }
4539
+ },
4540
+ "autoload": {
4541
+ "psr-4": {
4542
+ "Psr\\Log\\": "Psr/Log/"
4543
+ }
4544
+ },
4545
+ "notification-url": "https://packagist.org/downloads/",
4546
+ "license": [
4547
+ "MIT"
4548
+ ],
4549
+ "authors": [
4550
+ {
4551
+ "name": "PHP-FIG",
4552
+ "homepage": "https://www.php-fig.org/"
4553
+ }
4554
+ ],
4555
+ "description": "Common interface for logging libraries",
4556
+ "homepage": "https://github.com/php-fig/log",
4557
+ "keywords": [
4558
+ "log",
4559
+ "psr",
4560
+ "psr-3"
4561
+ ],
4562
+ "support": {
4563
+ "source": "https://github.com/php-fig/log/tree/1.1.4"
4564
+ },
4565
+ "time": "2021-05-03T11:20:27+00:00"
4566
+ },
4567
+ {
4568
+ "name": "psr/simple-cache",
4569
+ "version": "1.0.1",
4570
+ "source": {
4571
+ "type": "git",
4572
+ "url": "https://github.com/php-fig/simple-cache.git",
4573
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
4574
+ },
4575
+ "dist": {
4576
+ "type": "zip",
4577
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
4578
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
4579
+ "shasum": ""
4580
+ },
4581
+ "require": {
4582
+ "php": ">=5.3.0"
4583
+ },
4584
+ "type": "library",
4585
+ "extra": {
4586
+ "branch-alias": {
4587
+ "dev-master": "1.0.x-dev"
4588
+ }
4589
+ },
4590
+ "autoload": {
4591
+ "psr-4": {
4592
+ "Psr\\SimpleCache\\": "src/"
4593
+ }
4594
+ },
4595
+ "notification-url": "https://packagist.org/downloads/",
4596
+ "license": [
4597
+ "MIT"
4598
+ ],
4599
+ "authors": [
4600
+ {
4601
+ "name": "PHP-FIG",
4602
+ "homepage": "http://www.php-fig.org/"
4603
+ }
4604
+ ],
4605
+ "description": "Common interfaces for simple caching",
4606
+ "keywords": [
4607
+ "cache",
4608
+ "caching",
4609
+ "psr",
4610
+ "psr-16",
4611
+ "simple-cache"
4612
+ ],
4613
+ "support": {
4614
+ "source": "https://github.com/php-fig/simple-cache/tree/master"
4615
+ },
4616
+ "time": "2017-10-23T01:57:42+00:00"
4617
+ },
4618
+ {
4619
+ "name": "publishpress/publishpress-plugin-builder",
4620
+ "version": "v1.3.4",
4621
+ "source": {
4622
+ "type": "git",
4623
+ "url": "https://github.com/publishpress/PublishPress-Plugin-Builder",
4624
+ "reference": "fd58833743fc80aecac02c0c99b5eca1212c434d"
4625
+ },
4626
+ "require": {
4627
+ "consolidation/robo": "^3.0",
4628
+ "nelexa/zip": "^3.3",
4629
+ "php": "~7.3",
4630
+ "symfony/yaml": "^5"
4631
+ },
4632
+ "require-dev": {
4633
+ "codeception/codeception": "^4.0",
4634
+ "codeception/module-asserts": "^1.0.0",
4635
+ "phpmd/phpmd": "^2.8",
4636
+ "phpmetrics/phpmetrics": "^2.7",
4637
+ "squizlabs/php_codesniffer": "^3.5"
4638
+ },
4639
+ "type": "library",
4640
+ "autoload": {
4641
+ "psr-4": {
4642
+ "PublishPressBuilder\\": "src/"
4643
+ }
4644
+ },
4645
+ "license": [
4646
+ "GPL-2.0-or-later"
4647
+ ],
4648
+ "authors": [
4649
+ {
4650
+ "name": "PublishPress",
4651
+ "email": "help@publishpress.com"
4652
+ }
4653
+ ],
4654
+ "description": "Robo tasks for building WordPress plugins",
4655
+ "time": "2021-10-18T17:26:24+00:00"
4656
+ },
4657
+ {
4658
+ "name": "ralouphie/getallheaders",
4659
+ "version": "3.0.3",
4660
+ "source": {
4661
+ "type": "git",
4662
+ "url": "https://github.com/ralouphie/getallheaders.git",
4663
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
4664
+ },
4665
+ "dist": {
4666
+ "type": "zip",
4667
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
4668
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
4669
+ "shasum": ""
4670
+ },
4671
+ "require": {
4672
+ "php": ">=5.6"
4673
+ },
4674
+ "require-dev": {
4675
+ "php-coveralls/php-coveralls": "^2.1",
4676
+ "phpunit/phpunit": "^5 || ^6.5"
4677
+ },
4678
+ "type": "library",
4679
+ "autoload": {
4680
+ "files": [
4681
+ "src/getallheaders.php"
4682
+ ]
4683
+ },
4684
+ "notification-url": "https://packagist.org/downloads/",
4685
+ "license": [
4686
+ "MIT"
4687
+ ],
4688
+ "authors": [
4689
+ {
4690
+ "name": "Ralph Khattar",
4691
+ "email": "ralph.khattar@gmail.com"
4692
+ }
4693
+ ],
4694
+ "description": "A polyfill for getallheaders.",
4695
+ "support": {
4696
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
4697
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
4698
+ },
4699
+ "time": "2019-03-08T08:55:37+00:00"
4700
+ },
4701
+ {
4702
+ "name": "rmccue/requests",
4703
+ "version": "v1.8.1",
4704
+ "source": {
4705
+ "type": "git",
4706
+ "url": "https://github.com/WordPress/Requests.git",
4707
+ "reference": "82e6936366eac3af4d836c18b9d8c31028fe4cd5"
4708
+ },
4709
+ "dist": {
4710
+ "type": "zip",
4711
+ "url": "https://api.github.com/repos/WordPress/Requests/zipball/82e6936366eac3af4d836c18b9d8c31028fe4cd5",
4712
+ "reference": "82e6936366eac3af4d836c18b9d8c31028fe4cd5",
4713
+ "shasum": ""
4714
+ },
4715
+ "require": {
4716
+ "php": ">=5.2"
4717
+ },
4718
+ "require-dev": {
4719
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7",
4720
+ "php-parallel-lint/php-console-highlighter": "^0.5.0",
4721
+ "php-parallel-lint/php-parallel-lint": "^1.3",
4722
+ "phpcompatibility/php-compatibility": "^9.0",
4723
+ "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5",
4724
+ "requests/test-server": "dev-master",
4725
+ "squizlabs/php_codesniffer": "^3.5",
4726
+ "wp-coding-standards/wpcs": "^2.0"
4727
+ },
4728
+ "type": "library",
4729
+ "autoload": {
4730
+ "psr-0": {
4731
+ "Requests": "library/"
4732
+ }
4733
+ },
4734
+ "notification-url": "https://packagist.org/downloads/",
4735
+ "license": [
4736
+ "ISC"
4737
+ ],
4738
+ "authors": [
4739
+ {
4740
+ "name": "Ryan McCue",
4741
+ "homepage": "http://ryanmccue.info"
4742
+ }
4743
+ ],
4744
+ "description": "A HTTP library written in PHP, for human beings.",
4745
+ "homepage": "http://github.com/WordPress/Requests",
4746
+ "keywords": [
4747
+ "curl",
4748
+ "fsockopen",
4749
+ "http",
4750
+ "idna",
4751
+ "ipv6",
4752
+ "iri",
4753
+ "sockets"
4754
+ ],
4755
+ "support": {
4756
+ "issues": "https://github.com/WordPress/Requests/issues",
4757
+ "source": "https://github.com/WordPress/Requests/tree/v1.8.1"
4758
+ },
4759
+ "time": "2021-06-04T09:56:25+00:00"
4760
+ },
4761
+ {
4762
+ "name": "sebastian/code-unit",
4763
+ "version": "1.0.8",
4764
+ "source": {
4765
+ "type": "git",
4766
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
4767
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
4768
+ },
4769
+ "dist": {
4770
+ "type": "zip",
4771
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
4772
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
4773
+ "shasum": ""
4774
+ },
4775
+ "require": {
4776
+ "php": ">=7.3"
4777
+ },
4778
+ "require-dev": {
4779
+ "phpunit/phpunit": "^9.3"
4780
+ },
4781
+ "type": "library",
4782
+ "extra": {
4783
+ "branch-alias": {
4784
+ "dev-master": "1.0-dev"
4785
+ }
4786
+ },
4787
+ "autoload": {
4788
+ "classmap": [
4789
+ "src/"
4790
+ ]
4791
+ },
4792
+ "notification-url": "https://packagist.org/downloads/",
4793
+ "license": [
4794
+ "BSD-3-Clause"
4795
+ ],
4796
+ "authors": [
4797
+ {
4798
+ "name": "Sebastian Bergmann",
4799
+ "email": "sebastian@phpunit.de",
4800
+ "role": "lead"
4801
+ }
4802
+ ],
4803
+ "description": "Collection of value objects that represent the PHP code units",
4804
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
4805
+ "support": {
4806
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
4807
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
4808
+ },
4809
+ "funding": [
4810
+ {
4811
+ "url": "https://github.com/sebastianbergmann",
4812
+ "type": "github"
4813
+ }
4814
+ ],
4815
+ "time": "2020-10-26T13:08:54+00:00"
4816
+ },
4817
+ {
4818
+ "name": "sebastian/code-unit-reverse-lookup",
4819
+ "version": "2.0.3",
4820
+ "source": {
4821
+ "type": "git",
4822
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
4823
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
4824
+ },
4825
+ "dist": {
4826
+ "type": "zip",
4827
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
4828
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
4829
+ "shasum": ""
4830
+ },
4831
+ "require": {
4832
+ "php": ">=7.3"
4833
+ },
4834
+ "require-dev": {
4835
+ "phpunit/phpunit": "^9.3"
4836
+ },
4837
+ "type": "library",
4838
+ "extra": {
4839
+ "branch-alias": {
4840
+ "dev-master": "2.0-dev"
4841
+ }
4842
+ },
4843
+ "autoload": {
4844
+ "classmap": [
4845
+ "src/"
4846
+ ]
4847
+ },
4848
+ "notification-url": "https://packagist.org/downloads/",
4849
+ "license": [
4850
+ "BSD-3-Clause"
4851
+ ],
4852
+ "authors": [
4853
+ {
4854
+ "name": "Sebastian Bergmann",
4855
+ "email": "sebastian@phpunit.de"
4856
+ }
4857
+ ],
4858
+ "description": "Looks up which function or method a line of code belongs to",
4859
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
4860
+ "support": {
4861
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
4862
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
4863
+ },
4864
+ "funding": [
4865
+ {
4866
+ "url": "https://github.com/sebastianbergmann",
4867
+ "type": "github"
4868
+ }
4869
+ ],
4870
+ "time": "2020-09-28T05:30:19+00:00"
4871
+ },
4872
+ {
4873
+ "name": "sebastian/comparator",
4874
+ "version": "4.0.6",
4875
+ "source": {
4876
+ "type": "git",
4877
+ "url": "https://github.com/sebastianbergmann/comparator.git",
4878
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
4879
+ },
4880
+ "dist": {
4881
+ "type": "zip",
4882
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
4883
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
4884
+ "shasum": ""
4885
+ },
4886
+ "require": {
4887
+ "php": ">=7.3",
4888
+ "sebastian/diff": "^4.0",
4889
+ "sebastian/exporter": "^4.0"
4890
+ },
4891
+ "require-dev": {
4892
+ "phpunit/phpunit": "^9.3"
4893
+ },
4894
+ "type": "library",
4895
+ "extra": {
4896
+ "branch-alias": {
4897
+ "dev-master": "4.0-dev"
4898
+ }
4899
+ },
4900
+ "autoload": {
4901
+ "classmap": [
4902
+ "src/"
4903
+ ]
4904
+ },
4905
+ "notification-url": "https://packagist.org/downloads/",
4906
+ "license": [
4907
+ "BSD-3-Clause"
4908
+ ],
4909
+ "authors": [
4910
+ {
4911
+ "name": "Sebastian Bergmann",
4912
+ "email": "sebastian@phpunit.de"
4913
+ },
4914
+ {
4915
+ "name": "Jeff Welch",
4916
+ "email": "whatthejeff@gmail.com"
4917
+ },
4918
+ {
4919
+ "name": "Volker Dusch",
4920
+ "email": "github@wallbash.com"
4921
+ },
4922
+ {
4923
+ "name": "Bernhard Schussek",
4924
+ "email": "bschussek@2bepublished.at"
4925
+ }
4926
+ ],
4927
+ "description": "Provides the functionality to compare PHP values for equality",
4928
+ "homepage": "https://github.com/sebastianbergmann/comparator",
4929
+ "keywords": [
4930
+ "comparator",
4931
+ "compare",
4932
+ "equality"
4933
+ ],
4934
+ "support": {
4935
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
4936
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
4937
+ },
4938
+ "funding": [
4939
+ {
4940
+ "url": "https://github.com/sebastianbergmann",
4941
+ "type": "github"
4942
+ }
4943
+ ],
4944
+ "time": "2020-10-26T15:49:45+00:00"
4945
+ },
4946
+ {
4947
+ "name": "sebastian/diff",
4948
+ "version": "4.0.4",
4949
+ "source": {
4950
+ "type": "git",
4951
+ "url": "https://github.com/sebastianbergmann/diff.git",
4952
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
4953
+ },
4954
+ "dist": {
4955
+ "type": "zip",
4956
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
4957
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
4958
+ "shasum": ""
4959
+ },
4960
+ "require": {
4961
+ "php": ">=7.3"
4962
+ },
4963
+ "require-dev": {
4964
+ "phpunit/phpunit": "^9.3",
4965
+ "symfony/process": "^4.2 || ^5"
4966
+ },
4967
+ "type": "library",
4968
+ "extra": {
4969
+ "branch-alias": {
4970
+ "dev-master": "4.0-dev"
4971
+ }
4972
+ },
4973
+ "autoload": {
4974
+ "classmap": [
4975
+ "src/"
4976
+ ]
4977
+ },
4978
+ "notification-url": "https://packagist.org/downloads/",
4979
+ "license": [
4980
+ "BSD-3-Clause"
4981
+ ],
4982
+ "authors": [
4983
+ {
4984
+ "name": "Sebastian Bergmann",
4985
+ "email": "sebastian@phpunit.de"
4986
+ },
4987
+ {
4988
+ "name": "Kore Nordmann",
4989
+ "email": "mail@kore-nordmann.de"
4990
+ }
4991
+ ],
4992
+ "description": "Diff implementation",
4993
+ "homepage": "https://github.com/sebastianbergmann/diff",
4994
+ "keywords": [
4995
+ "diff",
4996
+ "udiff",
4997
+ "unidiff",
4998
+ "unified diff"
4999
+ ],
5000
+ "support": {
5001
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
5002
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
5003
+ },
5004
+ "funding": [
5005
+ {
5006
+ "url": "https://github.com/sebastianbergmann",
5007
+ "type": "github"
5008
+ }
5009
+ ],
5010
+ "time": "2020-10-26T13:10:38+00:00"
5011
+ },
5012
+ {
5013
+ "name": "sebastian/environment",
5014
+ "version": "5.1.3",
5015
+ "source": {
5016
+ "type": "git",
5017
+ "url": "https://github.com/sebastianbergmann/environment.git",
5018
+ "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
5019
+ },
5020
+ "dist": {
5021
+ "type": "zip",
5022
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
5023
+ "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
5024
+ "shasum": ""
5025
+ },
5026
+ "require": {
5027
+ "php": ">=7.3"
5028
+ },
5029
+ "require-dev": {
5030
+ "phpunit/phpunit": "^9.3"
5031
+ },
5032
+ "suggest": {
5033
+ "ext-posix": "*"
5034
+ },
5035
+ "type": "library",
5036
+ "extra": {
5037
+ "branch-alias": {
5038
+ "dev-master": "5.1-dev"
5039
+ }
5040
+ },
5041
+ "autoload": {
5042
+ "classmap": [
5043
+ "src/"
5044
+ ]
5045
+ },
5046
+ "notification-url": "https://packagist.org/downloads/",
5047
+ "license": [
5048
+ "BSD-3-Clause"
5049
+ ],
5050
+ "authors": [
5051
+ {
5052
+ "name": "Sebastian Bergmann",
5053
+ "email": "sebastian@phpunit.de"
5054
+ }
5055
+ ],
5056
+ "description": "Provides functionality to handle HHVM/PHP environments",
5057
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
5058
+ "keywords": [
5059
+ "Xdebug",
5060
+ "environment",
5061
+ "hhvm"
5062
+ ],
5063
+ "support": {
5064
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
5065
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
5066
+ },
5067
+ "funding": [
5068
+ {
5069
+ "url": "https://github.com/sebastianbergmann",
5070
+ "type": "github"
5071
+ }
5072
+ ],
5073
+ "time": "2020-09-28T05:52:38+00:00"
5074
+ },
5075
+ {
5076
+ "name": "sebastian/exporter",
5077
+ "version": "4.0.3",
5078
+ "source": {
5079
+ "type": "git",
5080
+ "url": "https://github.com/sebastianbergmann/exporter.git",
5081
+ "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
5082
+ },
5083
+ "dist": {
5084
+ "type": "zip",
5085
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
5086
+ "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
5087
+ "shasum": ""
5088
+ },
5089
+ "require": {
5090
+ "php": ">=7.3",
5091
+ "sebastian/recursion-context": "^4.0"
5092
+ },
5093
+ "require-dev": {
5094
+ "ext-mbstring": "*",
5095
+ "phpunit/phpunit": "^9.3"
5096
+ },
5097
+ "type": "library",
5098
+ "extra": {
5099
+ "branch-alias": {
5100
+ "dev-master": "4.0-dev"
5101
+ }
5102
+ },
5103
+ "autoload": {
5104
+ "classmap": [
5105
+ "src/"
5106
+ ]
5107
+ },
5108
+ "notification-url": "https://packagist.org/downloads/",
5109
+ "license": [
5110
+ "BSD-3-Clause"
5111
+ ],
5112
+ "authors": [
5113
+ {
5114
+ "name": "Sebastian Bergmann",
5115
+ "email": "sebastian@phpunit.de"
5116
+ },
5117
+ {
5118
+ "name": "Jeff Welch",
5119
+ "email": "whatthejeff@gmail.com"
5120
+ },
5121
+ {
5122
+ "name": "Volker Dusch",
5123
+ "email": "github@wallbash.com"
5124
+ },
5125
+ {
5126
+ "name": "Adam Harvey",
5127
+ "email": "aharvey@php.net"
5128
+ },
5129
+ {
5130
+ "name": "Bernhard Schussek",
5131
+ "email": "bschussek@gmail.com"
5132
+ }
5133
+ ],
5134
+ "description": "Provides the functionality to export PHP variables for visualization",
5135
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
5136
+ "keywords": [
5137
+ "export",
5138
+ "exporter"
5139
+ ],
5140
+ "support": {
5141
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
5142
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3"
5143
+ },
5144
+ "funding": [
5145
+ {
5146
+ "url": "https://github.com/sebastianbergmann",
5147
+ "type": "github"
5148
+ }
5149
+ ],
5150
+ "time": "2020-09-28T05:24:23+00:00"
5151
+ },
5152
+ {
5153
+ "name": "sebastian/finder-facade",
5154
+ "version": "2.0.0",
5155
+ "source": {
5156
+ "type": "git",
5157
+ "url": "https://github.com/sebastianbergmann/finder-facade.git",
5158
+ "reference": "9d3e74b845a2ce50e19b25b5f0c2718e153bee6c"
5159
+ },
5160
+ "dist": {
5161
+ "type": "zip",
5162
+ "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/9d3e74b845a2ce50e19b25b5f0c2718e153bee6c",
5163
+ "reference": "9d3e74b845a2ce50e19b25b5f0c2718e153bee6c",
5164
+ "shasum": ""
5165
+ },
5166
+ "require": {
5167
+ "ext-ctype": "*",
5168
+ "php": "^7.3",
5169
+ "symfony/finder": "^4.1|^5.0",
5170
+ "theseer/fdomdocument": "^1.6"
5171
+ },
5172
+ "type": "library",
5173
+ "extra": {
5174
+ "branch-alias": {
5175
+ "dev-master": "2.0-dev"
5176
+ }
5177
+ },
5178
+ "autoload": {
5179
+ "classmap": [
5180
+ "src/"
5181
+ ]
5182
+ },
5183
+ "notification-url": "https://packagist.org/downloads/",
5184
+ "license": [
5185
+ "BSD-3-Clause"
5186
+ ],
5187
+ "authors": [
5188
+ {
5189
+ "name": "Sebastian Bergmann",
5190
+ "email": "sebastian@phpunit.de",
5191
+ "role": "lead"
5192
+ }
5193
+ ],
5194
+ "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.",
5195
+ "homepage": "https://github.com/sebastianbergmann/finder-facade",
5196
+ "support": {
5197
+ "issues": "https://github.com/sebastianbergmann/finder-facade/issues",
5198
+ "source": "https://github.com/sebastianbergmann/finder-facade/tree/2.0.0"
5199
+ },
5200
+ "abandoned": true,
5201
+ "time": "2020-02-08T06:07:58+00:00"
5202
+ },
5203
+ {
5204
+ "name": "sebastian/global-state",
5205
+ "version": "4.0.0",
5206
+ "source": {
5207
+ "type": "git",
5208
+ "url": "https://github.com/sebastianbergmann/global-state.git",
5209
+ "reference": "bdb1e7c79e592b8c82cb1699be3c8743119b8a72"
5210
+ },
5211
+ "dist": {
5212
+ "type": "zip",
5213
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bdb1e7c79e592b8c82cb1699be3c8743119b8a72",
5214
+ "reference": "bdb1e7c79e592b8c82cb1699be3c8743119b8a72",
5215
+ "shasum": ""
5216
+ },
5217
+ "require": {
5218
+ "php": "^7.3",
5219
+ "sebastian/object-reflector": "^2.0",
5220
+ "sebastian/recursion-context": "^4.0"
5221
+ },
5222
+ "require-dev": {
5223
+ "ext-dom": "*",
5224
+ "phpunit/phpunit": "^9.0"
5225
+ },
5226
+ "suggest": {
5227
+ "ext-uopz": "*"
5228
+ },
5229
+ "type": "library",
5230
+ "extra": {
5231
+ "branch-alias": {
5232
+ "dev-master": "4.0-dev"
5233
+ }
5234
+ },
5235
+ "autoload": {
5236
+ "classmap": [
5237
+ "src/"
5238
+ ]
5239
+ },
5240
+ "notification-url": "https://packagist.org/downloads/",
5241
+ "license": [
5242
+ "BSD-3-Clause"
5243
+ ],
5244
+ "authors": [
5245
+ {
5246
+ "name": "Sebastian Bergmann",
5247
+ "email": "sebastian@phpunit.de"
5248
+ }
5249
+ ],
5250
+ "description": "Snapshotting of global state",
5251
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
5252
+ "keywords": [
5253
+ "global state"
5254
+ ],
5255
+ "support": {
5256
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
5257
+ "source": "https://github.com/sebastianbergmann/global-state/tree/master"
5258
+ },
5259
+ "time": "2020-02-07T06:11:37+00:00"
5260
+ },
5261
+ {
5262
+ "name": "sebastian/object-enumerator",
5263
+ "version": "4.0.4",
5264
+ "source": {
5265
+ "type": "git",
5266
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
5267
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
5268
+ },
5269
+ "dist": {
5270
+ "type": "zip",
5271
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
5272
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
5273
+ "shasum": ""
5274
+ },
5275
+ "require": {
5276
+ "php": ">=7.3",
5277
+ "sebastian/object-reflector": "^2.0",
5278
+ "sebastian/recursion-context": "^4.0"
5279
+ },
5280
+ "require-dev": {
5281
+ "phpunit/phpunit": "^9.3"
5282
+ },
5283
+ "type": "library",
5284
+ "extra": {
5285
+ "branch-alias": {
5286
+ "dev-master": "4.0-dev"
5287
+ }
5288
+ },
5289
+ "autoload": {
5290
+ "classmap": [
5291
+ "src/"
5292
+ ]
5293
+ },
5294
+ "notification-url": "https://packagist.org/downloads/",
5295
+ "license": [
5296
+ "BSD-3-Clause"
5297
+ ],
5298
+ "authors": [
5299
+ {
5300
+ "name": "Sebastian Bergmann",
5301
+ "email": "sebastian@phpunit.de"
5302
+ }
5303
+ ],
5304
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
5305
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
5306
+ "support": {
5307
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
5308
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
5309
+ },
5310
+ "funding": [
5311
+ {
5312
+ "url": "https://github.com/sebastianbergmann",
5313
+ "type": "github"
5314
+ }
5315
+ ],
5316
+ "time": "2020-10-26T13:12:34+00:00"
5317
+ },
5318
+ {
5319
+ "name": "sebastian/object-reflector",
5320
+ "version": "2.0.4",
5321
+ "source": {
5322
+ "type": "git",
5323
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
5324
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
5325
+ },
5326
+ "dist": {
5327
+ "type": "zip",
5328
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
5329
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
5330
+ "shasum": ""
5331
+ },
5332
+ "require": {
5333
+ "php": ">=7.3"
5334
+ },
5335
+ "require-dev": {
5336
+ "phpunit/phpunit": "^9.3"
5337
+ },
5338
+ "type": "library",
5339
+ "extra": {
5340
+ "branch-alias": {
5341
+ "dev-master": "2.0-dev"
5342
+ }
5343
+ },
5344
+ "autoload": {
5345
+ "classmap": [
5346
+ "src/"
5347
+ ]
5348
+ },
5349
+ "notification-url": "https://packagist.org/downloads/",
5350
+ "license": [
5351
+ "BSD-3-Clause"
5352
+ ],
5353
+ "authors": [
5354
+ {
5355
+ "name": "Sebastian Bergmann",
5356
+ "email": "sebastian@phpunit.de"
5357
+ }
5358
+ ],
5359
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
5360
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
5361
+ "support": {
5362
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
5363
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
5364
+ },
5365
+ "funding": [
5366
+ {
5367
+ "url": "https://github.com/sebastianbergmann",
5368
+ "type": "github"
5369
+ }
5370
+ ],
5371
+ "time": "2020-10-26T13:14:26+00:00"
5372
+ },
5373
+ {
5374
+ "name": "sebastian/phpcpd",
5375
+ "version": "5.0.2",
5376
+ "source": {
5377
+ "type": "git",
5378
+ "url": "https://github.com/sebastianbergmann/phpcpd.git",
5379
+ "reference": "8724382966b1861df4e12db915eaed2165e10bf3"
5380
+ },
5381
+ "dist": {
5382
+ "type": "zip",
5383
+ "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/8724382966b1861df4e12db915eaed2165e10bf3",
5384
+ "reference": "8724382966b1861df4e12db915eaed2165e10bf3",
5385
+ "shasum": ""
5386
+ },
5387
+ "require": {
5388
+ "ext-dom": "*",
5389
+ "php": "^7.3",
5390
+ "phpunit/php-timer": "^3.0",
5391
+ "sebastian/finder-facade": "^2.0",
5392
+ "sebastian/version": "^3.0",
5393
+ "symfony/console": "^4.0|^5.0"
5394
+ },
5395
+ "bin": [
5396
+ "phpcpd"
5397
+ ],
5398
+ "type": "library",
5399
+ "extra": {
5400
+ "branch-alias": {
5401
+ "dev-master": "5.0-dev"
5402
+ }
5403
+ },
5404
+ "autoload": {
5405
+ "classmap": [
5406
+ "src/"
5407
+ ]
5408
+ },
5409
+ "notification-url": "https://packagist.org/downloads/",
5410
+ "license": [
5411
+ "BSD-3-Clause"
5412
+ ],
5413
+ "authors": [
5414
+ {
5415
+ "name": "Sebastian Bergmann",
5416
+ "email": "sebastian@phpunit.de",
5417
+ "role": "lead"
5418
+ }
5419
+ ],
5420
+ "description": "Copy/Paste Detector (CPD) for PHP code.",
5421
+ "homepage": "https://github.com/sebastianbergmann/phpcpd",
5422
+ "support": {
5423
+ "issues": "https://github.com/sebastianbergmann/phpcpd/issues",
5424
+ "source": "https://github.com/sebastianbergmann/phpcpd/tree/5.0.2"
5425
+ },
5426
+ "time": "2020-02-22T06:03:17+00:00"
5427
+ },
5428
+ {
5429
+ "name": "sebastian/recursion-context",
5430
+ "version": "4.0.4",
5431
+ "source": {
5432
+ "type": "git",
5433
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
5434
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
5435
+ },
5436
+ "dist": {
5437
+ "type": "zip",
5438
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
5439
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
5440
+ "shasum": ""
5441
+ },
5442
+ "require": {
5443
+ "php": ">=7.3"
5444
+ },
5445
+ "require-dev": {
5446
+ "phpunit/phpunit": "^9.3"
5447
+ },
5448
+ "type": "library",
5449
+ "extra": {
5450
+ "branch-alias": {
5451
+ "dev-master": "4.0-dev"
5452
+ }
5453
+ },
5454
+ "autoload": {
5455
+ "classmap": [
5456
+ "src/"
5457
+ ]
5458
+ },
5459
+ "notification-url": "https://packagist.org/downloads/",
5460
+ "license": [
5461
+ "BSD-3-Clause"
5462
+ ],
5463
+ "authors": [
5464
+ {
5465
+ "name": "Sebastian Bergmann",
5466
+ "email": "sebastian@phpunit.de"
5467
+ },
5468
+ {
5469
+ "name": "Jeff Welch",
5470
+ "email": "whatthejeff@gmail.com"
5471
+ },
5472
+ {
5473
+ "name": "Adam Harvey",
5474
+ "email": "aharvey@php.net"
5475
+ }
5476
+ ],
5477
+ "description": "Provides functionality to recursively process PHP variables",
5478
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
5479
+ "support": {
5480
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
5481
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
5482
+ },
5483
+ "funding": [
5484
+ {
5485
+ "url": "https://github.com/sebastianbergmann",
5486
+ "type": "github"
5487
+ }
5488
+ ],
5489
+ "time": "2020-10-26T13:17:30+00:00"
5490
+ },
5491
+ {
5492
+ "name": "sebastian/resource-operations",
5493
+ "version": "3.0.3",
5494
+ "source": {
5495
+ "type": "git",
5496
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
5497
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
5498
+ },
5499
+ "dist": {
5500
+ "type": "zip",
5501
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
5502
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
5503
+ "shasum": ""
5504
+ },
5505
+ "require": {
5506
+ "php": ">=7.3"
5507
+ },
5508
+ "require-dev": {
5509
+ "phpunit/phpunit": "^9.0"
5510
+ },
5511
+ "type": "library",
5512
+ "extra": {
5513
+ "branch-alias": {
5514
+ "dev-master": "3.0-dev"
5515
+ }
5516
+ },
5517
+ "autoload": {
5518
+ "classmap": [
5519
+ "src/"
5520
+ ]
5521
+ },
5522
+ "notification-url": "https://packagist.org/downloads/",
5523
+ "license": [
5524
+ "BSD-3-Clause"
5525
+ ],
5526
+ "authors": [
5527
+ {
5528
+ "name": "Sebastian Bergmann",
5529
+ "email": "sebastian@phpunit.de"
5530
+ }
5531
+ ],
5532
+ "description": "Provides a list of PHP built-in functions that operate on resources",
5533
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
5534
+ "support": {
5535
+ "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
5536
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
5537
+ },
5538
+ "funding": [
5539
+ {
5540
+ "url": "https://github.com/sebastianbergmann",
5541
+ "type": "github"
5542
+ }
5543
+ ],
5544
+ "time": "2020-09-28T06:45:17+00:00"
5545
+ },
5546
+ {
5547
+ "name": "sebastian/type",
5548
+ "version": "2.3.4",
5549
+ "source": {
5550
+ "type": "git",
5551
+ "url": "https://github.com/sebastianbergmann/type.git",
5552
+ "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914"
5553
+ },
5554
+ "dist": {
5555
+ "type": "zip",
5556
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914",
5557
+ "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914",
5558
+ "shasum": ""
5559
+ },
5560
+ "require": {
5561
+ "php": ">=7.3"
5562
+ },
5563
+ "require-dev": {
5564
+ "phpunit/phpunit": "^9.3"
5565
+ },
5566
+ "type": "library",
5567
+ "extra": {
5568
+ "branch-alias": {
5569
+ "dev-master": "2.3-dev"
5570
+ }
5571
+ },
5572
+ "autoload": {
5573
+ "classmap": [
5574
+ "src/"
5575
+ ]
5576
+ },
5577
+ "notification-url": "https://packagist.org/downloads/",
5578
+ "license": [
5579
+ "BSD-3-Clause"
5580
+ ],
5581
+ "authors": [
5582
+ {
5583
+ "name": "Sebastian Bergmann",
5584
+ "email": "sebastian@phpunit.de",
5585
+ "role": "lead"
5586
+ }
5587
+ ],
5588
+ "description": "Collection of value objects that represent the types of the PHP type system",
5589
+ "homepage": "https://github.com/sebastianbergmann/type",
5590
+ "support": {
5591
+ "issues": "https://github.com/sebastianbergmann/type/issues",
5592
+ "source": "https://github.com/sebastianbergmann/type/tree/2.3.4"
5593
+ },
5594
+ "funding": [
5595
+ {
5596
+ "url": "https://github.com/sebastianbergmann",
5597
+ "type": "github"
5598
+ }
5599
+ ],
5600
+ "time": "2021-06-15T12:49:02+00:00"
5601
+ },
5602
+ {
5603
+ "name": "sebastian/version",
5604
+ "version": "3.0.2",
5605
+ "source": {
5606
+ "type": "git",
5607
+ "url": "https://github.com/sebastianbergmann/version.git",
5608
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
5609
+ },
5610
+ "dist": {
5611
+ "type": "zip",
5612
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
5613
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
5614
+ "shasum": ""
5615
+ },
5616
+ "require": {
5617
+ "php": ">=7.3"
5618
+ },
5619
+ "type": "library",
5620
+ "extra": {
5621
+ "branch-alias": {
5622
+ "dev-master": "3.0-dev"
5623
+ }
5624
+ },
5625
+ "autoload": {
5626
+ "classmap": [
5627
+ "src/"
5628
+ ]
5629
+ },
5630
+ "notification-url": "https://packagist.org/downloads/",
5631
+ "license": [
5632
+ "BSD-3-Clause"
5633
+ ],
5634
+ "authors": [
5635
+ {
5636
+ "name": "Sebastian Bergmann",
5637
+ "email": "sebastian@phpunit.de",
5638
+ "role": "lead"
5639
+ }
5640
+ ],
5641
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
5642
+ "homepage": "https://github.com/sebastianbergmann/version",
5643
+ "support": {
5644
+ "issues": "https://github.com/sebastianbergmann/version/issues",
5645
+ "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
5646
+ },
5647
+ "funding": [
5648
+ {
5649
+ "url": "https://github.com/sebastianbergmann",
5650
+ "type": "github"
5651
+ }
5652
+ ],
5653
+ "time": "2020-09-28T06:39:44+00:00"
5654
+ },
5655
+ {
5656
+ "name": "softcreatr/jsonpath",
5657
+ "version": "0.7.5",
5658
+ "source": {
5659
+ "type": "git",
5660
+ "url": "https://github.com/SoftCreatR/JSONPath.git",
5661
+ "reference": "008569bf80aa3584834f7890781576bc7b65afa7"
5662
+ },
5663
+ "dist": {
5664
+ "type": "zip",
5665
+ "url": "https://api.github.com/repos/SoftCreatR/JSONPath/zipball/008569bf80aa3584834f7890781576bc7b65afa7",
5666
+ "reference": "008569bf80aa3584834f7890781576bc7b65afa7",
5667
+ "shasum": ""
5668
+ },
5669
+ "require": {
5670
+ "ext-json": "*",
5671
+ "php": ">=7.1"
5672
+ },
5673
+ "replace": {
5674
+ "flow/jsonpath": "*"
5675
+ },
5676
+ "require-dev": {
5677
+ "phpunit/phpunit": ">=7.0",
5678
+ "roave/security-advisories": "dev-master",
5679
+ "squizlabs/php_codesniffer": "^3.5"
5680
+ },
5681
+ "type": "library",
5682
+ "autoload": {
5683
+ "psr-4": {
5684
+ "Flow\\JSONPath\\": "src/"
5685
+ }
5686
+ },
5687
+ "notification-url": "https://packagist.org/downloads/",
5688
+ "license": [
5689
+ "MIT"
5690
+ ],
5691
+ "authors": [
5692
+ {
5693
+ "name": "Stephen Frank",
5694
+ "email": "stephen@flowsa.com",
5695
+ "homepage": "https://prismaticbytes.com",
5696
+ "role": "Developer"
5697
+ },
5698
+ {
5699
+ "name": "Sascha Greuel",
5700
+ "email": "hello@1-2.dev",
5701
+ "homepage": "http://1-2.dev",
5702
+ "role": "Developer"
5703
+ }
5704
+ ],
5705
+ "description": "JSONPath implementation for parsing, searching and flattening arrays",
5706
+ "support": {
5707
+ "email": "hello@1-2.dev",
5708
+ "forum": "https://github.com/SoftCreatR/JSONPath/discussions",
5709
+ "issues": "https://github.com/SoftCreatR/JSONPath/issues",
5710
+ "source": "https://github.com/SoftCreatR/JSONPath"
5711
+ },
5712
+ "funding": [
5713
+ {
5714
+ "url": "https://github.com/softcreatr",
5715
+ "type": "github"
5716
+ }
5717
+ ],
5718
+ "time": "2021-06-02T22:15:26+00:00"
5719
+ },
5720
+ {
5721
+ "name": "squizlabs/php_codesniffer",
5722
+ "version": "3.6.1",
5723
+ "source": {
5724
+ "type": "git",
5725
+ "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
5726
+ "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e"
5727
+ },
5728
+ "dist": {
5729
+ "type": "zip",
5730
+ "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/f268ca40d54617c6e06757f83f699775c9b3ff2e",
5731
+ "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e",
5732
+ "shasum": ""
5733
+ },
5734
+ "require": {
5735
+ "ext-simplexml": "*",
5736
+ "ext-tokenizer": "*",
5737
+ "ext-xmlwriter": "*",
5738
+ "php": ">=5.4.0"
5739
+ },
5740
+ "require-dev": {
5741
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
5742
+ },
5743
+ "bin": [
5744
+ "bin/phpcs",
5745
+ "bin/phpcbf"
5746
+ ],
5747
+ "type": "library",
5748
+ "extra": {
5749
+ "branch-alias": {
5750
+ "dev-master": "3.x-dev"
5751
+ }
5752
+ },
5753
+ "notification-url": "https://packagist.org/downloads/",
5754
+ "license": [
5755
+ "BSD-3-Clause"
5756
+ ],
5757
+ "authors": [
5758
+ {
5759
+ "name": "Greg Sherwood",
5760
+ "role": "lead"
5761
+ }
5762
+ ],
5763
+ "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
5764
+ "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
5765
+ "keywords": [
5766
+ "phpcs",
5767
+ "standards"
5768
+ ],
5769
+ "support": {
5770
+ "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
5771
+ "source": "https://github.com/squizlabs/PHP_CodeSniffer",
5772
+ "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
5773
+ },
5774
+ "time": "2021-10-11T04:00:11+00:00"
5775
+ },
5776
+ {
5777
+ "name": "symfony/browser-kit",
5778
+ "version": "v5.3.4",
5779
+ "source": {
5780
+ "type": "git",
5781
+ "url": "https://github.com/symfony/browser-kit.git",
5782
+ "reference": "c1e3f64fcc631c96e2c5843b666db66679ced11c"
5783
+ },
5784
+ "dist": {
5785
+ "type": "zip",
5786
+ "url": "https://api.github.com/repos/symfony/browser-kit/zipball/c1e3f64fcc631c96e2c5843b666db66679ced11c",
5787
+ "reference": "c1e3f64fcc631c96e2c5843b666db66679ced11c",
5788
+ "shasum": ""
5789
+ },
5790
+ "require": {
5791
+ "php": ">=7.2.5",
5792
+ "symfony/dom-crawler": "^4.4|^5.0",
5793
+ "symfony/polyfill-php80": "^1.16"
5794
+ },
5795
+ "require-dev": {
5796
+ "symfony/css-selector": "^4.4|^5.0",
5797
+ "symfony/http-client": "^4.4|^5.0",
5798
+ "symfony/mime": "^4.4|^5.0",
5799
+ "symfony/process": "^4.4|^5.0"
5800
+ },
5801
+ "suggest": {
5802
+ "symfony/process": ""
5803
+ },
5804
+ "type": "library",
5805
+ "autoload": {
5806
+ "psr-4": {
5807
+ "Symfony\\Component\\BrowserKit\\": ""
5808
+ },
5809
+ "exclude-from-classmap": [
5810
+ "/Tests/"
5811
+ ]
5812
+ },
5813
+ "notification-url": "https://packagist.org/downloads/",
5814
+ "license": [
5815
+ "MIT"
5816
+ ],
5817
+ "authors": [
5818
+ {
5819
+ "name": "Fabien Potencier",
5820
+ "email": "fabien@symfony.com"
5821
+ },
5822
+ {
5823
+ "name": "Symfony Community",
5824
+ "homepage": "https://symfony.com/contributors"
5825
+ }
5826
+ ],
5827
+ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically",
5828
+ "homepage": "https://symfony.com",
5829
+ "support": {
5830
+ "source": "https://github.com/symfony/browser-kit/tree/v5.3.4"
5831
+ },
5832
+ "funding": [
5833
+ {
5834
+ "url": "https://symfony.com/sponsor",
5835
+ "type": "custom"
5836
+ },
5837
+ {
5838
+ "url": "https://github.com/fabpot",
5839
+ "type": "github"
5840
+ },
5841
+ {
5842
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
5843
+ "type": "tidelift"
5844
+ }
5845
+ ],
5846
+ "time": "2021-07-21T12:40:44+00:00"
5847
+ },
5848
+ {
5849
+ "name": "symfony/config",
5850
+ "version": "v5.3.4",
5851
+ "source": {
5852
+ "type": "git",
5853
+ "url": "https://github.com/symfony/config.git",
5854
+ "reference": "4268f3059c904c61636275182707f81645517a37"
5855
+ },
5856
+ "dist": {
5857
+ "type": "zip",
5858
+ "url": "https://api.github.com/repos/symfony/config/zipball/4268f3059c904c61636275182707f81645517a37",
5859
+ "reference": "4268f3059c904c61636275182707f81645517a37",
5860
+ "shasum": ""
5861
+ },
5862
+ "require": {
5863
+ "php": ">=7.2.5",
5864
+ "symfony/deprecation-contracts": "^2.1",
5865
+ "symfony/filesystem": "^4.4|^5.0",
5866
+ "symfony/polyfill-ctype": "~1.8",
5867
+ "symfony/polyfill-php80": "^1.16",
5868
+ "symfony/polyfill-php81": "^1.22"
5869
+ },
5870
+ "conflict": {
5871
+ "symfony/finder": "<4.4"
5872
+ },
5873
+ "require-dev": {
5874
+ "symfony/event-dispatcher": "^4.4|^5.0",
5875
+ "symfony/finder": "^4.4|^5.0",
5876
+ "symfony/messenger": "^4.4|^5.0",
5877
+ "symfony/service-contracts": "^1.1|^2",
5878
+ "symfony/yaml": "^4.4|^5.0"
5879
+ },
5880
+ "suggest": {
5881
+ "symfony/yaml": "To use the yaml reference dumper"
5882
+ },
5883
+ "type": "library",
5884
+ "autoload": {
5885
+ "psr-4": {
5886
+ "Symfony\\Component\\Config\\": ""
5887
+ },
5888
+ "exclude-from-classmap": [
5889
+ "/Tests/"
5890
+ ]
5891
+ },
5892
+ "notification-url": "https://packagist.org/downloads/",
5893
+ "license": [
5894
+ "MIT"
5895
+ ],
5896
+ "authors": [
5897
+ {
5898
+ "name": "Fabien Potencier",
5899
+ "email": "fabien@symfony.com"
5900
+ },
5901
+ {
5902
+ "name": "Symfony Community",
5903
+ "homepage": "https://symfony.com/contributors"
5904
+ }
5905
+ ],
5906
+ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
5907
+ "homepage": "https://symfony.com",
5908
+ "support": {
5909
+ "source": "https://github.com/symfony/config/tree/v5.3.4"
5910
+ },
5911
+ "funding": [
5912
+ {
5913
+ "url": "https://symfony.com/sponsor",
5914
+ "type": "custom"
5915
+ },
5916
+ {
5917
+ "url": "https://github.com/fabpot",
5918
+ "type": "github"
5919
+ },
5920
+ {
5921
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
5922
+ "type": "tidelift"
5923
+ }
5924
+ ],
5925
+ "time": "2021-07-21T12:40:44+00:00"
5926
+ },
5927
+ {
5928
+ "name": "symfony/console",
5929
+ "version": "v5.1.11",
5930
+ "source": {
5931
+ "type": "git",
5932
+ "url": "https://github.com/symfony/console.git",
5933
+ "reference": "d9a267b621c5082e0a6c659d73633b6fd28a8a08"
5934
+ },
5935
+ "dist": {
5936
+ "type": "zip",
5937
+ "url": "https://api.github.com/repos/symfony/console/zipball/d9a267b621c5082e0a6c659d73633b6fd28a8a08",
5938
+ "reference": "d9a267b621c5082e0a6c659d73633b6fd28a8a08",
5939
+ "shasum": ""
5940
+ },
5941
+ "require": {
5942
+ "php": ">=7.2.5",
5943
+ "symfony/polyfill-mbstring": "~1.0",
5944
+ "symfony/polyfill-php73": "^1.8",
5945
+ "symfony/polyfill-php80": "^1.15",
5946
+ "symfony/service-contracts": "^1.1|^2",
5947
+ "symfony/string": "^5.1"
5948
+ },
5949
+ "conflict": {
5950
+ "symfony/dependency-injection": "<4.4",
5951
+ "symfony/dotenv": "<5.1",
5952
+ "symfony/event-dispatcher": "<4.4",
5953
+ "symfony/lock": "<4.4",
5954
+ "symfony/process": "<4.4"
5955
+ },
5956
+ "provide": {
5957
+ "psr/log-implementation": "1.0"
5958
+ },
5959
+ "require-dev": {
5960
+ "psr/log": "~1.0",
5961
+ "symfony/config": "^4.4|^5.0",
5962
+ "symfony/dependency-injection": "^4.4|^5.0",
5963
+ "symfony/event-dispatcher": "^4.4|^5.0",
5964
+ "symfony/lock": "^4.4|^5.0",
5965
+ "symfony/process": "^4.4|^5.0",
5966
  "symfony/var-dumper": "^4.4|^5.0"
5967
  },
5968
  "suggest": {
5969
+ "psr/log": "For using the console logger",
5970
+ "symfony/event-dispatcher": "",
5971
+ "symfony/lock": "",
5972
+ "symfony/process": ""
5973
+ },
5974
+ "type": "library",
5975
+ "autoload": {
5976
+ "psr-4": {
5977
+ "Symfony\\Component\\Console\\": ""
5978
+ },
5979
+ "exclude-from-classmap": [
5980
+ "/Tests/"
5981
+ ]
5982
+ },
5983
+ "notification-url": "https://packagist.org/downloads/",
5984
+ "license": [
5985
+ "MIT"
5986
+ ],
5987
+ "authors": [
5988
+ {
5989
+ "name": "Fabien Potencier",
5990
+ "email": "fabien@symfony.com"
5991
+ },
5992
+ {
5993
+ "name": "Symfony Community",
5994
+ "homepage": "https://symfony.com/contributors"
5995
+ }
5996
+ ],
5997
+ "description": "Eases the creation of beautiful and testable command line interfaces",
5998
+ "homepage": "https://symfony.com",
5999
+ "support": {
6000
+ "source": "https://github.com/symfony/console/tree/v5.1.11"
6001
+ },
6002
+ "funding": [
6003
+ {
6004
+ "url": "https://symfony.com/sponsor",
6005
+ "type": "custom"
6006
+ },
6007
+ {
6008
+ "url": "https://github.com/fabpot",
6009
+ "type": "github"
6010
+ },
6011
+ {
6012
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
6013
+ "type": "tidelift"
6014
+ }
6015
+ ],
6016
+ "time": "2021-01-27T10:01:46+00:00"
6017
+ },
6018
+ {
6019
+ "name": "symfony/css-selector",
6020
+ "version": "v5.3.4",
6021
+ "source": {
6022
+ "type": "git",
6023
+ "url": "https://github.com/symfony/css-selector.git",
6024
+ "reference": "7fb120adc7f600a59027775b224c13a33530dd90"
6025
+ },
6026
+ "dist": {
6027
+ "type": "zip",
6028
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90",
6029
+ "reference": "7fb120adc7f600a59027775b224c13a33530dd90",
6030
+ "shasum": ""
6031
+ },
6032
+ "require": {
6033
+ "php": ">=7.2.5",
6034
+ "symfony/polyfill-php80": "^1.16"
6035
+ },
6036
+ "type": "library",
6037
+ "autoload": {
6038
+ "psr-4": {
6039
+ "Symfony\\Component\\CssSelector\\": ""
6040
+ },
6041
+ "exclude-from-classmap": [
6042
+ "/Tests/"
6043
+ ]
6044
+ },
6045
+ "notification-url": "https://packagist.org/downloads/",
6046
+ "license": [
6047
+ "MIT"
6048
+ ],
6049
+ "authors": [
6050
+ {
6051
+ "name": "Fabien Potencier",
6052
+ "email": "fabien@symfony.com"
6053
+ },
6054
+ {
6055
+ "name": "Jean-François Simon",
6056
+ "email": "jeanfrancois.simon@sensiolabs.com"
6057
+ },
6058
+ {
6059
+ "name": "Symfony Community",
6060
+ "homepage": "https://symfony.com/contributors"
6061
+ }
6062
+ ],
6063
+ "description": "Converts CSS selectors to XPath expressions",
6064
+ "homepage": "https://symfony.com",
6065
+ "support": {
6066
+ "source": "https://github.com/symfony/css-selector/tree/v5.3.4"
6067
+ },
6068
+ "funding": [
6069
+ {
6070
+ "url": "https://symfony.com/sponsor",
6071
+ "type": "custom"
6072
+ },
6073
+ {
6074
+ "url": "https://github.com/fabpot",
6075
+ "type": "github"
6076
+ },
6077
+ {
6078
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
6079
+ "type": "tidelift"
6080
+ }
6081
+ ],
6082
+ "time": "2021-07-21T12:38:00+00:00"
6083
+ },
6084
+ {
6085
+ "name": "symfony/dependency-injection",
6086
+ "version": "v5.3.8",
6087
+ "source": {
6088
+ "type": "git",
6089
+ "url": "https://github.com/symfony/dependency-injection.git",
6090
+ "reference": "e39c344e06a3ceab531ebeb6c077e6652c4a0829"
6091
+ },
6092
+ "dist": {
6093
+ "type": "zip",
6094
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e39c344e06a3ceab531ebeb6c077e6652c4a0829",
6095
+ "reference": "e39c344e06a3ceab531ebeb6c077e6652c4a0829",
6096
+ "shasum": ""
6097
+ },
6098
+ "require": {
6099
+ "php": ">=7.2.5",
6100
+ "psr/container": "^1.1.1",
6101
+ "symfony/deprecation-contracts": "^2.1",
6102
+ "symfony/polyfill-php80": "^1.16",
6103
+ "symfony/service-contracts": "^1.1.6|^2"
6104
+ },
6105
+ "conflict": {
6106
+ "ext-psr": "<1.1|>=2",
6107
+ "symfony/config": "<5.3",
6108
+ "symfony/finder": "<4.4",
6109
+ "symfony/proxy-manager-bridge": "<4.4",
6110
+ "symfony/yaml": "<4.4"
6111
+ },
6112
+ "provide": {
6113
+ "psr/container-implementation": "1.0",
6114
+ "symfony/service-implementation": "1.0|2.0"
6115
+ },
6116
+ "require-dev": {
6117
+ "symfony/config": "^5.3",
6118
+ "symfony/expression-language": "^4.4|^5.0",
6119
+ "symfony/yaml": "^4.4|^5.0"
6120
+ },
6121
+ "suggest": {
6122
+ "symfony/config": "",
6123
+ "symfony/expression-language": "For using expressions in service container configuration",
6124
+ "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required",
6125
+ "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
6126
+ "symfony/yaml": ""
6127
+ },
6128
+ "type": "library",
6129
+ "autoload": {
6130
+ "psr-4": {
6131
+ "Symfony\\Component\\DependencyInjection\\": ""
6132
+ },
6133
+ "exclude-from-classmap": [
6134
+ "/Tests/"
6135
+ ]
6136
+ },
6137
+ "notification-url": "https://packagist.org/downloads/",
6138
+ "license": [
6139
+ "MIT"
6140
+ ],
6141
+ "authors": [
6142
+ {
6143
+ "name": "Fabien Potencier",
6144
+ "email": "fabien@symfony.com"
6145
+ },
6146
+ {
6147
+ "name": "Symfony Community",
6148
+ "homepage": "https://symfony.com/contributors"
6149
+ }
6150
+ ],
6151
+ "description": "Allows you to standardize and centralize the way objects are constructed in your application",
6152
+ "homepage": "https://symfony.com",
6153
+ "support": {
6154
+ "source": "https://github.com/symfony/dependency-injection/tree/v5.3.8"
6155
+ },
6156
+ "funding": [
6157
+ {
6158
+ "url": "https://symfony.com/sponsor",
6159
+ "type": "custom"
6160
+ },
6161
+ {
6162
+ "url": "https://github.com/fabpot",
6163
+ "type": "github"
6164
+ },
6165
+ {
6166
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
6167
+ "type": "tidelift"
6168
+ }
6169
+ ],
6170
+ "time": "2021-09-21T20:52:44+00:00"
6171
+ },
6172
+ {
6173
+ "name": "symfony/deprecation-contracts",
6174
+ "version": "v2.4.0",
6175
+ "source": {
6176
+ "type": "git",
6177
+ "url": "https://github.com/symfony/deprecation-contracts.git",
6178
+ "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627"
6179
+ },
6180
+ "dist": {
6181
+ "type": "zip",
6182
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627",
6183
+ "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627",
6184
+ "shasum": ""
6185
+ },
6186
+ "require": {
6187
+ "php": ">=7.1"
6188
+ },
6189
+ "type": "library",
6190
+ "extra": {
6191
+ "branch-alias": {
6192
+ "dev-main": "2.4-dev"
6193
+ },
6194
+ "thanks": {
6195
+ "name": "symfony/contracts",
6196
+ "url": "https://github.com/symfony/contracts"
6197
+ }
6198
+ },
6199
+ "autoload": {
6200
+ "files": [
6201
+ "function.php"
6202
+ ]
6203
+ },
6204
+ "notification-url": "https://packagist.org/downloads/",
6205
+ "license": [
6206
+ "MIT"
6207
+ ],
6208
+ "authors": [
6209
+ {
6210
+ "name": "Nicolas Grekas",
6211
+ "email": "p@tchwork.com"
6212
+ },
6213
+ {
6214
+ "name": "Symfony Community",
6215
+ "homepage": "https://symfony.com/contributors"
6216
+ }
6217
+ ],
6218
+ "description": "A generic function and convention to trigger deprecation notices",
6219
+ "homepage": "https://symfony.com",
6220
+ "support": {
6221
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0"
6222
+ },
6223
+ "funding": [
6224
+ {
6225
+ "url": "https://symfony.com/sponsor",
6226
+ "type": "custom"
6227
+ },
6228
+ {
6229
+ "url": "https://github.com/fabpot",
6230
+ "type": "github"
6231
+ },
6232
+ {
6233
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
6234
+ "type": "tidelift"
6235
+ }
6236
+ ],
6237
+ "time": "2021-03-23T23:28:01+00:00"
6238
+ },
6239
+ {
6240
+ "name": "symfony/dom-crawler",
6241
+ "version": "v5.3.7",
6242
+ "source": {
6243
+ "type": "git",
6244
+ "url": "https://github.com/symfony/dom-crawler.git",
6245
+ "reference": "c7eef3a60ccfdd8eafe07f81652e769ac9c7146c"
6246
+ },
6247
+ "dist": {
6248
+ "type": "zip",
6249
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/c7eef3a60ccfdd8eafe07f81652e769ac9c7146c",
6250
+ "reference": "c7eef3a60ccfdd8eafe07f81652e769ac9c7146c",
6251
+ "shasum": ""
6252
+ },
6253
+ "require": {
6254
+ "php": ">=7.2.5",
6255
+ "symfony/deprecation-contracts": "^2.1",
6256
+ "symfony/polyfill-ctype": "~1.8",
6257
+ "symfony/polyfill-mbstring": "~1.0",
6258
+ "symfony/polyfill-php80": "^1.16"
6259
+ },
6260
+ "conflict": {
6261
+ "masterminds/html5": "<2.6"
6262
+ },
6263
+ "require-dev": {
6264
+ "masterminds/html5": "^2.6",
6265
+ "symfony/css-selector": "^4.4|^5.0"
6266
+ },
6267
+ "suggest": {
6268
+ "symfony/css-selector": ""
6269
+ },
6270
+ "type": "library",
6271
+ "autoload": {
6272
+ "psr-4": {
6273
+ "Symfony\\Component\\DomCrawler\\": ""
6274
+ },
6275
+ "exclude-from-classmap": [
6276
+ "/Tests/"
6277
+ ]
6278
+ },
6279
+ "notification-url": "https://packagist.org/downloads/",
6280
+ "license": [
6281
+ "MIT"
6282
+ ],
6283
+ "authors": [
6284
+ {
6285
+ "name": "Fabien Potencier",
6286
+ "email": "fabien@symfony.com"
6287
+ },
6288
+ {
6289
+ "name": "Symfony Community",
6290
+ "homepage": "https://symfony.com/contributors"
6291
+ }
6292
+ ],
6293
+ "description": "Eases DOM navigation for HTML and XML documents",
6294
+ "homepage": "https://symfony.com",
6295
+ "support": {
6296
+ "source": "https://github.com/symfony/dom-crawler/tree/v5.3.7"
6297
+ },
6298
+ "funding": [
6299
+ {
6300
+ "url": "https://symfony.com/sponsor",
6301
+ "type": "custom"
6302
+ },
6303
+ {
6304
+ "url": "https://github.com/fabpot",
6305
+ "type": "github"
6306
+ },
6307
+ {
6308
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
6309
+ "type": "tidelift"
6310
+ }
6311
+ ],
6312
+ "time": "2021-08-29T19:32:13+00:00"
6313
+ },
6314
+ {
6315
+ "name": "symfony/event-dispatcher",
6316
+ "version": "v5.3.7",
6317
+ "source": {
6318
+ "type": "git",
6319
+ "url": "https://github.com/symfony/event-dispatcher.git",
6320
+ "reference": "ce7b20d69c66a20939d8952b617506a44d102130"
6321
+ },
6322
+ "dist": {
6323
+ "type": "zip",
6324
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ce7b20d69c66a20939d8952b617506a44d102130",
6325
+ "reference": "ce7b20d69c66a20939d8952b617506a44d102130",
6326
+ "shasum": ""
6327
+ },
6328
+ "require": {
6329
+ "php": ">=7.2.5",
6330
+ "symfony/deprecation-contracts": "^2.1",
6331
+ "symfony/event-dispatcher-contracts": "^2",
6332
+ "symfony/polyfill-php80": "^1.16"
6333
+ },
6334
+ "conflict": {
6335
+ "symfony/dependency-injection": "<4.4"
6336
+ },
6337
+ "provide": {
6338
+ "psr/event-dispatcher-implementation": "1.0",
6339
+ "symfony/event-dispatcher-implementation": "2.0"
6340
+ },
6341
+ "require-dev": {
6342
+ "psr/log": "^1|^2|^3",
6343
+ "symfony/config": "^4.4|^5.0",
6344
+ "symfony/dependency-injection": "^4.4|^5.0",
6345
+ "symfony/error-handler": "^4.4|^5.0",
6346
+ "symfony/expression-language": "^4.4|^5.0",
6347
+ "symfony/http-foundation": "^4.4|^5.0",
6348
+ "symfony/service-contracts": "^1.1|^2",
6349
+ "symfony/stopwatch": "^4.4|^5.0"
6350
+ },
6351
+ "suggest": {
6352
+ "symfony/dependency-injection": "",
6353
+ "symfony/http-kernel": ""
6354
+ },
6355
+ "type": "library",
6356
+ "autoload": {
6357
+ "psr-4": {
6358
+ "Symfony\\Component\\EventDispatcher\\": ""
6359
+ },
6360
+ "exclude-from-classmap": [
6361
+ "/Tests/"
6362
+ ]
6363
+ },
6364
+ "notification-url": "https://packagist.org/downloads/",
6365
+ "license": [
6366
+ "MIT"
6367
+ ],
6368
+ "authors": [
6369
+ {
6370
+ "name": "Fabien Potencier",
6371
+ "email": "fabien@symfony.com"
6372
+ },
6373
+ {
6374
+ "name": "Symfony Community",
6375
+ "homepage": "https://symfony.com/contributors"
6376
+ }
6377
+ ],
6378
+ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
6379
+ "homepage": "https://symfony.com",
6380
+ "support": {
6381
+ "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.7"
6382
+ },
6383
+ "funding": [
6384
+ {
6385
+ "url": "https://symfony.com/sponsor",
6386
+ "type": "custom"
6387
+ },
6388
+ {
6389
+ "url": "https://github.com/fabpot",
6390
+ "type": "github"
6391
+ },
6392
+ {
6393
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
6394
+ "type": "tidelift"
6395
+ }
6396
+ ],
6397
+ "time": "2021-08-04T21:20:46+00:00"
6398
+ },
6399
+ {
6400
+ "name": "symfony/event-dispatcher-contracts",
6401
+ "version": "v2.4.0",
6402
+ "source": {
6403
+ "type": "git",
6404
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
6405
+ "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11"
6406
+ },
6407
+ "dist": {
6408
+ "type": "zip",
6409
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11",
6410
+ "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11",
6411
+ "shasum": ""
6412
+ },
6413
+ "require": {
6414
+ "php": ">=7.2.5",
6415
+ "psr/event-dispatcher": "^1"
6416
+ },
6417
+ "suggest": {
6418
+ "symfony/event-dispatcher-implementation": ""
6419
+ },
6420
+ "type": "library",
6421
+ "extra": {
6422
+ "branch-alias": {
6423
+ "dev-main": "2.4-dev"
6424
+ },
6425
+ "thanks": {
6426
+ "name": "symfony/contracts",
6427
+ "url": "https://github.com/symfony/contracts"
6428
+ }
6429
+ },
6430
+ "autoload": {
6431
+ "psr-4": {
6432
+ "Symfony\\Contracts\\EventDispatcher\\": ""
6433
+ }
6434
+ },
6435
+ "notification-url": "https://packagist.org/downloads/",
6436
+ "license": [
6437
+ "MIT"
6438
+ ],
6439
+ "authors": [
6440
+ {
6441
+ "name": "Nicolas Grekas",
6442
+ "email": "p@tchwork.com"
6443
+ },
6444
+ {
6445
+ "name": "Symfony Community",
6446
+ "homepage": "https://symfony.com/contributors"
6447
+ }
6448
+ ],
6449
+ "description": "Generic abstractions related to dispatching event",
6450
+ "homepage": "https://symfony.com",
6451
+ "keywords": [
6452
+ "abstractions",
6453
+ "contracts",
6454
+ "decoupling",
6455
+ "interfaces",
6456
+ "interoperability",
6457
+ "standards"
6458
+ ],
6459
+ "support": {
6460
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0"
6461
+ },
6462
+ "funding": [
6463
+ {
6464
+ "url": "https://symfony.com/sponsor",
6465
+ "type": "custom"
6466
+ },
6467
+ {
6468
+ "url": "https://github.com/fabpot",
6469
+ "type": "github"
6470
+ },
6471
+ {
6472
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
6473
+ "type": "tidelift"
6474
+ }
6475
+ ],
6476
+ "time": "2021-03-23T23:28:01+00:00"
6477
+ },
6478
+ {
6479
+ "name": "symfony/filesystem",
6480
+ "version": "v5.3.4",
6481
+ "source": {
6482
+ "type": "git",
6483
+ "url": "https://github.com/symfony/filesystem.git",
6484
+ "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32"
6485
+ },
6486
+ "dist": {
6487
+ "type": "zip",
6488
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32",
6489
+ "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32",
6490
+ "shasum": ""
6491
+ },
6492
+ "require": {
6493
+ "php": ">=7.2.5",
6494
+ "symfony/polyfill-ctype": "~1.8",
6495
+ "symfony/polyfill-php80": "^1.16"
6496
+ },
6497
+ "type": "library",
6498
+ "autoload": {
6499
+ "psr-4": {
6500
+ "Symfony\\Component\\Filesystem\\": ""
6501
+ },
6502
+ "exclude-from-classmap": [
6503
+ "/Tests/"
6504
+ ]
6505
+ },
6506
+ "notification-url": "https://packagist.org/downloads/",
6507
+ "license": [
6508
+ "MIT"
6509
+ ],
6510
+ "authors": [
6511
+ {
6512
+ "name": "Fabien Potencier",
6513
+ "email": "fabien@symfony.com"
6514
+ },
6515
+ {
6516
+ "name": "Symfony Community",
6517
+ "homepage": "https://symfony.com/contributors"
6518
+ }
6519
+ ],
6520
+ "description": "Provides basic utilities for the filesystem",
6521
+ "homepage": "https://symfony.com",
6522
+ "support": {
6523
+ "source": "https://github.com/symfony/filesystem/tree/v5.3.4"
6524
+ },
6525
+ "funding": [
6526
+ {
6527
+ "url": "https://symfony.com/sponsor",
6528
+ "type": "custom"
6529
+ },
6530
+ {
6531
+ "url": "https://github.com/fabpot",
6532
+ "type": "github"
6533
+ },
6534
+ {
6535
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
6536
+ "type": "tidelift"
6537
+ }
6538
+ ],
6539
+ "time": "2021-07-21T12:40:44+00:00"
6540
+ },
6541
+ {
6542
+ "name": "symfony/finder",
6543
+ "version": "v5.3.7",
6544
+ "source": {
6545
+ "type": "git",
6546
+ "url": "https://github.com/symfony/finder.git",
6547
+ "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93"
6548
+ },
6549
+ "dist": {
6550
+ "type": "zip",
6551
+ "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93",
6552
+ "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93",
6553
+ "shasum": ""
6554
+ },
6555
+ "require": {
6556
+ "php": ">=7.2.5",
6557
+ "symfony/polyfill-php80": "^1.16"
6558
+ },
6559
+ "type": "library",
6560
+ "autoload": {
6561
+ "psr-4": {
6562
+ "Symfony\\Component\\Finder\\": ""
6563
+ },
6564
+ "exclude-from-classmap": [
6565
+ "/Tests/"
6566
+ ]
6567
+ },
6568
+ "notification-url": "https://packagist.org/downloads/",
6569
+ "license": [
6570
+ "MIT"
6571
+ ],
6572
+ "authors": [
6573
+ {
6574
+ "name": "Fabien Potencier",
6575
+ "email": "fabien@symfony.com"
6576
+ },
6577
+ {
6578
+ "name": "Symfony Community",
6579
+ "homepage": "https://symfony.com/contributors"
6580
+ }
6581
+ ],
6582
+ "description": "Finds files and directories via an intuitive fluent interface",
6583
+ "homepage": "https://symfony.com",
6584
+ "support": {
6585
+ "source": "https://github.com/symfony/finder/tree/v5.3.7"
6586
+ },
6587
+ "funding": [
6588
+ {
6589
+ "url": "https://symfony.com/sponsor",
6590
+ "type": "custom"
6591
+ },
6592
+ {
6593
+ "url": "https://github.com/fabpot",
6594
+ "type": "github"
6595
+ },
6596
+ {
6597
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
6598
+ "type": "tidelift"
6599
+ }
6600
+ ],
6601
+ "time": "2021-08-04T21:20:46+00:00"
6602
+ },
6603
+ {
6604
+ "name": "symfony/polyfill-ctype",
6605
+ "version": "v1.23.0",
6606
+ "source": {
6607
+ "type": "git",
6608
+ "url": "https://github.com/symfony/polyfill-ctype.git",
6609
+ "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce"
6610
+ },
6611
+ "dist": {
6612
+ "type": "zip",
6613
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce",
6614
+ "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce",
6615
+ "shasum": ""
6616
+ },
6617
+ "require": {
6618
+ "php": ">=7.1"
6619
+ },
6620
+ "suggest": {
6621
+ "ext-ctype": "For best performance"
6622
+ },
6623
+ "type": "library",
6624
+ "extra": {
6625
+ "branch-alias": {
6626
+ "dev-main": "1.23-dev"
6627
+ },
6628
+ "thanks": {
6629
+ "name": "symfony/polyfill",
6630
+ "url": "https://github.com/symfony/polyfill"
6631
+ }
6632
+ },
6633
+ "autoload": {
6634
+ "psr-4": {
6635
+ "Symfony\\Polyfill\\Ctype\\": ""
6636
+ },
6637
+ "files": [
6638
+ "bootstrap.php"
6639
+ ]
6640
+ },
6641
+ "notification-url": "https://packagist.org/downloads/",
6642
+ "license": [
6643
+ "MIT"
6644
+ ],
6645
+ "authors": [
6646
+ {
6647
+ "name": "Gert de Pagter",
6648
+ "email": "BackEndTea@gmail.com"
6649
+ },
6650
+ {
6651
+ "name": "Symfony Community",
6652
+ "homepage": "https://symfony.com/contributors"
6653
+ }
6654
+ ],
6655
+ "description": "Symfony polyfill for ctype functions",
6656
+ "homepage": "https://symfony.com",
6657
+ "keywords": [
6658
+ "compatibility",
6659
+ "ctype",
6660
+ "polyfill",
6661
+ "portable"
6662
+ ],
6663
+ "support": {
6664
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0"
6665
+ },
6666
+ "funding": [
6667
+ {
6668
+ "url": "https://symfony.com/sponsor",
6669
+ "type": "custom"
6670
+ },
6671
+ {
6672
+ "url": "https://github.com/fabpot",
6673
+ "type": "github"
6674
+ },
6675
+ {
6676
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
6677
+ "type": "tidelift"
6678
+ }
6679
+ ],
6680
+ "time": "2021-02-19T12:13:01+00:00"
6681
+ },
6682
+ {
6683
+ "name": "symfony/polyfill-intl-grapheme",
6684
+ "version": "v1.23.1",
6685
+ "source": {
6686
+ "type": "git",
6687
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
6688
+ "reference": "16880ba9c5ebe3642d1995ab866db29270b36535"
6689
+ },
6690
+ "dist": {
6691
+ "type": "zip",
6692
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535",
6693
+ "reference": "16880ba9c5ebe3642d1995ab866db29270b36535",
6694
+ "shasum": ""
6695
+ },
6696
+ "require": {
6697
+ "php": ">=7.1"
6698
+ },
6699
+ "suggest": {
6700
+ "ext-intl": "For best performance"
6701
  },
6702
  "type": "library",
6703
+ "extra": {
6704
+ "branch-alias": {
6705
+ "dev-main": "1.23-dev"
6706
+ },
6707
+ "thanks": {
6708
+ "name": "symfony/polyfill",
6709
+ "url": "https://github.com/symfony/polyfill"
6710
+ }
6711
+ },
6712
  "autoload": {
6713
  "psr-4": {
6714
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
6715
  },
6716
+ "files": [
6717
+ "bootstrap.php"
6718
  ]
6719
  },
6720
  "notification-url": "https://packagist.org/downloads/",
6723
  ],
6724
  "authors": [
6725
  {
6726
+ "name": "Nicolas Grekas",
6727
+ "email": "p@tchwork.com"
6728
  },
6729
  {
6730
  "name": "Symfony Community",
6731
  "homepage": "https://symfony.com/contributors"
6732
  }
6733
  ],
6734
+ "description": "Symfony polyfill for intl's grapheme_* functions",
6735
  "homepage": "https://symfony.com",
6736
+ "keywords": [
6737
+ "compatibility",
6738
+ "grapheme",
6739
+ "intl",
6740
+ "polyfill",
6741
+ "portable",
6742
+ "shim"
6743
+ ],
6744
  "support": {
6745
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1"
6746
  },
6747
  "funding": [
6748
  {
6758
  "type": "tidelift"
6759
  }
6760
  ],
6761
+ "time": "2021-05-27T12:26:48+00:00"
6762
  },
6763
  {
6764
+ "name": "symfony/polyfill-intl-normalizer",
6765
+ "version": "v1.23.0",
6766
  "source": {
6767
  "type": "git",
6768
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
6769
+ "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8"
6770
  },
6771
  "dist": {
6772
  "type": "zip",
6773
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8",
6774
+ "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8",
6775
  "shasum": ""
6776
  },
6777
  "require": {
6778
  "php": ">=7.1"
6779
  },
6780
+ "suggest": {
6781
+ "ext-intl": "For best performance"
6782
+ },
6783
  "type": "library",
6784
  "extra": {
6785
  "branch-alias": {
6786
+ "dev-main": "1.23-dev"
6787
  },
6788
  "thanks": {
6789
+ "name": "symfony/polyfill",
6790
+ "url": "https://github.com/symfony/polyfill"
6791
  }
6792
  },
6793
  "autoload": {
6794
+ "psr-4": {
6795
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
6796
+ },
6797
  "files": [
6798
+ "bootstrap.php"
6799
+ ],
6800
+ "classmap": [
6801
+ "Resources/stubs"
6802
  ]
6803
  },
6804
  "notification-url": "https://packagist.org/downloads/",
6815
  "homepage": "https://symfony.com/contributors"
6816
  }
6817
  ],
6818
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
6819
  "homepage": "https://symfony.com",
6820
+ "keywords": [
6821
+ "compatibility",
6822
+ "intl",
6823
+ "normalizer",
6824
+ "polyfill",
6825
+ "portable",
6826
+ "shim"
6827
+ ],
6828
  "support": {
6829
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0"
6830
  },
6831
  "funding": [
6832
  {
6842
  "type": "tidelift"
6843
  }
6844
  ],
6845
+ "time": "2021-02-19T12:13:01+00:00"
6846
  },
6847
  {
6848
+ "name": "symfony/polyfill-mbstring",
6849
+ "version": "v1.23.1",
6850
  "source": {
6851
  "type": "git",
6852
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
6853
+ "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6"
6854
  },
6855
  "dist": {
6856
  "type": "zip",
6857
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6",
6858
+ "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6",
6859
+ "shasum": ""
6860
+ },
6861
+ "require": {
6862
+ "php": ">=7.1"
6863
+ },
6864
+ "suggest": {
6865
+ "ext-mbstring": "For best performance"
6866
+ },
6867
+ "type": "library",
6868
+ "extra": {
6869
+ "branch-alias": {
6870
+ "dev-main": "1.23-dev"
6871
+ },
6872
+ "thanks": {
6873
+ "name": "symfony/polyfill",
6874
+ "url": "https://github.com/symfony/polyfill"
6875
+ }
6876
+ },
6877
+ "autoload": {
6878
+ "psr-4": {
6879
+ "Symfony\\Polyfill\\Mbstring\\": ""
6880
+ },
6881
+ "files": [
6882
+ "bootstrap.php"
6883
+ ]
6884
+ },
6885
+ "notification-url": "https://packagist.org/downloads/",
6886
+ "license": [
6887
+ "MIT"
6888
+ ],
6889
+ "authors": [
6890
+ {
6891
+ "name": "Nicolas Grekas",
6892
+ "email": "p@tchwork.com"
6893
+ },
6894
+ {
6895
+ "name": "Symfony Community",
6896
+ "homepage": "https://symfony.com/contributors"
6897
+ }
6898
+ ],
6899
+ "description": "Symfony polyfill for the Mbstring extension",
6900
+ "homepage": "https://symfony.com",
6901
+ "keywords": [
6902
+ "compatibility",
6903
+ "mbstring",
6904
+ "polyfill",
6905
+ "portable",
6906
+ "shim"
6907
+ ],
6908
+ "support": {
6909
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1"
6910
+ },
6911
+ "funding": [
6912
+ {
6913
+ "url": "https://symfony.com/sponsor",
6914
+ "type": "custom"
6915
+ },
6916
+ {
6917
+ "url": "https://github.com/fabpot",
6918
+ "type": "github"
6919
+ },
6920
+ {
6921
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
6922
+ "type": "tidelift"
6923
+ }
6924
+ ],
6925
+ "time": "2021-05-27T12:26:48+00:00"
6926
+ },
6927
+ {
6928
+ "name": "symfony/polyfill-php73",
6929
+ "version": "v1.23.0",
6930
+ "source": {
6931
+ "type": "git",
6932
+ "url": "https://github.com/symfony/polyfill-php73.git",
6933
+ "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010"
6934
+ },
6935
+ "dist": {
6936
+ "type": "zip",
6937
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010",
6938
+ "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010",
6939
+ "shasum": ""
6940
+ },
6941
+ "require": {
6942
+ "php": ">=7.1"
6943
+ },
6944
+ "type": "library",
6945
+ "extra": {
6946
+ "branch-alias": {
6947
+ "dev-main": "1.23-dev"
6948
+ },
6949
+ "thanks": {
6950
+ "name": "symfony/polyfill",
6951
+ "url": "https://github.com/symfony/polyfill"
6952
+ }
6953
+ },
6954
+ "autoload": {
6955
+ "psr-4": {
6956
+ "Symfony\\Polyfill\\Php73\\": ""
6957
+ },
6958
+ "files": [
6959
+ "bootstrap.php"
6960
+ ],
6961
+ "classmap": [
6962
+ "Resources/stubs"
6963
+ ]
6964
+ },
6965
+ "notification-url": "https://packagist.org/downloads/",
6966
+ "license": [
6967
+ "MIT"
6968
+ ],
6969
+ "authors": [
6970
+ {
6971
+ "name": "Nicolas Grekas",
6972
+ "email": "p@tchwork.com"
6973
+ },
6974
+ {
6975
+ "name": "Symfony Community",
6976
+ "homepage": "https://symfony.com/contributors"
6977
+ }
6978
+ ],
6979
+ "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
6980
+ "homepage": "https://symfony.com",
6981
+ "keywords": [
6982
+ "compatibility",
6983
+ "polyfill",
6984
+ "portable",
6985
+ "shim"
6986
+ ],
6987
+ "support": {
6988
+ "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0"
6989
+ },
6990
+ "funding": [
6991
+ {
6992
+ "url": "https://symfony.com/sponsor",
6993
+ "type": "custom"
6994
+ },
6995
+ {
6996
+ "url": "https://github.com/fabpot",
6997
+ "type": "github"
6998
+ },
6999
+ {
7000
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
7001
+ "type": "tidelift"
7002
+ }
7003
+ ],
7004
+ "time": "2021-02-19T12:13:01+00:00"
7005
+ },
7006
+ {
7007
+ "name": "symfony/polyfill-php80",
7008
+ "version": "v1.23.1",
7009
+ "source": {
7010
+ "type": "git",
7011
+ "url": "https://github.com/symfony/polyfill-php80.git",
7012
+ "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be"
7013
+ },
7014
+ "dist": {
7015
+ "type": "zip",
7016
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be",
7017
+ "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be",
7018
  "shasum": ""
7019
  },
7020
  "require": {
7021
+ "php": ">=7.1"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7022
  },
7023
  "type": "library",
7024
+ "extra": {
7025
+ "branch-alias": {
7026
+ "dev-main": "1.23-dev"
7027
+ },
7028
+ "thanks": {
7029
+ "name": "symfony/polyfill",
7030
+ "url": "https://github.com/symfony/polyfill"
7031
+ }
7032
+ },
7033
  "autoload": {
7034
  "psr-4": {
7035
+ "Symfony\\Polyfill\\Php80\\": ""
7036
  },
7037
+ "files": [
7038
+ "bootstrap.php"
7039
+ ],
7040
+ "classmap": [
7041
+ "Resources/stubs"
7042
  ]
7043
  },
7044
  "notification-url": "https://packagist.org/downloads/",
7047
  ],
7048
  "authors": [
7049
  {
7050
+ "name": "Ion Bazan",
7051
+ "email": "ion.bazan@gmail.com"
7052
+ },
7053
+ {
7054
+ "name": "Nicolas Grekas",
7055
+ "email": "p@tchwork.com"
7056
  },
7057
  {
7058
  "name": "Symfony Community",
7059
  "homepage": "https://symfony.com/contributors"
7060
  }
7061
  ],
7062
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
7063
  "homepage": "https://symfony.com",
7064
+ "keywords": [
7065
+ "compatibility",
7066
+ "polyfill",
7067
+ "portable",
7068
+ "shim"
7069
+ ],
7070
  "support": {
7071
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1"
7072
  },
7073
  "funding": [
7074
  {
7084
  "type": "tidelift"
7085
  }
7086
  ],
7087
+ "time": "2021-07-28T13:41:28+00:00"
7088
  },
7089
  {
7090
+ "name": "symfony/polyfill-php81",
7091
+ "version": "v1.23.0",
7092
  "source": {
7093
  "type": "git",
7094
+ "url": "https://github.com/symfony/polyfill-php81.git",
7095
+ "reference": "e66119f3de95efc359483f810c4c3e6436279436"
7096
  },
7097
  "dist": {
7098
  "type": "zip",
7099
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436",
7100
+ "reference": "e66119f3de95efc359483f810c4c3e6436279436",
7101
  "shasum": ""
7102
  },
7103
  "require": {
7104
+ "php": ">=7.1"
 
 
 
 
7105
  },
7106
  "type": "library",
7107
  "extra": {
7108
  "branch-alias": {
7109
+ "dev-main": "1.23-dev"
7110
  },
7111
  "thanks": {
7112
+ "name": "symfony/polyfill",
7113
+ "url": "https://github.com/symfony/polyfill"
7114
  }
7115
  },
7116
  "autoload": {
7117
  "psr-4": {
7118
+ "Symfony\\Polyfill\\Php81\\": ""
7119
+ },
7120
+ "files": [
7121
+ "bootstrap.php"
7122
+ ],
7123
+ "classmap": [
7124
+ "Resources/stubs"
7125
+ ]
7126
  },
7127
  "notification-url": "https://packagist.org/downloads/",
7128
  "license": [
7138
  "homepage": "https://symfony.com/contributors"
7139
  }
7140
  ],
7141
+ "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
7142
  "homepage": "https://symfony.com",
7143
  "keywords": [
7144
+ "compatibility",
7145
+ "polyfill",
7146
+ "portable",
7147
+ "shim"
 
 
7148
  ],
7149
  "support": {
7150
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0"
7151
  },
7152
  "funding": [
7153
  {
7163
  "type": "tidelift"
7164
  }
7165
  ],
7166
+ "time": "2021-05-21T13:25:03+00:00"
7167
  },
7168
  {
7169
+ "name": "symfony/process",
7170
+ "version": "v5.3.7",
7171
  "source": {
7172
  "type": "git",
7173
+ "url": "https://github.com/symfony/process.git",
7174
+ "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967"
7175
  },
7176
  "dist": {
7177
  "type": "zip",
7178
+ "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967",
7179
+ "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967",
7180
  "shasum": ""
7181
  },
7182
  "require": {
7183
  "php": ">=7.2.5",
 
7184
  "symfony/polyfill-php80": "^1.16"
7185
  },
7186
  "type": "library",
7187
  "autoload": {
7188
  "psr-4": {
7189
+ "Symfony\\Component\\Process\\": ""
7190
  },
7191
  "exclude-from-classmap": [
7192
  "/Tests/"
7206
  "homepage": "https://symfony.com/contributors"
7207
  }
7208
  ],
7209
+ "description": "Executes commands in sub-processes",
7210
  "homepage": "https://symfony.com",
7211
  "support": {
7212
+ "source": "https://github.com/symfony/process/tree/v5.3.7"
7213
  },
7214
  "funding": [
7215
  {
7225
  "type": "tidelift"
7226
  }
7227
  ],
7228
+ "time": "2021-08-04T21:20:46+00:00"
7229
  },
7230
  {
7231
+ "name": "symfony/service-contracts",
7232
+ "version": "v2.4.0",
7233
  "source": {
7234
  "type": "git",
7235
+ "url": "https://github.com/symfony/service-contracts.git",
7236
+ "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb"
7237
  },
7238
  "dist": {
7239
  "type": "zip",
7240
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb",
7241
+ "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb",
7242
  "shasum": ""
7243
  },
7244
  "require": {
7245
  "php": ">=7.2.5",
7246
+ "psr/container": "^1.1"
7247
+ },
7248
+ "suggest": {
7249
+ "symfony/service-implementation": ""
7250
  },
7251
  "type": "library",
7252
+ "extra": {
7253
+ "branch-alias": {
7254
+ "dev-main": "2.4-dev"
7255
+ },
7256
+ "thanks": {
7257
+ "name": "symfony/contracts",
7258
+ "url": "https://github.com/symfony/contracts"
7259
+ }
7260
+ },
7261
  "autoload": {
7262
  "psr-4": {
7263
+ "Symfony\\Contracts\\Service\\": ""
7264
+ }
 
 
 
7265
  },
7266
  "notification-url": "https://packagist.org/downloads/",
7267
  "license": [
7269
  ],
7270
  "authors": [
7271
  {
7272
+ "name": "Nicolas Grekas",
7273
+ "email": "p@tchwork.com"
7274
  },
7275
  {
7276
  "name": "Symfony Community",
7277
  "homepage": "https://symfony.com/contributors"
7278
  }
7279
  ],
7280
+ "description": "Generic abstractions related to writing services",
7281
  "homepage": "https://symfony.com",
7282
+ "keywords": [
7283
+ "abstractions",
7284
+ "contracts",
7285
+ "decoupling",
7286
+ "interfaces",
7287
+ "interoperability",
7288
+ "standards"
7289
+ ],
7290
  "support": {
7291
+ "source": "https://github.com/symfony/service-contracts/tree/v2.4.0"
7292
  },
7293
  "funding": [
7294
  {
7304
  "type": "tidelift"
7305
  }
7306
  ],
7307
+ "time": "2021-04-01T10:43:52+00:00"
7308
  },
7309
  {
7310
+ "name": "symfony/string",
7311
+ "version": "v5.3.7",
7312
  "source": {
7313
  "type": "git",
7314
+ "url": "https://github.com/symfony/string.git",
7315
+ "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5"
7316
  },
7317
  "dist": {
7318
  "type": "zip",
7319
+ "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5",
7320
+ "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5",
7321
  "shasum": ""
7322
  },
7323
  "require": {
7324
+ "php": ">=7.2.5",
7325
+ "symfony/polyfill-ctype": "~1.8",
7326
+ "symfony/polyfill-intl-grapheme": "~1.0",
7327
+ "symfony/polyfill-intl-normalizer": "~1.0",
7328
+ "symfony/polyfill-mbstring": "~1.0",
7329
+ "symfony/polyfill-php80": "~1.15"
7330
  },
7331
+ "require-dev": {
7332
+ "symfony/error-handler": "^4.4|^5.0",
7333
+ "symfony/http-client": "^4.4|^5.0",
7334
+ "symfony/translation-contracts": "^1.1|^2",
7335
+ "symfony/var-exporter": "^4.4|^5.0"
7336
  },
7337
  "type": "library",
 
 
 
 
 
 
 
 
 
7338
  "autoload": {
7339
  "psr-4": {
7340
+ "Symfony\\Component\\String\\": ""
7341
  },
7342
  "files": [
7343
+ "Resources/functions.php"
7344
+ ],
7345
+ "exclude-from-classmap": [
7346
+ "/Tests/"
7347
  ]
7348
  },
7349
  "notification-url": "https://packagist.org/downloads/",
7352
  ],
7353
  "authors": [
7354
  {
7355
+ "name": "Nicolas Grekas",
7356
+ "email": "p@tchwork.com"
7357
  },
7358
  {
7359
  "name": "Symfony Community",
7360
  "homepage": "https://symfony.com/contributors"
7361
  }
7362
  ],
7363
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
7364
  "homepage": "https://symfony.com",
7365
  "keywords": [
7366
+ "grapheme",
7367
+ "i18n",
7368
+ "string",
7369
+ "unicode",
7370
+ "utf-8",
7371
+ "utf8"
7372
  ],
7373
  "support": {
7374
+ "source": "https://github.com/symfony/string/tree/v5.3.7"
7375
  },
7376
  "funding": [
7377
  {
7387
  "type": "tidelift"
7388
  }
7389
  ],
7390
+ "time": "2021-08-26T08:00:08+00:00"
7391
  },
7392
  {
7393
+ "name": "symfony/translation",
7394
+ "version": "v5.3.9",
7395
  "source": {
7396
  "type": "git",
7397
+ "url": "https://github.com/symfony/translation.git",
7398
+ "reference": "6e69f3551c1a3356cf6ea8d019bf039a0f8b6886"
7399
  },
7400
  "dist": {
7401
  "type": "zip",
7402
+ "url": "https://api.github.com/repos/symfony/translation/zipball/6e69f3551c1a3356cf6ea8d019bf039a0f8b6886",
7403
+ "reference": "6e69f3551c1a3356cf6ea8d019bf039a0f8b6886",
7404
  "shasum": ""
7405
  },
7406
+ "require": {
7407
+ "php": ">=7.2.5",
7408
+ "symfony/deprecation-contracts": "^2.1",
7409
+ "symfony/polyfill-mbstring": "~1.0",
7410
+ "symfony/polyfill-php80": "^1.16",
7411
+ "symfony/translation-contracts": "^2.3"
7412
+ },
7413
+ "conflict": {
7414
+ "symfony/config": "<4.4",
7415
+ "symfony/dependency-injection": "<5.0",
7416
+ "symfony/http-kernel": "<5.0",
7417
+ "symfony/twig-bundle": "<5.0",
7418
+ "symfony/yaml": "<4.4"
7419
+ },
7420
+ "provide": {
7421
+ "symfony/translation-implementation": "2.3"
7422
+ },
7423
+ "require-dev": {
7424
+ "psr/log": "^1|^2|^3",
7425
+ "symfony/config": "^4.4|^5.0",
7426
+ "symfony/console": "^4.4|^5.0",
7427
+ "symfony/dependency-injection": "^5.0",
7428
+ "symfony/finder": "^4.4|^5.0",
7429
+ "symfony/http-kernel": "^5.0",
7430
+ "symfony/intl": "^4.4|^5.0",
7431
+ "symfony/polyfill-intl-icu": "^1.21",
7432
+ "symfony/service-contracts": "^1.1.2|^2",
7433
+ "symfony/yaml": "^4.4|^5.0"
7434
  },
7435
  "suggest": {
7436
+ "psr/log-implementation": "To use logging capability in translator",
7437
+ "symfony/config": "",
7438
+ "symfony/yaml": ""
7439
  },
7440
  "type": "library",
 
 
 
 
 
 
 
 
 
7441
  "autoload": {
7442
+ "files": [
7443
+ "Resources/functions.php"
7444
+ ],
7445
  "psr-4": {
7446
+ "Symfony\\Component\\Translation\\": ""
7447
  },
7448
+ "exclude-from-classmap": [
7449
+ "/Tests/"
7450
  ]
7451
  },
7452
  "notification-url": "https://packagist.org/downloads/",
7455
  ],
7456
  "authors": [
7457
  {
7458
+ "name": "Fabien Potencier",
7459
+ "email": "fabien@symfony.com"
7460
  },
7461
  {
7462
  "name": "Symfony Community",
7463
  "homepage": "https://symfony.com/contributors"
7464
  }
7465
  ],
7466
+ "description": "Provides tools to internationalize your application",
7467
  "homepage": "https://symfony.com",
 
 
 
 
 
 
 
 
7468
  "support": {
7469
+ "source": "https://github.com/symfony/translation/tree/v5.3.9"
7470
  },
7471
  "funding": [
7472
  {
7482
  "type": "tidelift"
7483
  }
7484
  ],
7485
+ "time": "2021-08-26T08:22:53+00:00"
7486
  },
7487
  {
7488
+ "name": "symfony/translation-contracts",
7489
+ "version": "v2.4.0",
7490
  "source": {
7491
  "type": "git",
7492
+ "url": "https://github.com/symfony/translation-contracts.git",
7493
+ "reference": "95c812666f3e91db75385749fe219c5e494c7f95"
7494
  },
7495
  "dist": {
7496
  "type": "zip",
7497
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95",
7498
+ "reference": "95c812666f3e91db75385749fe219c5e494c7f95",
7499
  "shasum": ""
7500
  },
7501
  "require": {
7502
+ "php": ">=7.2.5"
7503
  },
7504
  "suggest": {
7505
+ "symfony/translation-implementation": ""
7506
  },
7507
  "type": "library",
7508
  "extra": {
7509
  "branch-alias": {
7510
+ "dev-main": "2.4-dev"
7511
  },
7512
  "thanks": {
7513
+ "name": "symfony/contracts",
7514
+ "url": "https://github.com/symfony/contracts"
7515
  }
7516
  },
7517
  "autoload": {
7518
  "psr-4": {
7519
+ "Symfony\\Contracts\\Translation\\": ""
7520
+ }
 
 
 
 
 
 
7521
  },
7522
  "notification-url": "https://packagist.org/downloads/",
7523
  "license": [
7533
  "homepage": "https://symfony.com/contributors"
7534
  }
7535
  ],
7536
+ "description": "Generic abstractions related to translation",
7537
  "homepage": "https://symfony.com",
7538
  "keywords": [
7539
+ "abstractions",
7540
+ "contracts",
7541
+ "decoupling",
7542
+ "interfaces",
7543
+ "interoperability",
7544
+ "standards"
7545
  ],
7546
  "support": {
7547
+ "source": "https://github.com/symfony/translation-contracts/tree/v2.4.0"
7548
  },
7549
  "funding": [
7550
  {
7560
  "type": "tidelift"
7561
  }
7562
  ],
7563
+ "time": "2021-03-23T23:28:01+00:00"
7564
  },
7565
  {
7566
+ "name": "symfony/yaml",
7567
+ "version": "v5.3.6",
7568
  "source": {
7569
  "type": "git",
7570
+ "url": "https://github.com/symfony/yaml.git",
7571
+ "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7"
7572
  },
7573
  "dist": {
7574
  "type": "zip",
7575
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7",
7576
+ "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7",
7577
  "shasum": ""
7578
  },
7579
  "require": {
7580
+ "php": ">=7.2.5",
7581
+ "symfony/deprecation-contracts": "^2.1",
7582
+ "symfony/polyfill-ctype": "~1.8"
7583
+ },
7584
+ "conflict": {
7585
+ "symfony/console": "<4.4"
7586
+ },
7587
+ "require-dev": {
7588
+ "symfony/console": "^4.4|^5.0"
7589
  },
7590
  "suggest": {
7591
+ "symfony/console": "For validating YAML files using the lint command"
7592
  },
7593
+ "bin": [
7594
+ "Resources/bin/yaml-lint"
7595
+ ],
7596
  "type": "library",
 
 
 
 
 
 
 
 
 
7597
  "autoload": {
7598
  "psr-4": {
7599
+ "Symfony\\Component\\Yaml\\": ""
7600
  },
7601
+ "exclude-from-classmap": [
7602
+ "/Tests/"
7603
  ]
7604
  },
7605
  "notification-url": "https://packagist.org/downloads/",
7608
  ],
7609
  "authors": [
7610
  {
7611
+ "name": "Fabien Potencier",
7612
+ "email": "fabien@symfony.com"
7613
  },
7614
  {
7615
  "name": "Symfony Community",
7616
  "homepage": "https://symfony.com/contributors"
7617
  }
7618
  ],
7619
+ "description": "Loads and dumps YAML files",
7620
  "homepage": "https://symfony.com",
 
 
 
 
 
 
 
7621
  "support": {
7622
+ "source": "https://github.com/symfony/yaml/tree/v5.3.6"
7623
  },
7624
  "funding": [
7625
  {
7635
  "type": "tidelift"
7636
  }
7637
  ],
7638
+ "time": "2021-07-29T06:20:01+00:00"
7639
  },
7640
  {
7641
+ "name": "theseer/fdomdocument",
7642
+ "version": "1.6.6",
7643
  "source": {
7644
  "type": "git",
7645
+ "url": "https://github.com/theseer/fDOMDocument.git",
7646
+ "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca"
7647
  },
7648
  "dist": {
7649
  "type": "zip",
7650
+ "url": "https://api.github.com/repos/theseer/fDOMDocument/zipball/6e8203e40a32a9c770bcb62fe37e68b948da6dca",
7651
+ "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca",
7652
  "shasum": ""
7653
  },
7654
  "require": {
7655
+ "ext-dom": "*",
7656
+ "lib-libxml": "*",
7657
+ "php": ">=5.3.3"
7658
  },
7659
  "type": "library",
7660
+ "autoload": {
7661
+ "classmap": [
7662
+ "src/"
7663
+ ]
7664
+ },
7665
+ "notification-url": "https://packagist.org/downloads/",
7666
+ "license": [
7667
+ "BSD-3-Clause"
7668
+ ],
7669
+ "authors": [
7670
+ {
7671
+ "name": "Arne Blankerts",
7672
+ "email": "arne@blankerts.de",
7673
+ "role": "lead"
7674
  }
7675
+ ],
7676
+ "description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.",
7677
+ "homepage": "https://github.com/theseer/fDOMDocument",
7678
+ "support": {
7679
+ "issues": "https://github.com/theseer/fDOMDocument/issues",
7680
+ "source": "https://github.com/theseer/fDOMDocument/tree/master"
7681
+ },
7682
+ "time": "2017-06-30T11:53:12+00:00"
7683
+ },
7684
+ {
7685
+ "name": "theseer/tokenizer",
7686
+ "version": "1.2.1",
7687
+ "source": {
7688
+ "type": "git",
7689
+ "url": "https://github.com/theseer/tokenizer.git",
7690
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
7691
+ },
7692
+ "dist": {
7693
+ "type": "zip",
7694
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
7695
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
7696
+ "shasum": ""
7697
+ },
7698
+ "require": {
7699
+ "ext-dom": "*",
7700
+ "ext-tokenizer": "*",
7701
+ "ext-xmlwriter": "*",
7702
+ "php": "^7.2 || ^8.0"
7703
  },
7704
+ "type": "library",
7705
  "autoload": {
 
 
 
 
 
 
7706
  "classmap": [
7707
+ "src/"
7708
  ]
7709
  },
7710
  "notification-url": "https://packagist.org/downloads/",
7711
  "license": [
7712
+ "BSD-3-Clause"
7713
  ],
7714
  "authors": [
7715
  {
7716
+ "name": "Arne Blankerts",
7717
+ "email": "arne@blankerts.de",
7718
+ "role": "Developer"
 
 
 
7719
  }
7720
  ],
7721
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
 
 
 
 
 
 
 
7722
  "support": {
7723
+ "issues": "https://github.com/theseer/tokenizer/issues",
7724
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
7725
  },
7726
  "funding": [
7727
  {
7728
+ "url": "https://github.com/theseer",
 
 
 
 
7729
  "type": "github"
 
 
 
 
7730
  }
7731
  ],
7732
+ "time": "2021-07-28T10:34:58+00:00"
7733
  },
7734
  {
7735
+ "name": "voku/portable-ascii",
7736
+ "version": "1.5.6",
7737
  "source": {
7738
  "type": "git",
7739
+ "url": "https://github.com/voku/portable-ascii.git",
7740
+ "reference": "80953678b19901e5165c56752d087fc11526017c"
7741
  },
7742
  "dist": {
7743
  "type": "zip",
7744
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c",
7745
+ "reference": "80953678b19901e5165c56752d087fc11526017c",
7746
  "shasum": ""
7747
  },
7748
  "require": {
7749
+ "php": ">=7.0.0"
7750
  },
7751
+ "require-dev": {
7752
+ "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
7753
+ },
7754
+ "suggest": {
7755
+ "ext-intl": "Use Intl for transliterator_transliterate() support"
 
 
 
 
7756
  },
7757
+ "type": "library",
7758
  "autoload": {
7759
  "psr-4": {
7760
+ "voku\\": "src/voku/"
7761
+ }
 
 
 
 
 
 
7762
  },
7763
  "notification-url": "https://packagist.org/downloads/",
7764
  "license": [
7766
  ],
7767
  "authors": [
7768
  {
7769
+ "name": "Lars Moelleken",
7770
+ "homepage": "http://www.moelleken.org/"
 
 
 
 
 
 
 
 
7771
  }
7772
  ],
7773
+ "description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
7774
+ "homepage": "https://github.com/voku/portable-ascii",
7775
  "keywords": [
7776
+ "ascii",
7777
+ "clean",
7778
+ "php"
 
7779
  ],
7780
  "support": {
7781
+ "issues": "https://github.com/voku/portable-ascii/issues",
7782
+ "source": "https://github.com/voku/portable-ascii/tree/1.5.6"
7783
  },
7784
  "funding": [
7785
  {
7786
+ "url": "https://www.paypal.me/moelleken",
7787
  "type": "custom"
7788
  },
7789
  {
7790
+ "url": "https://github.com/voku",
7791
+ "type": "github"
7792
+ },
7793
+ {
7794
+ "url": "https://opencollective.com/portable-ascii",
7795
+ "type": "open_collective"
7796
+ },
7797
+ {
7798
+ "url": "https://www.patreon.com/voku",
7799
+ "type": "patreon"
7800
  },
7801
  {
7802
+ "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii",
7803
  "type": "tidelift"
7804
  }
7805
  ],
7806
+ "time": "2020-11-12T00:07:28+00:00"
7807
  },
7808
  {
7809
+ "name": "vria/nodiacritic",
7810
+ "version": "0.1.2",
7811
  "source": {
7812
  "type": "git",
7813
+ "url": "https://github.com/vria/nodiacritic.git",
7814
+ "reference": "3efeb60fb2586fe3ce8ff0f3c122d380717b8b07"
7815
  },
7816
  "dist": {
7817
  "type": "zip",
7818
+ "url": "https://api.github.com/repos/vria/nodiacritic/zipball/3efeb60fb2586fe3ce8ff0f3c122d380717b8b07",
7819
+ "reference": "3efeb60fb2586fe3ce8ff0f3c122d380717b8b07",
7820
  "shasum": ""
7821
  },
7822
  "require": {
7823
+ "php": ">=5.3.3"
7824
+ },
7825
+ "require-dev": {
7826
+ "phpunit/phpunit": "4.8.*"
7827
  },
7828
  "type": "library",
7829
  "autoload": {
7830
  "psr-4": {
7831
+ "VRia\\Utils\\": "src/"
7832
+ }
 
 
 
7833
  },
7834
  "notification-url": "https://packagist.org/downloads/",
7835
  "license": [
7836
+ "GPL-2.0"
7837
  ],
7838
  "authors": [
7839
  {
7840
+ "name": "Riabchenko Vlad",
7841
+ "email": "contact@vria.eu",
7842
+ "homepage": "http://vria.eu"
 
 
 
7843
  }
7844
  ],
7845
+ "description": "Tiny helper function that removes all diacritical signs from characters",
7846
+ "homepage": "https://github.com/vria/nodiacritic",
7847
+ "keywords": [
7848
+ "accent",
7849
+ "diacritic",
7850
+ "filter",
7851
+ "string",
7852
+ "text"
7853
+ ],
7854
  "support": {
7855
+ "email": "contact@vria.eu",
7856
+ "issues": "https://github.com/vria/nodiacritic/issues",
7857
+ "source": "https://github.com/vria/nodiacritic/tree/0.1.2"
7858
  },
7859
+ "time": "2016-09-17T22:03:11+00:00"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7860
  },
7861
  {
7862
+ "name": "webmozart/assert",
7863
+ "version": "1.10.0",
7864
  "source": {
7865
  "type": "git",
7866
+ "url": "https://github.com/webmozarts/assert.git",
7867
+ "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
7868
  },
7869
  "dist": {
7870
  "type": "zip",
7871
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
7872
+ "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
7873
  "shasum": ""
7874
  },
7875
  "require": {
7876
+ "php": "^7.2 || ^8.0",
7877
+ "symfony/polyfill-ctype": "^1.8"
7878
  },
7879
+ "conflict": {
7880
+ "phpstan/phpstan": "<0.12.20",
7881
+ "vimeo/psalm": "<4.6.1 || 4.6.2"
7882
+ },
7883
+ "require-dev": {
7884
+ "phpunit/phpunit": "^8.5.13"
7885
  },
7886
  "type": "library",
7887
  "extra": {
7888
  "branch-alias": {
7889
+ "dev-master": "1.10-dev"
 
 
 
 
7890
  }
7891
  },
7892
  "autoload": {
7893
  "psr-4": {
7894
+ "Webmozart\\Assert\\": "src/"
7895
  }
7896
  },
7897
  "notification-url": "https://packagist.org/downloads/",
7900
  ],
7901
  "authors": [
7902
  {
7903
+ "name": "Bernhard Schussek",
7904
+ "email": "bschussek@gmail.com"
 
 
 
 
7905
  }
7906
  ],
7907
+ "description": "Assertions to validate method input/output with nice error messages.",
 
7908
  "keywords": [
7909
+ "assert",
7910
+ "check",
7911
+ "validate"
 
 
 
7912
  ],
7913
  "support": {
7914
+ "issues": "https://github.com/webmozarts/assert/issues",
7915
+ "source": "https://github.com/webmozarts/assert/tree/1.10.0"
7916
  },
7917
+ "time": "2021-03-09T10:59:23+00:00"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7918
  },
7919
  {
7920
+ "name": "wp-cli/mustangostang-spyc",
7921
+ "version": "0.6.3",
7922
  "source": {
7923
  "type": "git",
7924
+ "url": "https://github.com/wp-cli/spyc.git",
7925
+ "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7"
7926
  },
7927
  "dist": {
7928
  "type": "zip",
7929
+ "url": "https://api.github.com/repos/wp-cli/spyc/zipball/6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7",
7930
+ "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7",
7931
  "shasum": ""
7932
  },
7933
  "require": {
7934
+ "php": ">=5.3.1"
 
 
 
 
 
7935
  },
7936
  "require-dev": {
7937
+ "phpunit/phpunit": "4.3.*@dev"
 
 
 
7938
  },
7939
  "type": "library",
7940
+ "extra": {
7941
+ "branch-alias": {
7942
+ "dev-master": "0.5.x-dev"
7943
+ }
7944
+ },
7945
  "autoload": {
7946
  "psr-4": {
7947
+ "Mustangostang\\": "src/"
7948
  },
7949
  "files": [
7950
+ "includes/functions.php"
 
 
 
7951
  ]
7952
  },
7953
  "notification-url": "https://packagist.org/downloads/",
7956
  ],
7957
  "authors": [
7958
  {
7959
+ "name": "mustangostang",
7960
+ "email": "vlad.andersen@gmail.com"
 
 
 
 
7961
  }
7962
  ],
7963
+ "description": "A simple YAML loader/dumper class for PHP (WP-CLI fork)",
7964
+ "homepage": "https://github.com/mustangostang/spyc/",
 
 
 
 
 
 
 
 
7965
  "support": {
7966
+ "source": "https://github.com/wp-cli/spyc/tree/autoload"
7967
  },
7968
+ "time": "2017-04-25T11:26:20+00:00"
7969
+ },
7970
+ {
7971
+ "name": "wp-cli/php-cli-tools",
7972
+ "version": "v0.11.13",
7973
+ "source": {
7974
+ "type": "git",
7975
+ "url": "https://github.com/wp-cli/php-cli-tools.git",
7976
+ "reference": "a2866855ac1abc53005c102e901553ad5772dc04"
7977
+ },
7978
+ "dist": {
7979
+ "type": "zip",
7980
+ "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/a2866855ac1abc53005c102e901553ad5772dc04",
7981
+ "reference": "a2866855ac1abc53005c102e901553ad5772dc04",
7982
+ "shasum": ""
7983
+ },
7984
+ "require": {
7985
+ "php": ">= 5.3.0"
7986
+ },
7987
+ "type": "library",
7988
+ "autoload": {
7989
+ "psr-0": {
7990
+ "cli": "lib/"
7991
  },
7992
+ "files": [
7993
+ "lib/cli/cli.php"
7994
+ ]
7995
+ },
7996
+ "notification-url": "https://packagist.org/downloads/",
7997
+ "license": [
7998
+ "MIT"
7999
+ ],
8000
+ "authors": [
8001
  {
8002
+ "name": "Daniel Bachhuber",
8003
+ "email": "daniel@handbuilt.co",
8004
+ "role": "Maintainer"
8005
  },
8006
  {
8007
+ "name": "James Logsdon",
8008
+ "email": "jlogsdon@php.net",
8009
+ "role": "Developer"
8010
  }
8011
  ],
8012
+ "description": "Console utilities for PHP",
8013
+ "homepage": "http://github.com/wp-cli/php-cli-tools",
8014
+ "keywords": [
8015
+ "cli",
8016
+ "console"
8017
+ ],
8018
+ "support": {
8019
+ "issues": "https://github.com/wp-cli/php-cli-tools/issues",
8020
+ "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.11.13"
8021
+ },
8022
+ "time": "2021-07-01T15:08:16+00:00"
8023
  },
8024
  {
8025
+ "name": "wp-cli/wp-cli",
8026
+ "version": "v2.5.0",
8027
  "source": {
8028
  "type": "git",
8029
+ "url": "https://github.com/wp-cli/wp-cli.git",
8030
+ "reference": "0bcf0c54f4d35685211d435e25219cc7acbe6d48"
8031
  },
8032
  "dist": {
8033
  "type": "zip",
8034
+ "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/0bcf0c54f4d35685211d435e25219cc7acbe6d48",
8035
+ "reference": "0bcf0c54f4d35685211d435e25219cc7acbe6d48",
8036
  "shasum": ""
8037
  },
8038
  "require": {
8039
+ "ext-curl": "*",
8040
+ "mustache/mustache": "~2.13",
8041
+ "php": "^5.6 || ^7.0 || ^8.0",
8042
+ "rmccue/requests": "^1.8",
8043
+ "symfony/finder": ">2.7",
8044
+ "wp-cli/mustangostang-spyc": "^0.6.3",
8045
+ "wp-cli/php-cli-tools": "~0.11.2"
8046
  },
8047
  "require-dev": {
8048
+ "roave/security-advisories": "dev-master",
8049
+ "wp-cli/db-command": "^1.3 || ^2",
8050
+ "wp-cli/entity-command": "^1.2 || ^2",
8051
+ "wp-cli/extension-command": "^1.1 || ^2",
8052
+ "wp-cli/package-command": "^1 || ^2",
8053
+ "wp-cli/wp-cli-tests": "^3.0.7"
8054
  },
8055
  "suggest": {
8056
+ "ext-readline": "Include for a better --prompt implementation",
8057
+ "ext-zip": "Needed to support extraction of ZIP archives when doing downloads or updates"
8058
  },
8059
+ "bin": [
8060
+ "bin/wp",
8061
+ "bin/wp.bat"
8062
+ ],
8063
  "type": "library",
8064
+ "extra": {
8065
+ "branch-alias": {
8066
+ "dev-master": "2.5.x-dev"
8067
+ }
8068
+ },
8069
  "autoload": {
8070
+ "psr-0": {
8071
+ "WP_CLI\\": "php/"
8072
  },
8073
+ "classmap": [
8074
+ "php/class-wp-cli.php",
8075
+ "php/class-wp-cli-command.php"
8076
  ]
8077
  },
8078
  "notification-url": "https://packagist.org/downloads/",
8079
  "license": [
8080
  "MIT"
8081
  ],
8082
+ "description": "WP-CLI framework",
8083
+ "homepage": "https://wp-cli.org",
8084
+ "keywords": [
8085
+ "cli",
8086
+ "wordpress"
 
 
 
 
8087
  ],
 
 
8088
  "support": {
8089
+ "docs": "https://make.wordpress.org/cli/handbook/",
8090
+ "issues": "https://github.com/wp-cli/wp-cli/issues",
8091
+ "source": "https://github.com/wp-cli/wp-cli"
8092
  },
8093
+ "time": "2021-05-14T13:44:51+00:00"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8094
  },
8095
  {
8096
  "name": "wp-coding-standards/wpcs",
8142
  "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki"
8143
  },
8144
  "time": "2020-05-13T23:57:56+00:00"
8145
+ },
8146
+ {
8147
+ "name": "zordius/lightncandy",
8148
+ "version": "v1.2.6",
8149
+ "source": {
8150
+ "type": "git",
8151
+ "url": "https://github.com/zordius/lightncandy.git",
8152
+ "reference": "b451f73e8b5c73e62e365997ba3c993a0376b72a"
8153
+ },
8154
+ "dist": {
8155
+ "type": "zip",
8156
+ "url": "https://api.github.com/repos/zordius/lightncandy/zipball/b451f73e8b5c73e62e365997ba3c993a0376b72a",
8157
+ "reference": "b451f73e8b5c73e62e365997ba3c993a0376b72a",
8158
+ "shasum": ""
8159
+ },
8160
+ "require": {
8161
+ "php": ">=7.1.0"
8162
+ },
8163
+ "require-dev": {
8164
+ "phpunit/phpunit": ">=7"
8165
+ },
8166
+ "type": "library",
8167
+ "extra": {
8168
+ "branch-alias": {
8169
+ "dev-master": "1.2.5-dev"
8170
+ }
8171
+ },
8172
+ "autoload": {
8173
+ "psr-4": {
8174
+ "LightnCandy\\": "src"
8175
+ }
8176
+ },
8177
+ "notification-url": "https://packagist.org/downloads/",
8178
+ "license": [
8179
+ "MIT"
8180
+ ],
8181
+ "authors": [
8182
+ {
8183
+ "name": "Zordius Chen",
8184
+ "email": "zordius@gmail.com"
8185
+ }
8186
+ ],
8187
+ "description": "An extremely fast PHP implementation of handlebars ( http://handlebarsjs.com/ ) and mustache ( http://mustache.github.io/ ).",
8188
+ "homepage": "https://github.com/zordius/lightncandy",
8189
+ "keywords": [
8190
+ "handlebars",
8191
+ "logicless",
8192
+ "mustache",
8193
+ "php",
8194
+ "template"
8195
+ ],
8196
+ "support": {
8197
+ "issues": "https://github.com/zordius/lightncandy/issues",
8198
+ "source": "https://github.com/zordius/lightncandy/tree/v1.2.6"
8199
+ },
8200
+ "time": "2021-07-11T04:52:41+00:00"
8201
  }
8202
  ],
8203
  "aliases": [],
8207
  "prefer-lowest": false,
8208
  "platform": [],
8209
  "platform-dev": [],
8210
+ "plugin-api-version": "2.1.0"
8211
  }
legacy-functions.php CHANGED
@@ -1,64 +1,63 @@
1
  <?php
 
2
  /**
3
  * This file provides access to all legacy functions that are now deprecated.
4
  */
5
 
6
- if ( ! function_exists( '_scheduleExpiratorEvent' ) ) {
7
-
8
- /**
9
- * Schedules the single event.
10
- *
11
- * @since 2.4.3
12
- * @deprecated 2.4.3
13
- */
14
- function _scheduleExpiratorEvent( $id, $ts, $opts ) {
15
- postexpirator_schedule_event( $id, $ts, $opts );
16
- }
17
  }
18
 
19
 
20
- if ( ! function_exists( '_unscheduleExpiratorEvent' ) ) {
21
-
22
- /**
23
- * Unschedules the single event.
24
- *
25
- * @since 2.4.3
26
- * @deprecated 2.4.3
27
- */
28
- function _unscheduleExpiratorEvent( $id ) {
29
- postexpirator_unschedule_event( $id );
30
- }
31
  }
32
 
33
 
34
- if ( ! function_exists( 'postExpiratorExpire' ) ) {
35
-
36
- /**
37
- * Expires the post.
38
- *
39
- * @since 2.4.3
40
- * @deprecated 2.4.3
41
- */
42
- function postExpiratorExpire( $id ) {
43
- postexpirator_expire_post( $id );
44
- }
45
  }
46
 
47
 
48
- if ( ! function_exists( '_postExpiratorExpireType' ) ) {
49
-
50
- /**
51
- * Get the HTML for expire type.
52
- *
53
- * @since 2.5.0
54
- * @deprecated 2.5.0
55
- */
56
- function _postExpiratorExpireType( $opts ) {
57
- ob_start();
58
- _postexpirator_expire_type( $opts );
59
-
60
- return ob_get_clean();
61
- }
62
  }
63
-
64
-
1
  <?php
2
+
3
  /**
4
  * This file provides access to all legacy functions that are now deprecated.
5
  */
6
 
7
+ if (! function_exists('_scheduleExpiratorEvent')) {
8
+ /**
9
+ * Schedules the single event.
10
+ *
11
+ * @since 2.4.3
12
+ * @deprecated 2.4.3
13
+ */
14
+ function _scheduleExpiratorEvent($id, $ts, $opts)
15
+ {
16
+ postexpirator_schedule_event($id, $ts, $opts);
17
+ }
18
  }
19
 
20
 
21
+ if (! function_exists('_unscheduleExpiratorEvent')) {
22
+ /**
23
+ * Unschedules the single event.
24
+ *
25
+ * @since 2.4.3
26
+ * @deprecated 2.4.3
27
+ */
28
+ function _unscheduleExpiratorEvent($id)
29
+ {
30
+ postexpirator_unschedule_event($id);
31
+ }
32
  }
33
 
34
 
35
+ if (! function_exists('postExpiratorExpire')) {
36
+ /**
37
+ * Expires the post.
38
+ *
39
+ * @since 2.4.3
40
+ * @deprecated 2.4.3
41
+ */
42
+ function postExpiratorExpire($id)
43
+ {
44
+ postexpirator_expire_post($id);
45
+ }
46
  }
47
 
48
 
49
+ if (! function_exists('_postExpiratorExpireType')) {
50
+ /**
51
+ * Get the HTML for expire type.
52
+ *
53
+ * @since 2.5.0
54
+ * @deprecated 2.5.0
55
+ */
56
+ function _postExpiratorExpireType($opts)
57
+ {
58
+ ob_start();
59
+ _postexpirator_expire_type($opts);
60
+
61
+ return ob_get_clean();
62
+ }
63
  }
 
 
post-expirator-debug.php CHANGED
@@ -1,89 +1,99 @@
1
  <?php
2
 
3
- // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
4
-
5
  /**
6
  * The class that adds debug entries to the database.
7
  */
8
- class PostExpiratorDebug {
 
9
 
10
- /**
11
- * Constructor.
12
- */
13
- function __construct() {
14
- global $wpdb;
15
- $this->debug_table = $wpdb->prefix . 'postexpirator_debug';
16
- $this->createDBTable();
17
- }
 
18
 
19
- /**
20
- * Create Database Table to store debugging information if it does not already exist.
21
- */
22
- private function createDBTable() {
23
- global $wpdb;
 
24
 
25
- if ( $wpdb->get_var( "SHOW TABLES LIKE '" . $this->debug_table . "'" ) !== $this->debug_table ) {
26
- $sql = 'CREATE TABLE `' . $this->debug_table . '` (
27
- `id` INT(9) NOT NULL AUTO_INCREMENT PRIMARY KEY,
28
- `timestamp` TIMESTAMP NOT NULL,
29
- `blog` INT(9) NOT NULL,
30
- `message` text NOT NULL
31
- );';
32
- require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
33
- dbDelta( $sql );
34
- }
35
- }
36
 
37
- /**
38
- * Drop Database Table.
39
- */
40
- public function removeDBTable() {
41
- global $wpdb;
42
- $wpdb->query( 'DROP TABLE IF EXISTS ' . $this->debug_table );
43
- }
 
44
 
45
- /**
46
- * Insert into Database Table.
47
- */
48
- public function save( $data ) {
49
- global $wpdb;
50
- if ( is_multisite() ) {
51
- global $current_blog;
52
- $blog = $current_blog->blog_id;
53
- } else {
54
- $blog = 0;
55
- }
56
- $wpdb->query( $wpdb->prepare( 'INSERT INTO ' . $this->debug_table . ' (`timestamp`,`message`,`blog`) VALUES (FROM_UNIXTIME(%d),%s,%s)', time(), $data['message'], $blog ) );
57
- }
 
 
 
 
 
 
 
 
58
 
59
- /**
60
- * Get the HTML of the table's data.
61
- */
62
- public function getTable() {
63
- global $wpdb;
64
- $results = $wpdb->get_results( "SELECT * FROM {$this->debug_table} ORDER BY `id` DESC" );
65
- if ( empty( $results ) ) {
66
- print '<p>' . __( 'Debugging table is currently empty.', 'post-expirator' ) . '</p>';
 
67
 
68
- return;
69
- }
70
- print '<table class="post-expirator-debug">';
71
- print '<tr><th class="post-expirator-timestamp">' . __( 'Timestamp', 'post-expirator' ) . '</th>';
72
- print '<th>' . __( 'Message', 'post-expirator' ) . '</th></tr>';
73
- foreach ( $results as $result ) {
74
- print '<tr><td>' . $result->timestamp . '</td>';
75
- print '<td>' . $result->message . '</td></tr>';
76
- }
77
- print '</table>';
78
- }
79
 
80
- /**
81
- * Truncate Database Table.
82
- */
83
- public function purge() {
84
- global $wpdb;
85
- $wpdb->query( "TRUNCATE TABLE {$this->debug_table}" );
86
- }
 
87
  }
88
-
89
- // phpcs:enable
1
  <?php
2
 
 
 
3
  /**
4
  * The class that adds debug entries to the database.
5
  */
6
+ class PostExpiratorDebug
7
+ {
8
 
9
+ /**
10
+ * Constructor.
11
+ */
12
+ public function __construct()
13
+ {
14
+ global $wpdb;
15
+ $this->debug_table = $wpdb->prefix . 'postexpirator_debug';
16
+ $this->createDBTable();
17
+ }
18
 
19
+ /**
20
+ * Create Database Table to store debugging information if it does not already exist.
21
+ */
22
+ private function createDBTable()
23
+ {
24
+ global $wpdb;
25
 
26
+ if ($wpdb->get_var("SHOW TABLES LIKE '" . $this->debug_table . "'") !== $this->debug_table) {
27
+ $sql = 'CREATE TABLE `' . $this->debug_table . '` (
28
+ `id` INT(9) NOT NULL AUTO_INCREMENT PRIMARY KEY,
29
+ `timestamp` TIMESTAMP NOT NULL,
30
+ `blog` INT(9) NOT NULL,
31
+ `message` text NOT NULL
32
+ );';
33
+ require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
34
+ dbDelta($sql);
35
+ }
36
+ }
37
 
38
+ /**
39
+ * Drop Database Table.
40
+ */
41
+ public function removeDBTable()
42
+ {
43
+ global $wpdb;
44
+ $wpdb->query('DROP TABLE IF EXISTS ' . $this->debug_table);
45
+ }
46
 
47
+ /**
48
+ * Insert into Database Table.
49
+ */
50
+ public function save($data)
51
+ {
52
+ global $wpdb;
53
+ if (is_multisite()) {
54
+ global $current_blog;
55
+ $blog = $current_blog->blog_id;
56
+ } else {
57
+ $blog = 0;
58
+ }
59
+ $wpdb->query(
60
+ $wpdb->prepare(
61
+ 'INSERT INTO ' . $this->debug_table . ' (`timestamp`,`message`,`blog`) VALUES (FROM_UNIXTIME(%d),%s,%s)',
62
+ time(),
63
+ $data['message'],
64
+ $blog
65
+ )
66
+ );
67
+ }
68
 
69
+ /**
70
+ * Get the HTML of the table's data.
71
+ */
72
+ public function getTable()
73
+ {
74
+ global $wpdb;
75
+ $results = $wpdb->get_results("SELECT * FROM {$this->debug_table} ORDER BY `id` DESC");
76
+ if (empty($results)) {
77
+ print '<p>' . __('Debugging table is currently empty.', 'post-expirator') . '</p>';
78
 
79
+ return;
80
+ }
81
+ print '<table class="post-expirator-debug">';
82
+ print '<tr><th class="post-expirator-timestamp">' . __('Timestamp', 'post-expirator') . '</th>';
83
+ print '<th>' . __('Message', 'post-expirator') . '</th></tr>';
84
+ foreach ($results as $result) {
85
+ print '<tr><td>' . $result->timestamp . '</td>';
86
+ print '<td>' . $result->message . '</td></tr>';
87
+ }
88
+ print '</table>';
89
+ }
90
 
91
+ /**
92
+ * Truncate Database Table.
93
+ */
94
+ public function purge()
95
+ {
96
+ global $wpdb;
97
+ $wpdb->query("TRUNCATE TABLE {$this->debug_table}");
98
+ }
99
  }
 
 
post-expirator.php CHANGED
@@ -4,29 +4,30 @@ Plugin Name: Post Expirator
4
  Plugin URI: http://wordpress.org/extend/plugins/post-expirator/
5
  Description: Allows you to add an expiration date (minute) to posts which you can configure to either delete the post, change it to a draft, or update the post categories at expiration time.
6
  Author: PublishPress
7
- Version: 2.6.0
8
  Author URI: http://publishpress.com
9
  Text Domain: post-expirator
10
  Domain Path: /languages
11
  */
12
 
13
  // Default Values
14
- define( 'POSTEXPIRATOR_VERSION', '2.6.0' );
15
- define( 'POSTEXPIRATOR_DATEFORMAT', __( 'l F jS, Y', 'post-expirator' ) );
16
- define( 'POSTEXPIRATOR_TIMEFORMAT', __( 'g:ia', 'post-expirator' ) );
17
- define( 'POSTEXPIRATOR_FOOTERCONTENTS', __( 'Post expires at EXPIRATIONTIME on EXPIRATIONDATE', 'post-expirator' ) );
18
- define( 'POSTEXPIRATOR_FOOTERSTYLE', 'font-style: italic;' );
19
- define( 'POSTEXPIRATOR_FOOTERDISPLAY', '0' );
20
- define( 'POSTEXPIRATOR_EMAILNOTIFICATION', '0' );
21
- define( 'POSTEXPIRATOR_EMAILNOTIFICATIONADMINS', '0' );
22
- define( 'POSTEXPIRATOR_DEBUGDEFAULT', '0' );
23
- define( 'POSTEXPIRATOR_EXPIREDEFAULT', 'null' );
24
- define( 'POSTEXPIRATOR_SLUG', 'post-expirator' );
25
- define( 'POSTEXPIRATOR_BASEDIR', dirname( __FILE__ ) );
26
- define( 'POSTEXPIRATOR_BASENAME', basename( __FILE__ ) );
27
- define( 'POSTEXPIRATOR_BASEURL', plugins_url( '/', __FILE__ ) );
28
 
29
  require_once POSTEXPIRATOR_BASEDIR . '/functions.php';
 
30
 
31
 
32
  /**
@@ -36,16 +37,17 @@ require_once POSTEXPIRATOR_BASEDIR . '/functions.php';
36
  *
37
  * @access private
38
  */
39
- function postexpirator_plugin_action_links( $links, $file ) {
40
- $this_plugin = basename( plugin_dir_url( __FILE__ ) ) . '/post-expirator.php';
41
- if ( $file === $this_plugin ) {
42
- $links[] = '<a href="options-general.php?page=post-expirator">' . __( 'Settings', 'post-expirator' ) . '</a>';
43
- }
44
-
45
- return $links;
 
46
  }
47
 
48
- add_filter( 'plugin_action_links', 'postexpirator_plugin_action_links', 10, 2 );
49
 
50
  /**
51
  * Load translation, if it exists.
@@ -54,12 +56,15 @@ add_filter( 'plugin_action_links', 'postexpirator_plugin_action_links', 10, 2 );
54
  *
55
  * @access private
56
  */
57
- function postexpirator_init() {
58
- $plugin_dir = basename( dirname( __FILE__ ) );
59
- load_plugin_textdomain( 'post-expirator', null, $plugin_dir . '/languages/' );
 
 
 
60
  }
61
 
62
- add_action( 'plugins_loaded', 'postexpirator_init' );
63
 
64
  /**
65
  * Adds an 'Expires' column to the post display table.
@@ -68,20 +73,23 @@ add_action( 'plugins_loaded', 'postexpirator_init' );
68
  *
69
  * @access private
70
  */
71
- function postexpirator_add_column( $columns, $type ) {
72
- $defaults = get_option( 'expirationdateDefaults' . ucfirst( $type ) );
73
- // if settings are not configured, show the metabox by default only for posts and pages
74
- if ( ( ! isset( $defaults['activeMetaBox'] ) && in_array( $type, array(
75
- 'post',
76
- 'page'
77
- ), true ) ) || ( is_array( $defaults ) && $defaults['activeMetaBox'] === 'active' ) ) {
78
- $columns['expirationdate'] = __( 'Expires', 'post-expirator' );
79
- }
80
-
81
- return $columns;
 
 
 
82
  }
83
 
84
- add_filter( 'manage_posts_columns', 'postexpirator_add_column', 10, 2 );
85
 
86
  /**
87
  * Adds sortable columns.
@@ -90,14 +98,15 @@ add_filter( 'manage_posts_columns', 'postexpirator_add_column', 10, 2 );
90
  *
91
  * @access private
92
  */
93
- function postexpirator_manage_sortable_columns() {
94
- $post_types = postexpirator_get_post_types();
95
- foreach ( $post_types as $post_type ) {
96
- add_filter( 'manage_edit-' . $post_type . '_sortable_columns', 'postexpirator_sortable_column' );
97
- }
 
98
  }
99
 
100
- add_action( 'init', 'postexpirator_manage_sortable_columns', 100 );
101
 
102
  /**
103
  * Adds an 'Expires' column to the post display table.
@@ -106,10 +115,11 @@ add_action( 'init', 'postexpirator_manage_sortable_columns', 100 );
106
  *
107
  * @access private
108
  */
109
- function postexpirator_sortable_column( $columns ) {
110
- $columns['expirationdate'] = 'expirationdate';
 
111
 
112
- return $columns;
113
  }
114
 
115
  /**
@@ -119,33 +129,34 @@ function postexpirator_sortable_column( $columns ) {
119
  *
120
  * @access private
121
  */
122
- function postexpirator_orderby( $query ) {
123
- if ( ! is_admin() ) {
124
- return;
125
- }
126
-
127
- $orderby = $query->get( 'orderby' );
128
-
129
- if ( 'expirationdate' === $orderby ) {
130
- $query->set(
131
- 'meta_query', array(
132
- 'relation' => 'OR',
133
- array(
134
- 'key' => '_expiration-date',
135
- 'compare' => 'EXISTS',
136
- ),
137
- array(
138
- 'key' => '_expiration-date',
139
- 'compare' => 'NOT EXISTS',
140
- 'value' => '',
141
- ),
142
- )
143
- );
144
- $query->set( 'orderby', 'meta_value_num' );
145
- }
 
146
  }
147
 
148
- add_action( 'pre_get_posts', 'postexpirator_orderby' );
149
 
150
  /**
151
  * Adds an 'Expires' column to the page display table.
@@ -154,16 +165,17 @@ add_action( 'pre_get_posts', 'postexpirator_orderby' );
154
  *
155
  * @access private
156
  */
157
- function postexpirator_add_column_page( $columns ) {
158
- $defaults = get_option( 'expirationdateDefaultsPage' );
159
- if ( ! isset( $defaults['activeMetaBox'] ) || $defaults['activeMetaBox'] === 'active' ) {
160
- $columns['expirationdate'] = __( 'Expires', 'post-expirator' );
161
- }
162
-
163
- return $columns;
 
164
  }
165
 
166
- add_filter( 'manage_pages_columns', 'postexpirator_add_column_page' );
167
 
168
  /**
169
  * Fills the 'Expires' column of the post display table.
@@ -172,25 +184,26 @@ add_filter( 'manage_pages_columns', 'postexpirator_add_column_page' );
172
  *
173
  * @access private
174
  */
175
- function postexpirator_show_value( $column_name ) {
176
- if ( $column_name !== 'expirationdate' ) {
177
- return;
178
- }
179
-
180
- global $post;
181
-
182
- // get the attributes that quick edit functionality requires
183
- // and save it as a JSON encoded HTML attribute
184
- $attributes = PostExpirator_Facade::get_expire_principles( $post->ID );
185
- PostExpirator_Display::getInstance()->render_template( 'expire-column', array(
186
- 'id' => $post->ID,
187
- 'post_type' => $post->post_type,
188
- 'attributes' => $attributes
189
- ) );
 
190
  }
191
 
192
- add_action( 'manage_posts_custom_column', 'postexpirator_show_value' );
193
- add_action( 'manage_pages_custom_column', 'postexpirator_show_value' );
194
 
195
 
196
  /**
@@ -200,39 +213,40 @@ add_action( 'manage_pages_custom_column', 'postexpirator_show_value' );
200
  *
201
  * @access private
202
  */
203
- function postexpirator_quickedit( $column_name, $post_type ) {
204
- if ( $column_name !== 'expirationdate' ) {
205
- return;
206
- }
207
-
208
- $facade = PostExpirator_Facade::getInstance();
209
-
210
- if ( ! $facade->current_user_can_expire_posts() ) {
211
- return;
212
- }
213
-
214
- $defaults = get_option( 'expirationdateDefaults' . ucfirst( $post_type ) );
215
- $taxonomy = isset( $defaults['taxonomy'] ) ? $defaults['taxonomy'] : '';
216
- $label = '';
217
-
218
- // if settings have not been configured and this is the default post type
219
- if ( empty( $taxonomy ) && 'post' === $post_type ) {
220
- $taxonomy = 'category';
221
- }
222
-
223
- if ( ! empty( $taxonomy ) ) {
224
- $tax_object = get_taxonomy( $taxonomy );
225
- $label = $tax_object ? $tax_object->label : '';
226
- }
227
-
228
- PostExpirator_Display::getInstance()->render_template( 'quick-edit', array(
229
- 'post_type' => $post_type,
230
- 'taxonomy' => $taxonomy,
231
- 'tax_label' => $label
232
- ) );
 
233
  }
234
 
235
- add_action( 'quick_edit_custom_box', 'postexpirator_quickedit', 10, 2 );
236
 
237
  /**
238
  * Bulk Edit functionality.
@@ -241,39 +255,40 @@ add_action( 'quick_edit_custom_box', 'postexpirator_quickedit', 10, 2 );
241
  *
242
  * @access private
243
  */
244
- function postexpirator_bulkedit( $column_name, $post_type ) {
245
- if ( $column_name !== 'expirationdate' ) {
246
- return;
247
- }
248
-
249
- $facade = PostExpirator_Facade::getInstance();
250
-
251
- if ( ! $facade->current_user_can_expire_posts() ) {
252
- return;
253
- }
254
-
255
- $defaults = get_option( 'expirationdateDefaults' . ucfirst( $post_type ) );
256
- $taxonomy = isset( $defaults['taxonomy'] ) ? $defaults['taxonomy'] : '';
257
- $label = '';
258
-
259
- // if settings have not been configured and this is the default post type
260
- if ( empty( $taxonomy ) && 'post' === $post_type ) {
261
- $taxonomy = 'category';
262
- }
263
-
264
- if ( ! empty( $taxonomy ) ) {
265
- $tax_object = get_taxonomy( $taxonomy );
266
- $label = $tax_object ? $tax_object->label : '';
267
- }
268
-
269
- PostExpirator_Display::getInstance()->render_template( 'bulk-edit', array(
270
- 'post_type' => $post_type,
271
- 'taxonomy' => $taxonomy,
272
- 'tax_label' => $label
273
- ) );
 
274
  }
275
 
276
- add_action( 'bulk_edit_custom_box', 'postexpirator_bulkedit', 10, 2 );
277
 
278
  /**
279
  * Returns the post types that are supported.
@@ -282,23 +297,27 @@ add_action( 'bulk_edit_custom_box', 'postexpirator_bulkedit', 10, 2 );
282
  *
283
  * @access private
284
  */
285
- function postexpirator_get_post_types() {
286
- $post_types = get_post_types( array( 'public' => true ) );
287
- $post_types = array_merge( $post_types, get_post_types( array(
288
- 'public' => false,
289
- 'show_ui' => true,
290
- '_builtin' => false
291
- ) ) );
292
-
293
- // in case some post types should not be supported.
294
- $unset_post_types = apply_filters( 'postexpirator_unset_post_types', array( 'attachment' ) );
295
- if ( $unset_post_types ) {
296
- foreach ( $unset_post_types as $type ) {
297
- unset( $post_types[ $type ] );
298
- }
299
- }
300
-
301
- return $post_types;
 
 
 
 
302
  }
303
 
304
  /**
@@ -308,27 +327,38 @@ function postexpirator_get_post_types() {
308
  *
309
  * @access private
310
  */
311
- function postexpirator_meta_custom() {
312
- $facade = PostExpirator_Facade::getInstance();
313
-
314
- if ( ! $facade->current_user_can_expire_posts() ) {
315
- return;
316
- }
317
-
318
- $post_types = postexpirator_get_post_types();
319
- foreach ( $post_types as $type ) {
320
- $defaults = get_option( 'expirationdateDefaults' . ucfirst( $type ) );
321
- // if settings are not configured, show the metabox by default only for posts and pages
322
- if ( ( ! isset( $defaults['activeMetaBox'] ) && in_array( $type, array(
323
- 'post',
324
- 'page'
325
- ), true ) ) || ( is_array( $defaults ) && $defaults['activeMetaBox'] === 'active' ) ) {
326
- add_meta_box( 'expirationdatediv', __( 'Post Expirator', 'post-expirator' ), 'postexpirator_meta_box', $type, 'side', 'core', array( '__back_compat_meta_box' => PostExpirator_Facade::show_gutenberg_metabox() ) );
327
- }
328
- }
 
 
 
 
 
 
 
 
 
 
 
329
  }
330
 
331
- add_action( 'add_meta_boxes', 'postexpirator_meta_custom' );
332
 
333
  /**
334
  * Actually adds the meta box
@@ -337,60 +367,61 @@ add_action( 'add_meta_boxes', 'postexpirator_meta_custom' );
337
  *
338
  * @access private
339
  */
340
- function postexpirator_meta_box( $post ) {
341
- // Get default month
342
- $expirationdatets = get_post_meta( $post->ID, '_expiration-date', true );
343
- $firstsave = get_post_meta( $post->ID, '_expiration-date-status', true );
344
-
345
- $default = $expireType = $enabled = $defaultmonth = $defaultday = $defaulthour = $defaultyear = $defaultminute = $categories = '';
346
- $defaults = get_option( 'expirationdateDefaults' . ucfirst( $post->post_type ) );
347
- if ( empty( $expirationdatets ) ) {
348
- $default_expiry = PostExpirator_Facade::get_default_expiry( $post->post_type );
349
-
350
- $defaultmonth = $default_expiry['month'];
351
- $defaultday = $default_expiry['day'];
352
- $defaulthour = $default_expiry['hour'];
353
- $defaultyear = $default_expiry['year'];
354
- $defaultminute = $default_expiry['minute'];
355
-
356
- $enabled = '';
357
- $categories = get_option( 'expirationdateCategoryDefaults' );
358
-
359
- if ( isset( $defaults['expireType'] ) ) {
360
- $expireType = $defaults['expireType'];
361
- }
362
-
363
- // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
364
- if ( isset( $defaults['autoEnable'] ) && ( $firstsave !== 'saved' ) && ( $defaults['autoEnable'] === true || $defaults['autoEnable'] == 1 ) ) {
365
- $enabled = ' checked="checked"';
366
- }
367
- } else {
368
- $defaultmonth = get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $expirationdatets ), 'm' );
369
- $defaultday = get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $expirationdatets ), 'd' );
370
- $defaultyear = get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $expirationdatets ), 'Y' );
371
- $defaulthour = get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $expirationdatets ), 'H' );
372
- $defaultminute = get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $expirationdatets ), 'i' );
373
- $enabled = ' checked="checked"';
374
-
375
- $attributes = PostExpirator_Facade::get_expire_principles( $post->ID );
376
- $expireType = $attributes['expireType'];
377
- $categories = $attributes['category'];
378
- }
379
-
380
- PostExpirator_Display::getInstance()->render_template(
381
- 'classic-metabox', array(
382
- 'post' => $post,
383
- 'enabled' => $enabled,
384
- 'default' => $default,
385
- 'defaultmonth' => $defaultmonth,
386
- 'defaultday' => $defaultday,
387
- 'defaulthour' => $defaulthour,
388
- 'defaultyear' => $defaultyear,
389
- 'defaultminute' => $defaultminute,
390
- 'categories' => $categories,
391
- 'expireType' => $expireType,
392
- )
393
- );
 
394
  }
395
 
396
  /**
@@ -400,14 +431,15 @@ function postexpirator_meta_box( $post ) {
400
  *
401
  * @access private
402
  */
403
- function postexpirator_js_admin_header() {
404
- $facade = PostExpirator_Facade::getInstance();
405
-
406
- if ( ! $facade->current_user_can_expire_posts() ) {
407
- return;
408
- }
409
- ?>
410
- <script type="text/javascript">
 
411
  //<![CDATA[
412
  (function ($) {
413
  $(document).ready(function () {
@@ -433,11 +465,11 @@ function postexpirator_js_admin_header() {
433
  }
434
  })(jQuery);
435
  //]]>
436
- </script>
437
- <?php
438
  }
439
 
440
- add_action( 'admin_head', 'postexpirator_js_admin_header' );
441
 
442
  /**
443
  * Get correct URL (HTTP or HTTPS)
@@ -446,12 +478,13 @@ add_action( 'admin_head', 'postexpirator_js_admin_header' );
446
  *
447
  * @access private
448
  */
449
- function expirationdate_get_blog_url() {
450
- if ( is_multisite() ) {
451
- echo network_home_url( '/' );
452
- } else {
453
- echo home_url( '/' );
454
- }
 
455
  }
456
 
457
  /**
@@ -461,98 +494,157 @@ function expirationdate_get_blog_url() {
461
  *
462
  * @access private
463
  */
464
- function postexpirator_update_post_meta( $id ) {
465
- // don't run the echo if this is an auto save
466
- if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
467
- return;
468
- }
469
-
470
- // don't run the echo if the function is called for saving revision.
471
- $posttype = get_post_type( $id );
472
- if ( $posttype === 'revision' ) {
473
- return;
474
- }
475
-
476
- $facade = PostExpirator_Facade::getInstance();
477
-
478
- if ( ! $facade->current_user_can_expire_posts() ) {
479
- return;
480
- }
481
-
482
- // we want to make sure we don't fire the save_post action when we are inside the block editor
483
- // but this should not stop quick/bulk edit
484
- if ( PostExpirator_Util::is_gutenberg_active() && PostExpirator_Facade::show_gutenberg_metabox()
485
- &&
486
- ! isset( $_POST['expirationdate_quickedit'] ) && ! isset( $_POST['expirationdate_formcheck'] )
487
- ) {
488
- return;
489
- }
490
-
491
- if ( isset( $_POST['enable-expirationdate'] ) ) {
492
- $default = get_option( 'expirationdateDefaultDate', POSTEXPIRATOR_EXPIREDEFAULT );
493
- if ( $default === 'publish' ) {
494
- $month = intval( $_POST['mm'] );
495
- $day = intval( $_POST['jj'] );
496
- $year = intval( $_POST['aa'] );
497
- $hour = intval( $_POST['hh'] );
498
- $minute = intval( $_POST['mn'] );
499
- } else {
500
- $month = intval( $_POST['expirationdate_month'] );
501
- $day = intval( $_POST['expirationdate_day'] );
502
- $year = intval( $_POST['expirationdate_year'] );
503
- $hour = intval( $_POST['expirationdate_hour'] );
504
- $minute = intval( $_POST['expirationdate_minute'] );
505
-
506
- if ( empty( $day ) ) {
507
- $day = date( 'd' );
508
- }
509
- if ( empty( $year ) ) {
510
- $year = date( 'Y' );
511
- }
512
- }
513
- $category = isset( $_POST['expirationdate_category'] ) ? $_POST['expirationdate_category'] : 0;
514
-
515
- $ts = get_gmt_from_date( "$year-$month-$day $hour:$minute:0", 'U' );
516
-
517
- if ( isset( $_POST['expirationdate_quickedit'] ) ) {
518
- $ed = get_post_meta( $id, '_expiration-date', true );
519
- if ( $ed ) {
520
- $opts = PostExpirator_Facade::get_expire_principles( $id );
521
- if ( isset( $_POST['expirationdate_expiretype'] ) ) {
522
- $opts['expireType'] = $_POST['expirationdate_expiretype'];
523
- if ( in_array( $opts['expireType'], array(
524
- 'category',
525
- 'category-add',
526
- 'category-remove'
527
- ), true ) ) {
528
- $opts['category'] = $_POST['expirationdate_category'];
529
- }
530
- PostExpirator_Facade::set_expire_principles( $id, $opts );
531
- }
532
- }
533
- } else {
534
- $opts = array();
535
-
536
- // Schedule/Update Expiration
537
- $opts['expireType'] = $_POST['expirationdate_expiretype'];
538
- $opts['id'] = $id;
539
-
540
- if ( $opts['expireType'] === 'category' || $opts['expireType'] === 'category-add' || $opts['expireType'] === 'category-remove' ) {
541
- if ( isset( $category ) && ! empty( $category ) ) {
542
- if ( ! empty( $category ) ) {
543
- $opts['category'] = $category;
544
- $opts['categoryTaxonomy'] = $_POST['taxonomy-heirarchical'];
545
- }
546
- }
547
- }
548
- }
549
- postexpirator_schedule_event( $id, $ts, $opts );
550
- } else {
551
- postexpirator_unschedule_event( $id );
552
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
553
  }
554
 
555
- add_action( 'save_post', 'postexpirator_update_post_meta' );
556
 
557
  /**
558
  * Schedules the single event.
@@ -561,31 +653,47 @@ add_action( 'save_post', 'postexpirator_update_post_meta' );
561
  *
562
  * @access private
563
  */
564
- function postexpirator_schedule_event( $id, $ts, $opts ) {
565
- $debug = postexpirator_debug(); // check for/load debug
566
-
567
- $id = intval( $id );
568
-
569
- do_action( 'postexpiratior_schedule', $id, $ts, $opts ); // allow custom actions
570
-
571
- if ( wp_next_scheduled( 'postExpiratorExpire', array( $id ) ) !== false ) {
572
- $error = wp_clear_scheduled_hook( 'postExpiratorExpire', array( $id ), true ); // Remove any existing hooks
573
- if ( POSTEXPIRATOR_DEBUG ) {
574
- $debug->save( array( 'message' => $id . ' -> EXISTING FOUND - UNSCHEDULED - ' . ( is_wp_error( $error ) ? $error->get_error_message() : 'no error' ) ) );
575
- }
576
- }
577
-
578
- $error = wp_schedule_single_event( $ts, 'postExpiratorExpire', array( $id ), true );
579
- if ( POSTEXPIRATOR_DEBUG ) {
580
- $debug->save( array( 'message' => $id . ' -> SCHEDULED at ' . date_i18n( 'r', $ts ) . ' ' . '(' . $ts . ') with options ' . print_r( $opts, true ) . ' ' . ( is_wp_error( $error ) ? $error->get_error_message() : 'no error' ) ) );
581
- }
582
-
583
- // Update Post Meta
584
- update_post_meta( $id, '_expiration-date', $ts );
585
- if ( ! is_null( $opts ) ) {
586
- PostExpirator_Facade::set_expire_principles( $id, $opts );
587
- }
588
- update_post_meta( $id, '_expiration-date-status', 'saved' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
589
  }
590
 
591
  /**
@@ -595,25 +703,26 @@ function postexpirator_schedule_event( $id, $ts, $opts ) {
595
  *
596
  * @access private
597
  */
598
- function postexpirator_unschedule_event( $id ) {
599
- $debug = postexpirator_debug(); // check for/load debug
600
-
601
- do_action( 'postexpiratior_unschedule', $id ); // allow custom actions
602
-
603
- delete_post_meta( $id, '_expiration-date' );
604
- delete_post_meta( $id, '_expiration-date-options' );
605
- delete_post_meta( $id, '_expiration-date-type' );
606
- delete_post_meta( $id, '_expiration-date-categories' );
607
- delete_post_meta( $id, '_expiration-date-taxonomy' );
608
-
609
- // Delete Scheduled Expiration
610
- if ( wp_next_scheduled( 'postExpiratorExpire', array( $id ) ) !== false ) {
611
- wp_clear_scheduled_hook( 'postExpiratorExpire', array( $id ) ); // Remove any existing hooks
612
- if ( POSTEXPIRATOR_DEBUG ) {
613
- $debug->save( array( 'message' => $id . ' -> UNSCHEDULED' ) );
614
- }
615
- }
616
- delete_post_meta( $id, '_expiration-date-status' );
 
617
  }
618
 
619
  /**
@@ -625,309 +734,576 @@ function postexpirator_unschedule_event( $id ) {
625
  *
626
  * @access private
627
  */
628
- function postexpirator_expire_post( $id ) {
629
- $debug = postexpirator_debug(); // check for/load debug
630
-
631
- if ( empty( $id ) ) {
632
- if ( POSTEXPIRATOR_DEBUG ) {
633
- $debug->save( array( 'message' => 'No Post ID found - exiting' ) );
634
- }
635
-
636
- return false;
637
- }
638
-
639
- if ( is_null( get_post( $id ) ) ) {
640
- if ( POSTEXPIRATOR_DEBUG ) {
641
- $debug->save( array( 'message' => $id . ' -> Post does not exist - exiting' ) );
642
- }
643
-
644
- return false;
645
- }
646
-
647
- $posttype = get_post_type( $id );
648
- $posttitle = get_the_title( $id );
649
- $postlink = get_post_permalink( $id );
650
-
651
- $postoptions = PostExpirator_Facade::get_expire_principles( $id );
652
- $expireType = $category = $categoryTaxonomy = null;
653
-
654
- if ( isset( $postoptions['expireType'] ) ) {
655
- $expireType = $postoptions['expireType'];
656
- }
657
-
658
- if ( isset( $postoptions['category'] ) ) {
659
- $category = $postoptions['category'];
660
- }
661
-
662
- if ( isset( $postoptions['categoryTaxonomy'] ) ) {
663
- $categoryTaxonomy = $postoptions['categoryTaxonomy'];
664
- }
665
-
666
- $ed = get_post_meta( $id, '_expiration-date', true );
667
-
668
- // Check for default expire only if not passed in
669
- if ( empty( $expireType ) ) {
670
- $posttype = get_post_type( $id );
671
- if ( $posttype === 'page' ) {
672
- $expireType = strtolower( get_option( 'expirationdateExpiredPageStatus', POSTEXPIRATOR_PAGESTATUS ) );
673
- } elseif ( $posttype === 'post' ) {
674
- $expireType = strtolower( get_option( 'expirationdateExpiredPostStatus', 'draft' ) );
675
- } else {
676
- $expireType = apply_filters( 'postexpirator_custom_posttype_expire', $expireType, $posttype ); // hook to set defaults for custom post types
677
- }
678
- }
679
-
680
- // Remove KSES - wp_cron runs as an unauthenticated user, which will by default trigger kses filtering,
681
- // even if the post was published by a admin user. It is fairly safe here to remove the filter call since
682
- // we are only changing the post status/meta information and not touching the content.
683
- kses_remove_filters();
684
-
685
- // Do Work
686
- if ( $expireType === 'draft' ) {
687
- if ( wp_update_post( array( 'ID' => $id, 'post_status' => 'draft' ) ) === 0 ) {
688
- if ( POSTEXPIRATOR_DEBUG ) {
689
- $debug->save( array( 'message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
690
- }
691
- } else {
692
- $emailBody = sprintf( __( '%1$s (%2$s) has expired at %3$s. Post status has been successfully changed to "%4$s".', 'post-expirator' ), '##POSTTITLE##', '##POSTLINK##', '##EXPIRATIONDATE##', strtoupper( $expireType ) );
693
- if ( POSTEXPIRATOR_DEBUG ) {
694
- $debug->save( array( 'message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
695
- }
696
- }
697
- } elseif ( $expireType === 'private' ) {
698
- if ( wp_update_post( array( 'ID' => $id, 'post_status' => 'private' ) ) === 0 ) {
699
- if ( POSTEXPIRATOR_DEBUG ) {
700
- $debug->save( array( 'message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
701
- }
702
- } else {
703
- $emailBody = sprintf( __( '%1$s (%2$s) has expired at %3$s. Post status has been successfully changed to "%4$s".', 'post-expirator' ), '##POSTTITLE##', '##POSTLINK##', '##EXPIRATIONDATE##', strtoupper( $expireType ) );
704
- if ( POSTEXPIRATOR_DEBUG ) {
705
- $debug->save( array( 'message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
706
- }
707
- }
708
- } elseif ( $expireType === 'delete' ) {
709
- if ( wp_delete_post( $id ) === false ) {
710
- if ( POSTEXPIRATOR_DEBUG ) {
711
- $debug->save( array( 'message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
712
- }
713
- } else {
714
- $emailBody = sprintf( __( '%1$s (%2$s) has expired at %3$s. Post status has been successfully changed to "%4$s".', 'post-expirator' ), '##POSTTITLE##', '##POSTLINK##', '##EXPIRATIONDATE##', strtoupper( $expireType ) );
715
- if ( POSTEXPIRATOR_DEBUG ) {
716
- $debug->save( array( 'message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
717
- }
718
- }
719
- } elseif ( $expireType === 'trash' ) {
720
- if ( wp_trash_post( $id ) === false ) {
721
- if ( POSTEXPIRATOR_DEBUG ) {
722
- $debug->save( array( 'message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
723
- }
724
- } else {
725
- $emailBody = sprintf( __( '%1$s (%2$s) has expired at %3$s. Post status has been successfully changed to "%4$s".', 'post-expirator' ), '##POSTTITLE##', '##POSTLINK##', '##EXPIRATIONDATE##', strtoupper( $expireType ) );
726
- if ( POSTEXPIRATOR_DEBUG ) {
727
- $debug->save( array( 'message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
728
- }
729
- }
730
- } elseif ( $expireType === 'stick' ) {
731
- if ( stick_post( $id ) === false ) {
732
- if ( POSTEXPIRATOR_DEBUG ) {
733
- $debug->save( array( 'message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
734
- }
735
- } else {
736
- $emailBody = sprintf( __( '%1$s (%2$s) has expired at %3$s. Post "%4$s" status has been successfully set.', 'post-expirator' ), '##POSTTITLE##', '##POSTLINK##', '##EXPIRATIONDATE##', 'STICKY' );
737
- if ( POSTEXPIRATOR_DEBUG ) {
738
- $debug->save( array( 'message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
739
- }
740
- }
741
- } elseif ( $expireType === 'unstick' ) {
742
- if ( unstick_post( $id ) === false ) {
743
- if ( POSTEXPIRATOR_DEBUG ) {
744
- $debug->save( array( 'message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
745
- }
746
- } else {
747
- $emailBody = sprintf( __( '%1$s (%2$s) has expired at %3$s. Post "%4$s" status has been successfully removed.', 'post-expirator' ), '##POSTTITLE##', '##POSTLINK##', '##EXPIRATIONDATE##', 'STICKY' );
748
- if ( POSTEXPIRATOR_DEBUG ) {
749
- $debug->save( array( 'message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
750
- }
751
- }
752
- } elseif ( $expireType === 'category' ) {
753
- if ( ! empty( $category ) ) {
754
- if ( ! isset( $categoryTaxonomy ) || $categoryTaxonomy === 'category' ) {
755
- if ( wp_update_post( array( 'ID' => $id, 'post_category' => $category ) ) === 0 ) {
756
- if ( POSTEXPIRATOR_DEBUG ) {
757
- $debug->save( array( 'message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
758
- }
759
- } else {
760
- $emailBody = sprintf( __( '%1$s (%2$s) has expired at %3$s. Post "%4$s" have now been set to "%5$s".', 'post-expirator' ), '##POSTTITLE##', '##POSTLINK##', '##EXPIRATIONDATE##', 'CATEGORIES', implode( ',', _postexpirator_get_cat_names( $category ) ) );
761
- if ( POSTEXPIRATOR_DEBUG ) {
762
- $debug->save( array( 'message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
763
- $debug->save( array( 'message' => $id . ' -> CATEGORIES REPLACED ' . print_r( _postexpirator_get_cat_names( $category ), true ) ) );
764
- $debug->save( array( 'message' => $id . ' -> CATEGORIES COMPLETE ' . print_r( _postexpirator_get_cat_names( $category ), true ) ) );
765
- }
766
- }
767
- } else {
768
- $terms = array_map( 'intval', $category );
769
- if ( is_wp_error( wp_set_object_terms( $id, $terms, $categoryTaxonomy, false ) ) ) {
770
- if ( POSTEXPIRATOR_DEBUG ) {
771
- $debug->save( array( 'message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
772
- }
773
- } else {
774
- $emailBody = sprintf( __( '%1$s (%2$s) has expired at %3$s. Post "%4$s" have now been set to "%5$s".', 'post-expirator' ), '##POSTTITLE##', '##POSTLINK##', '##EXPIRATIONDATE##', 'CATEGORIES', implode( ',', _postexpirator_get_cat_names( $category ) ) );
775
- if ( POSTEXPIRATOR_DEBUG ) {
776
- $debug->save( array( 'message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
777
- $debug->save( array( 'message' => $id . ' -> CATEGORIES REPLACED ' . print_r( _postexpirator_get_cat_names( $category ), true ) ) );
778
- $debug->save( array( 'message' => $id . ' -> CATEGORIES COMPLETE ' . print_r( _postexpirator_get_cat_names( $category ), true ) ) );
779
- }
780
- }
781
- }
782
- } else {
783
- if ( POSTEXPIRATOR_DEBUG ) {
784
- $debug->save( array( 'message' => $id . ' -> CATEGORIES MISSING ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
785
- }
786
- }
787
- } elseif ( $expireType === 'category-add' ) {
788
- if ( ! empty( $category ) ) {
789
- if ( ! isset( $categoryTaxonomy ) || $categoryTaxonomy === 'category' ) {
790
- $cats = wp_get_post_categories( $id );
791
- $merged = array_merge( $cats, $category );
792
- if ( wp_update_post( array( 'ID' => $id, 'post_category' => $merged ) ) === 0 ) {
793
- if ( POSTEXPIRATOR_DEBUG ) {
794
- $debug->save( array( 'message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
795
- }
796
- } else {
797
- $emailBody = sprintf( __( '%1$s (%2$s) has expired at %3$s. The following post "%4$s" have now been added: "%5$s". The full list of categories on the post are: "%6$s".', 'post-expirator' ), '##POSTTITLE##', '##POSTLINK##', '##EXPIRATIONDATE##', 'CATEGORIES', implode( ',', _postexpirator_get_cat_names( $category ) ), implode( ',', _postexpirator_get_cat_names( $merged ) ) );
798
- if ( POSTEXPIRATOR_DEBUG ) {
799
- $debug->save( array( 'message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
800
- $debug->save( array( 'message' => $id . ' -> CATEGORIES ADDED ' . print_r( _postexpirator_get_cat_names( $category ), true ) ) );
801
- $debug->save( array( 'message' => $id . ' -> CATEGORIES COMPLETE ' . print_r( _postexpirator_get_cat_names( $merged ), true ) ) );
802
- }
803
- }
804
- } else {
805
- $terms = array_map( 'intval', $category );
806
- if ( is_wp_error( wp_set_object_terms( $id, $terms, $categoryTaxonomy, true ) ) ) {
807
- if ( POSTEXPIRATOR_DEBUG ) {
808
- $debug->save( array( 'message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
809
- }
810
- } else {
811
- $emailBody = sprintf( __( '%1$s (%2$s) has expired at %3$s. The following post "%4$s" have now been added: "%5$s". The full list of categories on the post are: "%6$s".', 'post-expirator' ), '##POSTTITLE##', '##POSTLINK##', '##EXPIRATIONDATE##', 'CATEGORIES', implode( ',', _postexpirator_get_cat_names( $category ) ), implode( ',', _postexpirator_get_cat_names( $merged ) ) );
812
- if ( POSTEXPIRATOR_DEBUG ) {
813
- $debug->save( array( 'message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
814
- $debug->save( array( 'message' => $id . ' -> CATEGORIES ADDED ' . print_r( _postexpirator_get_cat_names( $category ), true ) ) );
815
- $debug->save( array( 'message' => $id . ' -> CATEGORIES COMPLETE ' . print_r( _postexpirator_get_cat_names( $category ), true ) ) );
816
- }
817
- }
818
- }
819
- } else {
820
- if ( POSTEXPIRATOR_DEBUG ) {
821
- $debug->save( array( 'message' => $id . ' -> CATEGORIES MISSING ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
822
- }
823
- }
824
- } elseif ( $expireType === 'category-remove' ) {
825
- if ( ! empty( $category ) ) {
826
- if ( ! isset( $categoryTaxonomy ) || $categoryTaxonomy === 'category' ) {
827
- $cats = wp_get_post_categories( $id );
828
- $merged = array();
829
- foreach ( $cats as $cat ) {
830
- if ( ! in_array( $cat, $category, false ) ) {
831
- $merged[] = $cat;
832
- }
833
- }
834
-
835
- if ( wp_update_post( array( 'ID' => $id, 'post_category' => $merged ) ) === 0 ) {
836
- if ( POSTEXPIRATOR_DEBUG ) {
837
- $debug->save( array( 'message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
838
- }
839
- } else {
840
- $emailBody = sprintf( __( '%1$s (%2$s) has expired at %3$s. The following post "%4$s" have now been removed: "%5$s". The full list of categories on the post are: "%6$s".', 'post-expirator' ), '##POSTTITLE##', '##POSTLINK##', '##EXPIRATIONDATE##', 'CATEGORIES', implode( ',', _postexpirator_get_cat_names( $category ) ), implode( ',', _postexpirator_get_cat_names( $merged ) ) );
841
- if ( POSTEXPIRATOR_DEBUG ) {
842
- $debug->save( array( 'message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
843
- $debug->save( array( 'message' => $id . ' -> CATEGORIES REMOVED ' . print_r( _postexpirator_get_cat_names( $category ), true ) ) );
844
- $debug->save( array( 'message' => $id . ' -> CATEGORIES COMPLETE ' . print_r( _postexpirator_get_cat_names( $merged ), true ) ) );
845
- }
846
- }
847
- } else {
848
- $terms = wp_get_object_terms( $id, $categoryTaxonomy, array( 'fields' => 'ids' ) );
849
- $merged = array();
850
- foreach ( $terms as $term ) {
851
- if ( ! in_array( $term, $category, false ) ) {
852
- $merged[] = $term;
853
- }
854
- }
855
- $terms = array_map( 'intval', $merged );
856
- if ( is_wp_error( wp_set_object_terms( $id, $terms, $categoryTaxonomy, false ) ) ) {
857
- if ( POSTEXPIRATOR_DEBUG ) {
858
- $debug->save( array( 'message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
859
- }
860
- } else {
861
- $emailBody = sprintf( __( '%1$s (%2$s) has expired at %3$s. The following post "%4$s" have now been removed: "%5$s". The full list of categories on the post are: "%6$s".', 'post-expirator' ), '##POSTTITLE##', '##POSTLINK##', '##EXPIRATIONDATE##', 'CATEGORIES', implode( ',', _postexpirator_get_cat_names( $category ) ), implode( ',', _postexpirator_get_cat_names( $merged ) ) );
862
- if ( POSTEXPIRATOR_DEBUG ) {
863
- $debug->save( array( 'message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
864
- $debug->save( array( 'message' => $id . ' -> CATEGORIES REMOVED ' . print_r( _postexpirator_get_cat_names( $category ), true ) ) );
865
- $debug->save( array( 'message' => $id . ' -> CATEGORIES COMPLETE ' . print_r( _postexpirator_get_cat_names( $category ), true ) ) );
866
- }
867
- }
868
- }
869
- } else {
870
- if ( POSTEXPIRATOR_DEBUG ) {
871
- $debug->save( array( 'message' => $id . ' -> CATEGORIES MISSING ' . $expireType . ' ' . print_r( $postoptions, true ) ) );
872
- }
873
- }
874
- }
875
-
876
- // Process Email
877
- $emailenabled = get_option( 'expirationdateEmailNotification', POSTEXPIRATOR_EMAILNOTIFICATION );
878
- // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
879
- if ( $emailenabled == 1 && isset( $emailBody ) ) {
880
- $subj = sprintf( __( 'Post Expiration Complete "%s"', 'post-expirator' ), $posttitle );
881
- $emailBody = str_replace( '##POSTTITLE##', $posttitle, $emailBody );
882
- $emailBody = str_replace( '##POSTLINK##', $postlink, $emailBody );
883
- $emailBody = str_replace( '##EXPIRATIONDATE##', get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $ed ), get_option( 'date_format' ) . ' ' . get_option( 'time_format' ) ), $emailBody );
884
-
885
- $emails = array();
886
- // Get Blog Admins
887
- $emailadmins = get_option( 'expirationdateEmailNotificationAdmins', POSTEXPIRATOR_EMAILNOTIFICATIONADMINS );
888
- // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
889
- if ( $emailadmins == 1 ) {
890
- $blogusers = get_users( 'role=Administrator' );
891
- foreach ( $blogusers as $user ) {
892
- $emails[] = $user->user_email;
893
- }
894
- }
895
-
896
- // Get Global Notification Emails
897
- $emaillist = get_option( 'expirationdateEmailNotificationList' );
898
- if ( ! empty( $emaillist ) ) {
899
- $vals = explode( ',', $emaillist );
900
- foreach ( $vals as $val ) {
901
- $emails[] = trim( $val );
902
- }
903
- }
904
-
905
- // Get Post Type Notification Emails
906
- $defaults = get_option( 'expirationdateDefaults' . ucfirst( $posttype ) );
907
- if ( isset( $defaults['emailnotification'] ) && ! empty( $defaults['emailnotification'] ) ) {
908
- $vals = explode( ',', $defaults['emailnotification'] );
909
- foreach ( $vals as $val ) {
910
- $emails[] = trim( $val );
911
- }
912
- }
913
-
914
- // Send Emails
915
- foreach ( $emails as $email ) {
916
- if ( wp_mail( $email, sprintf( __( '[%1$s] %2$s' ), get_option( 'blogname' ), $subj ), $emailBody ) ) {
917
- if ( POSTEXPIRATOR_DEBUG ) {
918
- $debug->save( array( 'message' => $id . ' -> EXPIRATION EMAIL SENT (' . $email . ')' ) );
919
- }
920
- } else {
921
- if ( POSTEXPIRATOR_DEBUG ) {
922
- $debug->save( array( 'message' => $id . ' -> EXPIRATION EMAIL FAILED (' . $email . ')' ) );
923
- }
924
- }
925
- }
926
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
927
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
928
  }
929
 
930
- add_action( 'postExpiratorExpire', 'postexpirator_expire_post' );
931
 
932
  /**
933
  * Internal method to get category names corresponding to the category IDs.
@@ -936,13 +1312,14 @@ add_action( 'postExpiratorExpire', 'postexpirator_expire_post' );
936
  *
937
  * @access private
938
  */
939
- function _postexpirator_get_cat_names( $cats ) {
940
- $out = array();
941
- foreach ( $cats as $cat ) {
942
- $out[ $cat ] = get_the_category_by_id( $cat );
943
- }
944
-
945
- return $out;
 
946
  }
947
 
948
 
@@ -953,8 +1330,9 @@ function _postexpirator_get_cat_names( $cats ) {
953
  *
954
  * @access private
955
  */
956
- function postexpirator_menu() {
957
- _deprecated_function( __FUNCTION__, '2.5' );
 
958
  }
959
 
960
  /**
@@ -964,8 +1342,9 @@ function postexpirator_menu() {
964
  *
965
  * @access private
966
  */
967
- function postexpirator_add_menu() {
968
- _deprecated_function( __FUNCTION__, '2.5' );
 
969
  }
970
 
971
  /**
@@ -975,9 +1354,10 @@ function postexpirator_add_menu() {
975
  *
976
  * @access private
977
  */
978
- function postexpirator_menu_general() {
979
- _deprecated_function( __FUNCTION__, '2.5' );
980
- PostExpirator_Display::getInstance()->load_tab( 'general' );
 
981
  }
982
 
983
  /**
@@ -987,9 +1367,10 @@ function postexpirator_menu_general() {
987
  *
988
  * @access private
989
  */
990
- function postexpirator_menu_defaults() {
991
- _deprecated_function( __FUNCTION__, '2.5' );
992
- PostExpirator_Display::getInstance()->load_tab( 'defaults' );
 
993
  }
994
 
995
  /**
@@ -999,9 +1380,10 @@ function postexpirator_menu_defaults() {
999
  *
1000
  * @access private
1001
  */
1002
- function postexpirator_menu_diagnostics() {
1003
- _deprecated_function( __FUNCTION__, '2.5' );
1004
- PostExpirator_Display::getInstance()->load_tab( 'diagnostics' );
 
1005
  }
1006
 
1007
  /**
@@ -1011,9 +1393,10 @@ function postexpirator_menu_diagnostics() {
1011
  *
1012
  * @access private
1013
  */
1014
- function postexpirator_menu_debug() {
1015
- _deprecated_function( __FUNCTION__, '2.5' );
1016
- PostExpirator_Display::getInstance()->load_tab( 'viewdebug' );
 
1017
  }
1018
 
1019
  /**
@@ -1023,49 +1406,51 @@ function postexpirator_menu_debug() {
1023
  *
1024
  * @access private
1025
  */
1026
- function postexpirator_shortcode( $atts ) {
1027
- global $post;
1028
-
1029
- $expirationdatets = get_post_meta( $post->ID, '_expiration-date', true );
1030
- if ( empty( $expirationdatets ) ) {
1031
- return false;
1032
- }
1033
-
1034
- // @TODO remove extract
1035
- // phpcs:ignore WordPress.PHP.DontExtract.extract_extract
1036
- extract(
1037
- shortcode_atts(
1038
- array(
1039
- 'dateformat' => get_option( 'expirationdateDefaultDateFormat', POSTEXPIRATOR_DATEFORMAT ),
1040
- 'timeformat' => get_option( 'expirationdateDefaultTimeFormat', POSTEXPIRATOR_TIMEFORMAT ),
1041
- 'type' => 'full',
1042
- 'tz' => date( 'T' ),
1043
- ), $atts
1044
- )
1045
- );
1046
-
1047
- if ( empty( $dateformat ) ) {
1048
- global $expirationdateDefaultDateFormat;
1049
- $dateformat = $expirationdateDefaultDateFormat;
1050
- }
1051
-
1052
- if ( empty( $timeformat ) ) {
1053
- global $expirationdateDefaultTimeFormat;
1054
- $timeformat = $expirationdateDefaultTimeFormat;
1055
- }
1056
-
1057
- if ( $type === 'full' ) {
1058
- $format = $dateformat . ' ' . $timeformat;
1059
- } elseif ( $type === 'date' ) {
1060
- $format = $dateformat;
1061
- } elseif ( $type === 'time' ) {
1062
- $format = $timeformat;
1063
- }
1064
-
1065
- return date_i18n( $format, $expirationdatets + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) );
 
 
1066
  }
1067
 
1068
- add_shortcode( 'postexpirator', 'postexpirator_shortcode' );
1069
 
1070
  /**
1071
  * Add the footer.
@@ -1074,44 +1459,49 @@ add_shortcode( 'postexpirator', 'postexpirator_shortcode' );
1074
  *
1075
  * @access private
1076
  */
1077
- function postexpirator_add_footer( $text ) {
1078
- global $post;
1079
-
1080
- // Check to see if its enabled
1081
- $displayFooter = get_option( 'expirationdateDisplayFooter' );
1082
-
1083
- // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1084
- if ( $displayFooter === false || $displayFooter == 0 ) {
1085
- return $text;
1086
- }
1087
-
1088
- $expirationdatets = get_post_meta( $post->ID, '_expiration-date', true );
1089
- if ( ! is_numeric( $expirationdatets ) ) {
1090
- return $text;
1091
- }
1092
-
1093
- $dateformat = get_option( 'expirationdateDefaultDateFormat', POSTEXPIRATOR_DATEFORMAT );
1094
- $timeformat = get_option( 'expirationdateDefaultTimeFormat', POSTEXPIRATOR_TIMEFORMAT );
1095
- $expirationdateFooterContents = get_option( 'expirationdateFooterContents', POSTEXPIRATOR_FOOTERCONTENTS );
1096
- $expirationdateFooterStyle = get_option( 'expirationdateFooterStyle', POSTEXPIRATOR_FOOTERSTYLE );
1097
-
1098
- $search = array(
1099
- 'EXPIRATIONFULL',
1100
- 'EXPIRATIONDATE',
1101
- 'EXPIRATIONTIME',
1102
- );
1103
- $replace = array(
1104
- get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $expirationdatets ), "$dateformat $timeformat" ),
1105
- get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $expirationdatets ), $dateformat ),
1106
- get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $expirationdatets ), $timeformat ),
1107
- );
1108
-
1109
- $add_to_footer = '<p style="' . $expirationdateFooterStyle . '">' . str_replace( $search, $replace, $expirationdateFooterContents ) . '</p>';
1110
-
1111
- return $text . $add_to_footer;
 
 
 
 
 
1112
  }
1113
 
1114
- add_action( 'the_content', 'postexpirator_add_footer', 0 );
1115
 
1116
  /**
1117
  * Check for Debug
@@ -1120,23 +1510,24 @@ add_action( 'the_content', 'postexpirator_add_footer', 0 );
1120
  *
1121
  * @access private
1122
  */
1123
- function postexpirator_debug() {
1124
- $debug = get_option( 'expirationdateDebug' );
1125
- // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1126
- if ( $debug == 1 ) {
1127
- if ( ! defined( 'POSTEXPIRATOR_DEBUG' ) ) {
1128
- define( 'POSTEXPIRATOR_DEBUG', 1 );
1129
- }
1130
- require_once( plugin_dir_path( __FILE__ ) . 'post-expirator-debug.php' ); // Load Class
1131
-
1132
- return new PostExpiratorDebug();
1133
- } else {
1134
- if ( ! defined( 'POSTEXPIRATOR_DEBUG' ) ) {
1135
- define( 'POSTEXPIRATOR_DEBUG', 0 );
1136
- }
1137
-
1138
- return false;
1139
- }
 
1140
  }
1141
 
1142
 
@@ -1147,20 +1538,31 @@ function postexpirator_debug() {
1147
  *
1148
  * @access private
1149
  */
1150
- function postexpirator_css( $screen_id ) {
1151
- switch ( $screen_id ) {
1152
- case 'post.php':
1153
- case 'post-new.php':
1154
- case 'settings_page_post-expirator':
1155
- wp_enqueue_style( 'postexpirator-css', POSTEXPIRATOR_BASEURL . '/assets/css/style.css', array(), POSTEXPIRATOR_VERSION );
1156
- break;
1157
- case 'edit.php':
1158
- wp_enqueue_style( 'postexpirator-edit', POSTEXPIRATOR_BASEURL . '/assets/css/edit.css', array(), POSTEXPIRATOR_VERSION );
1159
- break;
1160
- }
 
 
 
 
 
 
 
 
 
 
 
1161
  }
1162
 
1163
- add_action( 'admin_enqueue_scripts', 'postexpirator_css', 10, 1 );
1164
 
1165
  /**
1166
  * Post Expirator Activation/Upgrade
@@ -1169,86 +1571,97 @@ add_action( 'admin_enqueue_scripts', 'postexpirator_css', 10, 1 );
1169
  *
1170
  * @access private
1171
  */
1172
- function postexpirator_upgrade() {
1173
-
1174
- // Check for current version, if not exists, run activation
1175
- $version = get_option( 'postexpiratorVersion' );
1176
- if ( $version === false ) { // not installed, run default activation
1177
- postexpirator_activate();
1178
- update_option( 'postexpiratorVersion', POSTEXPIRATOR_VERSION );
1179
- } else {
1180
- if ( version_compare( $version, '1.6.1' ) === - 1 ) {
1181
- update_option( 'postexpiratorVersion', POSTEXPIRATOR_VERSION );
1182
- update_option( 'expirationdateDefaultDate', POSTEXPIRATOR_EXPIREDEFAULT );
1183
- }
1184
-
1185
- if ( version_compare( $version, '1.6.2' ) === - 1 ) {
1186
- update_option( 'postexpiratorVersion', POSTEXPIRATOR_VERSION );
1187
- }
1188
-
1189
- if ( version_compare( $version, '2.0.0-rc1' ) === - 1 ) {
1190
- global $wpdb;
1191
-
1192
- // Schedule Events/Migrate Config
1193
- $results = $wpdb->get_results( $wpdb->prepare( 'select post_id, meta_value from ' . $wpdb->postmeta . ' as postmeta, ' . $wpdb->posts . ' as posts where postmeta.post_id = posts.ID AND postmeta.meta_key = %s AND postmeta.meta_value >= %d', 'expiration-date', time() ) );
1194
- foreach ( $results as $result ) {
1195
- wp_schedule_single_event( $result->meta_value, 'postExpiratorExpire', array( $result->post_id ) );
1196
- $opts = array();
1197
- $opts['id'] = $result->post_id;
1198
- $posttype = get_post_type( $result->post_id );
1199
- if ( $posttype === 'page' ) {
1200
- $opts['expireType'] = strtolower( get_option( 'expirationdateExpiredPageStatus', 'Draft' ) );
1201
- } else {
1202
- $opts['expireType'] = strtolower( get_option( 'expirationdateExpiredPostStatus', 'Draft' ) );
1203
- }
1204
-
1205
- $cat = get_post_meta( $result->post_id, '_expiration-date-category', true );
1206
- if ( ( isset( $cat ) && ! empty( $cat ) ) ) {
1207
- $opts['category'] = $cat;
1208
- $opts['expireType'] = 'category';
1209
- }
1210
-
1211
- PostExpirator_Facade::set_expire_principles( $result->post_id, $opts );
1212
-
1213
- }
1214
-
1215
- // update meta key to new format
1216
- $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->postmeta SET meta_key = %s WHERE meta_key = %s", '_expiration-date', 'expiration-date' ) );
1217
-
1218
- // migrate defaults
1219
- $pagedefault = get_option( 'expirationdateExpiredPageStatus' );
1220
- $postdefault = get_option( 'expirationdateExpiredPostStatus' );
1221
- if ( $pagedefault ) {
1222
- update_option( 'expirationdateDefaultsPage', array( 'expireType' => $pagedefault ) );
1223
- }
1224
- if ( $postdefault ) {
1225
- update_option( 'expirationdateDefaultsPost', array( 'expireType' => $postdefault ) );
1226
- }
1227
-
1228
- delete_option( 'expirationdateCronSchedule' );
1229
- delete_option( 'expirationdateAutoEnabled' );
1230
- delete_option( 'expirationdateExpiredPageStatus' );
1231
- delete_option( 'expirationdateExpiredPostStatus' );
1232
- update_option( 'postexpiratorVersion', POSTEXPIRATOR_VERSION );
1233
- }
1234
-
1235
- if ( version_compare( $version, '2.0.1' ) === - 1 ) {
1236
- // Forgot to do this in 2.0.0
1237
- if ( is_multisite() ) {
1238
- global $current_blog;
1239
- wp_clear_scheduled_hook( 'expirationdate_delete_' . $current_blog->blog_id );
1240
- } else {
1241
- wp_clear_scheduled_hook( 'expirationdate_delete' );
1242
- }
1243
-
1244
- update_option( 'postexpiratorVersion', POSTEXPIRATOR_VERSION );
1245
- }
1246
-
1247
- update_option( 'postexpiratorVersion', POSTEXPIRATOR_VERSION );
1248
- }
 
 
 
 
 
 
 
 
 
 
 
1249
  }
1250
 
1251
- add_action( 'admin_init', 'postexpirator_upgrade' );
1252
 
1253
  /**
1254
  * Called at plugin activation
@@ -1257,31 +1670,32 @@ add_action( 'admin_init', 'postexpirator_upgrade' );
1257
  *
1258
  * @access private
1259
  */
1260
- function postexpirator_activate() {
1261
- if ( get_option( 'expirationdateDefaultDateFormat' ) === false ) {
1262
- update_option( 'expirationdateDefaultDateFormat', POSTEXPIRATOR_DATEFORMAT );
1263
- }
1264
- if ( get_option( 'expirationdateDefaultTimeFormat' ) === false ) {
1265
- update_option( 'expirationdateDefaultTimeFormat', POSTEXPIRATOR_TIMEFORMAT );
1266
- }
1267
- if ( get_option( 'expirationdateFooterContents' ) === false ) {
1268
- update_option( 'expirationdateFooterContents', POSTEXPIRATOR_FOOTERCONTENTS );
1269
- }
1270
- if ( get_option( 'expirationdateFooterStyle' ) === false ) {
1271
- update_option( 'expirationdateFooterStyle', POSTEXPIRATOR_FOOTERSTYLE );
1272
- }
1273
- if ( get_option( 'expirationdateDisplayFooter' ) === false ) {
1274
- update_option( 'expirationdateDisplayFooter', POSTEXPIRATOR_FOOTERDISPLAY );
1275
- }
1276
- if ( get_option( 'expirationdateDebug' ) === false ) {
1277
- update_option( 'expirationdateDebug', POSTEXPIRATOR_DEBUGDEFAULT );
1278
- }
1279
- if ( get_option( 'expirationdateDefaultDate' ) === false ) {
1280
- update_option( 'expirationdateDefaultDate', POSTEXPIRATOR_EXPIREDEFAULT );
1281
- }
1282
- if ( get_option( 'expirationdateGutenbergSupport' ) === false ) {
1283
- update_option( 'expirationdateGutenbergSupport', 1 );
1284
- }
 
1285
  }
1286
 
1287
  /**
@@ -1291,38 +1705,39 @@ function postexpirator_activate() {
1291
  *
1292
  * @access private
1293
  */
1294
- function expirationdate_deactivate() {
1295
- global $current_blog;
1296
- delete_option( 'expirationdateExpiredPostStatus' );
1297
- delete_option( 'expirationdateExpiredPageStatus' );
1298
- delete_option( 'expirationdateDefaultDateFormat' );
1299
- delete_option( 'expirationdateDefaultTimeFormat' );
1300
- delete_option( 'expirationdateDisplayFooter' );
1301
- delete_option( 'expirationdateFooterContents' );
1302
- delete_option( 'expirationdateFooterStyle' );
1303
- delete_option( 'expirationdateCategory' );
1304
- delete_option( 'expirationdateCategoryDefaults' );
1305
- delete_option( 'expirationdateDebug' );
1306
- delete_option( 'postexpiratorVersion' );
1307
- delete_option( 'expirationdateCronSchedule' );
1308
- delete_option( 'expirationdateDefaultDate' );
1309
- delete_option( 'expirationdateDefaultDateCustom' );
1310
- delete_option( 'expirationdateAutoEnabled' );
1311
- delete_option( 'expirationdateDefaultsPage' );
1312
- delete_option( 'expirationdateDefaultsPost' );
1313
- delete_option( 'expirationdateGutenbergSupport' );
1314
- // what about custom post types? - how to cleanup?
1315
- if ( is_multisite() ) {
1316
- wp_clear_scheduled_hook( 'expirationdate_delete_' . $current_blog->blog_id );
1317
- } else {
1318
- wp_clear_scheduled_hook( 'expirationdate_delete' );
1319
- }
1320
- require_once( plugin_dir_path( __FILE__ ) . 'post-expirator-debug.php' );
1321
- $debug = new PostExpiratorDebug();
1322
- $debug->removeDbTable();
 
1323
  }
1324
 
1325
- register_deactivation_hook( __FILE__, 'expirationdate_deactivate' );
1326
 
1327
  /**
1328
  * The walker class for category checklist.
@@ -1331,105 +1746,117 @@ register_deactivation_hook( __FILE__, 'expirationdate_deactivate' );
1331
  *
1332
  * @access private
1333
  */
1334
- class Walker_PostExpirator_Category_Checklist extends Walker {
1335
-
1336
- /**
1337
- * What the class handles.
1338
- *
1339
- * @var string
1340
- */
1341
- var $tree_type = 'category';
1342
-
1343
- /**
1344
- * DB fields to use.
1345
- *
1346
- * @var array
1347
- */
1348
- var $db_fields = array( 'parent' => 'parent', 'id' => 'term_id' ); // TODO: decouple this
1349
-
1350
- /**
1351
- * The disabled attribute.
1352
- *
1353
- * @var string
1354
- */
1355
- var $disabled = '';
1356
-
1357
- /**
1358
- * Set the disabled attribute.
1359
- */
1360
- function setDisabled() {
1361
- $this->disabled = 'disabled="disabled"';
1362
- }
1363
-
1364
- /**
1365
- * Starts the list before the elements are added.
1366
- *
1367
- * The $args parameter holds additional values that may be used with the child
1368
- * class methods. This method is called at the start of the output list.
1369
- *
1370
- * @param string $output Used to append additional content (passed by reference).
1371
- * @param int $depth Depth of the item.
1372
- * @param array $args An array of additional arguments.
1373
- */
1374
- function start_lvl( &$output, $depth = 0, $args = array() ) {
1375
- $indent = str_repeat( "\t", $depth );
1376
- $output .= "$indent<ul class='children'>\n";
1377
- }
1378
-
1379
- /**
1380
- * Ends the list of after the elements are added.
1381
- *
1382
- * The $args parameter holds additional values that may be used with the child
1383
- * class methods. This method finishes the list at the end of output of the elements.
1384
- *
1385
- * @param string $output Used to append additional content (passed by reference).
1386
- * @param int $depth Depth of the item.
1387
- * @param array $args An array of additional arguments.
1388
- */
1389
- function end_lvl( &$output, $depth = 0, $args = array() ) {
1390
- $indent = str_repeat( "\t", $depth );
1391
- $output .= "$indent</ul>\n";
1392
- }
1393
-
1394
- /**
1395
- * Start the element output.
1396
- *
1397
- * The $args parameter holds additional values that may be used with the child
1398
- * class methods. Includes the element output also.
1399
- *
1400
- * @param string $output Used to append additional content (passed by reference).
1401
- * @param object $category The data object.
1402
- * @param int $depth Depth of the item.
1403
- * @param array $args An array of additional arguments.
1404
- * @param int $current_object_id ID of the current item.
1405
- */
1406
- function start_el( &$output, $category, $depth = 0, $args = array(), $current_object_id = 0 ) {
1407
- // @TODO remove extract
1408
- // phpcs:ignore WordPress.PHP.DontExtract.extract_extract
1409
- extract( $args );
1410
- if ( empty( $taxonomy ) ) {
1411
- $taxonomy = 'category';
1412
- }
1413
-
1414
- $name = 'expirationdate_category';
1415
-
1416
- $class = in_array( $category->term_id, $popular_cats, true ) ? ' class="expirator-category"' : '';
1417
- $output .= "\n<li id='expirator-{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="' . $name . '[]" id="expirator-in-' . $taxonomy . '-' . $category->term_id . '"' . checked( in_array( $category->term_id, $selected_cats, true ), true, false ) . disabled( empty( $args['disabled'] ), false, false ) . ' ' . $this->disabled . '/> ' . esc_html( apply_filters( 'the_category', $category->name ) ) . '</label>';
1418
- }
1419
-
1420
- /**
1421
- * Ends the element output, if needed.
1422
- *
1423
- * The $args parameter holds additional values that may be used with the child class methods.
1424
- *
1425
- * @param string $output Used to append additional content (passed by reference).
1426
- * @param object $category The data object.
1427
- * @param int $depth Depth of the item.
1428
- * @param array $args An array of additional arguments.
1429
- */
1430
- function end_el( &$output, $category, $depth = 0, $args = array() ) {
1431
- $output .= "</li>\n";
1432
- }
 
 
 
 
 
 
 
 
 
 
 
 
1433
  }
1434
 
1435
  /**
@@ -1439,12 +1866,13 @@ class Walker_PostExpirator_Category_Checklist extends Walker {
1439
  *
1440
  * @access private
1441
  */
1442
- function _postexpirator_expire_type( $opts ) {
1443
- if ( empty( $opts ) ) {
1444
- return false;
1445
- }
 
1446
 
1447
- PostExpirator_Display::getInstance()->render_template( 'how-to-expire', array( 'opts' => $opts ) );
1448
  }
1449
 
1450
  /**
@@ -1454,52 +1882,56 @@ function _postexpirator_expire_type( $opts ) {
1454
  *
1455
  * @access private
1456
  */
1457
- function _postexpirator_taxonomy( $opts ) {
1458
- if ( empty( $opts ) ) {
1459
- return false;
1460
- }
1461
-
1462
- // @TODO remove extract
1463
- // phpcs:ignore WordPress.PHP.DontExtract.extract_extract
1464
- extract( $opts );
1465
- if ( ! isset( $name ) ) {
1466
- return false;
1467
- }
1468
- if ( ! isset( $id ) ) {
1469
- $id = $name;
1470
- }
1471
- if ( ! isset( $disabled ) ) {
1472
- $disabled = false;
1473
- }
1474
- if ( ! isset( $onchange ) ) {
1475
- $onchange = '';
1476
- }
1477
- if ( ! isset( $type ) ) {
1478
- $type = '';
1479
- }
1480
-
1481
- $taxonomies = get_object_taxonomies( $type, 'object' );
1482
- $taxonomies = wp_filter_object_list( $taxonomies, array( 'hierarchical' => true ) );
1483
-
1484
- if ( empty( $taxonomies ) ) {
1485
- $disabled = true;
1486
- }
1487
-
1488
- $rv = array();
1489
- if ( $taxonomies ) {
1490
- // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1491
- $rv[] = '<select name="' . $name . '" id="' . $id . '"' . ( $disabled == true ? ' disabled="disabled"' : '' ) . ' onchange="' . $onchange . '">';
1492
- foreach ( $taxonomies as $taxonomy ) {
1493
- $rv[] = '<option value="' . $taxonomy->name . '" ' . ( $selected === $taxonomy->name ? 'selected="selected"' : '' ) . '>' . $taxonomy->label . '</option>';
1494
- }
1495
-
1496
- $rv[] = '</select>';
1497
- $rv[] = '<p class="description">' . __( 'Select the hierarchical taxonomy to be used for "category" based expiration.', 'post-expirator' ) . '</p>';
1498
- } else {
1499
- $rv[] = __( 'No taxonomies found', 'post-expirator' );
1500
- }
1501
-
1502
- return implode( "<br/>\n", $rv );
 
 
 
 
1503
  }
1504
 
1505
  /**
@@ -1509,23 +1941,24 @@ function _postexpirator_taxonomy( $opts ) {
1509
  *
1510
  * @access private
1511
  */
1512
- function postexpirator_quickedit_javascript() {
1513
- // if using code as plugin
1514
- wp_enqueue_script( 'postexpirator-edit', POSTEXPIRATOR_BASEURL . '/assets/js/admin-edit.js', array(
1515
- 'jquery',
1516
- 'inline-edit-post'
1517
- ), POSTEXPIRATOR_VERSION, true );
1518
- wp_localize_script(
1519
- 'postexpirator-edit', 'config', array(
1520
- 'ajax' => array(
1521
- 'nonce' => wp_create_nonce( POSTEXPIRATOR_SLUG ),
1522
- 'bulk_edit' => 'manage_wp_posts_using_bulk_quick_save_bulk_edit',
1523
- ),
1524
- )
1525
- );
 
1526
  }
1527
 
1528
- add_action( 'admin_print_scripts-edit.php', 'postexpirator_quickedit_javascript' );
1529
 
1530
  /**
1531
  * Receives AJAX call from bulk edit to process save.
@@ -1534,113 +1967,116 @@ add_action( 'admin_print_scripts-edit.php', 'postexpirator_quickedit_javascript'
1534
  *
1535
  * @access private
1536
  */
1537
- function postexpirator_date_save_bulk_edit() {
1538
- check_ajax_referer( POSTEXPIRATOR_SLUG, 'nonce' );
1539
-
1540
- $facade = PostExpirator_Facade::getInstance();
1541
-
1542
- if ( ! $facade->current_user_can_expire_posts() ) {
1543
- wp_die( __( 'You\'re not allowed to set posts to expire', 'post-expirator' ), __( 'Forbidden', 'post-expirator' ), 403 );
1544
- }
1545
-
1546
- // we need the post IDs
1547
- $post_ids = ( isset( $_POST['post_ids'] ) && ! empty( $_POST['post_ids'] ) ) ? $_POST['post_ids'] : null;
1548
-
1549
- // if we have post IDs
1550
- if ( ! empty( $post_ids ) && is_array( $post_ids ) ) {
1551
-
1552
- $status = $_POST['expirationdate_status'];
1553
-
1554
- // if no change, do nothing
1555
- if ( $status === 'no-change' ) {
1556
- return;
1557
- }
1558
-
1559
- $month = intval( $_POST['expirationdate_month'] );
1560
- $day = intval( $_POST['expirationdate_day'] );
1561
- $year = intval( $_POST['expirationdate_year'] );
1562
- $hour = intval( $_POST['expirationdate_hour'] );
1563
- $minute = intval( $_POST['expirationdate_minute'] );
1564
-
1565
- // default to current date and/or year if not provided by user.
1566
- if ( empty( $day ) ) {
1567
- $day = date( 'd' );
1568
- }
1569
- if ( empty( $year ) ) {
1570
- $year = date( 'Y' );
1571
- }
1572
-
1573
- $ts = get_gmt_from_date( "$year-$month-$day $hour:$minute:0", 'U' );
1574
-
1575
- if ( ! $ts ) {
1576
- return;
1577
- }
1578
-
1579
- foreach ( $post_ids as $post_id ) {
1580
- $ed = get_post_meta( $post_id, '_expiration-date', true );
1581
- $update_expiry = false;
1582
-
1583
- switch ( $status ) {
1584
- case 'change-only':
1585
- $update_expiry = ! empty( $ed );
1586
- break;
1587
- case 'add-only':
1588
- $update_expiry = empty( $ed );
1589
- break;
1590
- case 'change-add':
1591
- $update_expiry = true;
1592
- break;
1593
- case 'remove-only':
1594
- delete_post_meta( $post_id, '_expiration-date' );
1595
- postexpirator_unschedule_event( $post_id );
1596
- break;
1597
- }
1598
-
1599
- if ( $update_expiry ) {
1600
- $opts = PostExpirator_Facade::get_expire_principles( $post_id );
1601
- $opts['expireType'] = $_POST['expirationdate_expiretype'];
1602
-
1603
- if ( in_array( $opts['expireType'], array( 'category', 'category-add', 'category-remove' ), true ) ) {
1604
- $opts['category'] = $_POST['expirationdate_category'];
1605
- }
1606
-
1607
- PostExpirator_Facade::set_expire_principles( $post_id, $opts );
1608
- update_post_meta( $post_id, '_expiration-date', $ts );
1609
- postexpirator_schedule_event( $post_id, $ts, null );
1610
- }
1611
- }
1612
- }
 
1613
  }
1614
 
1615
- add_action( 'wp_ajax_manage_wp_posts_using_bulk_quick_save_bulk_edit', 'postexpirator_date_save_bulk_edit' );
1616
 
1617
  /**
1618
  * Autoloads the classes.
1619
  */
1620
- function postexpirator_autoload( $class ) {
1621
- $namespaces = array( 'PostExpirator' );
1622
- foreach ( $namespaces as $namespace ) {
1623
- if ( substr( $class, 0, strlen( $namespace ) ) === $namespace ) {
1624
- $class = str_replace( '_', '', strstr( $class, '_' ) );
1625
- $filename = plugin_dir_path( __FILE__ ) . 'classes/' . sprintf( '%s.class.php', $class );
1626
- if ( is_readable( $filename ) ) {
1627
- require_once $filename;
1628
-
1629
- return true;
1630
- }
1631
- }
1632
- }
1633
-
1634
- return false;
 
1635
  }
1636
 
1637
- spl_autoload_register( 'postexpirator_autoload' );
1638
 
1639
  /**
1640
  * Launch the plugin by initializing its helpers.
1641
  */
1642
- function postexpirator_launch() {
1643
- PostExpirator_Facade::getInstance();
 
1644
  }
1645
 
1646
  postexpirator_launch();
4
  Plugin URI: http://wordpress.org/extend/plugins/post-expirator/
5
  Description: Allows you to add an expiration date (minute) to posts which you can configure to either delete the post, change it to a draft, or update the post categories at expiration time.
6
  Author: PublishPress
7
+ Version: 2.6.1
8
  Author URI: http://publishpress.com
9
  Text Domain: post-expirator
10
  Domain Path: /languages
11
  */
12
 
13
  // Default Values
14
+ define('POSTEXPIRATOR_VERSION', '2.6.1');
15
+ define('POSTEXPIRATOR_DATEFORMAT', __('l F jS, Y', 'post-expirator'));
16
+ define('POSTEXPIRATOR_TIMEFORMAT', __('g:ia', 'post-expirator'));
17
+ define('POSTEXPIRATOR_FOOTERCONTENTS', __('Post expires at EXPIRATIONTIME on EXPIRATIONDATE', 'post-expirator'));
18
+ define('POSTEXPIRATOR_FOOTERSTYLE', 'font-style: italic;');
19
+ define('POSTEXPIRATOR_FOOTERDISPLAY', '0');
20
+ define('POSTEXPIRATOR_EMAILNOTIFICATION', '0');
21
+ define('POSTEXPIRATOR_EMAILNOTIFICATIONADMINS', '0');
22
+ define('POSTEXPIRATOR_DEBUGDEFAULT', '0');
23
+ define('POSTEXPIRATOR_EXPIREDEFAULT', 'null');
24
+ define('POSTEXPIRATOR_SLUG', 'post-expirator');
25
+ define('POSTEXPIRATOR_BASEDIR', dirname(__FILE__));
26
+ define('POSTEXPIRATOR_BASENAME', basename(__FILE__));
27
+ define('POSTEXPIRATOR_BASEURL', plugins_url('/', __FILE__));
28
 
29
  require_once POSTEXPIRATOR_BASEDIR . '/functions.php';
30
+ require_once POSTEXPIRATOR_BASEDIR . '/vendor/autoload.php';
31
 
32
 
33
  /**
37
  *
38
  * @access private
39
  */
40
+ function postexpirator_plugin_action_links($links, $file)
41
+ {
42
+ $this_plugin = basename(plugin_dir_url(__FILE__)) . '/post-expirator.php';
43
+ if ($file === $this_plugin) {
44
+ $links[] = '<a href="options-general.php?page=post-expirator">' . __('Settings', 'post-expirator') . '</a>';
45
+ }
46
+
47
+ return $links;
48
  }
49
 
50
+ add_filter('plugin_action_links', 'postexpirator_plugin_action_links', 10, 2);
51
 
52
  /**
53
  * Load translation, if it exists.
56
  *
57
  * @access private
58
  */
59
+ function postexpirator_init()
60
+ {
61
+ $plugin_dir = basename(dirname(__FILE__));
62
+ load_plugin_textdomain('post-expirator', null, $plugin_dir . '/languages/');
63
+
64
+ PostExpirator_Reviews::init();
65
  }
66
 
67
+ add_action('plugins_loaded', 'postexpirator_init');
68
 
69
  /**
70
  * Adds an 'Expires' column to the post display table.
73
  *
74
  * @access private
75
  */
76
+ function postexpirator_add_column($columns, $type)
77
+ {
78
+ $defaults = get_option('expirationdateDefaults' . ucfirst($type));
79
+ // if settings are not configured, show the metabox by default only for posts and pages
80
+ if ((! isset($defaults['activeMetaBox']) && in_array($type, array(
81
+ 'post',
82
+ 'page'
83
+ ), true)) || (is_array(
84
+ $defaults
85
+ ) && $defaults['activeMetaBox'] === 'active')) {
86
+ $columns['expirationdate'] = __('Expires', 'post-expirator');
87
+ }
88
+
89
+ return $columns;
90
  }
91
 
92
+ add_filter('manage_posts_columns', 'postexpirator_add_column', 10, 2);
93
 
94
  /**
95
  * Adds sortable columns.
98
  *
99
  * @access private
100
  */
101
+ function postexpirator_manage_sortable_columns()
102
+ {
103
+ $post_types = postexpirator_get_post_types();
104
+ foreach ($post_types as $post_type) {
105
+ add_filter('manage_edit-' . $post_type . '_sortable_columns', 'postexpirator_sortable_column');
106
+ }
107
  }
108
 
109
+ add_action('init', 'postexpirator_manage_sortable_columns', 100);
110
 
111
  /**
112
  * Adds an 'Expires' column to the post display table.
115
  *
116
  * @access private
117
  */
118
+ function postexpirator_sortable_column($columns)
119
+ {
120
+ $columns['expirationdate'] = 'expirationdate';
121
 
122
+ return $columns;
123
  }
124
 
125
  /**
129
  *
130
  * @access private
131
  */
132
+ function postexpirator_orderby($query)
133
+ {
134
+ if (! is_admin()) {
135
+ return;
136
+ }
137
+
138
+ $orderby = $query->get('orderby');
139
+
140
+ if ('expirationdate' === $orderby) {
141
+ $query->set(
142
+ 'meta_query', array(
143
+ 'relation' => 'OR',
144
+ array(
145
+ 'key' => '_expiration-date',
146
+ 'compare' => 'EXISTS',
147
+ ),
148
+ array(
149
+ 'key' => '_expiration-date',
150
+ 'compare' => 'NOT EXISTS',
151
+ 'value' => '',
152
+ ),
153
+ )
154
+ );
155
+ $query->set('orderby', 'meta_value_num');
156
+ }
157
  }
158
 
159
+ add_action('pre_get_posts', 'postexpirator_orderby');
160
 
161
  /**
162
  * Adds an 'Expires' column to the page display table.
165
  *
166
  * @access private
167
  */
168
+ function postexpirator_add_column_page($columns)
169
+ {
170
+ $defaults = get_option('expirationdateDefaultsPage');
171
+ if (! isset($defaults['activeMetaBox']) || $defaults['activeMetaBox'] === 'active') {
172
+ $columns['expirationdate'] = __('Expires', 'post-expirator');
173
+ }
174
+
175
+ return $columns;
176
  }
177
 
178
+ add_filter('manage_pages_columns', 'postexpirator_add_column_page');
179
 
180
  /**
181
  * Fills the 'Expires' column of the post display table.
184
  *
185
  * @access private
186
  */
187
+ function postexpirator_show_value($column_name)
188
+ {
189
+ if ($column_name !== 'expirationdate') {
190
+ return;
191
+ }
192
+
193
+ global $post;
194
+
195
+ // get the attributes that quick edit functionality requires
196
+ // and save it as a JSON encoded HTML attribute
197
+ $attributes = PostExpirator_Facade::get_expire_principles($post->ID);
198
+ PostExpirator_Display::getInstance()->render_template('expire-column', array(
199
+ 'id' => $post->ID,
200
+ 'post_type' => $post->post_type,
201
+ 'attributes' => $attributes
202
+ ));
203
  }
204
 
205
+ add_action('manage_posts_custom_column', 'postexpirator_show_value');
206
+ add_action('manage_pages_custom_column', 'postexpirator_show_value');
207
 
208
 
209
  /**
213
  *
214
  * @access private
215
  */
216
+ function postexpirator_quickedit($column_name, $post_type)
217
+ {
218
+ if ($column_name !== 'expirationdate') {
219
+ return;
220
+ }
221
+
222
+ $facade = PostExpirator_Facade::getInstance();
223
+
224
+ if (! $facade->current_user_can_expire_posts()) {
225
+ return;
226
+ }
227
+
228
+ $defaults = get_option('expirationdateDefaults' . ucfirst($post_type));
229
+ $taxonomy = isset($defaults['taxonomy']) ? $defaults['taxonomy'] : '';
230
+ $label = '';
231
+
232
+ // if settings have not been configured and this is the default post type
233
+ if (empty($taxonomy) && 'post' === $post_type) {
234
+ $taxonomy = 'category';
235
+ }
236
+
237
+ if (! empty($taxonomy)) {
238
+ $tax_object = get_taxonomy($taxonomy);
239
+ $label = $tax_object ? $tax_object->label : '';
240
+ }
241
+
242
+ PostExpirator_Display::getInstance()->render_template('quick-edit', array(
243
+ 'post_type' => $post_type,
244
+ 'taxonomy' => $taxonomy,
245
+ 'tax_label' => $label
246
+ ));
247
  }
248
 
249
+ add_action('quick_edit_custom_box', 'postexpirator_quickedit', 10, 2);
250
 
251
  /**
252
  * Bulk Edit functionality.
255
  *
256
  * @access private
257
  */
258
+ function postexpirator_bulkedit($column_name, $post_type)
259
+ {
260
+ if ($column_name !== 'expirationdate') {
261
+ return;
262
+ }
263
+
264
+ $facade = PostExpirator_Facade::getInstance();
265
+
266
+ if (! $facade->current_user_can_expire_posts()) {
267
+ return;
268
+ }
269
+
270
+ $defaults = get_option('expirationdateDefaults' . ucfirst($post_type));
271
+ $taxonomy = isset($defaults['taxonomy']) ? $defaults['taxonomy'] : '';
272
+ $label = '';
273
+
274
+ // if settings have not been configured and this is the default post type
275
+ if (empty($taxonomy) && 'post' === $post_type) {
276
+ $taxonomy = 'category';
277
+ }
278
+
279
+ if (! empty($taxonomy)) {
280
+ $tax_object = get_taxonomy($taxonomy);
281
+ $label = $tax_object ? $tax_object->label : '';
282
+ }
283
+
284
+ PostExpirator_Display::getInstance()->render_template('bulk-edit', array(
285
+ 'post_type' => $post_type,
286
+ 'taxonomy' => $taxonomy,
287
+ 'tax_label' => $label
288
+ ));
289
  }
290
 
291
+ add_action('bulk_edit_custom_box', 'postexpirator_bulkedit', 10, 2);
292
 
293
  /**
294
  * Returns the post types that are supported.
297
  *
298
  * @access private
299
  */
300
+ function postexpirator_get_post_types()
301
+ {
302
+ $post_types = get_post_types(array('public' => true));
303
+ $post_types = array_merge(
304
+ $post_types,
305
+ get_post_types(array(
306
+ 'public' => false,
307
+ 'show_ui' => true,
308
+ '_builtin' => false
309
+ ))
310
+ );
311
+
312
+ // in case some post types should not be supported.
313
+ $unset_post_types = apply_filters('postexpirator_unset_post_types', array('attachment'));
314
+ if ($unset_post_types) {
315
+ foreach ($unset_post_types as $type) {
316
+ unset($post_types[$type]);
317
+ }
318
+ }
319
+
320
+ return $post_types;
321
  }
322
 
323
  /**
327
  *
328
  * @access private
329
  */
330
+ function postexpirator_meta_custom()
331
+ {
332
+ $facade = PostExpirator_Facade::getInstance();
333
+
334
+ if (! $facade->current_user_can_expire_posts()) {
335
+ return;
336
+ }
337
+
338
+ $post_types = postexpirator_get_post_types();
339
+ foreach ($post_types as $type) {
340
+ $defaults = get_option('expirationdateDefaults' . ucfirst($type));
341
+ // if settings are not configured, show the metabox by default only for posts and pages
342
+ if ((! isset($defaults['activeMetaBox']) && in_array($type, array(
343
+ 'post',
344
+ 'page'
345
+ ), true)) || (is_array(
346
+ $defaults
347
+ ) && $defaults['activeMetaBox'] === 'active')) {
348
+ add_meta_box(
349
+ 'expirationdatediv',
350
+ __('Post Expirator', 'post-expirator'),
351
+ 'postexpirator_meta_box',
352
+ $type,
353
+ 'side',
354
+ 'core',
355
+ array('__back_compat_meta_box' => PostExpirator_Facade::show_gutenberg_metabox())
356
+ );
357
+ }
358
+ }
359
  }
360
 
361
+ add_action('add_meta_boxes', 'postexpirator_meta_custom');
362
 
363
  /**
364
  * Actually adds the meta box
367
  *
368
  * @access private
369
  */
370
+ function postexpirator_meta_box($post)
371
+ {
372
+ // Get default month
373
+ $expirationdatets = get_post_meta($post->ID, '_expiration-date', true);
374
+ $firstsave = get_post_meta($post->ID, '_expiration-date-status', true);
375
+
376
+ $default = $expireType = $enabled = $defaultmonth = $defaultday = $defaulthour = $defaultyear = $defaultminute = $categories = '';
377
+ $defaults = get_option('expirationdateDefaults' . ucfirst($post->post_type));
378
+ if (empty($expirationdatets)) {
379
+ $default_expiry = PostExpirator_Facade::get_default_expiry($post->post_type);
380
+
381
+ $defaultmonth = $default_expiry['month'];
382
+ $defaultday = $default_expiry['day'];
383
+ $defaulthour = $default_expiry['hour'];
384
+ $defaultyear = $default_expiry['year'];
385
+ $defaultminute = $default_expiry['minute'];
386
+
387
+ $enabled = '';
388
+ $categories = get_option('expirationdateCategoryDefaults');
389
+
390
+ if (isset($defaults['expireType'])) {
391
+ $expireType = $defaults['expireType'];
392
+ }
393
+
394
+ // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
395
+ if (isset($defaults['autoEnable']) && ($firstsave !== 'saved') && ($defaults['autoEnable'] === true || $defaults['autoEnable'] == 1)) {
396
+ $enabled = ' checked="checked"';
397
+ }
398
+ } else {
399
+ $defaultmonth = get_date_from_gmt(gmdate('Y-m-d H:i:s', $expirationdatets), 'm');
400
+ $defaultday = get_date_from_gmt(gmdate('Y-m-d H:i:s', $expirationdatets), 'd');
401
+ $defaultyear = get_date_from_gmt(gmdate('Y-m-d H:i:s', $expirationdatets), 'Y');
402
+ $defaulthour = get_date_from_gmt(gmdate('Y-m-d H:i:s', $expirationdatets), 'H');
403
+ $defaultminute = get_date_from_gmt(gmdate('Y-m-d H:i:s', $expirationdatets), 'i');
404
+ $enabled = ' checked="checked"';
405
+
406
+ $attributes = PostExpirator_Facade::get_expire_principles($post->ID);
407
+ $expireType = $attributes['expireType'];
408
+ $categories = $attributes['category'];
409
+ }
410
+
411
+ PostExpirator_Display::getInstance()->render_template(
412
+ 'classic-metabox', array(
413
+ 'post' => $post,
414
+ 'enabled' => $enabled,
415
+ 'default' => $default,
416
+ 'defaultmonth' => $defaultmonth,
417
+ 'defaultday' => $defaultday,
418
+ 'defaulthour' => $defaulthour,
419
+ 'defaultyear' => $defaultyear,
420
+ 'defaultminute' => $defaultminute,
421
+ 'categories' => $categories,
422
+ 'expireType' => $expireType,
423
+ )
424
+ );
425
  }
426
 
427
  /**
431
  *
432
  * @access private
433
  */
434
+ function postexpirator_js_admin_header()
435
+ {
436
+ $facade = PostExpirator_Facade::getInstance();
437
+
438
+ if (! $facade->current_user_can_expire_posts()) {
439
+ return;
440
+ }
441
+ ?>
442
+ <script type="text/javascript">
443
  //<![CDATA[
444
  (function ($) {
445
  $(document).ready(function () {
465
  }
466
  })(jQuery);
467
  //]]>
468
+ </script>
469
+ <?php
470
  }
471
 
472
+ add_action('admin_head', 'postexpirator_js_admin_header');
473
 
474
  /**
475
  * Get correct URL (HTTP or HTTPS)
478
  *
479
  * @access private
480
  */
481
+ function expirationdate_get_blog_url()
482
+ {
483
+ if (is_multisite()) {
484
+ echo network_home_url('/');
485
+ } else {
486
+ echo home_url('/');
487
+ }
488
  }
489
 
490
  /**
494
  *
495
  * @access private
496
  */
497
+ function postexpirator_update_post_meta($id)
498
+ {
499
+ // don't run the echo if this is an auto save
500
+ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
501
+ return;
502
+ }
503
+
504
+ // don't run the echo if the function is called for saving revision.
505
+ $posttype = get_post_type($id);
506
+ if ($posttype === 'revision') {
507
+ return;
508
+ }
509
+
510
+ // Do not process Bulk edit here
511
+ if (isset($_GET['postexpirator_view']) && $_GET['postexpirator_view'] === 'bulk-edit') {
512
+ return;
513
+ }
514
+
515
+ $facade = PostExpirator_Facade::getInstance();
516
+
517
+ if (! $facade->current_user_can_expire_posts()) {
518
+ return;
519
+ }
520
+
521
+ $shouldSchedule = false;
522
+ $ts = null;
523
+ $opts = [];
524
+
525
+ if (isset($_POST['postexpirator_view'])) {
526
+ // Classic editor, quick edit
527
+ $shouldSchedule = isset($_POST['enable-expirationdate']);
528
+
529
+ $default = get_option('expirationdateDefaultDate', POSTEXPIRATOR_EXPIREDEFAULT);
530
+ if ($default === 'publish') {
531
+ $month = intval($_POST['mm']);
532
+ $day = intval($_POST['jj']);
533
+ $year = intval($_POST['aa']);
534
+ $hour = intval($_POST['hh']);
535
+ $minute = intval($_POST['mn']);
536
+ } else {
537
+ $month = intval($_POST['expirationdate_month']);
538
+ $day = intval($_POST['expirationdate_day']);
539
+ $year = intval($_POST['expirationdate_year']);
540
+ $hour = intval($_POST['expirationdate_hour']);
541
+ $minute = intval($_POST['expirationdate_minute']);
542
+
543
+ if (empty($day)) {
544
+ $day = date('d');
545
+ }
546
+ if (empty($year)) {
547
+ $year = date('Y');
548
+ }
549
+ }
550
+ $category = isset($_POST['expirationdate_category']) ? $_POST['expirationdate_category'] : 0;
551
+
552
+ $ts = get_gmt_from_date("$year-$month-$day $hour:$minute:0", 'U');
553
+
554
+ if (isset($_POST['expirationdate_quickedit'])) {
555
+ $ed = get_post_meta($id, '_expiration-date', true);
556
+ if ($ed) {
557
+ $opts = PostExpirator_Facade::get_expire_principles($id);
558
+ if (isset($_POST['expirationdate_expiretype'])) {
559
+ $opts['expireType'] = $_POST['expirationdate_expiretype'];
560
+ if (in_array($opts['expireType'], array(
561
+ 'category',
562
+ 'category-add',
563
+ 'category-remove'
564
+ ), true)) {
565
+ $opts['category'] = $_POST['expirationdate_category'];
566
+ }
567
+ }
568
+ }
569
+ } else {
570
+ // Schedule/Update Expiration
571
+ $opts['expireType'] = $_POST['expirationdate_expiretype'];
572
+ $opts['id'] = $id;
573
+
574
+ if ($opts['expireType'] === 'category' || $opts['expireType'] === 'category-add' || $opts['expireType'] === 'category-remove') {
575
+ if (isset($category) && ! empty($category)) {
576
+ if (! empty($category)) {
577
+ $opts['category'] = $category;
578
+ $opts['categoryTaxonomy'] = $_POST['taxonomy-heirarchical'];
579
+ }
580
+ }
581
+ }
582
+ }
583
+ } else {
584
+ // Gutenberg or script
585
+ $payload = @file_get_contents('php://input');
586
+
587
+ if (empty($payload)) {
588
+ $debug = postexpirator_debug();
589
+
590
+ if (POSTEXPIRATOR_DEBUG) {
591
+ $debug->save(
592
+ array(
593
+ 'message' => $id . ' -> NO PAYLOAD ON SAVE_POST'
594
+ )
595
+ );
596
+ }
597
+
598
+ return;
599
+ }
600
+
601
+ $payload = @json_decode($payload, true);
602
+
603
+ if (isset($payload['meta'])) {
604
+ if (isset($payload['meta']['_expiration-date-status'])) {
605
+ $shouldSchedule = $payload['meta']['_expiration-date-status'] === 'saved';
606
+ } else {
607
+ $shouldSchedule = get_post_meta($id, '_expiration-date-status', true) === 'saved';
608
+ }
609
+
610
+ if (isset($payload['meta']['_expiration-date'])) {
611
+ $ts = $payload['meta']['_expiration-date'];
612
+ } else {
613
+ $ts = get_post_meta($id, '_expiration-date', true);
614
+ }
615
+
616
+ if (isset($payload['meta']['_expiration-date-type'])) {
617
+ $opts[expireType] = $payload['meta']['_expiration-date-type'];
618
+ } else {
619
+ $opts[expireType] = get_post_meta($id, '_expiration-date-type', true);
620
+ }
621
+
622
+ if (isset($payload['meta']['_expiration-date-categories'])) {
623
+ $opts['category'] = (array)$payload['meta']['_expiration-date-categories'];
624
+ } else {
625
+ $opts['category'] = (array)get_post_meta($id, '_expiration-date-categories', true);
626
+ }
627
+ } else {
628
+ $shouldSchedule = get_post_meta($id, '_expiration-date-status', true) === 'saved';
629
+
630
+ if ($shouldSchedule) {
631
+ $ts = get_post_meta($id, '_expiration-date', true);
632
+
633
+ $opts['expireType'] = get_post_meta($id, '_expiration-date-type', true);
634
+ $opts['category'] = (array)get_post_meta($id, '_expiration-date-categories', true);
635
+ }
636
+ }
637
+ }
638
+
639
+ if ($shouldSchedule) {
640
+ $opts['id'] = $id;
641
+ postexpirator_schedule_event($id, $ts, $opts);
642
+ } else {
643
+ postexpirator_unschedule_event($id);
644
+ }
645
  }
646
 
647
+ add_action('save_post', 'postexpirator_update_post_meta');
648
 
649
  /**
650
  * Schedules the single event.
653
  *
654
  * @access private
655
  */
656
+ function postexpirator_schedule_event($id, $ts, $opts)
657
+ {
658
+ $debug = postexpirator_debug(); // check for/load debug
659
+
660
+ $id = intval($id);
661
+
662
+ do_action('postexpiratior_schedule', $id, $ts, $opts); // allow custom actions
663
+
664
+ if (wp_next_scheduled('postExpiratorExpire', array($id)) !== false) {
665
+ $error = wp_clear_scheduled_hook('postExpiratorExpire', array($id), true); // Remove any existing hooks
666
+ if (POSTEXPIRATOR_DEBUG) {
667
+ $debug->save(
668
+ array(
669
+ 'message' => $id . ' -> EXISTING FOUND - UNSCHEDULED - ' . (is_wp_error(
670
+ $error
671
+ ) ? $error->get_error_message() : 'no error')
672
+ )
673
+ );
674
+ }
675
+ }
676
+
677
+ $error = wp_schedule_single_event($ts, 'postExpiratorExpire', array($id), true);
678
+ if (POSTEXPIRATOR_DEBUG) {
679
+ $debug->save(
680
+ array(
681
+ 'message' => $id . ' -> SCHEDULED at ' . date_i18n(
682
+ 'r',
683
+ $ts
684
+ ) . ' ' . '(' . $ts . ') with options ' . print_r($opts, true) . ' ' . (is_wp_error(
685
+ $error
686
+ ) ? $error->get_error_message() : 'no error')
687
+ )
688
+ );
689
+ }
690
+
691
+ // Update Post Meta
692
+ update_post_meta($id, '_expiration-date', $ts);
693
+ if (! is_null($opts)) {
694
+ PostExpirator_Facade::set_expire_principles($id, $opts);
695
+ }
696
+ update_post_meta($id, '_expiration-date-status', 'saved');
697
  }
698
 
699
  /**
703
  *
704
  * @access private
705
  */
706
+ function postexpirator_unschedule_event($id)
707
+ {
708
+ $debug = postexpirator_debug(); // check for/load debug
709
+
710
+ do_action('postexpiratior_unschedule', $id); // allow custom actions
711
+
712
+ delete_post_meta($id, '_expiration-date');
713
+ delete_post_meta($id, '_expiration-date-options');
714
+ delete_post_meta($id, '_expiration-date-type');
715
+ delete_post_meta($id, '_expiration-date-categories');
716
+ delete_post_meta($id, '_expiration-date-taxonomy');
717
+
718
+ // Delete Scheduled Expiration
719
+ if (wp_next_scheduled('postExpiratorExpire', array($id)) !== false) {
720
+ wp_clear_scheduled_hook('postExpiratorExpire', array($id)); // Remove any existing hooks
721
+ if (POSTEXPIRATOR_DEBUG) {
722
+ $debug->save(array('message' => $id . ' -> UNSCHEDULED'));
723
+ }
724
+ }
725
+ delete_post_meta($id, '_expiration-date-status');
726
  }
727
 
728
  /**
734
  *
735
  * @access private
736
  */
737
+ function postexpirator_expire_post($id)
738
+ {
739
+ $debug = postexpirator_debug(); // check for/load debug
740
+
741
+ if (empty($id)) {
742
+ if (POSTEXPIRATOR_DEBUG) {
743
+ $debug->save(array('message' => 'No Post ID found - exiting'));
744
+ }
745
+
746
+ return false;
747
+ }
748
+
749
+ if (is_null(get_post($id))) {
750
+ if (POSTEXPIRATOR_DEBUG) {
751
+ $debug->save(array('message' => $id . ' -> Post does not exist - exiting'));
752
+ }
753
+
754
+ return false;
755
+ }
756
+
757
+ $posttype = get_post_type($id);
758
+ $posttitle = get_the_title($id);
759
+ $postlink = get_post_permalink($id);
760
+
761
+ $postoptions = PostExpirator_Facade::get_expire_principles($id);
762
+ $expireType = $category = $categoryTaxonomy = null;
763
+
764
+ if (isset($postoptions['expireType'])) {
765
+ $expireType = $postoptions['expireType'];
766
+ }
767
+
768
+ if (isset($postoptions['category'])) {
769
+ $category = $postoptions['category'];
770
+ }
771
+
772
+ if (isset($postoptions['categoryTaxonomy'])) {
773
+ $categoryTaxonomy = $postoptions['categoryTaxonomy'];
774
+ }
775
+
776
+ $ed = get_post_meta($id, '_expiration-date', true);
777
+
778
+ // Check for default expire only if not passed in
779
+ if (empty($expireType)) {
780
+ $posttype = get_post_type($id);
781
+ if ($posttype === 'page') {
782
+ $expireType = strtolower(get_option('expirationdateExpiredPageStatus', POSTEXPIRATOR_PAGESTATUS));
783
+ } elseif ($posttype === 'post') {
784
+ $expireType = strtolower(get_option('expirationdateExpiredPostStatus', 'draft'));
785
+ } else {
786
+ $expireType = apply_filters(
787
+ 'postexpirator_custom_posttype_expire',
788
+ $expireType,
789
+ $posttype
790
+ ); // hook to set defaults for custom post types
791
+ }
792
+ }
793
+
794
+ // Remove KSES - wp_cron runs as an unauthenticated user, which will by default trigger kses filtering,
795
+ // even if the post was published by a admin user. It is fairly safe here to remove the filter call since
796
+ // we are only changing the post status/meta information and not touching the content.
797
+ kses_remove_filters();
798
+
799
+ // Do Work
800
+ if ($expireType === 'draft') {
801
+ if (wp_update_post(array('ID' => $id, 'post_status' => 'draft')) === 0) {
802
+ if (POSTEXPIRATOR_DEBUG) {
803
+ $debug->save(array('message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r($postoptions, true)));
804
+ }
805
+ } else {
806
+ $emailBody = sprintf(
807
+ __(
808
+ '%1$s (%2$s) has expired at %3$s. Post status has been successfully changed to "%4$s".',
809
+ 'post-expirator'
810
+ ),
811
+ '##POSTTITLE##',
812
+ '##POSTLINK##',
813
+ '##EXPIRATIONDATE##',
814
+ strtoupper($expireType)
815
+ );
816
+ if (POSTEXPIRATOR_DEBUG) {
817
+ $debug->save(
818
+ array('message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r($postoptions, true))
819
+ );
820
+ }
821
+ }
822
+ } elseif ($expireType === 'private') {
823
+ if (wp_update_post(array('ID' => $id, 'post_status' => 'private')) === 0) {
824
+ if (POSTEXPIRATOR_DEBUG) {
825
+ $debug->save(array('message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r($postoptions, true)));
826
+ }
827
+ } else {
828
+ $emailBody = sprintf(
829
+ __(
830
+ '%1$s (%2$s) has expired at %3$s. Post status has been successfully changed to "%4$s".',
831
+ 'post-expirator'
832
+ ),
833
+ '##POSTTITLE##',
834
+ '##POSTLINK##',
835
+ '##EXPIRATIONDATE##',
836
+ strtoupper($expireType)
837
+ );
838
+ if (POSTEXPIRATOR_DEBUG) {
839
+ $debug->save(
840
+ array('message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r($postoptions, true))
841
+ );
842
+ }
843
+ }
844
+ } elseif ($expireType === 'delete') {
845
+ if (wp_delete_post($id) === false) {
846
+ if (POSTEXPIRATOR_DEBUG) {
847
+ $debug->save(array('message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r($postoptions, true)));
848
+ }
849
+ } else {
850
+ $emailBody = sprintf(
851
+ __(
852
+ '%1$s (%2$s) has expired at %3$s. Post status has been successfully changed to "%4$s".',
853
+ 'post-expirator'
854
+ ),
855
+ '##POSTTITLE##',
856
+ '##POSTLINK##',
857
+ '##EXPIRATIONDATE##',
858
+ strtoupper($expireType)
859
+ );
860
+ if (POSTEXPIRATOR_DEBUG) {
861
+ $debug->save(
862
+ array('message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r($postoptions, true))
863
+ );
864
+ }
865
+ }
866
+ } elseif ($expireType === 'trash') {
867
+ if (wp_trash_post($id) === false) {
868
+ if (POSTEXPIRATOR_DEBUG) {
869
+ $debug->save(array('message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r($postoptions, true)));
870
+ }
871
+ } else {
872
+ $emailBody = sprintf(
873
+ __(
874
+ '%1$s (%2$s) has expired at %3$s. Post status has been successfully changed to "%4$s".',
875
+ 'post-expirator'
876
+ ),
877
+ '##POSTTITLE##',
878
+ '##POSTLINK##',
879
+ '##EXPIRATIONDATE##',
880
+ strtoupper($expireType)
881
+ );
882
+ if (POSTEXPIRATOR_DEBUG) {
883
+ $debug->save(
884
+ array('message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r($postoptions, true))
885
+ );
886
+ }
887
+ }
888
+ } elseif ($expireType === 'stick') {
889
+ if (stick_post($id) === false) {
890
+ if (POSTEXPIRATOR_DEBUG) {
891
+ $debug->save(array('message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r($postoptions, true)));
892
+ }
893
+ } else {
894
+ $emailBody = sprintf(
895
+ __('%1$s (%2$s) has expired at %3$s. Post "%4$s" status has been successfully set.', 'post-expirator'),
896
+ '##POSTTITLE##',
897
+ '##POSTLINK##',
898
+ '##EXPIRATIONDATE##',
899
+ 'STICKY'
900
+ );
901
+ if (POSTEXPIRATOR_DEBUG) {
902
+ $debug->save(
903
+ array('message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r($postoptions, true))
904
+ );
905
+ }
906
+ }
907
+ } elseif ($expireType === 'unstick') {
908
+ if (unstick_post($id) === false) {
909
+ if (POSTEXPIRATOR_DEBUG) {
910
+ $debug->save(array('message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r($postoptions, true)));
911
+ }
912
+ } else {
913
+ $emailBody = sprintf(
914
+ __(
915
+ '%1$s (%2$s) has expired at %3$s. Post "%4$s" status has been successfully removed.',
916
+ 'post-expirator'
917
+ ),
918
+ '##POSTTITLE##',
919
+ '##POSTLINK##',
920
+ '##EXPIRATIONDATE##',
921
+ 'STICKY'
922
+ );
923
+ if (POSTEXPIRATOR_DEBUG) {
924
+ $debug->save(
925
+ array('message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r($postoptions, true))
926
+ );
927
+ }
928
+ }
929
+ } elseif ($expireType === 'category') {
930
+ if (! empty($category)) {
931
+ if (empty($categoryTaxonomy) || $categoryTaxonomy === 'category') {
932
+ if (wp_update_post(array('ID' => $id, 'post_category' => $category)) === 0) {
933
+ if (POSTEXPIRATOR_DEBUG) {
934
+ $debug->save(
935
+ array('message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r($postoptions, true))
936
+ );
937
+ }
938
+ } else {
939
+ $emailBody = sprintf(
940
+ __(
941
+ '%1$s (%2$s) has expired at %3$s. Post "%4$s" have now been set to "%5$s".',
942
+ 'post-expirator'
943
+ ),
944
+ '##POSTTITLE##',
945
+ '##POSTLINK##',
946
+ '##EXPIRATIONDATE##',
947
+ 'CATEGORIES',
948
+ implode(',', _postexpirator_get_cat_names($category))
949
+ );
950
+ if (POSTEXPIRATOR_DEBUG) {
951
+ $debug->save(
952
+ array('message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r($postoptions, true))
953
+ );
954
+ $debug->save(
955
+ array(
956
+ 'message' => $id . ' -> CATEGORIES REPLACED ' . print_r(
957
+ _postexpirator_get_cat_names($category),
958
+ true
959
+ )
960
+ )
961
+ );
962
+ $debug->save(
963
+ array(
964
+ 'message' => $id . ' -> CATEGORIES COMPLETE ' . print_r(
965
+ _postexpirator_get_cat_names($category),
966
+ true
967
+ )
968
+ )
969
+ );
970
+ }
971
+ }
972
+ } else {
973
+ $terms = array_map('intval', $category);
974
+ if (is_wp_error(wp_set_object_terms($id, $terms, $categoryTaxonomy, false))) {
975
+ if (POSTEXPIRATOR_DEBUG) {
976
+ $debug->save(
977
+ array('message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r($postoptions, true))
978
+ );
979
+ }
980
+ } else {
981
+ $emailBody = sprintf(
982
+ __(
983
+ '%1$s (%2$s) has expired at %3$s. Post "%4$s" have now been set to "%5$s".',
984
+ 'post-expirator'
985
+ ),
986
+ '##POSTTITLE##',
987
+ '##POSTLINK##',
988
+ '##EXPIRATIONDATE##',
989
+ 'CATEGORIES',
990
+ implode(',', _postexpirator_get_cat_names($category))
991
+ );
992
+ if (POSTEXPIRATOR_DEBUG) {
993
+ $debug->save(
994
+ array('message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r($postoptions, true))
995
+ );
996
+ $debug->save(
997
+ array(
998
+ 'message' => $id . ' -> CATEGORIES REPLACED ' . print_r(
999
+ _postexpirator_get_cat_names($category),
1000
+ true
1001
+ )
1002
+ )
1003
+ );
1004
+ $debug->save(
1005
+ array(
1006
+ 'message' => $id . ' -> CATEGORIES COMPLETE ' . print_r(
1007
+ _postexpirator_get_cat_names($category),
1008
+ true
1009
+ )
1010
+ )
1011
+ );
1012
+ }
1013
+ }
1014
+ }
1015
+ } else {
1016
+ if (POSTEXPIRATOR_DEBUG) {
1017
+ $debug->save(
1018
+ array(
1019
+ 'message' => $id . ' -> CATEGORIES MISSING ' . $expireType . ' ' . print_r(
1020
+ $postoptions,
1021
+ true
1022
+ )
1023
+ )
1024
+ );
1025
+ }
1026
+ }
1027
+ } elseif ($expireType === 'category-add') {
1028
+ if (! empty($category)) {
1029
+ if (! isset($categoryTaxonomy) || $categoryTaxonomy === 'category') {
1030
+ $cats = wp_get_post_categories($id);
1031
+ $merged = array_merge($cats, $category);
1032
+ if (wp_update_post(array('ID' => $id, 'post_category' => $merged)) === 0) {
1033
+ if (POSTEXPIRATOR_DEBUG) {
1034
+ $debug->save(
1035
+ array('message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r($postoptions, true))
1036
+ );
1037
+ }
1038
+ } else {
1039
+ $emailBody = sprintf(
1040
+ __(
1041
+ '%1$s (%2$s) has expired at %3$s. The following post "%4$s" have now been added: "%5$s". The full list of categories on the post are: "%6$s".',
1042
+ 'post-expirator'
1043
+ ),
1044
+ '##POSTTITLE##',
1045
+ '##POSTLINK##',
1046
+ '##EXPIRATIONDATE##',
1047
+ 'CATEGORIES',
1048
+ implode(',', _postexpirator_get_cat_names($category)),
1049
+ implode(',', _postexpirator_get_cat_names($merged))
1050
+ );
1051
+ if (POSTEXPIRATOR_DEBUG) {
1052
+ $debug->save(
1053
+ array('message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r($postoptions, true))
1054
+ );
1055
+ $debug->save(
1056
+ array(
1057
+ 'message' => $id . ' -> CATEGORIES ADDED ' . print_r(
1058
+ _postexpirator_get_cat_names($category),
1059
+ true
1060
+ )
1061
+ )
1062
+ );
1063
+ $debug->save(
1064
+ array(
1065
+ 'message' => $id . ' -> CATEGORIES COMPLETE ' . print_r(
1066
+ _postexpirator_get_cat_names($merged),
1067
+ true
1068
+ )
1069
+ )
1070
+ );
1071
+ }
1072
+ }
1073
+ } else {
1074
+ $terms = array_map('intval', $category);
1075
+ if (is_wp_error(wp_set_object_terms($id, $terms, $categoryTaxonomy, true))) {
1076
+ if (POSTEXPIRATOR_DEBUG) {
1077
+ $debug->save(
1078
+ array('message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r($postoptions, true))
1079
+ );
1080
+ }
1081
+ } else {
1082
+ $emailBody = sprintf(
1083
+ __(
1084
+ '%1$s (%2$s) has expired at %3$s. The following post "%4$s" have now been added: "%5$s". The full list of categories on the post are: "%6$s".',
1085
+ 'post-expirator'
1086
+ ),
1087
+ '##POSTTITLE##',
1088
+ '##POSTLINK##',
1089
+ '##EXPIRATIONDATE##',
1090
+ 'CATEGORIES',
1091
+ implode(',', _postexpirator_get_cat_names($category)),
1092
+ implode(',', _postexpirator_get_cat_names($merged))
1093
+ );
1094
+ if (POSTEXPIRATOR_DEBUG) {
1095
+ $debug->save(
1096
+ array('message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r($postoptions, true))
1097
+ );
1098
+ $debug->save(
1099
+ array(
1100
+ 'message' => $id . ' -> CATEGORIES ADDED ' . print_r(
1101
+ _postexpirator_get_cat_names($category),
1102
+ true
1103
+ )
1104
+ )
1105
+ );
1106
+ $debug->save(
1107
+ array(
1108
+ 'message' => $id . ' -> CATEGORIES COMPLETE ' . print_r(
1109
+ _postexpirator_get_cat_names($category),
1110
+ true
1111
+ )
1112
+ )
1113
+ );
1114
+ }
1115
+ }
1116
+ }
1117
+ } else {
1118
+ if (POSTEXPIRATOR_DEBUG) {
1119
+ $debug->save(
1120
+ array(
1121
+ 'message' => $id . ' -> CATEGORIES MISSING ' . $expireType . ' ' . print_r(
1122
+ $postoptions,
1123
+ true
1124
+ )
1125
+ )
1126
+ );
1127
+ }
1128
+ }
1129
+ } elseif ($expireType === 'category-remove') {
1130
+ if (! empty($category)) {
1131
+ if (! isset($categoryTaxonomy) || $categoryTaxonomy === 'category') {
1132
+ $cats = wp_get_post_categories($id);
1133
+ $merged = array();
1134
+ foreach ($cats as $cat) {
1135
+ if (! in_array($cat, $category, false)) {
1136
+ $merged[] = $cat;
1137
+ }
1138
+ }
1139
 
1140
+ if (wp_update_post(array('ID' => $id, 'post_category' => $merged)) === 0) {
1141
+ if (POSTEXPIRATOR_DEBUG) {
1142
+ $debug->save(
1143
+ array('message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r($postoptions, true))
1144
+ );
1145
+ }
1146
+ } else {
1147
+ $emailBody = sprintf(
1148
+ __(
1149
+ '%1$s (%2$s) has expired at %3$s. The following post "%4$s" have now been removed: "%5$s". The full list of categories on the post are: "%6$s".',
1150
+ 'post-expirator'
1151
+ ),
1152
+ '##POSTTITLE##',
1153
+ '##POSTLINK##',
1154
+ '##EXPIRATIONDATE##',
1155
+ 'CATEGORIES',
1156
+ implode(',', _postexpirator_get_cat_names($category)),
1157
+ implode(',', _postexpirator_get_cat_names($merged))
1158
+ );
1159
+ if (POSTEXPIRATOR_DEBUG) {
1160
+ $debug->save(
1161
+ array('message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r($postoptions, true))
1162
+ );
1163
+ $debug->save(
1164
+ array(
1165
+ 'message' => $id . ' -> CATEGORIES REMOVED ' . print_r(
1166
+ _postexpirator_get_cat_names($category),
1167
+ true
1168
+ )
1169
+ )
1170
+ );
1171
+ $debug->save(
1172
+ array(
1173
+ 'message' => $id . ' -> CATEGORIES COMPLETE ' . print_r(
1174
+ _postexpirator_get_cat_names($merged),
1175
+ true
1176
+ )
1177
+ )
1178
+ );
1179
+ }
1180
+ }
1181
+ } else {
1182
+ $terms = wp_get_object_terms($id, $categoryTaxonomy, array('fields' => 'ids'));
1183
+ $merged = array();
1184
+ foreach ($terms as $term) {
1185
+ if (! in_array($term, $category, false)) {
1186
+ $merged[] = $term;
1187
+ }
1188
+ }
1189
+ $terms = array_map('intval', $merged);
1190
+ if (is_wp_error(wp_set_object_terms($id, $terms, $categoryTaxonomy, false))) {
1191
+ if (POSTEXPIRATOR_DEBUG) {
1192
+ $debug->save(
1193
+ array('message' => $id . ' -> FAILED ' . $expireType . ' ' . print_r($postoptions, true))
1194
+ );
1195
+ }
1196
+ } else {
1197
+ $emailBody = sprintf(
1198
+ __(
1199
+ '%1$s (%2$s) has expired at %3$s. The following post "%4$s" have now been removed: "%5$s". The full list of categories on the post are: "%6$s".',
1200
+ 'post-expirator'
1201
+ ),
1202
+ '##POSTTITLE##',
1203
+ '##POSTLINK##',
1204
+ '##EXPIRATIONDATE##',
1205
+ 'CATEGORIES',
1206
+ implode(',', _postexpirator_get_cat_names($category)),
1207
+ implode(',', _postexpirator_get_cat_names($merged))
1208
+ );
1209
+ if (POSTEXPIRATOR_DEBUG) {
1210
+ $debug->save(
1211
+ array('message' => $id . ' -> PROCESSED ' . $expireType . ' ' . print_r($postoptions, true))
1212
+ );
1213
+ $debug->save(
1214
+ array(
1215
+ 'message' => $id . ' -> CATEGORIES REMOVED ' . print_r(
1216
+ _postexpirator_get_cat_names($category),
1217
+ true
1218
+ )
1219
+ )
1220
+ );
1221
+ $debug->save(
1222
+ array(
1223
+ 'message' => $id . ' -> CATEGORIES COMPLETE ' . print_r(
1224
+ _postexpirator_get_cat_names($category),
1225
+ true
1226
+ )
1227
+ )
1228
+ );
1229
+ }
1230
+ }
1231
+ }
1232
+ } else {
1233
+ if (POSTEXPIRATOR_DEBUG) {
1234
+ $debug->save(
1235
+ array(
1236
+ 'message' => $id . ' -> CATEGORIES MISSING ' . $expireType . ' ' . print_r(
1237
+ $postoptions,
1238
+ true
1239
+ )
1240
+ )
1241
+ );
1242
+ }
1243
+ }
1244
+ }
1245
+
1246
+ // Process Email
1247
+ $emailenabled = get_option('expirationdateEmailNotification', POSTEXPIRATOR_EMAILNOTIFICATION);
1248
+ // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1249
+ if ($emailenabled == 1 && isset($emailBody)) {
1250
+ $subj = sprintf(__('Post Expiration Complete "%s"', 'post-expirator'), $posttitle);
1251
+ $emailBody = str_replace('##POSTTITLE##', $posttitle, $emailBody);
1252
+ $emailBody = str_replace('##POSTLINK##', $postlink, $emailBody);
1253
+ $emailBody = str_replace(
1254
+ '##EXPIRATIONDATE##',
1255
+ get_date_from_gmt(
1256
+ gmdate('Y-m-d H:i:s', $ed),
1257
+ get_option('date_format') . ' ' . get_option('time_format')
1258
+ ),
1259
+ $emailBody
1260
+ );
1261
+
1262
+ $emails = array();
1263
+ // Get Blog Admins
1264
+ $emailadmins = get_option('expirationdateEmailNotificationAdmins', POSTEXPIRATOR_EMAILNOTIFICATIONADMINS);
1265
+ // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1266
+ if ($emailadmins == 1) {
1267
+ $blogusers = get_users('role=Administrator');
1268
+ foreach ($blogusers as $user) {
1269
+ $emails[] = $user->user_email;
1270
+ }
1271
+ }
1272
+
1273
+ // Get Global Notification Emails
1274
+ $emaillist = get_option('expirationdateEmailNotificationList');
1275
+ if (! empty($emaillist)) {
1276
+ $vals = explode(',', $emaillist);
1277
+ foreach ($vals as $val) {
1278
+ $emails[] = trim($val);
1279
+ }
1280
+ }
1281
+
1282
+ // Get Post Type Notification Emails
1283
+ $defaults = get_option('expirationdateDefaults' . ucfirst($posttype));
1284
+ if (isset($defaults['emailnotification']) && ! empty($defaults['emailnotification'])) {
1285
+ $vals = explode(',', $defaults['emailnotification']);
1286
+ foreach ($vals as $val) {
1287
+ $emails[] = trim($val);
1288
+ }
1289
+ }
1290
+
1291
+ // Send Emails
1292
+ foreach ($emails as $email) {
1293
+ if (wp_mail($email, sprintf(__('[%1$s] %2$s'), get_option('blogname'), $subj), $emailBody)) {
1294
+ if (POSTEXPIRATOR_DEBUG) {
1295
+ $debug->save(array('message' => $id . ' -> EXPIRATION EMAIL SENT (' . $email . ')'));
1296
+ }
1297
+ } else {
1298
+ if (POSTEXPIRATOR_DEBUG) {
1299
+ $debug->save(array('message' => $id . ' -> EXPIRATION EMAIL FAILED (' . $email . ')'));
1300
+ }
1301
+ }
1302
+ }
1303
+ }
1304
  }
1305
 
1306
+ add_action('postExpiratorExpire', 'postexpirator_expire_post');
1307
 
1308
  /**
1309
  * Internal method to get category names corresponding to the category IDs.
1312
  *
1313
  * @access private
1314
  */
1315
+ function _postexpirator_get_cat_names($cats)
1316
+ {
1317
+ $out = array();
1318
+ foreach ($cats as $cat) {
1319
+ $out[$cat] = get_the_category_by_id($cat);
1320
+ }
1321
+
1322
+ return $out;
1323
  }
1324
 
1325
 
1330
  *
1331
  * @access private
1332
  */
1333
+ function postexpirator_menu()
1334
+ {
1335
+ _deprecated_function(__FUNCTION__, '2.5');
1336
  }
1337
 
1338
  /**
1342
  *
1343
  * @access private
1344
  */
1345
+ function postexpirator_add_menu()
1346
+ {
1347
+ _deprecated_function(__FUNCTION__, '2.5');
1348
  }
1349
 
1350
  /**
1354
  *
1355
  * @access private
1356
  */
1357
+ function postexpirator_menu_general()
1358
+ {
1359
+ _deprecated_function(__FUNCTION__, '2.5');
1360
+ PostExpirator_Display::getInstance()->load_tab('general');
1361
  }
1362
 
1363
  /**
1367
  *
1368
  * @access private
1369
  */
1370
+ function postexpirator_menu_defaults()
1371
+ {
1372
+ _deprecated_function(__FUNCTION__, '2.5');
1373
+ PostExpirator_Display::getInstance()->load_tab('defaults');
1374
  }
1375
 
1376
  /**
1380
  *
1381
  * @access private
1382
  */
1383
+ function postexpirator_menu_diagnostics()
1384
+ {
1385
+ _deprecated_function(__FUNCTION__, '2.5');
1386
+ PostExpirator_Display::getInstance()->load_tab('diagnostics');
1387
  }
1388
 
1389
  /**
1393
  *
1394
  * @access private
1395
  */
1396
+ function postexpirator_menu_debug()
1397
+ {
1398
+ _deprecated_function(__FUNCTION__, '2.5');
1399
+ PostExpirator_Display::getInstance()->load_tab('viewdebug');
1400
  }
1401
 
1402
  /**
1406
  *
1407
  * @access private
1408
  */
1409
+ function postexpirator_shortcode($atts)
1410
+ {
1411
+ global $post;
1412
+
1413
+ $expirationdatets = get_post_meta($post->ID, '_expiration-date', true);
1414
+ if (empty($expirationdatets)) {
1415
+ return false;
1416
+ }
1417
+
1418
+ // @TODO remove extract
1419
+ // phpcs:ignore WordPress.PHP.DontExtract.extract_extract
1420
+ extract(
1421
+ shortcode_atts(
1422
+ array(
1423
+ 'dateformat' => get_option('expirationdateDefaultDateFormat', POSTEXPIRATOR_DATEFORMAT),
1424
+ 'timeformat' => get_option('expirationdateDefaultTimeFormat', POSTEXPIRATOR_TIMEFORMAT),
1425
+ 'type' => 'full',
1426
+ 'tz' => date('T'),
1427
+ ),
1428
+ $atts
1429
+ )
1430
+ );
1431
+
1432
+ if (empty($dateformat)) {
1433
+ global $expirationdateDefaultDateFormat;
1434
+ $dateformat = $expirationdateDefaultDateFormat;
1435
+ }
1436
+
1437
+ if (empty($timeformat)) {
1438
+ global $expirationdateDefaultTimeFormat;
1439
+ $timeformat = $expirationdateDefaultTimeFormat;
1440
+ }
1441
+
1442
+ if ($type === 'full') {
1443
+ $format = $dateformat . ' ' . $timeformat;
1444
+ } elseif ($type === 'date') {
1445
+ $format = $dateformat;
1446
+ } elseif ($type === 'time') {
1447
+ $format = $timeformat;
1448
+ }
1449
+
1450
+ return date_i18n($format, $expirationdatets + (get_option('gmt_offset') * HOUR_IN_SECONDS));
1451
  }
1452
 
1453
+ add_shortcode('postexpirator', 'postexpirator_shortcode');
1454
 
1455
  /**
1456
  * Add the footer.
1459
  *
1460
  * @access private
1461
  */
1462
+ function postexpirator_add_footer($text)
1463
+ {
1464
+ global $post;
1465
+
1466
+ // Check to see if its enabled
1467
+ $displayFooter = get_option('expirationdateDisplayFooter');
1468
+
1469
+ // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1470
+ if ($displayFooter === false || $displayFooter == 0) {
1471
+ return $text;
1472
+ }
1473
+
1474
+ $expirationdatets = get_post_meta($post->ID, '_expiration-date', true);
1475
+ if (! is_numeric($expirationdatets)) {
1476
+ return $text;
1477
+ }
1478
+
1479
+ $dateformat = get_option('expirationdateDefaultDateFormat', POSTEXPIRATOR_DATEFORMAT);
1480
+ $timeformat = get_option('expirationdateDefaultTimeFormat', POSTEXPIRATOR_TIMEFORMAT);
1481
+ $expirationdateFooterContents = get_option('expirationdateFooterContents', POSTEXPIRATOR_FOOTERCONTENTS);
1482
+ $expirationdateFooterStyle = get_option('expirationdateFooterStyle', POSTEXPIRATOR_FOOTERSTYLE);
1483
+
1484
+ $search = array(
1485
+ 'EXPIRATIONFULL',
1486
+ 'EXPIRATIONDATE',
1487
+ 'EXPIRATIONTIME',
1488
+ );
1489
+ $replace = array(
1490
+ get_date_from_gmt(gmdate('Y-m-d H:i:s', $expirationdatets), "$dateformat $timeformat"),
1491
+ get_date_from_gmt(gmdate('Y-m-d H:i:s', $expirationdatets), $dateformat),
1492
+ get_date_from_gmt(gmdate('Y-m-d H:i:s', $expirationdatets), $timeformat),
1493
+ );
1494
+
1495
+ $add_to_footer = '<p style="' . $expirationdateFooterStyle . '">' . str_replace(
1496
+ $search,
1497
+ $replace,
1498
+ $expirationdateFooterContents
1499
+ ) . '</p>';
1500
+
1501
+ return $text . $add_to_footer;
1502
  }
1503
 
1504
+ add_action('the_content', 'postexpirator_add_footer', 0);
1505
 
1506
  /**
1507
  * Check for Debug
1510
  *
1511
  * @access private
1512
  */
1513
+ function postexpirator_debug()
1514
+ {
1515
+ $debug = get_option('expirationdateDebug');
1516
+ // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1517
+ if ($debug == 1) {
1518
+ if (! defined('POSTEXPIRATOR_DEBUG')) {
1519
+ define('POSTEXPIRATOR_DEBUG', 1);
1520
+ }
1521
+ require_once(plugin_dir_path(__FILE__) . 'post-expirator-debug.php'); // Load Class
1522
+
1523
+ return new PostExpiratorDebug();
1524
+ } else {
1525
+ if (! defined('POSTEXPIRATOR_DEBUG')) {
1526
+ define('POSTEXPIRATOR_DEBUG', 0);
1527
+ }
1528
+
1529
+ return false;
1530
+ }
1531
  }
1532
 
1533
 
1538
  *
1539
  * @access private
1540
  */
1541
+ function postexpirator_css($screen_id)
1542
+ {
1543
+ switch ($screen_id) {
1544
+ case 'post.php':
1545
+ case 'post-new.php':
1546
+ case 'settings_page_post-expirator':
1547
+ wp_enqueue_style(
1548
+ 'postexpirator-css',
1549
+ POSTEXPIRATOR_BASEURL . '/assets/css/style.css',
1550
+ array(),
1551
+ POSTEXPIRATOR_VERSION
1552
+ );
1553
+ break;
1554
+ case 'edit.php':
1555
+ wp_enqueue_style(
1556
+ 'postexpirator-edit',
1557
+ POSTEXPIRATOR_BASEURL . '/assets/css/edit.css',
1558
+ array(),
1559
+ POSTEXPIRATOR_VERSION
1560
+ );
1561
+ break;
1562
+ }
1563
  }
1564
 
1565
+ add_action('admin_enqueue_scripts', 'postexpirator_css', 10, 1);
1566
 
1567
  /**
1568
  * Post Expirator Activation/Upgrade
1571
  *
1572
  * @access private
1573
  */
1574
+ function postexpirator_upgrade()
1575
+ {
1576
+ // Check for current version, if not exists, run activation
1577
+ $version = get_option('postexpiratorVersion');
1578
+ if ($version === false) { // not installed, run default activation
1579
+ postexpirator_activate();
1580
+ update_option('postexpiratorVersion', POSTEXPIRATOR_VERSION);
1581
+ } else {
1582
+ if (version_compare($version, '1.6.1') === -1) {
1583
+ update_option('postexpiratorVersion', POSTEXPIRATOR_VERSION);
1584
+ update_option('expirationdateDefaultDate', POSTEXPIRATOR_EXPIREDEFAULT);
1585
+ }
1586
+
1587
+ if (version_compare($version, '1.6.2') === -1) {
1588
+ update_option('postexpiratorVersion', POSTEXPIRATOR_VERSION);
1589
+ }
1590
+
1591
+ if (version_compare($version, '2.0.0-rc1') === -1) {
1592
+ global $wpdb;
1593
+
1594
+ // Schedule Events/Migrate Config
1595
+ $results = $wpdb->get_results(
1596
+ $wpdb->prepare(
1597
+ 'select post_id, meta_value from ' . $wpdb->postmeta . ' as postmeta, ' . $wpdb->posts . ' as posts where postmeta.post_id = posts.ID AND postmeta.meta_key = %s AND postmeta.meta_value >= %d',
1598
+ 'expiration-date',
1599
+ time()
1600
+ )
1601
+ );
1602
+ foreach ($results as $result) {
1603
+ wp_schedule_single_event($result->meta_value, 'postExpiratorExpire', array($result->post_id));
1604
+ $opts = array();
1605
+ $opts['id'] = $result->post_id;
1606
+ $posttype = get_post_type($result->post_id);
1607
+ if ($posttype === 'page') {
1608
+ $opts['expireType'] = strtolower(get_option('expirationdateExpiredPageStatus', 'Draft'));
1609
+ } else {
1610
+ $opts['expireType'] = strtolower(get_option('expirationdateExpiredPostStatus', 'Draft'));
1611
+ }
1612
+
1613
+ $cat = get_post_meta($result->post_id, '_expiration-date-category', true);
1614
+ if ((isset($cat) && ! empty($cat))) {
1615
+ $opts['category'] = $cat;
1616
+ $opts['expireType'] = 'category';
1617
+ }
1618
+
1619
+ PostExpirator_Facade::set_expire_principles($result->post_id, $opts);
1620
+ }
1621
+
1622
+ // update meta key to new format
1623
+ $wpdb->query(
1624
+ $wpdb->prepare(
1625
+ "UPDATE $wpdb->postmeta SET meta_key = %s WHERE meta_key = %s",
1626
+ '_expiration-date',
1627
+ 'expiration-date'
1628
+ )
1629
+ );
1630
+
1631
+ // migrate defaults
1632
+ $pagedefault = get_option('expirationdateExpiredPageStatus');
1633
+ $postdefault = get_option('expirationdateExpiredPostStatus');
1634
+ if ($pagedefault) {
1635
+ update_option('expirationdateDefaultsPage', array('expireType' => $pagedefault));
1636
+ }
1637
+ if ($postdefault) {
1638
+ update_option('expirationdateDefaultsPost', array('expireType' => $postdefault));
1639
+ }
1640
+
1641
+ delete_option('expirationdateCronSchedule');
1642
+ delete_option('expirationdateAutoEnabled');
1643
+ delete_option('expirationdateExpiredPageStatus');
1644
+ delete_option('expirationdateExpiredPostStatus');
1645
+ update_option('postexpiratorVersion', POSTEXPIRATOR_VERSION);
1646
+ }
1647
+
1648
+ if (version_compare($version, '2.0.1') === -1) {
1649
+ // Forgot to do this in 2.0.0
1650
+ if (is_multisite()) {
1651
+ global $current_blog;
1652
+ wp_clear_scheduled_hook('expirationdate_delete_' . $current_blog->blog_id);
1653
+ } else {
1654
+ wp_clear_scheduled_hook('expirationdate_delete');
1655
+ }
1656
+
1657
+ update_option('postexpiratorVersion', POSTEXPIRATOR_VERSION);
1658
+ }
1659
+
1660
+ update_option('postexpiratorVersion', POSTEXPIRATOR_VERSION);
1661
+ }
1662
  }
1663
 
1664
+ add_action('admin_init', 'postexpirator_upgrade');
1665
 
1666
  /**
1667
  * Called at plugin activation
1670
  *
1671
  * @access private
1672
  */
1673
+ function postexpirator_activate()
1674
+ {
1675
+ if (get_option('expirationdateDefaultDateFormat') === false) {
1676
+ update_option('expirationdateDefaultDateFormat', POSTEXPIRATOR_DATEFORMAT);
1677
+ }
1678
+ if (get_option('expirationdateDefaultTimeFormat') === false) {
1679
+ update_option('expirationdateDefaultTimeFormat', POSTEXPIRATOR_TIMEFORMAT);
1680
+ }
1681
+ if (get_option('expirationdateFooterContents') === false) {
1682
+ update_option('expirationdateFooterContents', POSTEXPIRATOR_FOOTERCONTENTS);
1683
+ }
1684
+ if (get_option('expirationdateFooterStyle') === false) {
1685
+ update_option('expirationdateFooterStyle', POSTEXPIRATOR_FOOTERSTYLE);
1686
+ }
1687
+ if (get_option('expirationdateDisplayFooter') === false) {
1688
+ update_option('expirationdateDisplayFooter', POSTEXPIRATOR_FOOTERDISPLAY);
1689
+ }
1690
+ if (get_option('expirationdateDebug') === false) {
1691
+ update_option('expirationdateDebug', POSTEXPIRATOR_DEBUGDEFAULT);
1692
+ }
1693
+ if (get_option('expirationdateDefaultDate') === false) {
1694
+ update_option('expirationdateDefaultDate', POSTEXPIRATOR_EXPIREDEFAULT);
1695
+ }
1696
+ if (get_option('expirationdateGutenbergSupport') === false) {
1697
+ update_option('expirationdateGutenbergSupport', 1);
1698
+ }
1699
  }
1700
 
1701
  /**
1705
  *
1706
  * @access private
1707
  */
1708
+ function expirationdate_deactivate()
1709
+ {
1710
+ global $current_blog;
1711
+ delete_option('expirationdateExpiredPostStatus');
1712
+ delete_option('expirationdateExpiredPageStatus');
1713
+ delete_option('expirationdateDefaultDateFormat');
1714
+ delete_option('expirationdateDefaultTimeFormat');
1715
+ delete_option('expirationdateDisplayFooter');
1716
+ delete_option('expirationdateFooterContents');
1717
+ delete_option('expirationdateFooterStyle');
1718
+ delete_option('expirationdateCategory');
1719
+ delete_option('expirationdateCategoryDefaults');
1720
+ delete_option('expirationdateDebug');
1721
+ delete_option('postexpiratorVersion');
1722
+ delete_option('expirationdateCronSchedule');
1723
+ delete_option('expirationdateDefaultDate');
1724
+ delete_option('expirationdateDefaultDateCustom');
1725
+ delete_option('expirationdateAutoEnabled');
1726
+ delete_option('expirationdateDefaultsPage');
1727
+ delete_option('expirationdateDefaultsPost');
1728
+ delete_option('expirationdateGutenbergSupport');
1729
+ // what about custom post types? - how to cleanup?
1730
+ if (is_multisite()) {
1731
+ wp_clear_scheduled_hook('expirationdate_delete_' . $current_blog->blog_id);
1732
+ } else {
1733
+ wp_clear_scheduled_hook('expirationdate_delete');
1734
+ }
1735
+ require_once(plugin_dir_path(__FILE__) . 'post-expirator-debug.php');
1736
+ $debug = new PostExpiratorDebug();
1737
+ $debug->removeDbTable();
1738
  }
1739
 
1740
+ register_deactivation_hook(__FILE__, 'expirationdate_deactivate');
1741
 
1742
  /**
1743
  * The walker class for category checklist.
1746
  *
1747
  * @access private
1748
  */
1749
+ class Walker_PostExpirator_Category_Checklist extends Walker
1750
+ {
1751
+
1752
+ /**
1753
+ * What the class handles.
1754
+ *
1755
+ * @var string
1756
+ */
1757
+ public $tree_type = 'category';
1758
+
1759
+ /**
1760
+ * DB fields to use.
1761
+ *
1762
+ * @var array
1763
+ */
1764
+ public $db_fields = array('parent' => 'parent', 'id' => 'term_id'); // TODO: decouple this
1765
+
1766
+ /**
1767
+ * The disabled attribute.
1768
+ *
1769
+ * @var string
1770
+ */
1771
+ public $disabled = '';
1772
+
1773
+ /**
1774
+ * Set the disabled attribute.
1775
+ */
1776
+ public function setDisabled()
1777
+ {
1778
+ $this->disabled = 'disabled="disabled"';
1779
+ }
1780
+
1781
+ /**
1782
+ * Starts the list before the elements are added.
1783
+ *
1784
+ * The $args parameter holds additional values that may be used with the child
1785
+ * class methods. This method is called at the start of the output list.
1786
+ *
1787
+ * @param string $output Used to append additional content (passed by reference).
1788
+ * @param int $depth Depth of the item.
1789
+ * @param array $args An array of additional arguments.
1790
+ */
1791
+ public function start_lvl(&$output, $depth = 0, $args = array())
1792
+ {
1793
+ $indent = str_repeat("\t", $depth);
1794
+ $output .= "$indent<ul class='children'>\n";
1795
+ }
1796
+
1797
+ /**
1798
+ * Ends the list of after the elements are added.
1799
+ *
1800
+ * The $args parameter holds additional values that may be used with the child
1801
+ * class methods. This method finishes the list at the end of output of the elements.
1802
+ *
1803
+ * @param string $output Used to append additional content (passed by reference).
1804
+ * @param int $depth Depth of the item.
1805
+ * @param array $args An array of additional arguments.
1806
+ */
1807
+ public function end_lvl(&$output, $depth = 0, $args = array())
1808
+ {
1809
+ $indent = str_repeat("\t", $depth);
1810
+ $output .= "$indent</ul>\n";
1811
+ }
1812
+
1813
+ /**
1814
+ * Start the element output.
1815
+ *
1816
+ * The $args parameter holds additional values that may be used with the child
1817
+ * class methods. Includes the element output also.
1818
+ *
1819
+ * @param string $output Used to append additional content (passed by reference).
1820
+ * @param object $category The data object.
1821
+ * @param int $depth Depth of the item.
1822
+ * @param array $args An array of additional arguments.
1823
+ * @param int $current_object_id ID of the current item.
1824
+ */
1825
+ public function start_el(&$output, $category, $depth = 0, $args = array(), $current_object_id = 0)
1826
+ {
1827
+ // @TODO remove extract
1828
+ // phpcs:ignore WordPress.PHP.DontExtract.extract_extract
1829
+ extract($args);
1830
+ if (empty($taxonomy)) {
1831
+ $taxonomy = 'category';
1832
+ }
1833
+
1834
+ $name = 'expirationdate_category';
1835
+
1836
+ $class = in_array($category->term_id, $popular_cats, true) ? ' class="expirator-category"' : '';
1837
+ $output .= "\n<li id='expirator-{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="' . $name . '[]" id="expirator-in-' . $taxonomy . '-' . $category->term_id . '"' . checked(
1838
+ in_array($category->term_id, $selected_cats, true),
1839
+ true,
1840
+ false
1841
+ ) . disabled(empty($args['disabled']), false, false) . ' ' . $this->disabled . '/> ' . esc_html(
1842
+ apply_filters('the_category', $category->name)
1843
+ ) . '</label>';
1844
+ }
1845
+
1846
+ /**
1847
+ * Ends the element output, if needed.
1848
+ *
1849
+ * The $args parameter holds additional values that may be used with the child class methods.
1850
+ *
1851
+ * @param string $output Used to append additional content (passed by reference).
1852
+ * @param object $category The data object.
1853
+ * @param int $depth Depth of the item.
1854
+ * @param array $args An array of additional arguments.
1855
+ */
1856
+ public function end_el(&$output, $category, $depth = 0, $args = array())
1857
+ {
1858
+ $output .= "</li>\n";
1859
+ }
1860
  }
1861
 
1862
  /**
1866
  *
1867
  * @access private
1868
  */
1869
+ function _postexpirator_expire_type($opts)
1870
+ {
1871
+ if (empty($opts)) {
1872
+ return false;
1873
+ }
1874
 
1875
+ PostExpirator_Display::getInstance()->render_template('how-to-expire', array('opts' => $opts));
1876
  }
1877
 
1878
  /**
1882
  *
1883
  * @access private
1884
  */
1885
+ function _postexpirator_taxonomy($opts)
1886
+ {
1887
+ if (empty($opts)) {
1888
+ return false;
1889
+ }
1890
+
1891
+ // @TODO remove extract
1892
+ // phpcs:ignore WordPress.PHP.DontExtract.extract_extract
1893
+ extract($opts);
1894
+ if (! isset($name)) {
1895
+ return false;
1896
+ }
1897
+ if (! isset($id)) {
1898
+ $id = $name;
1899
+ }
1900
+ if (! isset($disabled)) {
1901
+ $disabled = false;
1902
+ }
1903
+ if (! isset($onchange)) {
1904
+ $onchange = '';
1905
+ }
1906
+ if (! isset($type)) {
1907
+ $type = '';
1908
+ }
1909
+
1910
+ $taxonomies = get_object_taxonomies($type, 'object');
1911
+ $taxonomies = wp_filter_object_list($taxonomies, array('hierarchical' => true));
1912
+
1913
+ if (empty($taxonomies)) {
1914
+ $disabled = true;
1915
+ }
1916
+
1917
+ $rv = array();
1918
+ if ($taxonomies) {
1919
+ // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1920
+ $rv[] = '<select name="' . $name . '" id="' . $id . '"' . ($disabled == true ? ' disabled="disabled"' : '') . ' onchange="' . $onchange . '">';
1921
+ foreach ($taxonomies as $taxonomy) {
1922
+ $rv[] = '<option value="' . $taxonomy->name . '" ' . ($selected === $taxonomy->name ? 'selected="selected"' : '') . '>' . $taxonomy->label . '</option>';
1923
+ }
1924
+
1925
+ $rv[] = '</select>';
1926
+ $rv[] = '<p class="description">' . __(
1927
+ 'Select the hierarchical taxonomy to be used for "category" based expiration.',
1928
+ 'post-expirator'
1929
+ ) . '</p>';
1930
+ } else {
1931
+ $rv[] = __('No taxonomies found', 'post-expirator');
1932
+ }
1933
+
1934
+ return implode("<br/>\n", $rv);
1935
  }
1936
 
1937
  /**
1941
  *
1942
  * @access private
1943
  */
1944
+ function postexpirator_quickedit_javascript()
1945
+ {
1946
+ // if using code as plugin
1947
+ wp_enqueue_script('postexpirator-edit', POSTEXPIRATOR_BASEURL . '/assets/js/admin-edit.js', array(
1948
+ 'jquery',
1949
+ 'inline-edit-post'
1950
+ ), POSTEXPIRATOR_VERSION, true);
1951
+ wp_localize_script(
1952
+ 'postexpirator-edit', 'config', array(
1953
+ 'ajax' => array(
1954
+ 'nonce' => wp_create_nonce(POSTEXPIRATOR_SLUG),
1955
+ 'bulk_edit' => 'manage_wp_posts_using_bulk_quick_save_bulk_edit',
1956
+ ),
1957
+ )
1958
+ );
1959
  }
1960
 
1961
+ add_action('admin_print_scripts-edit.php', 'postexpirator_quickedit_javascript');
1962
 
1963
  /**
1964
  * Receives AJAX call from bulk edit to process save.
1967
  *
1968
  * @access private
1969
  */
1970
+ function postexpirator_date_save_bulk_edit()
1971
+ {
1972
+ check_ajax_referer(POSTEXPIRATOR_SLUG, 'nonce');
1973
+
1974
+ $facade = PostExpirator_Facade::getInstance();
1975
+
1976
+ if (! $facade->current_user_can_expire_posts()) {
1977
+ wp_die(
1978
+ __('You\'re not allowed to set posts to expire', 'post-expirator'),
1979
+ __('Forbidden', 'post-expirator'),
1980
+ 403
1981
+ );
1982
+ }
1983
+
1984
+ $status = $_POST['expirationdate_status'];
1985
+ // if no change, do nothing
1986
+ if ($status === 'no-change') {
1987
+ return;
1988
+ }
1989
+
1990
+ // we need the post IDs
1991
+ $post_ids = (isset($_POST['post_ids']) && ! empty($_POST['post_ids'])) ? $_POST['post_ids'] : null;
1992
+
1993
+ // if we have post IDs
1994
+ if (! empty($post_ids) && is_array($post_ids)) {
1995
+ $post_type = get_post_type($post_ids[0]);
1996
+
1997
+ $defaults = PostExpirator_Facade::get_default_expiry($post_type);
1998
+
1999
+ $year = intval('' === $_POST['expirationdate_year'] ? $defaults['year'] : $_POST['expirationdate_year']);
2000
+ $month = intval('' === $_POST['expirationdate_month'] ? $defaults['month'] : $_POST['expirationdate_month']);
2001
+ $day = intval('' === $_POST['expirationdate_day'] ? $defaults['day'] : $_POST['expirationdate_day']);
2002
+ $hour = intval('' === $_POST['expirationdate_hour'] ? $defaults['hour'] : $_POST['expirationdate_hour']);
2003
+ $minute = intval(
2004
+ '' === $_POST['expirationdate_minute'] ? $defaults['minute'] : $_POST['expirationdate_minute']
2005
+ );
2006
+
2007
+ $ts = get_gmt_from_date("$year-$month-$day $hour:$minute:0", 'U');
2008
+
2009
+ if (! $ts) {
2010
+ return;
2011
+ }
2012
+
2013
+ foreach ($post_ids as $post_id) {
2014
+ $ed = get_post_meta($post_id, '_expiration-date', true);
2015
+ $update_expiry = false;
2016
+
2017
+ switch ($status) {
2018
+ case 'change-only':
2019
+ $update_expiry = ! empty($ed);
2020
+ break;
2021
+ case 'add-only':
2022
+ $update_expiry = empty($ed);
2023
+ break;
2024
+ case 'change-add':
2025
+ $update_expiry = true;
2026
+ break;
2027
+ case 'remove-only':
2028
+ delete_post_meta($post_id, '_expiration-date');
2029
+ postexpirator_unschedule_event($post_id);
2030
+ break;
2031
+ }
2032
+
2033
+ if ($update_expiry) {
2034
+ $opts = PostExpirator_Facade::get_expire_principles($post_id);
2035
+ $opts['expireType'] = $_POST['expirationdate_expiretype'];
2036
+
2037
+ if (in_array($opts['expireType'], array('category', 'category-add', 'category-remove'), true)) {
2038
+ $opts['category'] = $_POST['expirationdate_category'];
2039
+ }
2040
+
2041
+ PostExpirator_Facade::set_expire_principles($post_id, $opts);
2042
+ update_post_meta($post_id, '_expiration-date', $ts);
2043
+ postexpirator_schedule_event($post_id, $ts, $opts);
2044
+ }
2045
+ }
2046
+ }
2047
  }
2048
 
2049
+ add_action('wp_ajax_manage_wp_posts_using_bulk_quick_save_bulk_edit', 'postexpirator_date_save_bulk_edit');
2050
 
2051
  /**
2052
  * Autoloads the classes.
2053
  */
2054
+ function postexpirator_autoload($class)
2055
+ {
2056
+ $namespaces = array('PostExpirator');
2057
+ foreach ($namespaces as $namespace) {
2058
+ if (substr($class, 0, strlen($namespace)) === $namespace) {
2059
+ $class = str_replace('_', '', strstr($class, '_'));
2060
+ $filename = plugin_dir_path(__FILE__) . 'classes/' . sprintf('%s.class.php', $class);
2061
+ if (is_readable($filename)) {
2062
+ require_once $filename;
2063
+
2064
+ return true;
2065
+ }
2066
+ }
2067
+ }
2068
+
2069
+ return false;
2070
  }
2071
 
2072
+ spl_autoload_register('postexpirator_autoload');
2073
 
2074
  /**
2075
  * Launch the plugin by initializing its helpers.
2076
  */
2077
+ function postexpirator_launch()
2078
+ {
2079
+ PostExpirator_Facade::getInstance();
2080
  }
2081
 
2082
  postexpirator_launch();
readme.txt CHANGED
@@ -5,7 +5,7 @@ Author URI: https://publishpress.com
5
  Tags: expire, posts, pages, schedule
6
  Requires at least: 5.0
7
  Tested up to: 5.8
8
- Stable tag: 2.6.0
9
 
10
  Add an expiration date to posts. When your post is automatically unpublished, you can delete the post, change the status, or update the post categories.
11
 
@@ -81,6 +81,18 @@ This section describes how to install the plugin and get it working.
81
 
82
  == Changelog ==
83
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  = [2.6.0] - 04 Oct 2021 =
85
 
86
  * Added: Add specific capabilities for expiring posts, #141;
5
  Tags: expire, posts, pages, schedule
6
  Requires at least: 5.0
7
  Tested up to: 5.8
8
+ Stable tag: 2.6.1
9
 
10
  Add an expiration date to posts. When your post is automatically unpublished, you can delete the post, change the status, or update the post categories.
11
 
81
 
82
  == Changelog ==
83
 
84
+ = [2.6.1] - 27 Oct 2021 =
85
+
86
+ * Fixed: Fix category replace not saving, #159;
87
+ * Fixed: Fix auto enabled settings, #158;
88
+ * Fixed: Fix expiration data and cron on Gutenberg style box, #156, #136;
89
+ * Fixed: Fix the request that loads categories in the Gutenberg style panel, #133;
90
+ * Fixed: Fix the category replace not working with the new Gutenberg style panel, #127;
91
+ * Fixed: Fix the default options for the Gutenberg style panel, #145;
92
+ * Added: Add post information to the scheduled list for easier debugging, #164;
93
+ * Added: Add a review request after a specific period of usage, #103;
94
+ * Added: Improve the list of cron tasks, filtering only the tasks related to the plugin, #153;
95
+
96
  = [2.6.0] - 04 Oct 2021 =
97
 
98
  * Added: Add specific capabilities for expiring posts, #141;
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit252d08f02d77dcc4a9b095ab08120c6d::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInitb4c7c32b9bcab4f54643f778f077efdc::getLoader();
vendor/composer/ClassLoader.php CHANGED
@@ -42,21 +42,75 @@ namespace Composer\Autoload;
42
  */
43
  class ClassLoader
44
  {
 
 
 
45
  // PSR-4
 
 
 
 
46
  private $prefixLengthsPsr4 = array();
 
 
 
 
47
  private $prefixDirsPsr4 = array();
 
 
 
 
48
  private $fallbackDirsPsr4 = array();
49
 
50
  // PSR-0
 
 
 
 
51
  private $prefixesPsr0 = array();
 
 
 
 
52
  private $fallbackDirsPsr0 = array();
53
 
 
54
  private $useIncludePath = false;
 
 
 
 
 
55
  private $classMap = array();
 
 
56
  private $classMapAuthoritative = false;
 
 
 
 
 
57
  private $missingClasses = array();
 
 
58
  private $apcuPrefix;
59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  public function getPrefixes()
61
  {
62
  if (!empty($this->prefixesPsr0)) {
@@ -66,28 +120,47 @@ class ClassLoader
66
  return array();
67
  }
68
 
 
 
 
 
69
  public function getPrefixesPsr4()
70
  {
71
  return $this->prefixDirsPsr4;
72
  }
73
 
 
 
 
 
74
  public function getFallbackDirs()
75
  {
76
  return $this->fallbackDirsPsr0;
77
  }
78
 
 
 
 
 
79
  public function getFallbackDirsPsr4()
80
  {
81
  return $this->fallbackDirsPsr4;
82
  }
83
 
 
 
 
 
84
  public function getClassMap()
85
  {
86
  return $this->classMap;
87
  }
88
 
89
  /**
90
- * @param array $classMap Class to filename map
 
 
 
91
  */
92
  public function addClassMap(array $classMap)
93
  {
@@ -102,9 +175,11 @@ class ClassLoader
102
  * Registers a set of PSR-0 directories for a given prefix, either
103
  * appending or prepending to the ones previously set for this prefix.
104
  *
105
- * @param string $prefix The prefix
106
- * @param array|string $paths The PSR-0 root directories
107
- * @param bool $prepend Whether to prepend the directories
 
 
108
  */
109
  public function add($prefix, $paths, $prepend = false)
110
  {
@@ -147,11 +222,13 @@ class ClassLoader
147
  * Registers a set of PSR-4 directories for a given namespace, either
148
  * appending or prepending to the ones previously set for this namespace.
149
  *
150
- * @param string $prefix The prefix/namespace, with trailing '\\'
151
- * @param array|string $paths The PSR-4 base directories
152
- * @param bool $prepend Whether to prepend the directories
153
  *
154
  * @throws \InvalidArgumentException
 
 
155
  */
156
  public function addPsr4($prefix, $paths, $prepend = false)
157
  {
@@ -195,8 +272,10 @@ class ClassLoader
195
  * Registers a set of PSR-0 directories for a given prefix,
196
  * replacing any others previously set for this prefix.
197
  *
198
- * @param string $prefix The prefix
199
- * @param array|string $paths The PSR-0 base directories
 
 
200
  */
201
  public function set($prefix, $paths)
202
  {
@@ -211,10 +290,12 @@ class ClassLoader
211
  * Registers a set of PSR-4 directories for a given namespace,
212
  * replacing any others previously set for this namespace.
213
  *
214
- * @param string $prefix The prefix/namespace, with trailing '\\'
215
- * @param array|string $paths The PSR-4 base directories
216
  *
217
  * @throws \InvalidArgumentException
 
 
218
  */
219
  public function setPsr4($prefix, $paths)
220
  {
@@ -234,6 +315,8 @@ class ClassLoader
234
  * Turns on searching the include path for class files.
235
  *
236
  * @param bool $useIncludePath
 
 
237
  */
238
  public function setUseIncludePath($useIncludePath)
239
  {
@@ -256,6 +339,8 @@ class ClassLoader
256
  * that have not been registered with the class map.
257
  *
258
  * @param bool $classMapAuthoritative
 
 
259
  */
260
  public function setClassMapAuthoritative($classMapAuthoritative)
261
  {
@@ -276,6 +361,8 @@ class ClassLoader
276
  * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
277
  *
278
  * @param string|null $apcuPrefix
 
 
279
  */
280
  public function setApcuPrefix($apcuPrefix)
281
  {
@@ -296,25 +383,44 @@ class ClassLoader
296
  * Registers this instance as an autoloader.
297
  *
298
  * @param bool $prepend Whether to prepend the autoloader or not
 
 
299
  */
300
  public function register($prepend = false)
301
  {
302
  spl_autoload_register(array($this, 'loadClass'), true, $prepend);
 
 
 
 
 
 
 
 
 
 
 
303
  }
304
 
305
  /**
306
  * Unregisters this instance as an autoloader.
 
 
307
  */
308
  public function unregister()
309
  {
310
  spl_autoload_unregister(array($this, 'loadClass'));
 
 
 
 
311
  }
312
 
313
  /**
314
  * Loads the given class or interface.
315
  *
316
  * @param string $class The name of the class
317
- * @return bool|null True if loaded, null otherwise
318
  */
319
  public function loadClass($class)
320
  {
@@ -323,6 +429,8 @@ class ClassLoader
323
 
324
  return true;
325
  }
 
 
326
  }
327
 
328
  /**
@@ -367,6 +475,21 @@ class ClassLoader
367
  return $file;
368
  }
369
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
370
  private function findFileWithExtension($class, $ext)
371
  {
372
  // PSR-4 lookup
@@ -438,6 +561,10 @@ class ClassLoader
438
  * Scope isolated include.
439
  *
440
  * Prevents access to $this/self from included files.
 
 
 
 
441
  */
442
  function includeFile($file)
443
  {
42
  */
43
  class ClassLoader
44
  {
45
+ /** @var ?string */
46
+ private $vendorDir;
47
+
48
  // PSR-4
49
+ /**
50
+ * @var array[]
51
+ * @psalm-var array<string, array<string, int>>
52
+ */
53
  private $prefixLengthsPsr4 = array();
54
+ /**
55
+ * @var array[]
56
+ * @psalm-var array<string, array<int, string>>
57
+ */
58
  private $prefixDirsPsr4 = array();
59
+ /**
60
+ * @var array[]
61
+ * @psalm-var array<string, string>
62
+ */
63
  private $fallbackDirsPsr4 = array();
64
 
65
  // PSR-0
66
+ /**
67
+ * @var array[]
68
+ * @psalm-var array<string, array<string, string[]>>
69
+ */
70
  private $prefixesPsr0 = array();
71
+ /**
72
+ * @var array[]
73
+ * @psalm-var array<string, string>
74
+ */
75
  private $fallbackDirsPsr0 = array();
76
 
77
+ /** @var bool */
78
  private $useIncludePath = false;
79
+
80
+ /**
81
+ * @var string[]
82
+ * @psalm-var array<string, string>
83
+ */
84
  private $classMap = array();
85
+
86
+ /** @var bool */
87
  private $classMapAuthoritative = false;
88
+
89
+ /**
90
+ * @var bool[]
91
+ * @psalm-var array<string, bool>
92
+ */
93
  private $missingClasses = array();
94
+
95
+ /** @var ?string */
96
  private $apcuPrefix;
97
 
98
+ /**
99
+ * @var self[]
100
+ */
101
+ private static $registeredLoaders = array();
102
+
103
+ /**
104
+ * @param ?string $vendorDir
105
+ */
106
+ public function __construct($vendorDir = null)
107
+ {
108
+ $this->vendorDir = $vendorDir;
109
+ }
110
+
111
+ /**
112
+ * @return string[]
113
+ */
114
  public function getPrefixes()
115
  {
116
  if (!empty($this->prefixesPsr0)) {
120
  return array();
121
  }
122
 
123
+ /**
124
+ * @return array[]
125
+ * @psalm-return array<string, array<int, string>>
126
+ */
127
  public function getPrefixesPsr4()
128
  {
129
  return $this->prefixDirsPsr4;
130
  }
131
 
132
+ /**
133
+ * @return array[]
134
+ * @psalm-return array<string, string>
135
+ */
136
  public function getFallbackDirs()
137
  {
138
  return $this->fallbackDirsPsr0;
139
  }
140
 
141
+ /**
142
+ * @return array[]
143
+ * @psalm-return array<string, string>
144
+ */
145
  public function getFallbackDirsPsr4()
146
  {
147
  return $this->fallbackDirsPsr4;
148
  }
149
 
150
+ /**
151
+ * @return string[] Array of classname => path
152
+ * @psalm-var array<string, string>
153
+ */
154
  public function getClassMap()
155
  {
156
  return $this->classMap;
157
  }
158
 
159
  /**
160
+ * @param string[] $classMap Class to filename map
161
+ * @psalm-param array<string, string> $classMap
162
+ *
163
+ * @return void
164
  */
165
  public function addClassMap(array $classMap)
166
  {
175
  * Registers a set of PSR-0 directories for a given prefix, either
176
  * appending or prepending to the ones previously set for this prefix.
177
  *
178
+ * @param string $prefix The prefix
179
+ * @param string[]|string $paths The PSR-0 root directories
180
+ * @param bool $prepend Whether to prepend the directories
181
+ *
182
+ * @return void
183
  */
184
  public function add($prefix, $paths, $prepend = false)
185
  {
222
  * Registers a set of PSR-4 directories for a given namespace, either
223
  * appending or prepending to the ones previously set for this namespace.
224
  *
225
+ * @param string $prefix The prefix/namespace, with trailing '\\'
226
+ * @param string[]|string $paths The PSR-4 base directories
227
+ * @param bool $prepend Whether to prepend the directories
228
  *
229
  * @throws \InvalidArgumentException
230
+ *
231
+ * @return void
232
  */
233
  public function addPsr4($prefix, $paths, $prepend = false)
234
  {
272
  * Registers a set of PSR-0 directories for a given prefix,
273
  * replacing any others previously set for this prefix.
274
  *
275
+ * @param string $prefix The prefix
276
+ * @param string[]|string $paths The PSR-0 base directories
277
+ *
278
+ * @return void
279
  */
280
  public function set($prefix, $paths)
281
  {
290
  * Registers a set of PSR-4 directories for a given namespace,
291
  * replacing any others previously set for this namespace.
292
  *
293
+ * @param string $prefix The prefix/namespace, with trailing '\\'
294
+ * @param string[]|string $paths The PSR-4 base directories
295
  *
296
  * @throws \InvalidArgumentException
297
+ *
298
+ * @return void
299
  */
300
  public function setPsr4($prefix, $paths)
301
  {
315
  * Turns on searching the include path for class files.
316
  *
317
  * @param bool $useIncludePath
318
+ *
319
+ * @return void
320
  */
321
  public function setUseIncludePath($useIncludePath)
322
  {
339
  * that have not been registered with the class map.
340
  *
341
  * @param bool $classMapAuthoritative
342
+ *
343
+ * @return void
344
  */
345
  public function setClassMapAuthoritative($classMapAuthoritative)
346
  {
361
  * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
362
  *
363
  * @param string|null $apcuPrefix
364
+ *
365
+ * @return void
366
  */
367
  public function setApcuPrefix($apcuPrefix)
368
  {
383
  * Registers this instance as an autoloader.
384
  *
385
  * @param bool $prepend Whether to prepend the autoloader or not
386
+ *
387
+ * @return void
388
  */
389
  public function register($prepend = false)
390
  {
391
  spl_autoload_register(array($this, 'loadClass'), true, $prepend);
392
+
393
+ if (null === $this->vendorDir) {
394
+ return;
395
+ }
396
+
397
+ if ($prepend) {
398
+ self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
399
+ } else {
400
+ unset(self::$registeredLoaders[$this->vendorDir]);
401
+ self::$registeredLoaders[$this->vendorDir] = $this;
402
+ }
403
  }
404
 
405
  /**
406
  * Unregisters this instance as an autoloader.
407
+ *
408
+ * @return void
409
  */
410
  public function unregister()
411
  {
412
  spl_autoload_unregister(array($this, 'loadClass'));
413
+
414
+ if (null !== $this->vendorDir) {
415
+ unset(self::$registeredLoaders[$this->vendorDir]);
416
+ }
417
  }
418
 
419
  /**
420
  * Loads the given class or interface.
421
  *
422
  * @param string $class The name of the class
423
+ * @return true|null True if loaded, null otherwise
424
  */
425
  public function loadClass($class)
426
  {
429
 
430
  return true;
431
  }
432
+
433
+ return null;
434
  }
435
 
436
  /**
475
  return $file;
476
  }
477
 
478
+ /**
479
+ * Returns the currently registered loaders indexed by their corresponding vendor directories.
480
+ *
481
+ * @return self[]
482
+ */
483
+ public static function getRegisteredLoaders()
484
+ {
485
+ return self::$registeredLoaders;
486
+ }
487
+
488
+ /**
489
+ * @param string $class
490
+ * @param string $ext
491
+ * @return string|false
492
+ */
493
  private function findFileWithExtension($class, $ext)
494
  {
495
  // PSR-4 lookup
561
  * Scope isolated include.
562
  *
563
  * Prevents access to $this/self from included files.
564
+ *
565
+ * @param string $file
566
+ * @return void
567
+ * @private
568
  */
569
  function includeFile($file)
570
  {
vendor/composer/InstalledVersions.php CHANGED
@@ -1,219 +1,337 @@
1
  <?php
2
 
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
 
13
  namespace Composer;
14
 
 
15
  use Composer\Semver\VersionParser;
16
 
17
-
18
-
19
-
20
-
21
-
 
 
22
  class InstalledVersions
23
  {
24
- private static $installed = array (
25
- 'root' =>
26
- array (
27
- 'pretty_version' => 'dev-main',
28
- 'version' => 'dev-main',
29
- 'aliases' =>
30
- array (
31
- ),
32
- 'reference' => '51bb3d37d22a270fd69314262d1ff3f997ee8f4c',
33
- 'name' => 'publishpress/post-expirator',
34
- ),
35
- 'versions' =>
36
- array (
37
- 'publishpress/post-expirator' =>
38
- array (
39
- 'pretty_version' => 'dev-main',
40
- 'version' => 'dev-main',
41
- 'aliases' =>
42
- array (
43
- ),
44
- 'reference' => '51bb3d37d22a270fd69314262d1ff3f997ee8f4c',
45
- ),
46
- ),
47
- );
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
- public static function getInstalledPackages()
56
- {
57
- return array_keys(self::$installed['versions']);
58
- }
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
- public static function isInstalled($packageName)
69
- {
70
- return isset(self::$installed['versions'][$packageName]);
71
- }
72
-
73
-
74
-
75
-
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
- public static function satisfies(VersionParser $parser, $packageName, $constraint)
87
- {
88
- $constraint = $parser->parseConstraints($constraint);
89
- $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
90
-
91
- return $provided->matches($constraint);
92
- }
93
-
94
-
95
-
96
-
97
-
98
-
99
-
100
-
101
-
102
-
103
- public static function getVersionRanges($packageName)
104
- {
105
- if (!isset(self::$installed['versions'][$packageName])) {
106
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
107
- }
108
-
109
- $ranges = array();
110
- if (isset(self::$installed['versions'][$packageName]['pretty_version'])) {
111
- $ranges[] = self::$installed['versions'][$packageName]['pretty_version'];
112
- }
113
- if (array_key_exists('aliases', self::$installed['versions'][$packageName])) {
114
- $ranges = array_merge($ranges, self::$installed['versions'][$packageName]['aliases']);
115
- }
116
- if (array_key_exists('replaced', self::$installed['versions'][$packageName])) {
117
- $ranges = array_merge($ranges, self::$installed['versions'][$packageName]['replaced']);
118
- }
119
- if (array_key_exists('provided', self::$installed['versions'][$packageName])) {
120
- $ranges = array_merge($ranges, self::$installed['versions'][$packageName]['provided']);
121
- }
122
-
123
- return implode(' || ', $ranges);
124
- }
125
-
126
-
127
-
128
-
129
-
130
- public static function getVersion($packageName)
131
- {
132
- if (!isset(self::$installed['versions'][$packageName])) {
133
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
134
- }
135
-
136
- if (!isset(self::$installed['versions'][$packageName]['version'])) {
137
- return null;
138
- }
139
-
140
- return self::$installed['versions'][$packageName]['version'];
141
- }
142
-
143
-
144
-
145
-
146
-
147
- public static function getPrettyVersion($packageName)
148
- {
149
- if (!isset(self::$installed['versions'][$packageName])) {
150
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
151
- }
152
-
153
- if (!isset(self::$installed['versions'][$packageName]['pretty_version'])) {
154
- return null;
155
- }
156
-
157
- return self::$installed['versions'][$packageName]['pretty_version'];
158
- }
159
-
160
-
161
-
162
-
163
-
164
- public static function getReference($packageName)
165
- {
166
- if (!isset(self::$installed['versions'][$packageName])) {
167
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
168
- }
169
-
170
- if (!isset(self::$installed['versions'][$packageName]['reference'])) {
171
- return null;
172
- }
173
-
174
- return self::$installed['versions'][$packageName]['reference'];
175
- }
176
-
177
-
178
-
179
-
180
-
181
- public static function getRootPackage()
182
- {
183
- return self::$installed['root'];
184
- }
185
-
186
-
187
-
188
-
189
-
190
-
191
-
192
- public static function getRawData()
193
- {
194
- return self::$installed;
195
- }
196
-
197
-
198
-
199
-
200
-
201
-
202
-
203
-
204
-
205
-
206
-
207
-
208
-
209
-
210
-
211
-
212
-
213
-
214
-
215
- public static function reload($data)
216
- {
217
- self::$installed = $data;
218
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
219
  }
1
  <?php
2
 
3
+ /*
4
+ * This file is part of Composer.
5
+ *
6
+ * (c) Nils Adermann <naderman@naderman.de>
7
+ * Jordi Boggiano <j.boggiano@seld.be>
8
+ *
9
+ * For the full copyright and license information, please view the LICENSE
10
+ * file that was distributed with this source code.
11
+ */
12
 
13
  namespace Composer;
14
 
15
+ use Composer\Autoload\ClassLoader;
16
  use Composer\Semver\VersionParser;
17
 
18
+ /**
19
+ * This class is copied in every Composer installed project and available to all
20
+ *
21
+ * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
22
+ *
23
+ * To require its presence, you can require `composer-runtime-api ^2.0`
24
+ */
25
  class InstalledVersions
26
  {
27
+ private static $installed;
28
+ private static $canGetVendors;
29
+ private static $installedByVendor = array();
30
+
31
+ /**
32
+ * Returns a list of all package names which are present, either by being installed, replaced or provided
33
+ *
34
+ * @return string[]
35
+ * @psalm-return list<string>
36
+ */
37
+ public static function getInstalledPackages()
38
+ {
39
+ $packages = array();
40
+ foreach (self::getInstalled() as $installed) {
41
+ $packages[] = array_keys($installed['versions']);
42
+ }
43
+
44
+ if (1 === \count($packages)) {
45
+ return $packages[0];
46
+ }
47
+
48
+ return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
49
+ }
50
+
51
+ /**
52
+ * Returns a list of all package names with a specific type e.g. 'library'
53
+ *
54
+ * @param string $type
55
+ * @return string[]
56
+ * @psalm-return list<string>
57
+ */
58
+ public static function getInstalledPackagesByType($type)
59
+ {
60
+ $packagesByType = array();
61
+
62
+ foreach (self::getInstalled() as $installed) {
63
+ foreach ($installed['versions'] as $name => $package) {
64
+ if (isset($package['type']) && $package['type'] === $type) {
65
+ $packagesByType[] = $name;
66
+ }
67
+ }
68
+ }
69
+
70
+ return $packagesByType;
71
+ }
72
+
73
+ /**
74
+ * Checks whether the given package is installed
75
+ *
76
+ * This also returns true if the package name is provided or replaced by another package
77
+ *
78
+ * @param string $packageName
79
+ * @param bool $includeDevRequirements
80
+ * @return bool
81
+ */
82
+ public static function isInstalled($packageName, $includeDevRequirements = true)
83
+ {
84
+ foreach (self::getInstalled() as $installed) {
85
+ if (isset($installed['versions'][$packageName])) {
86
+ return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
87
+ }
88
+ }
89
+
90
+ return false;
91
+ }
92
+
93
+ /**
94
+ * Checks whether the given package satisfies a version constraint
95
+ *
96
+ * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
97
+ *
98
+ * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
99
+ *
100
+ * @param VersionParser $parser Install composer/semver to have access to this class and functionality
101
+ * @param string $packageName
102
+ * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
103
+ * @return bool
104
+ */
105
+ public static function satisfies(VersionParser $parser, $packageName, $constraint)
106
+ {
107
+ $constraint = $parser->parseConstraints($constraint);
108
+ $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
109
+
110
+ return $provided->matches($constraint);
111
+ }
112
+
113
+ /**
114
+ * Returns a version constraint representing all the range(s) which are installed for a given package
115
+ *
116
+ * It is easier to use this via isInstalled() with the $constraint argument if you need to check
117
+ * whether a given version of a package is installed, and not just whether it exists
118
+ *
119
+ * @param string $packageName
120
+ * @return string Version constraint usable with composer/semver
121
+ */
122
+ public static function getVersionRanges($packageName)
123
+ {
124
+ foreach (self::getInstalled() as $installed) {
125
+ if (!isset($installed['versions'][$packageName])) {
126
+ continue;
127
+ }
128
+
129
+ $ranges = array();
130
+ if (isset($installed['versions'][$packageName]['pretty_version'])) {
131
+ $ranges[] = $installed['versions'][$packageName]['pretty_version'];
132
+ }
133
+ if (array_key_exists('aliases', $installed['versions'][$packageName])) {
134
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
135
+ }
136
+ if (array_key_exists('replaced', $installed['versions'][$packageName])) {
137
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
138
+ }
139
+ if (array_key_exists('provided', $installed['versions'][$packageName])) {
140
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
141
+ }
142
+
143
+ return implode(' || ', $ranges);
144
+ }
145
+
146
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
147
+ }
148
+
149
+ /**
150
+ * @param string $packageName
151
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
152
+ */
153
+ public static function getVersion($packageName)
154
+ {
155
+ foreach (self::getInstalled() as $installed) {
156
+ if (!isset($installed['versions'][$packageName])) {
157
+ continue;
158
+ }
159
+
160
+ if (!isset($installed['versions'][$packageName]['version'])) {
161
+ return null;
162
+ }
163
+
164
+ return $installed['versions'][$packageName]['version'];
165
+ }
166
+
167
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
168
+ }
169
+
170
+ /**
171
+ * @param string $packageName
172
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
173
+ */
174
+ public static function getPrettyVersion($packageName)
175
+ {
176
+ foreach (self::getInstalled() as $installed) {
177
+ if (!isset($installed['versions'][$packageName])) {
178
+ continue;
179
+ }
180
+
181
+ if (!isset($installed['versions'][$packageName]['pretty_version'])) {
182
+ return null;
183
+ }
184
+
185
+ return $installed['versions'][$packageName]['pretty_version'];
186
+ }
187
+
188
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
189
+ }
190
+
191
+ /**
192
+ * @param string $packageName
193
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
194
+ */
195
+ public static function getReference($packageName)
196
+ {
197
+ foreach (self::getInstalled() as $installed) {
198
+ if (!isset($installed['versions'][$packageName])) {
199
+ continue;
200
+ }
201
+
202
+ if (!isset($installed['versions'][$packageName]['reference'])) {
203
+ return null;
204
+ }
205
+
206
+ return $installed['versions'][$packageName]['reference'];
207
+ }
208
+
209
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
210
+ }
211
+
212
+ /**
213
+ * @param string $packageName
214
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
215
+ */
216
+ public static function getInstallPath($packageName)
217
+ {
218
+ foreach (self::getInstalled() as $installed) {
219
+ if (!isset($installed['versions'][$packageName])) {
220
+ continue;
221
+ }
222
+
223
+ return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
224
+ }
225
+
226
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
227
+ }
228
+
229
+ /**
230
+ * @return array
231
+ * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
232
+ */
233
+ public static function getRootPackage()
234
+ {
235
+ $installed = self::getInstalled();
236
+
237
+ return $installed[0]['root'];
238
+ }
239
+
240
+ /**
241
+ * Returns the raw installed.php data for custom implementations
242
+ *
243
+ * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
244
+ * @return array[]
245
+ * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
246
+ */
247
+ public static function getRawData()
248
+ {
249
+ @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
250
+
251
+ if (null === self::$installed) {
252
+ // only require the installed.php file if this file is loaded from its dumped location,
253
+ // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
254
+ if (substr(__DIR__, -8, 1) !== 'C') {
255
+ self::$installed = include __DIR__ . '/installed.php';
256
+ } else {
257
+ self::$installed = array();
258
+ }
259
+ }
260
+
261
+ return self::$installed;
262
+ }
263
+
264
+ /**
265
+ * Returns the raw data of all installed.php which are currently loaded for custom implementations
266
+ *
267
+ * @return array[]
268
+ * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
269
+ */
270
+ public static function getAllRawData()
271
+ {
272
+ return self::getInstalled();
273
+ }
274
+
275
+ /**
276
+ * Lets you reload the static array from another file
277
+ *
278
+ * This is only useful for complex integrations in which a project needs to use
279
+ * this class but then also needs to execute another project's autoloader in process,
280
+ * and wants to ensure both projects have access to their version of installed.php.
281
+ *
282
+ * A typical case would be PHPUnit, where it would need to make sure it reads all
283
+ * the data it needs from this class, then call reload() with
284
+ * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
285
+ * the project in which it runs can then also use this class safely, without
286
+ * interference between PHPUnit's dependencies and the project's dependencies.
287
+ *
288
+ * @param array[] $data A vendor/composer/installed.php data set
289
+ * @return void
290
+ *
291
+ * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
292
+ */
293
+ public static function reload($data)
294
+ {
295
+ self::$installed = $data;
296
+ self::$installedByVendor = array();
297
+ }
298
+
299
+ /**
300
+ * @return array[]
301
+ * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
302
+ */
303
+ private static function getInstalled()
304
+ {
305
+ if (null === self::$canGetVendors) {
306
+ self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
307
+ }
308
+
309
+ $installed = array();
310
+
311
+ if (self::$canGetVendors) {
312
+ foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
313
+ if (isset(self::$installedByVendor[$vendorDir])) {
314
+ $installed[] = self::$installedByVendor[$vendorDir];
315
+ } elseif (is_file($vendorDir.'/composer/installed.php')) {
316
+ $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
317
+ if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
318
+ self::$installed = $installed[count($installed) - 1];
319
+ }
320
+ }
321
+ }
322
+ }
323
+
324
+ if (null === self::$installed) {
325
+ // only require the installed.php file if this file is loaded from its dumped location,
326
+ // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
327
+ if (substr(__DIR__, -8, 1) !== 'C') {
328
+ self::$installed = require __DIR__ . '/installed.php';
329
+ } else {
330
+ self::$installed = array();
331
+ }
332
+ }
333
+ $installed[] = self::$installed;
334
+
335
+ return $installed;
336
+ }
337
  }
vendor/composer/autoload_files.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_files.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ '41c664bd04a95c2d6a2f2a3e00f06593' => $vendorDir . '/publishpress/wordpress-reviews/ReviewsController.php',
10
+ );
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit252d08f02d77dcc4a9b095ab08120c6d
6
  {
7
  private static $loader;
8
 
@@ -22,15 +22,17 @@ class ComposerAutoloaderInit252d08f02d77dcc4a9b095ab08120c6d
22
  return self::$loader;
23
  }
24
 
25
- spl_autoload_register(array('ComposerAutoloaderInit252d08f02d77dcc4a9b095ab08120c6d', 'loadClassLoader'), true, true);
26
- self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
- spl_autoload_unregister(array('ComposerAutoloaderInit252d08f02d77dcc4a9b095ab08120c6d', 'loadClassLoader'));
 
 
28
 
29
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
30
  if ($useStaticLoader) {
31
  require __DIR__ . '/autoload_static.php';
32
 
33
- call_user_func(\Composer\Autoload\ComposerStaticInit252d08f02d77dcc4a9b095ab08120c6d::getInitializer($loader));
34
  } else {
35
  $map = require __DIR__ . '/autoload_namespaces.php';
36
  foreach ($map as $namespace => $path) {
@@ -50,6 +52,24 @@ class ComposerAutoloaderInit252d08f02d77dcc4a9b095ab08120c6d
50
 
51
  $loader->register(true);
52
 
 
 
 
 
 
 
 
 
 
53
  return $loader;
54
  }
55
  }
 
 
 
 
 
 
 
 
 
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInitb4c7c32b9bcab4f54643f778f077efdc
6
  {
7
  private static $loader;
8
 
22
  return self::$loader;
23
  }
24
 
25
+ require __DIR__ . '/platform_check.php';
26
+
27
+ spl_autoload_register(array('ComposerAutoloaderInitb4c7c32b9bcab4f54643f778f077efdc', 'loadClassLoader'), true, true);
28
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
29
+ spl_autoload_unregister(array('ComposerAutoloaderInitb4c7c32b9bcab4f54643f778f077efdc', 'loadClassLoader'));
30
 
31
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
32
  if ($useStaticLoader) {
33
  require __DIR__ . '/autoload_static.php';
34
 
35
+ call_user_func(\Composer\Autoload\ComposerStaticInitb4c7c32b9bcab4f54643f778f077efdc::getInitializer($loader));
36
  } else {
37
  $map = require __DIR__ . '/autoload_namespaces.php';
38
  foreach ($map as $namespace => $path) {
52
 
53
  $loader->register(true);
54
 
55
+ if ($useStaticLoader) {
56
+ $includeFiles = Composer\Autoload\ComposerStaticInitb4c7c32b9bcab4f54643f778f077efdc::$files;
57
+ } else {
58
+ $includeFiles = require __DIR__ . '/autoload_files.php';
59
+ }
60
+ foreach ($includeFiles as $fileIdentifier => $file) {
61
+ composerRequireb4c7c32b9bcab4f54643f778f077efdc($fileIdentifier, $file);
62
+ }
63
+
64
  return $loader;
65
  }
66
  }
67
+
68
+ function composerRequireb4c7c32b9bcab4f54643f778f077efdc($fileIdentifier, $file)
69
+ {
70
+ if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
71
+ require $file;
72
+
73
+ $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
74
+ }
75
+ }
vendor/composer/autoload_static.php CHANGED
@@ -4,8 +4,12 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInit252d08f02d77dcc4a9b095ab08120c6d
8
  {
 
 
 
 
9
  public static $classMap = array (
10
  'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
11
  );
@@ -13,7 +17,7 @@ class ComposerStaticInit252d08f02d77dcc4a9b095ab08120c6d
13
  public static function getInitializer(ClassLoader $loader)
14
  {
15
  return \Closure::bind(function () use ($loader) {
16
- $loader->classMap = ComposerStaticInit252d08f02d77dcc4a9b095ab08120c6d::$classMap;
17
 
18
  }, null, ClassLoader::class);
19
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInitb4c7c32b9bcab4f54643f778f077efdc
8
  {
9
+ public static $files = array (
10
+ '41c664bd04a95c2d6a2f2a3e00f06593' => __DIR__ . '/..' . '/publishpress/wordpress-reviews/ReviewsController.php',
11
+ );
12
+
13
  public static $classMap = array (
14
  'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
15
  );
17
  public static function getInitializer(ClassLoader $loader)
18
  {
19
  return \Closure::bind(function () use ($loader) {
20
+ $loader->classMap = ComposerStaticInitb4c7c32b9bcab4f54643f778f077efdc::$classMap;
21
 
22
  }, null, ClassLoader::class);
23
  }
vendor/composer/installed.json CHANGED
@@ -1,5 +1,62 @@
1
  {
2
- "packages": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  "dev": false,
4
  "dev-package-names": []
5
  }
1
  {
2
+ "packages": [
3
+ {
4
+ "name": "publishpress/wordpress-reviews",
5
+ "version": "v1.1.11",
6
+ "version_normalized": "1.1.11.0",
7
+ "source": {
8
+ "type": "git",
9
+ "url": "https://github.com/publishpress/wordpress-reviews.git",
10
+ "reference": "eb913d04f5cc18769b9b415324305a2f9695d30e"
11
+ },
12
+ "dist": {
13
+ "type": "zip",
14
+ "url": "https://api.github.com/repos/publishpress/wordpress-reviews/zipball/eb913d04f5cc18769b9b415324305a2f9695d30e",
15
+ "reference": "eb913d04f5cc18769b9b415324305a2f9695d30e",
16
+ "shasum": ""
17
+ },
18
+ "require": {
19
+ "php": ">=5.6.20"
20
+ },
21
+ "require-dev": {
22
+ "overtrue/phplint": "^2.1"
23
+ },
24
+ "time": "2021-10-26T15:47:36+00:00",
25
+ "type": "library",
26
+ "installation-source": "dist",
27
+ "autoload": {
28
+ "files": [
29
+ "ReviewsController.php"
30
+ ]
31
+ },
32
+ "notification-url": "https://packagist.org/downloads/",
33
+ "license": [
34
+ "GPL-3.0-or-later"
35
+ ],
36
+ "authors": [
37
+ {
38
+ "name": "PublishPress",
39
+ "email": "help@publishpress.com"
40
+ },
41
+ {
42
+ "name": "Daniel Iser",
43
+ "homepage": "https://github.com/danieliser/WP-Product-In-Dash-Review-Requests"
44
+ }
45
+ ],
46
+ "description": "Library for showing a five-star review banner.",
47
+ "homepage": "http://publishpress.com/",
48
+ "keywords": [
49
+ "review",
50
+ "reviews",
51
+ "wordpress plugin"
52
+ ],
53
+ "support": {
54
+ "issues": "https://github.com/publishpress/wordpress-reviews/issues",
55
+ "source": "https://github.com/publishpress/wordpress-reviews/tree/v1.1.11"
56
+ },
57
+ "install-path": "../publishpress/wordpress-reviews"
58
+ }
59
+ ],
60
  "dev": false,
61
  "dev-package-names": []
62
  }
vendor/composer/installed.php CHANGED
@@ -1,24 +1,32 @@
1
- <?php return array (
2
- 'root' =>
3
- array (
4
- 'pretty_version' => 'dev-main',
5
- 'version' => 'dev-main',
6
- 'aliases' =>
7
- array (
 
 
 
8
  ),
9
- 'reference' => '51bb3d37d22a270fd69314262d1ff3f997ee8f4c',
10
- 'name' => 'publishpress/post-expirator',
11
- ),
12
- 'versions' =>
13
- array (
14
- 'publishpress/post-expirator' =>
15
- array (
16
- 'pretty_version' => 'dev-main',
17
- 'version' => 'dev-main',
18
- 'aliases' =>
19
- array (
20
- ),
21
- 'reference' => '51bb3d37d22a270fd69314262d1ff3f997ee8f4c',
 
 
 
 
 
 
22
  ),
23
- ),
24
  );
1
+ <?php return array(
2
+ 'root' => array(
3
+ 'pretty_version' => 'dev-main',
4
+ 'version' => 'dev-main',
5
+ 'type' => 'wordpress-plugin',
6
+ 'install_path' => __DIR__ . '/../../',
7
+ 'aliases' => array(),
8
+ 'reference' => '2f5ba153bfa0d15e1a6a943866cf71f25ec1d5f2',
9
+ 'name' => 'publishpress/post-expirator',
10
+ 'dev' => false,
11
  ),
12
+ 'versions' => array(
13
+ 'publishpress/post-expirator' => array(
14
+ 'pretty_version' => 'dev-main',
15
+ 'version' => 'dev-main',
16
+ 'type' => 'wordpress-plugin',
17
+ 'install_path' => __DIR__ . '/../../',
18
+ 'aliases' => array(),
19
+ 'reference' => '2f5ba153bfa0d15e1a6a943866cf71f25ec1d5f2',
20
+ 'dev_requirement' => false,
21
+ ),
22
+ 'publishpress/wordpress-reviews' => array(
23
+ 'pretty_version' => 'v1.1.11',
24
+ 'version' => '1.1.11.0',
25
+ 'type' => 'library',
26
+ 'install_path' => __DIR__ . '/../publishpress/wordpress-reviews',
27
+ 'aliases' => array(),
28
+ 'reference' => 'eb913d04f5cc18769b9b415324305a2f9695d30e',
29
+ 'dev_requirement' => false,
30
+ ),
31
  ),
 
32
  );
vendor/composer/platform_check.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // platform_check.php @generated by Composer
4
+
5
+ $issues = array();
6
+
7
+ if (!(PHP_VERSION_ID >= 50620)) {
8
+ $issues[] = 'Your Composer dependencies require a PHP version ">= 5.6.20". You are running ' . PHP_VERSION . '.';
9
+ }
10
+
11
+ if ($issues) {
12
+ if (!headers_sent()) {
13
+ header('HTTP/1.1 500 Internal Server Error');
14
+ }
15
+ if (!ini_get('display_errors')) {
16
+ if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
17
+ fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
18
+ } elseif (!headers_sent()) {
19
+ echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
20
+ }
21
+ }
22
+ trigger_error(
23
+ 'Composer detected issues in your platform: ' . implode(' ', $issues),
24
+ E_USER_ERROR
25
+ );
26
+ }
vendor/publishpress/wordpress-reviews/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
1
+ .idea/
2
+ vendor/
vendor/publishpress/wordpress-reviews/LICENSE ADDED
@@ -0,0 +1,674 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 3, 29 June 2007
3
+
4
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
5
+ Everyone is permitted to copy and distribute verbatim copies
6
+ of this license document, but changing it is not allowed.
7
+
8
+ Preamble
9
+
10
+ The GNU General Public License is a free, copyleft license for
11
+ software and other kinds of works.
12
+
13
+ The licenses for most software and other practical works are designed
14
+ to take away your freedom to share and change the works. By contrast,
15
+ the GNU General Public License is intended to guarantee your freedom to
16
+ share and change all versions of a program--to make sure it remains free
17
+ software for all its users. We, the Free Software Foundation, use the
18
+ GNU General Public License for most of our software; it applies also to
19
+ any other work released this way by its authors. You can apply it to
20
+ your programs, too.
21
+
22
+ When we speak of free software, we are referring to freedom, not
23
+ price. Our General Public Licenses are designed to make sure that you
24
+ have the freedom to distribute copies of free software (and charge for
25
+ them if you wish), that you receive source code or can get it if you
26
+ want it, that you can change the software or use pieces of it in new
27
+ free programs, and that you know you can do these things.
28
+
29
+ To protect your rights, we need to prevent others from denying you
30
+ these rights or asking you to surrender the rights. Therefore, you have
31
+ certain responsibilities if you distribute copies of the software, or if
32
+ you modify it: responsibilities to respect the freedom of others.
33
+
34
+ For example, if you distribute copies of such a program, whether
35
+ gratis or for a fee, you must pass on to the recipients the same
36
+ freedoms that you received. You must make sure that they, too, receive
37
+ or can get the source code. And you must show them these terms so they
38
+ know their rights.
39
+
40
+ Developers that use the GNU GPL protect your rights with two steps:
41
+ (1) assert copyright on the software, and (2) offer you this License
42
+ giving you legal permission to copy, distribute and/or modify it.
43
+
44
+ For the developers' and authors' protection, the GPL clearly explains
45
+ that there is no warranty for this free software. For both users' and
46
+ authors' sake, the GPL requires that modified versions be marked as
47
+ changed, so that their problems will not be attributed erroneously to
48
+ authors of previous versions.
49
+
50
+ Some devices are designed to deny users access to install or run
51
+ modified versions of the software inside them, although the manufacturer
52
+ can do so. This is fundamentally incompatible with the aim of
53
+ protecting users' freedom to change the software. The systematic
54
+ pattern of such abuse occurs in the area of products for individuals to
55
+ use, which is precisely where it is most unacceptable. Therefore, we
56
+ have designed this version of the GPL to prohibit the practice for those
57
+ products. If such problems arise substantially in other domains, we
58
+ stand ready to extend this provision to those domains in future versions
59
+ of the GPL, as needed to protect the freedom of users.
60
+
61
+ Finally, every program is threatened constantly by software patents.
62
+ States should not allow patents to restrict development and use of
63
+ software on general-purpose computers, but in those that do, we wish to
64
+ avoid the special danger that patents applied to a free program could
65
+ make it effectively proprietary. To prevent this, the GPL assures that
66
+ patents cannot be used to render the program non-free.
67
+
68
+ The precise terms and conditions for copying, distribution and
69
+ modification follow.
70
+
71
+ TERMS AND CONDITIONS
72
+
73
+ 0. Definitions.
74
+
75
+ "This License" refers to version 3 of the GNU General Public License.
76
+
77
+ "Copyright" also means copyright-like laws that apply to other kinds of
78
+ works, such as semiconductor masks.
79
+
80
+ "The Program" refers to any copyrightable work licensed under this
81
+ License. Each licensee is addressed as "you". "Licensees" and
82
+ "recipients" may be individuals or organizations.
83
+
84
+ To "modify" a work means to copy from or adapt all or part of the work
85
+ in a fashion requiring copyright permission, other than the making of an
86
+ exact copy. The resulting work is called a "modified version" of the
87
+ earlier work or a work "based on" the earlier work.
88
+
89
+ A "covered work" means either the unmodified Program or a work based
90
+ on the Program.
91
+
92
+ To "propagate" a work means to do anything with it that, without
93
+ permission, would make you directly or secondarily liable for
94
+ infringement under applicable copyright law, except executing it on a
95
+ computer or modifying a private copy. Propagation includes copying,
96
+ distribution (with or without modification), making available to the
97
+ public, and in some countries other activities as well.
98
+
99
+ To "convey" a work means any kind of propagation that enables other
100
+ parties to make or receive copies. Mere interaction with a user through
101
+ a computer network, with no transfer of a copy, is not conveying.
102
+
103
+ An interactive user interface displays "Appropriate Legal Notices"
104
+ to the extent that it includes a convenient and prominently visible
105
+ feature that (1) displays an appropriate copyright notice, and (2)
106
+ tells the user that there is no warranty for the work (except to the
107
+ extent that warranties are provided), that licensees may convey the
108
+ work under this License, and how to view a copy of this License. If
109
+ the interface presents a list of user commands or options, such as a
110
+ menu, a prominent item in the list meets this criterion.
111
+
112
+ 1. Source Code.
113
+
114
+ The "source code" for a work means the preferred form of the work
115
+ for making modifications to it. "Object code" means any non-source
116
+ form of a work.
117
+
118
+ A "Standard Interface" means an interface that either is an official
119
+ standard defined by a recognized standards body, or, in the case of
120
+ interfaces specified for a particular programming language, one that
121
+ is widely used among developers working in that language.
122
+
123
+ The "System Libraries" of an executable work include anything, other
124
+ than the work as a whole, that (a) is included in the normal form of
125
+ packaging a Major Component, but which is not part of that Major
126
+ Component, and (b) serves only to enable use of the work with that
127
+ Major Component, or to implement a Standard Interface for which an
128
+ implementation is available to the public in source code form. A
129
+ "Major Component", in this context, means a major essential component
130
+ (kernel, window system, and so on) of the specific operating system
131
+ (if any) on which the executable work runs, or a compiler used to
132
+ produce the work, or an object code interpreter used to run it.
133
+
134
+ The "Corresponding Source" for a work in object code form means all
135
+ the source code needed to generate, install, and (for an executable
136
+ work) run the object code and to modify the work, including scripts to
137
+ control those activities. However, it does not include the work's
138
+ System Libraries, or general-purpose tools or generally available free
139
+ programs which are used unmodified in performing those activities but
140
+ which are not part of the work. For example, Corresponding Source
141
+ includes interface definition files associated with source files for
142
+ the work, and the source code for shared libraries and dynamically
143
+ linked subprograms that the work is specifically designed to require,
144
+ such as by intimate data communication or control flow between those
145
+ subprograms and other parts of the work.
146
+
147
+ The Corresponding Source need not include anything that users
148
+ can regenerate automatically from other parts of the Corresponding
149
+ Source.
150
+
151
+ The Corresponding Source for a work in source code form is that
152
+ same work.
153
+
154
+ 2. Basic Permissions.
155
+
156
+ All rights granted under this License are granted for the term of
157
+ copyright on the Program, and are irrevocable provided the stated
158
+ conditions are met. This License explicitly affirms your unlimited
159
+ permission to run the unmodified Program. The output from running a
160
+ covered work is covered by this License only if the output, given its
161
+ content, constitutes a covered work. This License acknowledges your
162
+ rights of fair use or other equivalent, as provided by copyright law.
163
+
164
+ You may make, run and propagate covered works that you do not
165
+ convey, without conditions so long as your license otherwise remains
166
+ in force. You may convey covered works to others for the sole purpose
167
+ of having them make modifications exclusively for you, or provide you
168
+ with facilities for running those works, provided that you comply with
169
+ the terms of this License in conveying all material for which you do
170
+ not control copyright. Those thus making or running the covered works
171
+ for you must do so exclusively on your behalf, under your direction
172
+ and control, on terms that prohibit them from making any copies of
173
+ your copyrighted material outside their relationship with you.
174
+
175
+ Conveying under any other circumstances is permitted solely under
176
+ the conditions stated below. Sublicensing is not allowed; section 10
177
+ makes it unnecessary.
178
+
179
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180
+
181
+ No covered work shall be deemed part of an effective technological
182
+ measure under any applicable law fulfilling obligations under article
183
+ 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184
+ similar laws prohibiting or restricting circumvention of such
185
+ measures.
186
+
187
+ When you convey a covered work, you waive any legal power to forbid
188
+ circumvention of technological measures to the extent such circumvention
189
+ is effected by exercising rights under this License with respect to
190
+ the covered work, and you disclaim any intention to limit operation or
191
+ modification of the work as a means of enforcing, against the work's
192
+ users, your or third parties' legal rights to forbid circumvention of
193
+ technological measures.
194
+
195
+ 4. Conveying Verbatim Copies.
196
+
197
+ You may convey verbatim copies of the Program's source code as you
198
+ receive it, in any medium, provided that you conspicuously and
199
+ appropriately publish on each copy an appropriate copyright notice;
200
+ keep intact all notices stating that this License and any
201
+ non-permissive terms added in accord with section 7 apply to the code;
202
+ keep intact all notices of the absence of any warranty; and give all
203
+ recipients a copy of this License along with the Program.
204
+
205
+ You may charge any price or no price for each copy that you convey,
206
+ and you may offer support or warranty protection for a fee.
207
+
208
+ 5. Conveying Modified Source Versions.
209
+
210
+ You may convey a work based on the Program, or the modifications to
211
+ produce it from the Program, in the form of source code under the
212
+ terms of section 4, provided that you also meet all of these conditions:
213
+
214
+ a) The work must carry prominent notices stating that you modified
215
+ it, and giving a relevant date.
216
+
217
+ b) The work must carry prominent notices stating that it is
218
+ released under this License and any conditions added under section
219
+ 7. This requirement modifies the requirement in section 4 to
220
+ "keep intact all notices".
221
+
222
+ c) You must license the entire work, as a whole, under this
223
+ License to anyone who comes into possession of a copy. This
224
+ License will therefore apply, along with any applicable section 7
225
+ additional terms, to the whole of the work, and all its parts,
226
+ regardless of how they are packaged. This License gives no
227
+ permission to license the work in any other way, but it does not
228
+ invalidate such permission if you have separately received it.
229
+
230
+ d) If the work has interactive user interfaces, each must display
231
+ Appropriate Legal Notices; however, if the Program has interactive
232
+ interfaces that do not display Appropriate Legal Notices, your
233
+ work need not make them do so.
234
+
235
+ A compilation of a covered work with other separate and independent
236
+ works, which are not by their nature extensions of the covered work,
237
+ and which are not combined with it such as to form a larger program,
238
+ in or on a volume of a storage or distribution medium, is called an
239
+ "aggregate" if the compilation and its resulting copyright are not
240
+ used to limit the access or legal rights of the compilation's users
241
+ beyond what the individual works permit. Inclusion of a covered work
242
+ in an aggregate does not cause this License to apply to the other
243
+ parts of the aggregate.
244
+
245
+ 6. Conveying Non-Source Forms.
246
+
247
+ You may convey a covered work in object code form under the terms
248
+ of sections 4 and 5, provided that you also convey the
249
+ machine-readable Corresponding Source under the terms of this License,
250
+ in one of these ways:
251
+
252
+ a) Convey the object code in, or embodied in, a physical product
253
+ (including a physical distribution medium), accompanied by the
254
+ Corresponding Source fixed on a durable physical medium
255
+ customarily used for software interchange.
256
+
257
+ b) Convey the object code in, or embodied in, a physical product
258
+ (including a physical distribution medium), accompanied by a
259
+ written offer, valid for at least three years and valid for as
260
+ long as you offer spare parts or customer support for that product
261
+ model, to give anyone who possesses the object code either (1) a
262
+ copy of the Corresponding Source for all the software in the
263
+ product that is covered by this License, on a durable physical
264
+ medium customarily used for software interchange, for a price no
265
+ more than your reasonable cost of physically performing this
266
+ conveying of source, or (2) access to copy the
267
+ Corresponding Source from a network server at no charge.
268
+
269
+ c) Convey individual copies of the object code with a copy of the
270
+ written offer to provide the Corresponding Source. This
271
+ alternative is allowed only occasionally and noncommercially, and
272
+ only if you received the object code with such an offer, in accord
273
+ with subsection 6b.
274
+
275
+ d) Convey the object code by offering access from a designated
276
+ place (gratis or for a charge), and offer equivalent access to the
277
+ Corresponding Source in the same way through the same place at no
278
+ further charge. You need not require recipients to copy the
279
+ Corresponding Source along with the object code. If the place to
280
+ copy the object code is a network server, the Corresponding Source
281
+ may be on a different server (operated by you or a third party)
282
+ that supports equivalent copying facilities, provided you maintain
283
+ clear directions next to the object code saying where to find the
284
+ Corresponding Source. Regardless of what server hosts the
285
+ Corresponding Source, you remain obligated to ensure that it is
286
+ available for as long as needed to satisfy these requirements.
287
+
288
+ e) Convey the object code using peer-to-peer transmission, provided
289
+ you inform other peers where the object code and Corresponding
290
+ Source of the work are being offered to the general public at no
291
+ charge under subsection 6d.
292
+
293
+ A separable portion of the object code, whose source code is excluded
294
+ from the Corresponding Source as a System Library, need not be
295
+ included in conveying the object code work.
296
+
297
+ A "User Product" is either (1) a "consumer product", which means any
298
+ tangible personal property which is normally used for personal, family,
299
+ or household purposes, or (2) anything designed or sold for incorporation
300
+ into a dwelling. In determining whether a product is a consumer product,
301
+ doubtful cases shall be resolved in favor of coverage. For a particular
302
+ product received by a particular user, "normally used" refers to a
303
+ typical or common use of that class of product, regardless of the status
304
+ of the particular user or of the way in which the particular user
305
+ actually uses, or expects or is expected to use, the product. A product
306
+ is a consumer product regardless of whether the product has substantial
307
+ commercial, industrial or non-consumer uses, unless such uses represent
308
+ the only significant mode of use of the product.
309
+
310
+ "Installation Information" for a User Product means any methods,
311
+ procedures, authorization keys, or other information required to install
312
+ and execute modified versions of a covered work in that User Product from
313
+ a modified version of its Corresponding Source. The information must
314
+ suffice to ensure that the continued functioning of the modified object
315
+ code is in no case prevented or interfered with solely because
316
+ modification has been made.
317
+
318
+ If you convey an object code work under this section in, or with, or
319
+ specifically for use in, a User Product, and the conveying occurs as
320
+ part of a transaction in which the right of possession and use of the
321
+ User Product is transferred to the recipient in perpetuity or for a
322
+ fixed term (regardless of how the transaction is characterized), the
323
+ Corresponding Source conveyed under this section must be accompanied
324
+ by the Installation Information. But this requirement does not apply
325
+ if neither you nor any third party retains the ability to install
326
+ modified object code on the User Product (for example, the work has
327
+ been installed in ROM).
328
+
329
+ The requirement to provide Installation Information does not include a
330
+ requirement to continue to provide support service, warranty, or updates
331
+ for a work that has been modified or installed by the recipient, or for
332
+ the User Product in which it has been modified or installed. Access to a
333
+ network may be denied when the modification itself materially and
334
+ adversely affects the operation of the network or violates the rules and
335
+ protocols for communication across the network.
336
+
337
+ Corresponding Source conveyed, and Installation Information provided,
338
+ in accord with this section must be in a format that is publicly
339
+ documented (and with an implementation available to the public in
340
+ source code form), and must require no special password or key for
341
+ unpacking, reading or copying.
342
+
343
+ 7. Additional Terms.
344
+
345
+ "Additional permissions" are terms that supplement the terms of this
346
+ License by making exceptions from one or more of its conditions.
347
+ Additional permissions that are applicable to the entire Program shall
348
+ be treated as though they were included in this License, to the extent
349
+ that they are valid under applicable law. If additional permissions
350
+ apply only to part of the Program, that part may be used separately
351
+ under those permissions, but the entire Program remains governed by
352
+ this License without regard to the additional permissions.
353
+
354
+ When you convey a copy of a covered work, you may at your option
355
+ remove any additional permissions from that copy, or from any part of
356
+ it. (Additional permissions may be written to require their own
357
+ removal in certain cases when you modify the work.) You may place
358
+ additional permissions on material, added by you to a covered work,
359
+ for which you have or can give appropriate copyright permission.
360
+
361
+ Notwithstanding any other provision of this License, for material you
362
+ add to a covered work, you may (if authorized by the copyright holders of
363
+ that material) supplement the terms of this License with terms:
364
+
365
+ a) Disclaiming warranty or limiting liability differently from the
366
+ terms of sections 15 and 16 of this License; or
367
+
368
+ b) Requiring preservation of specified reasonable legal notices or
369
+ author attributions in that material or in the Appropriate Legal
370
+ Notices displayed by works containing it; or
371
+
372
+ c) Prohibiting misrepresentation of the origin of that material, or
373
+ requiring that modified versions of such material be marked in
374
+ reasonable ways as different from the original version; or
375
+
376
+ d) Limiting the use for publicity purposes of names of licensors or
377
+ authors of the material; or
378
+
379
+ e) Declining to grant rights under trademark law for use of some
380
+ trade names, trademarks, or service marks; or
381
+
382
+ f) Requiring indemnification of licensors and authors of that
383
+ material by anyone who conveys the material (or modified versions of
384
+ it) with contractual assumptions of liability to the recipient, for
385
+ any liability that these contractual assumptions directly impose on
386
+ those licensors and authors.
387
+
388
+ All other non-permissive additional terms are considered "further
389
+ restrictions" within the meaning of section 10. If the Program as you
390
+ received it, or any part of it, contains a notice stating that it is
391
+ governed by this License along with a term that is a further
392
+ restriction, you may remove that term. If a license document contains
393
+ a further restriction but permits relicensing or conveying under this
394
+ License, you may add to a covered work material governed by the terms
395
+ of that license document, provided that the further restriction does
396
+ not survive such relicensing or conveying.
397
+
398
+ If you add terms to a covered work in accord with this section, you
399
+ must place, in the relevant source files, a statement of the
400
+ additional terms that apply to those files, or a notice indicating
401
+ where to find the applicable terms.
402
+
403
+ Additional terms, permissive or non-permissive, may be stated in the
404
+ form of a separately written license, or stated as exceptions;
405
+ the above requirements apply either way.
406
+
407
+ 8. Termination.
408
+
409
+ You may not propagate or modify a covered work except as expressly
410
+ provided under this License. Any attempt otherwise to propagate or
411
+ modify it is void, and will automatically terminate your rights under
412
+ this License (including any patent licenses granted under the third
413
+ paragraph of section 11).
414
+
415
+ However, if you cease all violation of this License, then your
416
+ license from a particular copyright holder is reinstated (a)
417
+ provisionally, unless and until the copyright holder explicitly and
418
+ finally terminates your license, and (b) permanently, if the copyright
419
+ holder fails to notify you of the violation by some reasonable means
420
+ prior to 60 days after the cessation.
421
+
422
+ Moreover, your license from a particular copyright holder is
423
+ reinstated permanently if the copyright holder notifies you of the
424
+ violation by some reasonable means, this is the first time you have
425
+ received notice of violation of this License (for any work) from that
426
+ copyright holder, and you cure the violation prior to 30 days after
427
+ your receipt of the notice.
428
+
429
+ Termination of your rights under this section does not terminate the
430
+ licenses of parties who have received copies or rights from you under
431
+ this License. If your rights have been terminated and not permanently
432
+ reinstated, you do not qualify to receive new licenses for the same
433
+ material under section 10.
434
+
435
+ 9. Acceptance Not Required for Having Copies.
436
+
437
+ You are not required to accept this License in order to receive or
438
+ run a copy of the Program. Ancillary propagation of a covered work
439
+ occurring solely as a consequence of using peer-to-peer transmission
440
+ to receive a copy likewise does not require acceptance. However,
441
+ nothing other than this License grants you permission to propagate or
442
+ modify any covered work. These actions infringe copyright if you do
443
+ not accept this License. Therefore, by modifying or propagating a
444
+ covered work, you indicate your acceptance of this License to do so.
445
+
446
+ 10. Automatic Licensing of Downstream Recipients.
447
+
448
+ Each time you convey a covered work, the recipient automatically
449
+ receives a license from the original licensors, to run, modify and
450
+ propagate that work, subject to this License. You are not responsible
451
+ for enforcing compliance by third parties with this License.
452
+
453
+ An "entity transaction" is a transaction transferring control of an
454
+ organization, or substantially all assets of one, or subdividing an
455
+ organization, or merging organizations. If propagation of a covered
456
+ work results from an entity transaction, each party to that
457
+ transaction who receives a copy of the work also receives whatever
458
+ licenses to the work the party's predecessor in interest had or could
459
+ give under the previous paragraph, plus a right to possession of the
460
+ Corresponding Source of the work from the predecessor in interest, if
461
+ the predecessor has it or can get it with reasonable efforts.
462
+
463
+ You may not impose any further restrictions on the exercise of the
464
+ rights granted or affirmed under this License. For example, you may
465
+ not impose a license fee, royalty, or other charge for exercise of
466
+ rights granted under this License, and you may not initiate litigation
467
+ (including a cross-claim or counterclaim in a lawsuit) alleging that
468
+ any patent claim is infringed by making, using, selling, offering for
469
+ sale, or importing the Program or any portion of it.
470
+
471
+ 11. Patents.
472
+
473
+ A "contributor" is a copyright holder who authorizes use under this
474
+ License of the Program or a work on which the Program is based. The
475
+ work thus licensed is called the contributor's "contributor version".
476
+
477
+ A contributor's "essential patent claims" are all patent claims
478
+ owned or controlled by the contributor, whether already acquired or
479
+ hereafter acquired, that would be infringed by some manner, permitted
480
+ by this License, of making, using, or selling its contributor version,
481
+ but do not include claims that would be infringed only as a
482
+ consequence of further modification of the contributor version. For
483
+ purposes of this definition, "control" includes the right to grant
484
+ patent sublicenses in a manner consistent with the requirements of
485
+ this License.
486
+
487
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
488
+ patent license under the contributor's essential patent claims, to
489
+ make, use, sell, offer for sale, import and otherwise run, modify and
490
+ propagate the contents of its contributor version.
491
+
492
+ In the following three paragraphs, a "patent license" is any express
493
+ agreement or commitment, however denominated, not to enforce a patent
494
+ (such as an express permission to practice a patent or covenant not to
495
+ sue for patent infringement). To "grant" such a patent license to a
496
+ party means to make such an agreement or commitment not to enforce a
497
+ patent against the party.
498
+
499
+ If you convey a covered work, knowingly relying on a patent license,
500
+ and the Corresponding Source of the work is not available for anyone
501
+ to copy, free of charge and under the terms of this License, through a
502
+ publicly available network server or other readily accessible means,
503
+ then you must either (1) cause the Corresponding Source to be so
504
+ available, or (2) arrange to deprive yourself of the benefit of the
505
+ patent license for this particular work, or (3) arrange, in a manner
506
+ consistent with the requirements of this License, to extend the patent
507
+ license to downstream recipients. "Knowingly relying" means you have
508
+ actual knowledge that, but for the patent license, your conveying the
509
+ covered work in a country, or your recipient's use of the covered work
510
+ in a country, would infringe one or more identifiable patents in that
511
+ country that you have reason to believe are valid.
512
+
513
+ If, pursuant to or in connection with a single transaction or
514
+ arrangement, you convey, or propagate by procuring conveyance of, a
515
+ covered work, and grant a patent license to some of the parties
516
+ receiving the covered work authorizing them to use, propagate, modify
517
+ or convey a specific copy of the covered work, then the patent license
518
+ you grant is automatically extended to all recipients of the covered
519
+ work and works based on it.
520
+
521
+ A patent license is "discriminatory" if it does not include within
522
+ the scope of its coverage, prohibits the exercise of, or is
523
+ conditioned on the non-exercise of one or more of the rights that are
524
+ specifically granted under this License. You may not convey a covered
525
+ work if you are a party to an arrangement with a third party that is
526
+ in the business of distributing software, under which you make payment
527
+ to the third party based on the extent of your activity of conveying
528
+ the work, and under which the third party grants, to any of the
529
+ parties who would receive the covered work from you, a discriminatory
530
+ patent license (a) in connection with copies of the covered work
531
+ conveyed by you (or copies made from those copies), or (b) primarily
532
+ for and in connection with specific products or compilations that
533
+ contain the covered work, unless you entered into that arrangement,
534
+ or that patent license was granted, prior to 28 March 2007.
535
+
536
+ Nothing in this License shall be construed as excluding or limiting
537
+ any implied license or other defenses to infringement that may
538
+ otherwise be available to you under applicable patent law.
539
+
540
+ 12. No Surrender of Others' Freedom.
541
+
542
+ If conditions are imposed on you (whether by court order, agreement or
543
+ otherwise) that contradict the conditions of this License, they do not
544
+ excuse you from the conditions of this License. If you cannot convey a
545
+ covered work so as to satisfy simultaneously your obligations under this
546
+ License and any other pertinent obligations, then as a consequence you may
547
+ not convey it at all. For example, if you agree to terms that obligate you
548
+ to collect a royalty for further conveying from those to whom you convey
549
+ the Program, the only way you could satisfy both those terms and this
550
+ License would be to refrain entirely from conveying the Program.
551
+
552
+ 13. Use with the GNU Affero General Public License.
553
+
554
+ Notwithstanding any other provision of this License, you have
555
+ permission to link or combine any covered work with a work licensed
556
+ under version 3 of the GNU Affero General Public License into a single
557
+ combined work, and to convey the resulting work. The terms of this
558
+ License will continue to apply to the part which is the covered work,
559
+ but the special requirements of the GNU Affero General Public License,
560
+ section 13, concerning interaction through a network will apply to the
561
+ combination as such.
562
+
563
+ 14. Revised Versions of this License.
564
+
565
+ The Free Software Foundation may publish revised and/or new versions of
566
+ the GNU General Public License from time to time. Such new versions will
567
+ be similar in spirit to the present version, but may differ in detail to
568
+ address new problems or concerns.
569
+
570
+ Each version is given a distinguishing version number. If the
571
+ Program specifies that a certain numbered version of the GNU General
572
+ Public License "or any later version" applies to it, you have the
573
+ option of following the terms and conditions either of that numbered
574
+ version or of any later version published by the Free Software
575
+ Foundation. If the Program does not specify a version number of the
576
+ GNU General Public License, you may choose any version ever published
577
+ by the Free Software Foundation.
578
+
579
+ If the Program specifies that a proxy can decide which future
580
+ versions of the GNU General Public License can be used, that proxy's
581
+ public statement of acceptance of a version permanently authorizes you
582
+ to choose that version for the Program.
583
+
584
+ Later license versions may give you additional or different
585
+ permissions. However, no additional obligations are imposed on any
586
+ author or copyright holder as a result of your choosing to follow a
587
+ later version.
588
+
589
+ 15. Disclaimer of Warranty.
590
+
591
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592
+ APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593
+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594
+ OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596
+ PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597
+ IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598
+ ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599
+
600
+ 16. Limitation of Liability.
601
+
602
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604
+ THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605
+ GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606
+ USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608
+ PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609
+ EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610
+ SUCH DAMAGES.
611
+
612
+ 17. Interpretation of Sections 15 and 16.
613
+
614
+ If the disclaimer of warranty and limitation of liability provided
615
+ above cannot be given local legal effect according to their terms,
616
+ reviewing courts shall apply local law that most closely approximates
617
+ an absolute waiver of all civil liability in connection with the
618
+ Program, unless a warranty or assumption of liability accompanies a
619
+ copy of the Program in return for a fee.
620
+
621
+ END OF TERMS AND CONDITIONS
622
+
623
+ How to Apply These Terms to Your New Programs
624
+
625
+ If you develop a new program, and you want it to be of the greatest
626
+ possible use to the public, the best way to achieve this is to make it
627
+ free software which everyone can redistribute and change under these terms.
628
+
629
+ To do so, attach the following notices to the program. It is safest
630
+ to attach them to the start of each source file to most effectively
631
+ state the exclusion of warranty; and each file should have at least
632
+ the "copyright" line and a pointer to where the full notice is found.
633
+
634
+ <one line to give the program's name and a brief idea of what it does.>
635
+ Copyright (C) <year> <name of author>
636
+
637
+ This program is free software: you can redistribute it and/or modify
638
+ it under the terms of the GNU General Public License as published by
639
+ the Free Software Foundation, either version 3 of the License, or
640
+ (at your option) any later version.
641
+
642
+ This program is distributed in the hope that it will be useful,
643
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
644
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645
+ GNU General Public License for more details.
646
+
647
+ You should have received a copy of the GNU General Public License
648
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
649
+
650
+ Also add information on how to contact you by electronic and paper mail.
651
+
652
+ If the program does terminal interaction, make it output a short
653
+ notice like this when it starts in an interactive mode:
654
+
655
+ <program> Copyright (C) <year> <name of author>
656
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657
+ This is free software, and you are welcome to redistribute it
658
+ under certain conditions; type `show c' for details.
659
+
660
+ The hypothetical commands `show w' and `show c' should show the appropriate
661
+ parts of the General Public License. Of course, your program's commands
662
+ might be different; for a GUI interface, you would use an "about box".
663
+
664
+ You should also get your employer (if you work as a programmer) or school,
665
+ if any, to sign a "copyright disclaimer" for the program, if necessary.
666
+ For more information on this, and how to apply and follow the GNU GPL, see
667
+ <https://www.gnu.org/licenses/>.
668
+
669
+ The GNU General Public License does not permit incorporating your program
670
+ into proprietary programs. If your program is a subroutine library, you
671
+ may consider it more useful to permit linking proprietary applications with
672
+ the library. If this is what you want to do, use the GNU Lesser General
673
+ Public License instead of this License. But first, please read
674
+ <https://www.gnu.org/licenses/why-not-lgpl.html>.
vendor/publishpress/wordpress-reviews/README.md ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # PublishPress WordPress Reviews Library
2
+ Library for displaying a banner asking for a 5-star review on WordPress plugins.
3
+
4
+ ## Installation
5
+
6
+ We do recommend using composer for adding this library as a requirement:
7
+
8
+ ```shell
9
+ $ composer require publishpress/wordpress-reviews
10
+ ```
11
+
12
+ ## How to use it
13
+
14
+ If your plugin does not load the composer's autoloader yet, you need to add the following code:
15
+
16
+ ```php
17
+ <?php
18
+
19
+ require_once 'vendor/autoload.php';
20
+ ```
21
+
22
+ The library should be initialized in the method of your plugin that loads the main WordPress hooks.
23
+ You can add it to the main class of the plugin. When instantiating it you have to pass 3 params: the plugin slug (the same one used in the URL of the WordPress repository), the plugin's name, and the logo URL (optional).
24
+
25
+ Pro plugins don't require this library, if they use they embed the free plugin. If you instantiate this library on both free and pro plugins, users will probably see duplicated banners.
26
+
27
+ It by default displays the banner when the following condition is true:
28
+
29
+ ```php
30
+ is_admin() && current_user_can('edit_posts')
31
+ ```
32
+
33
+ But you can specify custom criteria to display the banner hooking into the filter `<plugin_slug>_wp_reviews_allow_display_notice`.
34
+
35
+ ```php
36
+ <?php
37
+
38
+ use PublishPress\WordPressReviews\ReviewsController;
39
+
40
+ class MyPlugin
41
+ {
42
+ /**
43
+ * @var ReviewsController
44
+ */
45
+ private $reviewController;
46
+
47
+ public function __construct()
48
+ {
49
+ $this->reviewController = new ReviewsController(
50
+ 'my-plugin',
51
+ 'My Plugin',
52
+ MY_PLUGIN_URL . '/assets/img/logo.png'
53
+ );
54
+ }
55
+
56
+ public function init()
57
+ {
58
+ // .......
59
+ add_filter('my-plugin_wp_reviews_allow_display_notice', [$this, 'shouldDisplayBanner']);
60
+
61
+ $this->reviewController->init();
62
+ }
63
+
64
+ public function shouldDisplayBanner($shouldDisplay)
65
+ {
66
+ global $pagenow;
67
+
68
+ if (! is_admin() || ! current_user_can('edit_posts')) {
69
+ return false;
70
+ }
71
+
72
+ if ($pagenow === 'admin.php' && isset($_GET['page'])) {
73
+ if ($_GET['page'] === 'pp-page1') {
74
+ return true;
75
+ }
76
+
77
+ if ($_GET['page'] === 'pp-page2') {
78
+ return true;
79
+ }
80
+ }
81
+
82
+ if ($pagenow === 'edit.php' && isset($_GET['post_type'])) {
83
+ if ($_GET['post_type'] === 'pp_custom_post_type') {
84
+ return true;
85
+ }
86
+ }
87
+
88
+ return false;
89
+ }
90
+
91
+ // .......
92
+ }
93
+ ```
94
+
95
+ By default, the library will use the plugin's slug as a prefix for the actions, metadata and options:
96
+
97
+ ```php
98
+ [
99
+ 'action_ajax_handler' => $this->pluginSlug . '_action',
100
+ 'option_installed_on' => $this->pluginSlug . '_wp_reviews_installed_on',
101
+ 'nonce_action' => $this->pluginSlug . '_wp_reviews_action',
102
+ 'user_meta_dismissed_triggers' => '_' . $this->pluginSlug . '_wp_reviews_dismissed_triggers',
103
+ 'user_meta_last_dismissed' => '_' . $this->pluginSlug . '_wp_reviews_last_dismissed',
104
+ 'user_meta_already_did' => '_' . $this->pluginSlug . '_wp_reviews_already_did',
105
+ 'filter_triggers' => $this->pluginSlug . '_wp_reviews_triggers',
106
+ ]
107
+ ```
108
+
109
+ If you already use the original library in your plugin and want to keep compatibility with current sites data, you can customize the
110
+ hooks and keys for the data stored in the DB using the filter `<plugin_slug>_wp_reviews_meta_map`:
111
+
112
+ ```php
113
+ <?php
114
+
115
+ add_filter('my-plugin_wp_reviews_meta_map', 'my_plugin_wp_reviews_meta_map');
116
+
117
+ function my_plugin_wp_reviews_meta_map($metaMap)
118
+ {
119
+ // You can override all the array, or specific keys.
120
+ $metaMap = [
121
+ 'action_ajax_handler' => 'legacy_slug_ajax_action',
122
+ 'option_installed_on' => 'legacy_slug_wp_reviews_installed_on',
123
+ 'nonce_action' => 'legacy_slug_wp_reviews_action',
124
+ 'user_meta_dismissed_triggers' => '_legacy_slug_wp_reviews_dismissed_triggers',
125
+ 'user_meta_last_dismissed' => '_legacy_slug_wp_reviews_last_dismissed',
126
+ 'user_meta_already_did' => '_legacy_slug_wp_reviews_already_did',
127
+ 'filter_triggers' => 'legacy_slug_wp_reviews_triggers',
128
+ ];
129
+
130
+ return $metaMap;
131
+ }
132
+ ```
133
+
134
+ ## Testing
135
+
136
+ You can easily test the banner in the WordPress admin.
137
+ After initializing the library, change the option `<plugin-slug>_wp_reviews_installed_on` in the options table. Set it for older data to make sure the time difference is bigger than the trigger we are using.
138
+
139
+ ## Copyright
140
+
141
+ Based on the [library](https://github.com/danieliser/WP-Product-In-Dash-Review-Requests) created by [Daniel Iser](https://danieliser.com).
vendor/publishpress/wordpress-reviews/ReviewsController.php ADDED
@@ -0,0 +1,688 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @package PublishPress
4
+ * @author PublishPress
5
+ *
6
+ * Copyright (c) 2021 PublishPress
7
+ *
8
+ * WordPressReviews is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * WordPressReviews is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with PublishPress. If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ * ---------------------------------------------------------------------
22
+ * It includes:
23
+ * - Multiple trigger groups which can be ordered by priority.
24
+ * - Multiple triggers per group.
25
+ * - Customizable messaging per trigger.
26
+ * - Link to review page.
27
+ * - Request reviews on a per-user basis rather than per site.
28
+ * - Allows each user to dismiss it until later or permanently seamlessly via AJAX.
29
+ * - Integrates with attached tracking server to keep anonymous records of each trigger's effectiveness.
30
+ * - Tracking Server API: https://gist.github.com/danieliser/0d997532e023c46d38e1bdfd50f38801
31
+ *
32
+ * Original Author: danieliser
33
+ * Original Author URL: https://danieliser.com
34
+ * URL: https://github.com/danieliser/WP-Product-In-Dash-Review-Requests
35
+ */
36
+
37
+ namespace PublishPress\WordPressReviews;
38
+
39
+
40
+ use Exception;
41
+
42
+ /**
43
+ * Class ReviewsController
44
+ *
45
+ * @package PublishPress\WordPressReviews
46
+ */
47
+ class ReviewsController
48
+ {
49
+ /**
50
+ * @var string
51
+ */
52
+ private $pluginSlug;
53
+
54
+ /**
55
+ * @var string
56
+ */
57
+ private $pluginName;
58
+
59
+ /**
60
+ * @var string
61
+ */
62
+ private $apiUrl = '';
63
+
64
+ /**
65
+ * @var array
66
+ */
67
+ private $metaMap;
68
+
69
+ /**
70
+ * @var string
71
+ */
72
+ private $iconUrl;
73
+
74
+ /**
75
+ * @param string $pluginSlug
76
+ * @param string $pluginName
77
+ * @param string $iconUrl
78
+ */
79
+ public function __construct($pluginSlug, $pluginName, $iconUrl = '')
80
+ {
81
+ $this->pluginSlug = $pluginSlug;
82
+ $this->pluginName = $pluginName;
83
+ $this->iconUrl = esc_url_raw($iconUrl);
84
+
85
+ /**
86
+ * Filter to replace the meta map with options, filters and actions names.
87
+ *
88
+ * @param array
89
+ *
90
+ * @return array
91
+ */
92
+ $this->metaMap = apply_filters(
93
+ "{$pluginSlug}_wp_reviews_meta_map",
94
+ [
95
+ 'action_ajax_handler' => "{$this->pluginSlug}_action",
96
+ 'option_installed_on' => "{$this->pluginSlug}_wp_reviews_installed_on",
97
+ 'nonce_action' => "{$this->pluginSlug}_wp_reviews_action",
98
+ 'user_meta_dismissed_triggers' => "_{$this->pluginSlug}_wp_reviews_dismissed_triggers",
99
+ 'user_meta_last_dismissed' => "_{$this->pluginSlug}_wp_reviews_last_dismissed",
100
+ 'user_meta_already_did' => "_{$this->pluginSlug}_wp_reviews_already_did",
101
+ 'filter_triggers' => "{$this->pluginSlug}_wp_reviews_triggers",
102
+ ]
103
+ );
104
+
105
+ /**
106
+ * Legacy filter to replace the meta map with options, filters and actions names.
107
+ *
108
+ * @param array
109
+ * @return array
110
+ * @deprecated 1.1.9
111
+ *
112
+ */
113
+ $this->metaMap = apply_filters(
114
+ "publishpress_wp_reviews_meta_map_{$this->pluginSlug}",
115
+ $this->metaMap
116
+ );
117
+
118
+ add_action('admin_enqueue_scripts', [$this, 'enqueueStyle']);
119
+ }
120
+
121
+ /**
122
+ * Initialize the library.
123
+ */
124
+ public function init()
125
+ {
126
+ $this->addHooks();
127
+ }
128
+
129
+ /**
130
+ * Hook into relevant WP actions.
131
+ */
132
+ private function addHooks()
133
+ {
134
+ if (defined('DOING_AJAX') && DOING_AJAX) {
135
+ add_action("wp_ajax_{$this->metaMap['action_ajax_handler']}", [$this, 'ajaxHandler']);
136
+ }
137
+
138
+ if ($this->screenIsAllowedToDisplayNotice()) {
139
+ $this->installationPath();
140
+ add_action('admin_notices', [$this, 'renderAdminNotices']);
141
+ add_action('network_admin_notices', [$this, 'renderAdminNotices']);
142
+ add_action('user_admin_notices', [$this, 'renderAdminNotices']);
143
+ }
144
+ }
145
+
146
+ /**
147
+ * @return bool
148
+ */
149
+ private function screenIsAllowedToDisplayNotice()
150
+ {
151
+ $displayNotice = is_admin() && current_user_can('edit_posts');
152
+
153
+ /**
154
+ * Deprecated filter to specify a custom conditional to display or not the notice.
155
+ *
156
+ * @param bool
157
+ * @return bool
158
+ * @deprecated 1.1.9
159
+ *
160
+ */
161
+ $displayNotice = apply_filters(
162
+ "publishpress_wp_reviews_display_banner_{$this->pluginSlug}",
163
+ $displayNotice
164
+ );
165
+
166
+ /**
167
+ * Filter to specify a custom conditional to display or not the notice.
168
+ *
169
+ * @param bool
170
+ *
171
+ * @return bool
172
+ */
173
+ return apply_filters("{$this->pluginSlug}_wp_reviews_allow_display_notice", $displayNotice);
174
+ }
175
+
176
+ /**
177
+ * Get the installation date for comparisons. Sets the date to now if none is found.
178
+ *
179
+ * @return false|string
180
+ */
181
+ public function installationPath()
182
+ {
183
+ $installationPath = get_option($this->metaMap['option_installed_on'], false);
184
+
185
+ if (! $installationPath) {
186
+ $installationPath = current_time('mysql');
187
+ update_option($this->metaMap['option_installed_on'], $installationPath);
188
+ }
189
+
190
+ return $installationPath;
191
+ }
192
+
193
+ /**
194
+ * The function called by the ajax request.
195
+ */
196
+ public function ajaxHandler()
197
+ {
198
+ $args = wp_parse_args(
199
+ $_REQUEST,
200
+ [
201
+ 'group' => $this->getTriggerGroup(),
202
+ 'code' => $this->getTriggerCode(),
203
+ 'priority' => $this->getCurrentTrigger('priority'),
204
+ 'reason' => 'maybe_later',
205
+ ]
206
+ );
207
+
208
+ if (! wp_verify_nonce($_REQUEST['nonce'], $this->metaMap['nonce_action'])) {
209
+ wp_send_json_error();
210
+ }
211
+
212
+ try {
213
+ $userId = get_current_user_id();
214
+
215
+ $dismissedTriggers = $this->getDismissedTriggerGroups();
216
+ $dismissedTriggers[$args['group']] = (int)$args['priority'];
217
+
218
+ update_user_meta($userId, $this->metaMap['user_meta_dismissed_triggers'], $dismissedTriggers);
219
+ update_user_meta($userId, $this->metaMap['user_meta_last_dismissed'], current_time('mysql'));
220
+
221
+ switch ($args['reason']) {
222
+ case 'maybe_later':
223
+ update_user_meta($userId, $this->metaMap['user_meta_last_dismissed'], current_time('mysql'));
224
+ break;
225
+ case 'am_now':
226
+ case 'already_did':
227
+ $this->setUserAlreadyDid($userId);
228
+ break;
229
+ }
230
+
231
+ wp_send_json_success();
232
+ } catch (Exception $e) {
233
+ wp_send_json_error($e);
234
+ }
235
+ }
236
+
237
+ /**
238
+ * Get the trigger group.
239
+ *
240
+ * @return int|string
241
+ */
242
+ private function getTriggerGroup()
243
+ {
244
+ static $selected;
245
+
246
+ if (! isset($selected)) {
247
+ $dismissedTriggers = $this->getDismissedTriggerGroups();
248
+
249
+ $triggers = $this->getTriggers();
250
+
251
+ foreach ($triggers as $g => $group) {
252
+ foreach ($group['triggers'] as $trigger) {
253
+ if (! in_array(
254
+ false,
255
+ $trigger['conditions']
256
+ ) && (empty($dismissedTriggers[$g]) || $dismissedTriggers[$g] < $trigger['priority'])) {
257
+ $selected = $g;
258
+ break;
259
+ }
260
+ }
261
+
262
+ if (isset($selected)) {
263
+ break;
264
+ }
265
+ }
266
+ }
267
+
268
+ return $selected;
269
+ }
270
+
271
+ /**
272
+ * Returns an array of dismissed trigger groups.
273
+ *
274
+ * Array contains the group key and highest priority trigger that has been shown previously for each group.
275
+ *
276
+ * $return = array(
277
+ * 'group1' => 20
278
+ * );
279
+ *
280
+ * @return array|mixed
281
+ */
282
+ private function getDismissedTriggerGroups()
283
+ {
284
+ $userId = get_current_user_id();
285
+
286
+ $dismissedTriggers = get_user_meta($userId, $this->metaMap['user_meta_dismissed_triggers'], true);
287
+
288
+ if (! $dismissedTriggers) {
289
+ $dismissedTriggers = [];
290
+ }
291
+
292
+ return $dismissedTriggers;
293
+ }
294
+
295
+ /**
296
+ * Gets a list of triggers.
297
+ *
298
+ * @param null $group
299
+ * @param null $code
300
+ *
301
+ * @return bool|mixed|void
302
+ */
303
+ private function getTriggers($group = null, $code = null)
304
+ {
305
+ static $triggers;
306
+
307
+ if (! isset($triggers)) {
308
+ $timeMessage = __(
309
+ 'Hey, you\'ve been using %1$s for %2$s on your site. We hope the plugin has been useful. Please could you quickly leave a 5-star rating on WordPress.org? It really does help to keep %1$s growing.',
310
+ $this->pluginSlug
311
+ );
312
+
313
+ $triggers = apply_filters(
314
+ $this->metaMap['filter_triggers'],
315
+ [
316
+ 'time_installed' => [
317
+ 'triggers' => [
318
+ 'one_week' => [
319
+ 'message' => sprintf($timeMessage, $this->pluginName, __('1 week', $this->pluginSlug)),
320
+ 'conditions' => [
321
+ strtotime($this->installationPath() . ' +1 week') < time(),
322
+ ],
323
+ 'link' => "https://wordpress.org/support/plugin/{$this->pluginSlug}/reviews/?rate=5#rate-response",
324
+ 'priority' => 10,
325
+ ],
326
+ 'one_month' => [
327
+ 'message' => sprintf($timeMessage, $this->pluginName, __('1 month', $this->pluginSlug)),
328
+ 'conditions' => [
329
+ strtotime($this->installationPath() . ' +1 month') < time(),
330
+ ],
331
+ 'link' => "https://wordpress.org/support/plugin/{$this->pluginSlug}/reviews/?rate=5#rate-response",
332
+ 'priority' => 20,
333
+ ],
334
+ 'three_months' => [
335
+ 'message' => sprintf(
336
+ $timeMessage,
337
+ $this->pluginName,
338
+ __('3 months', $this->pluginSlug)
339
+ ),
340
+ 'conditions' => [
341
+ strtotime($this->installationPath() . ' +3 months') < time(),
342
+ ],
343
+ 'link' => "https://wordpress.org/support/plugin/{$this->pluginSlug}/reviews/?rate=5#rate-response",
344
+ 'priority' => 30,
345
+ ],
346
+ ],
347
+ 'priority' => 10,
348
+ ],
349
+ ]
350
+ );
351
+
352
+ // Sort Groups
353
+ uasort($triggers, [$this, 'rsortByPriority']);
354
+
355
+ // Sort each groups triggers.
356
+ foreach ($triggers as $v) {
357
+ uasort($v['triggers'], [$this, 'rsortByPriority']);
358
+ }
359
+ }
360
+
361
+ if (isset($group)) {
362
+ if (! isset($triggers[$group])) {
363
+ return false;
364
+ }
365
+
366
+ if (! isset($code)) {
367
+ $return = $triggers[$group];
368
+ } elseif (isset($triggers[$group]['triggers'][$code])) {
369
+ $return = $triggers[$group]['triggers'][$code];
370
+ } else {
371
+ $return = false;
372
+ }
373
+
374
+ return $return;
375
+ }
376
+
377
+ return $triggers;
378
+ }
379
+
380
+ /**
381
+ * @return int|string
382
+ */
383
+ private function getTriggerCode()
384
+ {
385
+ static $selected;
386
+
387
+ if (! isset($selected)) {
388
+ $dismissedTriggers = $this->getDismissedTriggerGroups();
389
+
390
+ foreach ($this->getTriggers() as $g => $group) {
391
+ foreach ($group['triggers'] as $t => $trigger) {
392
+ if (! in_array(
393
+ false,
394
+ $trigger['conditions']
395
+ ) && (empty($dismissedTriggers[$g]) || $dismissedTriggers[$g] < $trigger['priority'])) {
396
+ $selected = $t;
397
+ break;
398
+ }
399
+ }
400
+
401
+ if (isset($selected)) {
402
+ break;
403
+ }
404
+ }
405
+ }
406
+
407
+ return $selected;
408
+ }
409
+
410
+ /**
411
+ * @param null $key
412
+ *
413
+ * @return bool|mixed|void
414
+ */
415
+ private function getCurrentTrigger($key = null)
416
+ {
417
+ $group = $this->getTriggerGroup();
418
+ $code = $this->getTriggerCode();
419
+
420
+ if (! $group || ! $code) {
421
+ return false;
422
+ }
423
+
424
+ $trigger = $this->getTriggers($group, $code);
425
+
426
+ if (empty($key)) {
427
+ $return = $trigger;
428
+ } elseif (isset($trigger[$key])) {
429
+ $return = $trigger[$key];
430
+ } else {
431
+ $return = false;
432
+ }
433
+
434
+ return $return;
435
+ }
436
+
437
+ /**
438
+ * @param $userId
439
+ */
440
+ private function setUserAlreadyDid($userId)
441
+ {
442
+ update_user_meta($userId, $this->metaMap['user_meta_already_did'], true);
443
+ }
444
+
445
+ public function enqueueStyle()
446
+ {
447
+ if (! $this->screenIsAllowedToDisplayNotice()) {
448
+ return;
449
+ }
450
+
451
+ wp_register_style('publishpress_wordpress_reviews_style', false);
452
+ wp_enqueue_style('publishpress_wordpress_reviews_style');
453
+ wp_add_inline_style(
454
+ 'publishpress_wordpress_reviews_style',
455
+ "
456
+ .{$this->pluginSlug}-wp-reviews-notice .button,
457
+ .{$this->pluginSlug}-wp-reviews-notice p {
458
+ font-size: 15px;
459
+ }
460
+
461
+ .{$this->pluginSlug}-wp-reviews-notice .button:not(.notice-dismiss) {
462
+ border-width: 1px;
463
+ }
464
+
465
+ .{$this->pluginSlug}-wp-reviews-notice .button.button-primary {
466
+ background-color: #655897;
467
+ border-color: #3d355c;
468
+ color: #fff;
469
+ }
470
+
471
+ .{$this->pluginSlug}-wp-reviews-notice .notice-icon {
472
+ float: right;
473
+ height: 110px;
474
+ margin-top: 10px;
475
+ margin-left: 10px;
476
+ }
477
+
478
+ @media (min-width:1000px) {
479
+ .{$this->pluginSlug}-wp-reviews-notice .notice-icon {
480
+ height: 90px;
481
+ }
482
+ }
483
+
484
+ @media (min-width:1700px) {
485
+ .{$this->pluginSlug}-wp-reviews-notice .notice-icon {
486
+ height: 70px;
487
+ }
488
+ }
489
+ "
490
+ );
491
+ }
492
+
493
+ /**
494
+ * Render admin notices if available.
495
+ */
496
+ public function renderAdminNotices()
497
+ {
498
+ if ($this->hideNotices()) {
499
+ return;
500
+ }
501
+
502
+ $group = $this->getTriggerGroup();
503
+ $code = $this->getTriggerCode();
504
+ $priority = $this->getCurrentTrigger('priority');
505
+ $trigger = $this->getCurrentTrigger();
506
+
507
+ // Used to anonymously distinguish unique site+user combinations in terms of effectiveness of each trigger.
508
+ $uuid = wp_hash(home_url() . '-' . get_current_user_id());
509
+
510
+ ?>
511
+
512
+ <script type="text/javascript">
513
+ (function ($) {
514
+ var trigger = {
515
+ group: '<?php echo $group; ?>',
516
+ code: '<?php echo $code; ?>',
517
+ priority: '<?php echo $priority; ?>'
518
+ };
519
+
520
+ function dismiss(reason) {
521
+ $.ajax({
522
+ method: "POST",
523
+ dataType: "json",
524
+ url: ajaxurl,
525
+ data: {
526
+ action: '<?php echo $this->metaMap['action_ajax_handler']; ?>',
527
+ nonce: '<?php echo wp_create_nonce($this->metaMap['nonce_action']); ?>',
528
+ group: trigger.group,
529
+ code: trigger.code,
530
+ priority: trigger.priority,
531
+ reason: reason
532
+ }
533
+ });
534
+
535
+ <?php if ( ! empty($this->apiUrl) ) : ?>
536
+ $.ajax({
537
+ method: "POST",
538
+ dataType: "json",
539
+ url: '<?php echo $this->apiUrl; ?>',
540
+ data: {
541
+ trigger_group: trigger.group,
542
+ trigger_code: trigger.code,
543
+ reason: reason,
544
+ uuid: '<?php echo $uuid; ?>'
545
+ }
546
+ });
547
+ <?php endif; ?>
548
+ }
549
+
550
+ $(document)
551
+ .on('click', '.<?php echo $this->pluginSlug; ?>-wp-reviews-notice .<?php echo "$this->pluginSlug-dismiss"; ?>', function (event) {
552
+ var $this = $(this),
553
+ reason = $this.data('reason'),
554
+ notice = $this.parents('.<?php echo $this->pluginSlug; ?>-wp-reviews-notice');
555
+
556
+ notice.fadeTo(100, 0, function () {
557
+ notice.slideUp(100, function () {
558
+ notice.remove();
559
+ });
560
+ });
561
+
562
+ dismiss(reason);
563
+ })
564
+ .ready(function () {
565
+ setTimeout(function () {
566
+ $('.<?php echo $this->pluginSlug; ?>-wp-reviews-notice button.notice-dismiss').click(function (event) {
567
+ dismiss('maybe_later');
568
+ });
569
+ }, 1000);
570
+ });
571
+ }(jQuery));
572
+ </script>
573
+
574
+ <div class="notice notice-success is-dismissible <?php
575
+ echo "$this->pluginSlug-wp-reviews-notice"; ?>">
576
+ <?php
577
+ if (! empty($this->iconUrl)) : ?>
578
+ <img src="<?php
579
+ echo $this->iconUrl; ?>" class="notice-icon" alt="<?php
580
+ echo $this->pluginName; ?> logo"/>
581
+ <?php
582
+ endif; ?>
583
+
584
+ <p><?php
585
+ echo $trigger['message']; ?></p>
586
+ <p>
587
+ <a class="button button-primary <?php
588
+ echo "$this->pluginSlug-dismiss"; ?>"
589
+ target="_blank"
590
+ href="<?php
591
+ echo $trigger['link']; ?>"
592
+ data-reason="am_now"
593
+ >
594
+ <strong><?php
595
+ echo sprintf(
596
+ __('Click here to add your rating for %s', $this->pluginSlug),
597
+ $this->pluginName
598
+ ); ?></strong>
599
+ </a>
600
+ <a href="#" class="button <?php
601
+ echo "$this->pluginSlug-dismiss"; ?>" data-reason="maybe_later">
602
+ <?php
603
+ _e('Maybe later', $this->pluginSlug); ?>
604
+ </a>
605
+ <a href="#" class="button <?php
606
+ echo "$this->pluginSlug-dismiss"; ?>" data-reason="already_did">
607
+ <?php
608
+ _e('I already did', $this->pluginSlug); ?>
609
+ </a>
610
+ </p>
611
+ </div>
612
+ <?php
613
+ }
614
+
615
+ /**
616
+ * Checks if notices should be shown.
617
+ *
618
+ * @return bool
619
+ */
620
+ private function hideNotices()
621
+ {
622
+ $conditions = [
623
+ $this->userSelectedAlreadyDid(),
624
+ $this->lastDismissedDate() && strtotime($this->lastDismissedDate() . ' +2 weeks') > time(),
625
+ empty($this->getTriggerCode()),
626
+ ];
627
+
628
+ return in_array(true, $conditions);
629
+ }
630
+
631
+ /**
632
+ * Returns true if the user has opted to never see this again.
633
+ *
634
+ * @return bool
635
+ */
636
+ private function userSelectedAlreadyDid()
637
+ {
638
+ $userId = get_current_user_id();
639
+
640
+ return (bool)get_user_meta($userId, $this->metaMap['user_meta_already_did'], true);
641
+ }
642
+
643
+ /**
644
+ * Gets the last dismissed date.
645
+ *
646
+ * @return false|string
647
+ */
648
+ private function lastDismissedDate()
649
+ {
650
+ $userId = get_current_user_id();
651
+
652
+ return get_user_meta($userId, $this->metaMap['user_meta_last_dismissed'], true);
653
+ }
654
+
655
+ /**
656
+ * Sort array by priority value
657
+ *
658
+ * @param $a
659
+ * @param $b
660
+ *
661
+ * @return int
662
+ */
663
+ public function sortByPriority($a, $b)
664
+ {
665
+ if (! isset($a['priority']) || ! isset($b['priority']) || $a['priority'] === $b['priority']) {
666
+ return 0;
667
+ }
668
+
669
+ return ($a['priority'] < $b['priority']) ? -1 : 1;
670
+ }
671
+
672
+ /**
673
+ * Sort array in reverse by priority value
674
+ *
675
+ * @param $a
676
+ * @param $b
677
+ *
678
+ * @return int
679
+ */
680
+ public function rsortByPriority($a, $b)
681
+ {
682
+ if (! isset($a['priority']) || ! isset($b['priority']) || $a['priority'] === $b['priority']) {
683
+ return 0;
684
+ }
685
+
686
+ return ($a['priority'] < $b['priority']) ? 1 : -1;
687
+ }
688
+ }
vendor/publishpress/wordpress-reviews/composer.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "publishpress/wordpress-reviews",
3
+ "type": "library",
4
+ "license": "GPL-3.0-or-later",
5
+ "description": "Library for showing a five-star review banner.",
6
+ "keywords": ["reviews", "review", "wordpress plugin"],
7
+ "homepage": "http://publishpress.com/",
8
+ "authors": [
9
+ {
10
+ "name": "PublishPress",
11
+ "email": "help@publishpress.com"
12
+ },
13
+ {
14
+ "name": "Daniel Iser",
15
+ "homepage": "https://github.com/danieliser/WP-Product-In-Dash-Review-Requests"
16
+ }
17
+ ],
18
+ "minimum-stability": "dev",
19
+ "prefer-stable": true,
20
+ "autoload": {
21
+ "files": [
22
+ "ReviewsController.php"
23
+ ]
24
+ },
25
+ "require": {
26
+ "php": ">=5.6.20"
27
+ },
28
+ "require-dev": {
29
+ "overtrue/phplint": "^2.1"
30
+ }
31
+ }
vendor/publishpress/wordpress-reviews/composer.lock ADDED
@@ -0,0 +1,1192 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_readme": [
3
+ "This file locks the dependencies of your project to a known state",
4
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
+ "This file is @generated automatically"
6
+ ],
7
+ "content-hash": "a47c2b0c564dacf272772323aaf812ae",
8
+ "packages": [],
9
+ "packages-dev": [
10
+ {
11
+ "name": "n98/junit-xml",
12
+ "version": "1.1.0",
13
+ "source": {
14
+ "type": "git",
15
+ "url": "https://github.com/cmuench/junit-xml.git",
16
+ "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73"
17
+ },
18
+ "dist": {
19
+ "type": "zip",
20
+ "url": "https://api.github.com/repos/cmuench/junit-xml/zipball/0017dd92ac8cb619f02e32f4cffd768cfe327c73",
21
+ "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73",
22
+ "shasum": ""
23
+ },
24
+ "require-dev": {
25
+ "phpunit/phpunit": "^9.5.0"
26
+ },
27
+ "type": "library",
28
+ "autoload": {
29
+ "psr-4": {
30
+ "N98\\JUnitXml\\": "src/N98/JUnitXml"
31
+ }
32
+ },
33
+ "notification-url": "https://packagist.org/downloads/",
34
+ "license": [
35
+ "MIT"
36
+ ],
37
+ "authors": [
38
+ {
39
+ "name": "Christian Münch",
40
+ "email": "c.muench@netz98.de"
41
+ }
42
+ ],
43
+ "description": "JUnit XML Document generation library",
44
+ "support": {
45
+ "issues": "https://github.com/cmuench/junit-xml/issues",
46
+ "source": "https://github.com/cmuench/junit-xml/tree/1.1.0"
47
+ },
48
+ "time": "2020-12-25T09:08:58+00:00"
49
+ },
50
+ {
51
+ "name": "overtrue/phplint",
52
+ "version": "2.4.1",
53
+ "source": {
54
+ "type": "git",
55
+ "url": "https://github.com/overtrue/phplint.git",
56
+ "reference": "59affacd0b09a1460e39acf2c64c963ddbf734cf"
57
+ },
58
+ "dist": {
59
+ "type": "zip",
60
+ "url": "https://api.github.com/repos/overtrue/phplint/zipball/59affacd0b09a1460e39acf2c64c963ddbf734cf",
61
+ "reference": "59affacd0b09a1460e39acf2c64c963ddbf734cf",
62
+ "shasum": ""
63
+ },
64
+ "require": {
65
+ "ext-json": "*",
66
+ "n98/junit-xml": "1.1.0",
67
+ "php": ">=5.5.9",
68
+ "symfony/console": "^3.2|^4.0|^5.0",
69
+ "symfony/finder": "^3.0|^4.0|^5.0",
70
+ "symfony/process": "^3.3|^4.0|^5.0",
71
+ "symfony/yaml": "^3.0|^4.0|^5.0"
72
+ },
73
+ "require-dev": {
74
+ "brainmaestro/composer-git-hooks": "^2.7",
75
+ "friendsofphp/php-cs-fixer": "^2.16",
76
+ "jakub-onderka/php-console-highlighter": "^0.3.2 || ^0.4"
77
+ },
78
+ "bin": [
79
+ "bin/phplint"
80
+ ],
81
+ "type": "library",
82
+ "extra": {
83
+ "hooks": {
84
+ "pre-commit": [
85
+ "composer fix-style"
86
+ ],
87
+ "pre-push": [
88
+ "composer check-style"
89
+ ]
90
+ }
91
+ },
92
+ "autoload": {
93
+ "psr-4": {
94
+ "Overtrue\\PHPLint\\": "src/"
95
+ }
96
+ },
97
+ "notification-url": "https://packagist.org/downloads/",
98
+ "license": [
99
+ "MIT"
100
+ ],
101
+ "authors": [
102
+ {
103
+ "name": "overtrue",
104
+ "email": "anzhengchao@gmail.com"
105
+ }
106
+ ],
107
+ "description": "`phplint` is a tool that can speed up linting of php files by running several lint processes at once.",
108
+ "keywords": [
109
+ "check",
110
+ "lint",
111
+ "phplint",
112
+ "syntax"
113
+ ],
114
+ "support": {
115
+ "issues": "https://github.com/overtrue/phplint/issues",
116
+ "source": "https://github.com/overtrue/phplint/tree/2.4.1"
117
+ },
118
+ "time": "2021-06-02T16:18:33+00:00"
119
+ },
120
+ {
121
+ "name": "psr/container",
122
+ "version": "1.1.1",
123
+ "source": {
124
+ "type": "git",
125
+ "url": "https://github.com/php-fig/container.git",
126
+ "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
127
+ },
128
+ "dist": {
129
+ "type": "zip",
130
+ "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
131
+ "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
132
+ "shasum": ""
133
+ },
134
+ "require": {
135
+ "php": ">=7.2.0"
136
+ },
137
+ "type": "library",
138
+ "autoload": {
139
+ "psr-4": {
140
+ "Psr\\Container\\": "src/"
141
+ }
142
+ },
143
+ "notification-url": "https://packagist.org/downloads/",
144
+ "license": [
145
+ "MIT"
146
+ ],
147
+ "authors": [
148
+ {
149
+ "name": "PHP-FIG",
150
+ "homepage": "https://www.php-fig.org/"
151
+ }
152
+ ],
153
+ "description": "Common Container Interface (PHP FIG PSR-11)",
154
+ "homepage": "https://github.com/php-fig/container",
155
+ "keywords": [
156
+ "PSR-11",
157
+ "container",
158
+ "container-interface",
159
+ "container-interop",
160
+ "psr"
161
+ ],
162
+ "support": {
163
+ "issues": "https://github.com/php-fig/container/issues",
164
+ "source": "https://github.com/php-fig/container/tree/1.1.1"
165
+ },
166
+ "time": "2021-03-05T17:36:06+00:00"
167
+ },
168
+ {
169
+ "name": "symfony/console",
170
+ "version": "v5.3.7",
171
+ "source": {
172
+ "type": "git",
173
+ "url": "https://github.com/symfony/console.git",
174
+ "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a"
175
+ },
176
+ "dist": {
177
+ "type": "zip",
178
+ "url": "https://api.github.com/repos/symfony/console/zipball/8b1008344647462ae6ec57559da166c2bfa5e16a",
179
+ "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a",
180
+ "shasum": ""
181
+ },
182
+ "require": {
183
+ "php": ">=7.2.5",
184
+ "symfony/deprecation-contracts": "^2.1",
185
+ "symfony/polyfill-mbstring": "~1.0",
186
+ "symfony/polyfill-php73": "^1.8",
187
+ "symfony/polyfill-php80": "^1.16",
188
+ "symfony/service-contracts": "^1.1|^2",
189
+ "symfony/string": "^5.1"
190
+ },
191
+ "conflict": {
192
+ "psr/log": ">=3",
193
+ "symfony/dependency-injection": "<4.4",
194
+ "symfony/dotenv": "<5.1",
195
+ "symfony/event-dispatcher": "<4.4",
196
+ "symfony/lock": "<4.4",
197
+ "symfony/process": "<4.4"
198
+ },
199
+ "provide": {
200
+ "psr/log-implementation": "1.0|2.0"
201
+ },
202
+ "require-dev": {
203
+ "psr/log": "^1|^2",
204
+ "symfony/config": "^4.4|^5.0",
205
+ "symfony/dependency-injection": "^4.4|^5.0",
206
+ "symfony/event-dispatcher": "^4.4|^5.0",
207
+ "symfony/lock": "^4.4|^5.0",
208
+ "symfony/process": "^4.4|^5.0",
209
+ "symfony/var-dumper": "^4.4|^5.0"
210
+ },
211
+ "suggest": {
212
+ "psr/log": "For using the console logger",
213
+ "symfony/event-dispatcher": "",
214
+ "symfony/lock": "",
215
+ "symfony/process": ""
216
+ },
217
+ "type": "library",
218
+ "autoload": {
219
+ "psr-4": {
220
+ "Symfony\\Component\\Console\\": ""
221
+ },
222
+ "exclude-from-classmap": [
223
+ "/Tests/"
224
+ ]
225
+ },
226
+ "notification-url": "https://packagist.org/downloads/",
227
+ "license": [
228
+ "MIT"
229
+ ],
230
+ "authors": [
231
+ {
232
+ "name": "Fabien Potencier",
233
+ "email": "fabien@symfony.com"
234
+ },
235
+ {
236
+ "name": "Symfony Community",
237
+ "homepage": "https://symfony.com/contributors"
238
+ }
239
+ ],
240
+ "description": "Eases the creation of beautiful and testable command line interfaces",
241
+ "homepage": "https://symfony.com",
242
+ "keywords": [
243
+ "cli",
244
+ "command line",
245
+ "console",
246
+ "terminal"
247
+ ],
248
+ "support": {
249
+ "source": "https://github.com/symfony/console/tree/v5.3.7"
250
+ },
251
+ "funding": [
252
+ {
253
+ "url": "https://symfony.com/sponsor",
254
+ "type": "custom"
255
+ },
256
+ {
257
+ "url": "https://github.com/fabpot",
258
+ "type": "github"
259
+ },
260
+ {
261
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
262
+ "type": "tidelift"
263
+ }
264
+ ],
265
+ "time": "2021-08-25T20:02:16+00:00"
266
+ },
267
+ {
268
+ "name": "symfony/deprecation-contracts",
269
+ "version": "v2.4.0",
270
+ "source": {
271
+ "type": "git",
272
+ "url": "https://github.com/symfony/deprecation-contracts.git",
273
+ "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627"
274
+ },
275
+ "dist": {
276
+ "type": "zip",
277
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627",
278
+ "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627",
279
+ "shasum": ""
280
+ },
281
+ "require": {
282
+ "php": ">=7.1"
283
+ },
284
+ "type": "library",
285
+ "extra": {
286
+ "branch-alias": {
287
+ "dev-main": "2.4-dev"
288
+ },
289
+ "thanks": {
290
+ "name": "symfony/contracts",
291
+ "url": "https://github.com/symfony/contracts"
292
+ }
293
+ },
294
+ "autoload": {
295
+ "files": [
296
+ "function.php"
297
+ ]
298
+ },
299
+ "notification-url": "https://packagist.org/downloads/",
300
+ "license": [
301
+ "MIT"
302
+ ],
303
+ "authors": [
304
+ {
305
+ "name": "Nicolas Grekas",
306
+ "email": "p@tchwork.com"
307
+ },
308
+ {
309
+ "name": "Symfony Community",
310
+ "homepage": "https://symfony.com/contributors"
311
+ }
312
+ ],
313
+ "description": "A generic function and convention to trigger deprecation notices",
314
+ "homepage": "https://symfony.com",
315
+ "support": {
316
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0"
317
+ },
318
+ "funding": [
319
+ {
320
+ "url": "https://symfony.com/sponsor",
321
+ "type": "custom"
322
+ },
323
+ {
324
+ "url": "https://github.com/fabpot",
325
+ "type": "github"
326
+ },
327
+ {
328
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
329
+ "type": "tidelift"
330
+ }
331
+ ],
332
+ "time": "2021-03-23T23:28:01+00:00"
333
+ },
334
+ {
335
+ "name": "symfony/finder",
336
+ "version": "v5.3.7",
337
+ "source": {
338
+ "type": "git",
339
+ "url": "https://github.com/symfony/finder.git",
340
+ "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93"
341
+ },
342
+ "dist": {
343
+ "type": "zip",
344
+ "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93",
345
+ "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93",
346
+ "shasum": ""
347
+ },
348
+ "require": {
349
+ "php": ">=7.2.5",
350
+ "symfony/polyfill-php80": "^1.16"
351
+ },
352
+ "type": "library",
353
+ "autoload": {
354
+ "psr-4": {
355
+ "Symfony\\Component\\Finder\\": ""
356
+ },
357
+ "exclude-from-classmap": [
358
+ "/Tests/"
359
+ ]
360
+ },
361
+ "notification-url": "https://packagist.org/downloads/",
362
+ "license": [
363
+ "MIT"
364
+ ],
365
+ "authors": [
366
+ {
367
+ "name": "Fabien Potencier",
368
+ "email": "fabien@symfony.com"
369
+ },
370
+ {
371
+ "name": "Symfony Community",
372
+ "homepage": "https://symfony.com/contributors"
373
+ }
374
+ ],
375
+ "description": "Finds files and directories via an intuitive fluent interface",
376
+ "homepage": "https://symfony.com",
377
+ "support": {
378
+ "source": "https://github.com/symfony/finder/tree/v5.3.7"
379
+ },
380
+ "funding": [
381
+ {
382
+ "url": "https://symfony.com/sponsor",
383
+ "type": "custom"
384
+ },
385
+ {
386
+ "url": "https://github.com/fabpot",
387
+ "type": "github"
388
+ },
389
+ {
390
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
391
+ "type": "tidelift"
392
+ }
393
+ ],
394
+ "time": "2021-08-04T21:20:46+00:00"
395
+ },
396
+ {
397
+ "name": "symfony/polyfill-ctype",
398
+ "version": "v1.23.0",
399
+ "source": {
400
+ "type": "git",
401
+ "url": "https://github.com/symfony/polyfill-ctype.git",
402
+ "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce"
403
+ },
404
+ "dist": {
405
+ "type": "zip",
406
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce",
407
+ "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce",
408
+ "shasum": ""
409
+ },
410
+ "require": {
411
+ "php": ">=7.1"
412
+ },
413
+ "suggest": {
414
+ "ext-ctype": "For best performance"
415
+ },
416
+ "type": "library",
417
+ "extra": {
418
+ "branch-alias": {
419
+ "dev-main": "1.23-dev"
420
+ },
421
+ "thanks": {
422
+ "name": "symfony/polyfill",
423
+ "url": "https://github.com/symfony/polyfill"
424
+ }
425
+ },
426
+ "autoload": {
427
+ "psr-4": {
428
+ "Symfony\\Polyfill\\Ctype\\": ""
429
+ },
430
+ "files": [
431
+ "bootstrap.php"
432
+ ]
433
+ },
434
+ "notification-url": "https://packagist.org/downloads/",
435
+ "license": [
436
+ "MIT"
437
+ ],
438
+ "authors": [
439
+ {
440
+ "name": "Gert de Pagter",
441
+ "email": "BackEndTea@gmail.com"
442
+ },
443
+ {
444
+ "name": "Symfony Community",
445
+ "homepage": "https://symfony.com/contributors"
446
+ }
447
+ ],
448
+ "description": "Symfony polyfill for ctype functions",
449
+ "homepage": "https://symfony.com",
450
+ "keywords": [
451
+ "compatibility",
452
+ "ctype",
453
+ "polyfill",
454
+ "portable"
455
+ ],
456
+ "support": {
457
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0"
458
+ },
459
+ "funding": [
460
+ {
461
+ "url": "https://symfony.com/sponsor",
462
+ "type": "custom"
463
+ },
464
+ {
465
+ "url": "https://github.com/fabpot",
466
+ "type": "github"
467
+ },
468
+ {
469
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
470
+ "type": "tidelift"
471
+ }
472
+ ],
473
+ "time": "2021-02-19T12:13:01+00:00"
474
+ },
475
+ {
476
+ "name": "symfony/polyfill-intl-grapheme",
477
+ "version": "v1.23.1",
478
+ "source": {
479
+ "type": "git",
480
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
481
+ "reference": "16880ba9c5ebe3642d1995ab866db29270b36535"
482
+ },
483
+ "dist": {
484
+ "type": "zip",
485
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535",
486
+ "reference": "16880ba9c5ebe3642d1995ab866db29270b36535",
487
+ "shasum": ""
488
+ },
489
+ "require": {
490
+ "php": ">=7.1"
491
+ },
492
+ "suggest": {
493
+ "ext-intl": "For best performance"
494
+ },
495
+ "type": "library",
496
+ "extra": {
497
+ "branch-alias": {
498
+ "dev-main": "1.23-dev"
499
+ },
500
+ "thanks": {
501
+ "name": "symfony/polyfill",
502
+ "url": "https://github.com/symfony/polyfill"
503
+ }
504
+ },
505
+ "autoload": {
506
+ "psr-4": {
507
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
508
+ },
509
+ "files": [
510
+ "bootstrap.php"
511
+ ]
512
+ },
513
+ "notification-url": "https://packagist.org/downloads/",
514
+ "license": [
515
+ "MIT"
516
+ ],
517
+ "authors": [
518
+ {
519
+ "name": "Nicolas Grekas",
520
+ "email": "p@tchwork.com"
521
+ },
522
+ {
523
+ "name": "Symfony Community",
524
+ "homepage": "https://symfony.com/contributors"
525
+ }
526
+ ],
527
+ "description": "Symfony polyfill for intl's grapheme_* functions",
528
+ "homepage": "https://symfony.com",
529
+ "keywords": [
530
+ "compatibility",
531
+ "grapheme",
532
+ "intl",
533
+ "polyfill",
534
+ "portable",
535
+ "shim"
536
+ ],
537
+ "support": {
538
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1"
539
+ },
540
+ "funding": [
541
+ {
542
+ "url": "https://symfony.com/sponsor",
543
+ "type": "custom"
544
+ },
545
+ {
546
+ "url": "https://github.com/fabpot",
547
+ "type": "github"
548
+ },
549
+ {
550
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
551
+ "type": "tidelift"
552
+ }
553
+ ],
554
+ "time": "2021-05-27T12:26:48+00:00"
555
+ },
556
+ {
557
+ "name": "symfony/polyfill-intl-normalizer",
558
+ "version": "v1.23.0",
559
+ "source": {
560
+ "type": "git",
561
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
562
+ "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8"
563
+ },
564
+ "dist": {
565
+ "type": "zip",
566
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8",
567
+ "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8",
568
+ "shasum": ""
569
+ },
570
+ "require": {
571
+ "php": ">=7.1"
572
+ },
573
+ "suggest": {
574
+ "ext-intl": "For best performance"
575
+ },
576
+ "type": "library",
577
+ "extra": {
578
+ "branch-alias": {
579
+ "dev-main": "1.23-dev"
580
+ },
581
+ "thanks": {
582
+ "name": "symfony/polyfill",
583
+ "url": "https://github.com/symfony/polyfill"
584
+ }
585
+ },
586
+ "autoload": {
587
+ "psr-4": {
588
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
589
+ },
590
+ "files": [
591
+ "bootstrap.php"
592
+ ],
593
+ "classmap": [
594
+ "Resources/stubs"
595
+ ]
596
+ },
597
+ "notification-url": "https://packagist.org/downloads/",
598
+ "license": [
599
+ "MIT"
600
+ ],
601
+ "authors": [
602
+ {
603
+ "name": "Nicolas Grekas",
604
+ "email": "p@tchwork.com"
605
+ },
606
+ {
607
+ "name": "Symfony Community",
608
+ "homepage": "https://symfony.com/contributors"
609
+ }
610
+ ],
611
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
612
+ "homepage": "https://symfony.com",
613
+ "keywords": [
614
+ "compatibility",
615
+ "intl",
616
+ "normalizer",
617
+ "polyfill",
618
+ "portable",
619
+ "shim"
620
+ ],
621
+ "support": {
622
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0"
623
+ },
624
+ "funding": [
625
+ {
626
+ "url": "https://symfony.com/sponsor",
627
+ "type": "custom"
628
+ },
629
+ {
630
+ "url": "https://github.com/fabpot",
631
+ "type": "github"
632
+ },
633
+ {
634
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
635
+ "type": "tidelift"
636
+ }
637
+ ],
638
+ "time": "2021-02-19T12:13:01+00:00"
639
+ },
640
+ {
641
+ "name": "symfony/polyfill-mbstring",
642
+ "version": "v1.23.1",
643
+ "source": {
644
+ "type": "git",
645
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
646
+ "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6"
647
+ },
648
+ "dist": {
649
+ "type": "zip",
650
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6",
651
+ "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6",
652
+ "shasum": ""
653
+ },
654
+ "require": {
655
+ "php": ">=7.1"
656
+ },
657
+ "suggest": {
658
+ "ext-mbstring": "For best performance"
659
+ },
660
+ "type": "library",
661
+ "extra": {
662
+ "branch-alias": {
663
+ "dev-main": "1.23-dev"
664
+ },
665
+ "thanks": {
666
+ "name": "symfony/polyfill",
667
+ "url": "https://github.com/symfony/polyfill"
668
+ }
669
+ },
670
+ "autoload": {
671
+ "psr-4": {
672
+ "Symfony\\Polyfill\\Mbstring\\": ""
673
+ },
674
+ "files": [
675
+ "bootstrap.php"
676
+ ]
677
+ },
678
+ "notification-url": "https://packagist.org/downloads/",
679
+ "license": [
680
+ "MIT"
681
+ ],
682
+ "authors": [
683
+ {
684
+ "name": "Nicolas Grekas",
685
+ "email": "p@tchwork.com"
686
+ },
687
+ {
688
+ "name": "Symfony Community",
689
+ "homepage": "https://symfony.com/contributors"
690
+ }
691
+ ],
692
+ "description": "Symfony polyfill for the Mbstring extension",
693
+ "homepage": "https://symfony.com",
694
+ "keywords": [
695
+ "compatibility",
696
+ "mbstring",
697
+ "polyfill",
698
+ "portable",
699
+ "shim"
700
+ ],
701
+ "support": {
702
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1"
703
+ },
704
+ "funding": [
705
+ {
706
+ "url": "https://symfony.com/sponsor",
707
+ "type": "custom"
708
+ },
709
+ {
710
+ "url": "https://github.com/fabpot",
711
+ "type": "github"
712
+ },
713
+ {
714
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
715
+ "type": "tidelift"
716
+ }
717
+ ],
718
+ "time": "2021-05-27T12:26:48+00:00"
719
+ },
720
+ {
721
+ "name": "symfony/polyfill-php73",
722
+ "version": "v1.23.0",
723
+ "source": {
724
+ "type": "git",
725
+ "url": "https://github.com/symfony/polyfill-php73.git",
726
+ "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010"
727
+ },
728
+ "dist": {
729
+ "type": "zip",
730
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010",
731
+ "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010",
732
+ "shasum": ""
733
+ },
734
+ "require": {
735
+ "php": ">=7.1"
736
+ },
737
+ "type": "library",
738
+ "extra": {
739
+ "branch-alias": {
740
+ "dev-main": "1.23-dev"
741
+ },
742
+ "thanks": {
743
+ "name": "symfony/polyfill",
744
+ "url": "https://github.com/symfony/polyfill"
745
+ }
746
+ },
747
+ "autoload": {
748
+ "psr-4": {
749
+ "Symfony\\Polyfill\\Php73\\": ""
750
+ },
751
+ "files": [
752
+ "bootstrap.php"
753
+ ],
754
+ "classmap": [
755
+ "Resources/stubs"
756
+ ]
757
+ },
758
+ "notification-url": "https://packagist.org/downloads/",
759
+ "license": [
760
+ "MIT"
761
+ ],
762
+ "authors": [
763
+ {
764
+ "name": "Nicolas Grekas",
765
+ "email": "p@tchwork.com"
766
+ },
767
+ {
768
+ "name": "Symfony Community",
769
+ "homepage": "https://symfony.com/contributors"
770
+ }
771
+ ],
772
+ "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
773
+ "homepage": "https://symfony.com",
774
+ "keywords": [
775
+ "compatibility",
776
+ "polyfill",
777
+ "portable",
778
+ "shim"
779
+ ],
780
+ "support": {
781
+ "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0"
782
+ },
783
+ "funding": [
784
+ {
785
+ "url": "https://symfony.com/sponsor",
786
+ "type": "custom"
787
+ },
788
+ {
789
+ "url": "https://github.com/fabpot",
790
+ "type": "github"
791
+ },
792
+ {
793
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
794
+ "type": "tidelift"
795
+ }
796
+ ],
797
+ "time": "2021-02-19T12:13:01+00:00"
798
+ },
799
+ {
800
+ "name": "symfony/polyfill-php80",
801
+ "version": "v1.23.1",
802
+ "source": {
803
+ "type": "git",
804
+ "url": "https://github.com/symfony/polyfill-php80.git",
805
+ "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be"
806
+ },
807
+ "dist": {
808
+ "type": "zip",
809
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be",
810
+ "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be",
811
+ "shasum": ""
812
+ },
813
+ "require": {
814
+ "php": ">=7.1"
815
+ },
816
+ "type": "library",
817
+ "extra": {
818
+ "branch-alias": {
819
+ "dev-main": "1.23-dev"
820
+ },
821
+ "thanks": {
822
+ "name": "symfony/polyfill",
823
+ "url": "https://github.com/symfony/polyfill"
824
+ }
825
+ },
826
+ "autoload": {
827
+ "psr-4": {
828
+ "Symfony\\Polyfill\\Php80\\": ""
829
+ },
830
+ "files": [
831
+ "bootstrap.php"
832
+ ],
833
+ "classmap": [
834
+ "Resources/stubs"
835
+ ]
836
+ },
837
+ "notification-url": "https://packagist.org/downloads/",
838
+ "license": [
839
+ "MIT"
840
+ ],
841
+ "authors": [
842
+ {
843
+ "name": "Ion Bazan",
844
+ "email": "ion.bazan@gmail.com"
845
+ },
846
+ {
847
+ "name": "Nicolas Grekas",
848
+ "email": "p@tchwork.com"
849
+ },
850
+ {
851
+ "name": "Symfony Community",
852
+ "homepage": "https://symfony.com/contributors"
853
+ }
854
+ ],
855
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
856
+ "homepage": "https://symfony.com",
857
+ "keywords": [
858
+ "compatibility",
859
+ "polyfill",
860
+ "portable",
861
+ "shim"
862
+ ],
863
+ "support": {
864
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1"
865
+ },
866
+ "funding": [
867
+ {
868
+ "url": "https://symfony.com/sponsor",
869
+ "type": "custom"
870
+ },
871
+ {
872
+ "url": "https://github.com/fabpot",
873
+ "type": "github"
874
+ },
875
+ {
876
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
877
+ "type": "tidelift"
878
+ }
879
+ ],
880
+ "time": "2021-07-28T13:41:28+00:00"
881
+ },
882
+ {
883
+ "name": "symfony/process",
884
+ "version": "v5.3.7",
885
+ "source": {
886
+ "type": "git",
887
+ "url": "https://github.com/symfony/process.git",
888
+ "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967"
889
+ },
890
+ "dist": {
891
+ "type": "zip",
892
+ "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967",
893
+ "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967",
894
+ "shasum": ""
895
+ },
896
+ "require": {
897
+ "php": ">=7.2.5",
898
+ "symfony/polyfill-php80": "^1.16"
899
+ },
900
+ "type": "library",
901
+ "autoload": {
902
+ "psr-4": {
903
+ "Symfony\\Component\\Process\\": ""
904
+ },
905
+ "exclude-from-classmap": [
906
+ "/Tests/"
907
+ ]
908
+ },
909
+ "notification-url": "https://packagist.org/downloads/",
910
+ "license": [
911
+ "MIT"
912
+ ],
913
+ "authors": [
914
+ {
915
+ "name": "Fabien Potencier",
916
+ "email": "fabien@symfony.com"
917
+ },
918
+ {
919
+ "name": "Symfony Community",
920
+ "homepage": "https://symfony.com/contributors"
921
+ }
922
+ ],
923
+ "description": "Executes commands in sub-processes",
924
+ "homepage": "https://symfony.com",
925
+ "support": {
926
+ "source": "https://github.com/symfony/process/tree/v5.3.7"
927
+ },
928
+ "funding": [
929
+ {
930
+ "url": "https://symfony.com/sponsor",
931
+ "type": "custom"
932
+ },
933
+ {
934
+ "url": "https://github.com/fabpot",
935
+ "type": "github"
936
+ },
937
+ {
938
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
939
+ "type": "tidelift"
940
+ }
941
+ ],
942
+ "time": "2021-08-04T21:20:46+00:00"
943
+ },
944
+ {
945
+ "name": "symfony/service-contracts",
946
+ "version": "v2.4.0",
947
+ "source": {
948
+ "type": "git",
949
+ "url": "https://github.com/symfony/service-contracts.git",
950
+ "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb"
951
+ },
952
+ "dist": {
953
+ "type": "zip",
954
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb",
955
+ "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb",
956
+ "shasum": ""
957
+ },
958
+ "require": {
959
+ "php": ">=7.2.5",
960
+ "psr/container": "^1.1"
961
+ },
962
+ "suggest": {
963
+ "symfony/service-implementation": ""
964
+ },
965
+ "type": "library",
966
+ "extra": {
967
+ "branch-alias": {
968
+ "dev-main": "2.4-dev"
969
+ },
970
+ "thanks": {
971
+ "name": "symfony/contracts",
972
+ "url": "https://github.com/symfony/contracts"
973
+ }
974
+ },
975
+ "autoload": {
976
+ "psr-4": {
977
+ "Symfony\\Contracts\\Service\\": ""
978
+ }
979
+ },
980
+ "notification-url": "https://packagist.org/downloads/",
981
+ "license": [
982
+ "MIT"
983
+ ],
984
+ "authors": [
985
+ {
986
+ "name": "Nicolas Grekas",
987
+ "email": "p@tchwork.com"
988
+ },
989
+ {
990
+ "name": "Symfony Community",
991
+ "homepage": "https://symfony.com/contributors"
992
+ }
993
+ ],
994
+ "description": "Generic abstractions related to writing services",
995
+ "homepage": "https://symfony.com",
996
+ "keywords": [
997
+ "abstractions",
998
+ "contracts",
999
+ "decoupling",
1000
+ "interfaces",
1001
+ "interoperability",
1002
+ "standards"
1003
+ ],
1004
+ "support": {
1005
+ "source": "https://github.com/symfony/service-contracts/tree/v2.4.0"
1006
+ },
1007
+ "funding": [
1008
+ {
1009
+ "url": "https://symfony.com/sponsor",
1010
+ "type": "custom"
1011
+ },
1012
+ {
1013
+ "url": "https://github.com/fabpot",
1014
+ "type": "github"
1015
+ },
1016
+ {
1017
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1018
+ "type": "tidelift"
1019
+ }
1020
+ ],
1021
+ "time": "2021-04-01T10:43:52+00:00"
1022
+ },
1023
+ {
1024
+ "name": "symfony/string",
1025
+ "version": "v5.3.7",
1026
+ "source": {
1027
+ "type": "git",
1028
+ "url": "https://github.com/symfony/string.git",
1029
+ "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5"
1030
+ },
1031
+ "dist": {
1032
+ "type": "zip",
1033
+ "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5",
1034
+ "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5",
1035
+ "shasum": ""
1036
+ },
1037
+ "require": {
1038
+ "php": ">=7.2.5",
1039
+ "symfony/polyfill-ctype": "~1.8",
1040
+ "symfony/polyfill-intl-grapheme": "~1.0",
1041
+ "symfony/polyfill-intl-normalizer": "~1.0",
1042
+ "symfony/polyfill-mbstring": "~1.0",
1043
+ "symfony/polyfill-php80": "~1.15"
1044
+ },
1045
+ "require-dev": {
1046
+ "symfony/error-handler": "^4.4|^5.0",
1047
+ "symfony/http-client": "^4.4|^5.0",
1048
+ "symfony/translation-contracts": "^1.1|^2",
1049
+ "symfony/var-exporter": "^4.4|^5.0"
1050
+ },
1051
+ "type": "library",
1052
+ "autoload": {
1053
+ "psr-4": {
1054
+ "Symfony\\Component\\String\\": ""
1055
+ },
1056
+ "files": [
1057
+ "Resources/functions.php"
1058
+ ],
1059
+ "exclude-from-classmap": [
1060
+ "/Tests/"
1061
+ ]
1062
+ },
1063
+ "notification-url": "https://packagist.org/downloads/",
1064
+ "license": [
1065
+ "MIT"
1066
+ ],
1067
+ "authors": [
1068
+ {
1069
+ "name": "Nicolas Grekas",
1070
+ "email": "p@tchwork.com"
1071
+ },
1072
+ {
1073
+ "name": "Symfony Community",
1074
+ "homepage": "https://symfony.com/contributors"
1075
+ }
1076
+ ],
1077
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
1078
+ "homepage": "https://symfony.com",
1079
+ "keywords": [
1080
+ "grapheme",
1081
+ "i18n",
1082
+ "string",
1083
+ "unicode",
1084
+ "utf-8",
1085
+ "utf8"
1086
+ ],
1087
+ "support": {
1088
+ "source": "https://github.com/symfony/string/tree/v5.3.7"
1089
+ },
1090
+ "funding": [
1091
+ {
1092
+ "url": "https://symfony.com/sponsor",
1093
+ "type": "custom"
1094
+ },
1095
+ {
1096
+ "url": "https://github.com/fabpot",
1097
+ "type": "github"
1098
+ },
1099
+ {
1100
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1101
+ "type": "tidelift"
1102
+ }
1103
+ ],
1104
+ "time": "2021-08-26T08:00:08+00:00"
1105
+ },
1106
+ {
1107
+ "name": "symfony/yaml",
1108
+ "version": "v5.3.6",
1109
+ "source": {
1110
+ "type": "git",
1111
+ "url": "https://github.com/symfony/yaml.git",
1112
+ "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7"
1113
+ },
1114
+ "dist": {
1115
+ "type": "zip",
1116
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7",
1117
+ "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7",
1118
+ "shasum": ""
1119
+ },
1120
+ "require": {
1121
+ "php": ">=7.2.5",
1122
+ "symfony/deprecation-contracts": "^2.1",
1123
+ "symfony/polyfill-ctype": "~1.8"
1124
+ },
1125
+ "conflict": {
1126
+ "symfony/console": "<4.4"
1127
+ },
1128
+ "require-dev": {
1129
+ "symfony/console": "^4.4|^5.0"
1130
+ },
1131
+ "suggest": {
1132
+ "symfony/console": "For validating YAML files using the lint command"
1133
+ },
1134
+ "bin": [
1135
+ "Resources/bin/yaml-lint"
1136
+ ],
1137
+ "type": "library",
1138
+ "autoload": {
1139
+ "psr-4": {
1140
+ "Symfony\\Component\\Yaml\\": ""
1141
+ },
1142
+ "exclude-from-classmap": [
1143
+ "/Tests/"
1144
+ ]
1145
+ },
1146
+ "notification-url": "https://packagist.org/downloads/",
1147
+ "license": [
1148
+ "MIT"
1149
+ ],
1150
+ "authors": [
1151
+ {
1152
+ "name": "Fabien Potencier",
1153
+ "email": "fabien@symfony.com"
1154
+ },
1155
+ {
1156
+ "name": "Symfony Community",
1157
+ "homepage": "https://symfony.com/contributors"
1158
+ }
1159
+ ],
1160
+ "description": "Loads and dumps YAML files",
1161
+ "homepage": "https://symfony.com",
1162
+ "support": {
1163
+ "source": "https://github.com/symfony/yaml/tree/v5.3.6"
1164
+ },
1165
+ "funding": [
1166
+ {
1167
+ "url": "https://symfony.com/sponsor",
1168
+ "type": "custom"
1169
+ },
1170
+ {
1171
+ "url": "https://github.com/fabpot",
1172
+ "type": "github"
1173
+ },
1174
+ {
1175
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1176
+ "type": "tidelift"
1177
+ }
1178
+ ],
1179
+ "time": "2021-07-29T06:20:01+00:00"
1180
+ }
1181
+ ],
1182
+ "aliases": [],
1183
+ "minimum-stability": "dev",
1184
+ "stability-flags": [],
1185
+ "prefer-stable": true,
1186
+ "prefer-lowest": false,
1187
+ "platform": {
1188
+ "php": ">=5.6.20"
1189
+ },
1190
+ "platform-dev": [],
1191
+ "plugin-api-version": "2.1.0"
1192
+ }
views/bulk-edit.php CHANGED
@@ -1,114 +1,147 @@
1
  <?php
2
- $defaults = PostExpirator_Facade::get_default_expiry( $post_type );
3
 
4
- $year = $defaults['year'];
5
- $month = $defaults['month'];
6
- $day = $defaults['day'];
7
- $hour = $defaults['hour'];
 
 
8
  $minute = $defaults['minute'];
9
  ?>
10
  <div style="clear:both"></div>
11
  <div class="inline-edit-col post-expirator-quickedit">
12
- <div class="inline-edit-col">
13
- <div class="inline-edit-group">
14
- <legend class="inline-edit-legend"><?php _e( 'Post Expirator', 'post-expirator' ); ?></legend>
15
- <fieldset class="inline-edit-date">
16
- <div class="pe-qe-fields">
17
- <div>
18
- <legend><span class="title"><?php _e( 'Date', 'post-expirator' ); ?></span></legend>
19
- <label>
20
- <span class="screen-reader-text"><?php _e( 'Enable Post Expiration', 'post-expirator' ); ?></span>
21
- <select name="expirationdate_status">
22
- <option value="no-change" data-show-fields="false" selected>
23
- --<?php _e( 'No Change', 'post-expirator' ); ?>--
24
- </option>
25
- <option value="change-only" data-show-fields="true"
26
- title="<?php _e( 'Change expiry date if enabled on posts', 'post-expirator' ); ?>"><?php _e( 'Change on posts', 'post-expirator' ); ?></option>
27
- <option value="add-only" data-show-fields="true"
28
- title="<?php _e( 'Add expiry date if not enabled on posts', 'post-expirator' ); ?>"><?php _e( 'Add to posts', 'post-expirator' ); ?></option>
29
- <option value="change-add"
30
- data-show-fields="true"><?php _e( 'Change & Add', 'post-expirator' ); ?></option>
31
- <option value="remove-only"
32
- data-show-fields="false"><?php _e( 'Remove from posts', 'post-expirator' ); ?></option>
33
- </select>
34
- </label>
35
- <span class="post-expirator-date-fields">
36
- <label>
37
- <span class="screen-reader-text"><?php _e( 'Month', 'post-expirator' ); ?></span>
38
- <select name="expirationdate_month">
39
- <?php
40
- for ( $x = 1; $x <= 12; $x ++ ) {
41
- $now = mktime( 0, 0, 0, $x, 1, date_i18n( 'Y' ) );
42
- $monthNumeric = date_i18n( 'm', $now );
43
- $monthStr = date_i18n( 'M', $now );
44
- // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
45
- $selected = $monthNumeric == $defaults['month'] ? 'selected' : '';
46
- ?>
47
- <option value="<?php echo $monthNumeric; ?>"
48
- data-text="<?php echo $monthStr; ?>" <?php echo $selected; ?>><?php echo $monthNumeric; ?>-<?php echo $monthStr; ?></option>
49
- <?php } ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
 
51
- </select>
52
- </label>
53
- <label>
54
- <span class="screen-reader-text"><?php _e( 'Day', 'post-expirator' ); ?></span>
55
- <input name="expirationdate_day" placeholder="<?php echo $day; ?>" value="" size="2"
56
- maxlength="2" autocomplete="off" type="text">
57
- </label>,
58
- <label>
59
- <span class="screen-reader-text"><?php _e( 'Year', 'post-expirator' ); ?></span>
60
- <input name="expirationdate_year" placeholder="<?php echo $year; ?>" value="" size="4"
61
- maxlength="4" autocomplete="off" type="text">
62
- </label> @
63
- <label>
64
- <span class="screen-reader-text"><?php _e( 'Hour', 'post-expirator' ); ?></span>
65
- <input name="expirationdate_hour" placeholder="<?php echo $hour; ?>" value="" size="2"
66
- maxlength="2" autocomplete="off" type="text">
67
- </label> :
68
- <label>
69
- <span class="screen-reader-text"><?php _e( 'Minute', 'post-expirator' ); ?></span>
70
- <input name="expirationdate_minute" placeholder="<?php echo $minute; ?>" value=""
71
- size="2" maxlength="2" autocomplete="off" type="text">
72
- </label>
73
- </span>
74
- </div>
75
- <div class="post-expirator-date-fields">
76
- <legend>
77
- <span class="title"><?php _e( 'Type', 'post-expirator' ); ?></span>
78
- <span class="screen-reader-text"><?php _e( 'How to expire', 'post-expirator' ); ?></span>
79
- </legend>
80
- <label>
81
- <?php
82
- $defaults = get_option( 'expirationdateDefaults' . ucfirst( $post_type ) );
83
- _postexpirator_expire_type( array( 'name' => 'expirationdate_expiretype',
84
- 'selected' => empty( $defaults ) ? 'draft' : $defaults['expireType'],
85
- 'post_type' => $post_type
86
- ) );
87
- ?>
88
- </label>
89
- </div>
90
- <div class="pe-category-list">
91
- <legend>
92
- <span class="title"><?php echo $tax_label; ?></span>
93
- <span class="screen-reader-text"><?php _e( 'Expiration Categories', 'post-expirator' ); ?></span>
94
- </legend>
95
- <ul id="categorychecklist"
96
- class="list:category categorychecklist cat-checklist category-checklist">
97
- <?php
98
- if ( ! empty( $taxonomy ) ) {
99
- $walker = new Walker_PostExpirator_Category_Checklist();
100
- wp_terms_checklist( 0, array( 'taxonomy' => $taxonomy,
101
- 'walker' => $walker,
102
- 'checked_ontop' => false
103
- ) );
104
- }
105
- ?>
106
- </ul>
107
- </div>
108
- </span>
109
- </div>
110
- <input name="expirationdate_quickedit" value="true" type="hidden"/>
111
- </fieldset>
112
- </div>
113
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  </div>
1
  <?php
 
2
 
3
+ $defaults = PostExpirator_Facade::get_default_expiry($post_type);
4
+
5
+ $year = $defaults['year'];
6
+ $month = $defaults['month'];
7
+ $day = $defaults['day'];
8
+ $hour = $defaults['hour'];
9
  $minute = $defaults['minute'];
10
  ?>
11
  <div style="clear:both"></div>
12
  <div class="inline-edit-col post-expirator-quickedit">
13
+ <div class="inline-edit-col">
14
+ <div class="inline-edit-group">
15
+ <legend class="inline-edit-legend"><?php
16
+ _e('Post Expirator', 'post-expirator'); ?></legend>
17
+ <fieldset class="inline-edit-date">
18
+ <div class="pe-qe-fields">
19
+ <div>
20
+ <legend><span class="title"><?php
21
+ _e('Date', 'post-expirator'); ?></span></legend>
22
+ <label>
23
+ <span class="screen-reader-text"><?php
24
+ _e('Enable Post Expiration', 'post-expirator'); ?></span>
25
+ <select name="expirationdate_status">
26
+ <option value="no-change" data-show-fields="false" selected>
27
+ --<?php
28
+ _e('No Change', 'post-expirator'); ?>--
29
+ </option>
30
+ <option value="change-only" data-show-fields="true"
31
+ title="<?php
32
+ _e('Change expiry date if enabled on posts', 'post-expirator'); ?>"><?php
33
+ _e('Change on posts', 'post-expirator'); ?></option>
34
+ <option value="add-only" data-show-fields="true"
35
+ title="<?php
36
+ _e('Add expiry date if not enabled on posts', 'post-expirator'); ?>"><?php
37
+ _e('Add to posts', 'post-expirator'); ?></option>
38
+ <option value="change-add"
39
+ data-show-fields="true"><?php
40
+ _e('Change & Add', 'post-expirator'); ?></option>
41
+ <option value="remove-only"
42
+ data-show-fields="false"><?php
43
+ _e('Remove from posts', 'post-expirator'); ?></option>
44
+ </select>
45
+ </label>
46
+ <span class="post-expirator-date-fields">
47
+ <label>
48
+ <span class="screen-reader-text"><?php
49
+ _e('Month', 'post-expirator'); ?></span>
50
+ <select name="expirationdate_month">
51
+ <?php
52
+ for ($x = 1; $x <= 12; $x++) {
53
+ $now = mktime(0, 0, 0, $x, 1, date_i18n('Y'));
54
+ $monthNumeric = date_i18n('m', $now);
55
+ $monthStr = date_i18n('M', $now);
56
+ // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
57
+ $selected = $monthNumeric == $defaults['month'] ? 'selected' : '';
58
+ ?>
59
+ <option value="<?php
60
+ echo $monthNumeric; ?>"
61
+ data-text="<?php
62
+ echo $monthStr; ?>" <?php
63
+ echo $selected; ?>><?php
64
+ echo $monthNumeric; ?>-<?php
65
+ echo $monthStr; ?></option>
66
+ <?php
67
+ } ?>
68
 
69
+ </select>
70
+ </label>
71
+ <label>
72
+ <span class="screen-reader-text"><?php
73
+ _e('Day', 'post-expirator'); ?></span>
74
+ <input name="expirationdate_day" placeholder="<?php
75
+ echo $day; ?>" value="" size="2"
76
+ maxlength="2" autocomplete="off" type="text">
77
+ </label>,
78
+ <label>
79
+ <span class="screen-reader-text"><?php
80
+ _e('Year', 'post-expirator'); ?></span>
81
+ <input name="expirationdate_year" placeholder="<?php
82
+ echo $year; ?>" value="" size="4"
83
+ maxlength="4" autocomplete="off" type="text">
84
+ </label> @
85
+ <label>
86
+ <span class="screen-reader-text"><?php
87
+ _e('Hour', 'post-expirator'); ?></span>
88
+ <input name="expirationdate_hour" placeholder="<?php
89
+ echo $hour; ?>" value="" size="2"
90
+ maxlength="2" autocomplete="off" type="text">
91
+ </label> :
92
+ <label>
93
+ <span class="screen-reader-text"><?php
94
+ _e('Minute', 'post-expirator'); ?></span>
95
+ <input name="expirationdate_minute" placeholder="<?php
96
+ echo $minute; ?>" value=""
97
+ size="2" maxlength="2" autocomplete="off" type="text">
98
+ </label>
99
+ </span>
100
+ </div>
101
+ <div class="post-expirator-date-fields">
102
+ <legend>
103
+ <span class="title"><?php
104
+ _e('Type', 'post-expirator'); ?></span>
105
+ <span class="screen-reader-text"><?php
106
+ _e('How to expire', 'post-expirator'); ?></span>
107
+ </legend>
108
+ <label>
109
+ <?php
110
+ $defaults = get_option('expirationdateDefaults' . ucfirst($post_type));
111
+ _postexpirator_expire_type(array(
112
+ 'name' => 'expirationdate_expiretype',
113
+ 'selected' => empty($defaults) ? 'draft' : $defaults['expireType'],
114
+ 'post_type' => $post_type
115
+ ));
116
+ ?>
117
+ </label>
118
+ </div>
119
+ <div class="pe-category-list">
120
+ <legend>
121
+ <span class="title"><?php
122
+ echo $tax_label; ?></span>
123
+ <span class="screen-reader-text"><?php
124
+ _e('Expiration Categories', 'post-expirator'); ?></span>
125
+ </legend>
126
+ <ul id="categorychecklist"
127
+ class="list:category categorychecklist cat-checklist category-checklist">
128
+ <?php
129
+ if (! empty($taxonomy)) {
130
+ $walker = new Walker_PostExpirator_Category_Checklist();
131
+ wp_terms_checklist(0, array(
132
+ 'taxonomy' => $taxonomy,
133
+ 'walker' => $walker,
134
+ 'checked_ontop' => false
135
+ ));
136
+ }
137
+ ?>
138
+ </ul>
139
+ </div>
140
+ </span>
141
+ </div>
142
+ <input name="expirationdate_quickedit" value="true" type="hidden"/>
143
+ <input name="postexpirator_view" value="bulk-edit" type="hidden"/>
144
+ </fieldset>
145
+ </div>
146
+ </div>
147
  </div>
views/classic-metabox.php CHANGED
@@ -1,135 +1,171 @@
1
  <p>
2
- <input type="checkbox" name="enable-expirationdate" id="enable-expirationdate" value="checked"'
3
- . <?php echo $enabled; ?>/>
4
- <label for="enable-expirationdate"><?php _e( 'Enable Post Expiration', 'post-expirator' ); ?></label>
 
 
5
  </p>
6
 
7
  <?php
8
- if ( $default === 'publish' ) {
9
- ?>
10
- <em><?php _e( 'The published date/time will be used as the expiration value', 'post-expirator' ); ?></em>
11
- <?php
12
- return;
 
13
  }
14
  ?>
15
- <div class="pe-classic-fields" style="display: <?php echo empty( $enabled ) ? 'none' : 'flex'; ?>">
16
- <div>
17
- <label><?php _e( 'Year', 'post-expirator' ); ?></label>
18
- <select name="expirationdate_year" id="expirationdate_year">
19
- <?php
20
- $currentyear = date( 'Y' );
 
 
21
 
22
- if ( $defaultyear < $currentyear ) {
23
- $currentyear = $defaultyear;
24
- }
25
 
26
- for ( $i = $currentyear; $i <= $currentyear + 10; $i ++ ) {
27
- // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
28
- if ( $i == $defaultyear ) {
29
- $selected = ' selected="selected"';
30
- } else {
31
- $selected = '';
32
- }
33
- ?>
34
- <option <?php echo $selected; ?> value="<?php echo $i; ?>"><?php echo $i; ?></option>
35
- <?php
36
- }
37
- ?>
38
- </select>
39
- </div>
40
- <div>
41
- <label><?php _e( 'Month', 'post-expirator' ); ?></label>
42
- <select name="expirationdate_month" id="expirationdate_month">
43
- <?php
44
- for ( $i = 1; $i <= 12; $i ++ ) {
45
- if ( $defaultmonth === date_i18n( 'm', mktime( 0, 0, 0, $i, 1, date_i18n( 'Y' ) ) ) ) {
46
- $selected = ' selected="selected"';
47
- } else {
48
- $selected = '';
49
- }
50
- ?>
51
- <option value="<?php echo date_i18n( 'm', mktime( 0, 0, 0, $i, 1, date_i18n( 'Y' ) ) ); ?>" <?php echo $selected; ?>><?php echo date_i18n( 'F', mktime( 0, 0, 0, $i, 1, date_i18n( 'Y' ) ) ); ?></option>
52
- <?php
53
- }
54
- ?>
55
- </select>
56
- </div>
57
- <div>
58
- <label><?php _e( 'Day', 'post-expirator' ); ?></label>
59
- <input type="text" id="expirationdate_day" name="expirationdate_day" value="<?php echo $defaultday; ?>"
60
- size="2"/>
61
- </div>
62
- <div>
63
- <label><?php _e( 'Hour', 'post-expirator' ); ?>
64
- (<?php echo date_i18n( 'T', mktime( 0, 0, 0, $i, 1, date_i18n( 'Y' ) ) ); ?>)</label>
65
- <select name="expirationdate_hour" id="expirationdate_hour">
66
- <?php
67
- for ( $i = 1; $i <= 24; $i ++ ) {
68
- $hour = date_i18n( 'H', mktime( $i, 0, 0, date_i18n( 'n' ), date_i18n( 'j' ), date_i18n( 'Y' ) ) );
69
- if ( $defaulthour === $hour ) {
70
- $selected = ' selected="selected"';
71
- } else {
72
- $selected = '';
73
- }
74
- ?>
75
- <option value="<?php echo $hour; ?>" <?php echo $selected; ?>><?php echo $hour; ?></option>
76
- <?php
77
- }
78
- ?>
79
- </select>
80
- </div>
81
- <div>
82
- <label><?php _e( 'Minute', 'post-expirator' ); ?></label>
83
- <input type="text" id="expirationdate_minute" name="expirationdate_minute" value="<?php echo $defaultminute; ?>"
84
- size="2"/>
85
- </div>
86
- <div>
87
- <label><?php _e( 'How to expire', 'post-expirator' ); ?></label>
88
- <?php _postexpirator_expire_type( array( 'type' => $post->post_type,
89
- 'name' => 'expirationdate_expiretype',
90
- 'selected' => $expireType
91
- ) ); ?>
92
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
 
94
- <?php
95
- if ( $post->post_type !== 'page' ) {
96
- if ( isset( $expireType ) && ( $expireType === 'category' || $expireType === 'category-add' || $expireType === 'category-remove' ) ) {
97
- $catdisplay = 'block';
98
- } else {
99
- $catdisplay = 'none';
100
- }
101
 
102
- echo '<div id="expired-category-selection" style="display: ' . $catdisplay . '">';
103
- echo '<br/>' . __( 'Expiration Categories', 'post-expirator' ) . ':<br/>';
104
 
105
- echo '<div class="wp-tab-panel" id="post-expirator-cat-list">';
106
- echo '<ul id="categorychecklist" class="list:category categorychecklist form-no-clear">';
107
- $walker = new Walker_PostExpirator_Category_Checklist();
108
- $taxonomies = get_object_taxonomies( $post->post_type, 'object' );
109
- $taxonomies = wp_filter_object_list( $taxonomies, array( 'hierarchical' => true ) );
110
- if ( sizeof( $taxonomies ) === 0 ) {
111
- echo '<p>' . __( 'You must assign a heirarchical taxonomy to this post type to use this feature.', 'post-expirator' ) . '</p>';
112
- } elseif ( sizeof( $taxonomies ) > 1 && ! isset( $defaults['taxonomy'] ) ) {
113
- echo '<p>' . __( 'More than 1 heirachical taxonomy detected. You must assign a default taxonomy on the settings screen.', 'post-expirator' ) . '</p>';
114
- } else {
115
- $keys = array_keys( $taxonomies );
116
- $taxonomy = isset( $defaults['taxonomy'] ) ? $defaults['taxonomy'] : $keys[0];
117
- wp_terms_checklist( 0, array( 'taxonomy' => $taxonomy,
118
- 'walker' => $walker,
119
- 'selected_cats' => $categories,
120
- 'checked_ontop' => false
121
- ) );
122
- echo '<input type="hidden" name="taxonomy-heirarchical" value="' . $taxonomy . '" />';
123
- }
124
- echo '</ul>';
125
- echo '</div>';
126
- if ( isset( $taxonomy ) ) {
127
- echo '<p class="post-expirator-taxonomy-name">' . __( 'Taxonomy Name', 'post-expirator' ) . ': ' . $taxonomy . '</p>';
128
- }
129
- echo '</div>';
130
- }
131
- ?>
 
 
 
 
 
 
 
 
 
 
132
  </div>
133
 
134
- <input type="hidden" name="expirationdate_formcheck" value="true"/>
135
- <?php wp_nonce_field( '__postexpirator', '_postexpiratornonce' ); ?>
 
 
1
  <p>
2
+ <input type="checkbox" name="enable-expirationdate" id="enable-expirationdate" value="checked"'
3
+ . <?php
4
+ echo $enabled; ?>/>
5
+ <label for="enable-expirationdate"><?php
6
+ _e('Enable Post Expiration', 'post-expirator'); ?></label>
7
  </p>
8
 
9
  <?php
10
+ if ($default === 'publish') {
11
+ ?>
12
+ <em><?php
13
+ _e('The published date/time will be used as the expiration value', 'post-expirator'); ?></em>
14
+ <?php
15
+ return;
16
  }
17
  ?>
18
+ <div class="pe-classic-fields" style="display: <?php
19
+ echo empty($enabled) ? 'none' : 'flex'; ?>">
20
+ <div>
21
+ <label><?php
22
+ _e('Year', 'post-expirator'); ?></label>
23
+ <select name="expirationdate_year" id="expirationdate_year">
24
+ <?php
25
+ $currentyear = date('Y');
26
 
27
+ if ($defaultyear < $currentyear) {
28
+ $currentyear = $defaultyear;
29
+ }
30
 
31
+ for ($i = $currentyear; $i <= $currentyear + 10; $i++) {
32
+ // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
33
+ if ($i == $defaultyear) {
34
+ $selected = ' selected="selected"';
35
+ } else {
36
+ $selected = '';
37
+ }
38
+ ?>
39
+ <option <?php
40
+ echo $selected; ?> value="<?php
41
+ echo $i; ?>"><?php
42
+ echo $i; ?></option>
43
+ <?php
44
+ }
45
+ ?>
46
+ </select>
47
+ </div>
48
+ <div>
49
+ <label><?php
50
+ _e('Month', 'post-expirator'); ?></label>
51
+ <select name="expirationdate_month" id="expirationdate_month">
52
+ <?php
53
+ for ($i = 1; $i <= 12; $i++) {
54
+ if ($defaultmonth === date_i18n('m', mktime(0, 0, 0, $i, 1, date_i18n('Y')))) {
55
+ $selected = ' selected="selected"';
56
+ } else {
57
+ $selected = '';
58
+ }
59
+ ?>
60
+ <option value="<?php
61
+ echo date_i18n('m', mktime(0, 0, 0, $i, 1, date_i18n('Y'))); ?>" <?php
62
+ echo $selected; ?>><?php
63
+ echo date_i18n('F', mktime(0, 0, 0, $i, 1, date_i18n('Y'))); ?></option>
64
+ <?php
65
+ }
66
+ ?>
67
+ </select>
68
+ </div>
69
+ <div>
70
+ <label><?php
71
+ _e('Day', 'post-expirator'); ?></label>
72
+ <input type="text" id="expirationdate_day" name="expirationdate_day" value="<?php
73
+ echo $defaultday; ?>"
74
+ size="2"/>
75
+ </div>
76
+ <div>
77
+ <label><?php
78
+ _e('Hour', 'post-expirator'); ?>
79
+ (<?php
80
+ echo date_i18n('T', mktime(0, 0, 0, $i, 1, date_i18n('Y'))); ?>)</label>
81
+ <select name="expirationdate_hour" id="expirationdate_hour">
82
+ <?php
83
+ for ($i = 1; $i <= 24; $i++) {
84
+ $hour = date_i18n('H', mktime($i, 0, 0, date_i18n('n'), date_i18n('j'), date_i18n('Y')));
85
+ if ($defaulthour === $hour) {
86
+ $selected = ' selected="selected"';
87
+ } else {
88
+ $selected = '';
89
+ }
90
+ ?>
91
+ <option value="<?php
92
+ echo $hour; ?>" <?php
93
+ echo $selected; ?>><?php
94
+ echo $hour; ?></option>
95
+ <?php
96
+ }
97
+ ?>
98
+ </select>
99
+ </div>
100
+ <div>
101
+ <label><?php
102
+ _e('Minute', 'post-expirator'); ?></label>
103
+ <input type="text" id="expirationdate_minute" name="expirationdate_minute" value="<?php
104
+ echo $defaultminute; ?>"
105
+ size="2"/>
106
+ </div>
107
+ <div>
108
+ <label><?php
109
+ _e('How to expire', 'post-expirator'); ?></label>
110
+ <?php
111
+ _postexpirator_expire_type(array(
112
+ 'type' => $post->post_type,
113
+ 'name' => 'expirationdate_expiretype',
114
+ 'selected' => $expireType
115
+ )); ?>
116
+ </div>
117
 
118
+ <?php
119
+ if ($post->post_type !== 'page') {
120
+ if (isset($expireType) && ($expireType === 'category' || $expireType === 'category-add' || $expireType === 'category-remove')) {
121
+ $catdisplay = 'block';
122
+ } else {
123
+ $catdisplay = 'none';
124
+ }
125
 
126
+ echo '<div id="expired-category-selection" style="display: ' . $catdisplay . '">';
127
+ echo '<br/>' . __('Expiration Categories', 'post-expirator') . ':<br/>';
128
 
129
+ echo '<div class="wp-tab-panel" id="post-expirator-cat-list">';
130
+ echo '<ul id="categorychecklist" class="list:category categorychecklist form-no-clear">';
131
+ $walker = new Walker_PostExpirator_Category_Checklist();
132
+ $taxonomies = get_object_taxonomies($post->post_type, 'object');
133
+ $taxonomies = wp_filter_object_list($taxonomies, array('hierarchical' => true));
134
+ if (sizeof($taxonomies) === 0) {
135
+ echo '<p>' . __(
136
+ 'You must assign a heirarchical taxonomy to this post type to use this feature.',
137
+ 'post-expirator'
138
+ ) . '</p>';
139
+ } elseif (sizeof($taxonomies) > 1 && ! isset($defaults['taxonomy'])) {
140
+ echo '<p>' . __(
141
+ 'More than 1 heirachical taxonomy detected. You must assign a default taxonomy on the settings screen.',
142
+ 'post-expirator'
143
+ ) . '</p>';
144
+ } else {
145
+ $keys = array_keys($taxonomies);
146
+ $taxonomy = isset($defaults['taxonomy']) ? $defaults['taxonomy'] : $keys[0];
147
+ wp_terms_checklist(0, array(
148
+ 'taxonomy' => $taxonomy,
149
+ 'walker' => $walker,
150
+ 'selected_cats' => $categories,
151
+ 'checked_ontop' => false
152
+ ));
153
+ echo '<input type="hidden" name="taxonomy-heirarchical" value="' . $taxonomy . '" />';
154
+ }
155
+ echo '</ul>';
156
+ echo '</div>';
157
+ if (isset($taxonomy)) {
158
+ echo '<p class="post-expirator-taxonomy-name">' . __(
159
+ 'Taxonomy Name',
160
+ 'post-expirator'
161
+ ) . ': ' . $taxonomy . '</p>';
162
+ }
163
+ echo '</div>';
164
+ }
165
+ ?>
166
  </div>
167
 
168
+ <input name="expirationdate_formcheck" value="true" type="hidden"/>
169
+ <input name="postexpirator_view" value="classic-metabox" type="hidden"/>
170
+ <?php
171
+ wp_nonce_field('__postexpirator', '_postexpiratornonce'); ?>
views/expire-column.php CHANGED
@@ -1,60 +1,68 @@
1
- <div class="post-expire-col" data-id="<?php echo esc_attr( $id ); ?>"
2
- data-expire-attributes="<?php echo esc_attr( json_encode( $attributes ) ); ?>">
3
- <?php
4
- $display = __( 'Never', 'post-expirator' );
5
- $ed = get_post_meta( $id, '_expiration-date', true );
6
- if ( $ed ) {
7
- $display = date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $ed + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) );
8
- }
 
 
 
 
 
9
 
10
- $defaults = get_option( 'expirationdateDefaults' . ucfirst( $post_type ) );
11
- $expireType = 'draft';
12
- if ( isset( $defaults['expireType'] ) ) {
13
- $expireType = $defaults['expireType'];
14
- }
15
 
16
- // these defaults will be used by quick edit
17
- $defaults = PostExpirator_Facade::get_default_expiry( $post_type );
18
 
19
- $year = $defaults['year'];
20
- $month = $defaults['month'];
21
- $day = $defaults['day'];
22
- $hour = $defaults['hour'];
23
- $minute = $defaults['minute'];
24
- $enabled = 'false';
25
- $categories = '';
26
 
27
- // Values for Quick Edit
28
- if ( $ed ) {
29
- $enabled = 'true';
30
- $date = gmdate( 'Y-m-d H:i:s', $ed );
31
- $year = get_date_from_gmt( $date, 'Y' );
32
- $month = get_date_from_gmt( $date, 'm' );
33
- $day = get_date_from_gmt( $date, 'd' );
34
- $hour = get_date_from_gmt( $date, 'H' );
35
- $minute = get_date_from_gmt( $date, 'i' );
36
- if ( isset( $attributes['expireType'] ) ) {
37
- $expireType = $attributes['expireType'];
38
- }
39
- if ( isset( $attributes['category'] ) && ! empty( $attributes['category'] ) && in_array( $expireType, array(
40
- 'category',
41
- 'category-add',
42
- 'category-remove'
43
- ), true ) ) {
44
- $categories = implode( ',', $attributes['category'] );
45
- }
46
- }
 
 
47
 
48
- // the hidden fields will be used by quick edit
49
 
50
- ?>
51
- <?php echo esc_html( $display ); ?>
52
- <span id="expirationdate_year-<?php echo $id; ?>" style="display: none;"><?php echo $year; ?></span>
53
- <span id="expirationdate_month-<?php echo $id; ?>" style="display: none;"><?php echo $month; ?></span>
54
- <span id="expirationdate_day-<?php echo $id; ?>" style="display: none;"><?php echo $day; ?></span>
55
- <span id="expirationdate_hour-<?php echo $id; ?>" style="display: none;"><?php echo $hour; ?></span>
56
- <span id="expirationdate_minute-<?php echo $id; ?>" style="display: none;"><?php echo $minute; ?></span>
57
- <span id="expirationdate_enabled-<?php echo $id; ?>" style="display: none;"><?php echo $enabled; ?></span>
58
- <span id="expirationdate_expireType-<?php echo $id; ?>" style="display: none;"><?php echo $expireType; ?></span>
59
- <span id="expirationdate_categories-<?php echo $id; ?>" style="display: none;"><?php echo $categories; ?></span>
 
60
  </div>
1
+ <div class="post-expire-col" data-id="<?php
2
+ echo esc_attr($id); ?>"
3
+ data-expire-attributes="<?php
4
+ echo esc_attr(json_encode($attributes)); ?>">
5
+ <?php
6
+ $display = __('Never', 'post-expirator');
7
+ $ed = get_post_meta($id, '_expiration-date', true);
8
+ if ($ed) {
9
+ $display = date_i18n(
10
+ get_option('date_format') . ' ' . get_option('time_format'),
11
+ $ed + (get_option('gmt_offset') * HOUR_IN_SECONDS)
12
+ );
13
+ }
14
 
15
+ $defaults = get_option('expirationdateDefaults' . ucfirst($post_type));
16
+ $expireType = 'draft';
17
+ if (isset($defaults['expireType'])) {
18
+ $expireType = $defaults['expireType'];
19
+ }
20
 
21
+ // these defaults will be used by quick edit
22
+ $defaults = PostExpirator_Facade::get_default_expiry($post_type);
23
 
24
+ $year = $defaults['year'];
25
+ $month = $defaults['month'];
26
+ $day = $defaults['day'];
27
+ $hour = $defaults['hour'];
28
+ $minute = $defaults['minute'];
29
+ $enabled = 'false';
30
+ $categories = '';
31
 
32
+ // Values for Quick Edit
33
+ if ($ed) {
34
+ $enabled = 'true';
35
+ $date = gmdate('Y-m-d H:i:s', $ed);
36
+ $year = get_date_from_gmt($date, 'Y');
37
+ $month = get_date_from_gmt($date, 'm');
38
+ $day = get_date_from_gmt($date, 'd');
39
+ $hour = get_date_from_gmt($date, 'H');
40
+ $minute = get_date_from_gmt($date, 'i');
41
+ if (isset($attributes['expireType'])) {
42
+ $expireType = $attributes['expireType'];
43
+ }
44
+ if (
45
+ isset($attributes['category'])
46
+ && ! empty($attributes['category']) && in_array($expireType, array(
47
+ 'category',
48
+ 'category-add',
49
+ 'category-remove'
50
+ ), true)) {
51
+ $categories = implode(',', $attributes['category']);
52
+ }
53
+ }
54
 
55
+ // the hidden fields will be used by quick edit
56
 
57
+ ?>
58
+ <?php
59
+ echo esc_html($display); ?>
60
+ <span id="expirationdate_year-<?php echo $id; ?>" style="display: none;"><?php echo $year; ?></span>
61
+ <span id="expirationdate_month-<?php echo $id; ?>" style="display: none;"><?php echo $month; ?></span>
62
+ <span id="expirationdate_day-<?php echo $id; ?>" style="display: none;"><?php echo $day; ?></span>
63
+ <span id="expirationdate_hour-<?php echo $id; ?>" style="display: none;"><?php echo $hour; ?></span>
64
+ <span id="expirationdate_minute-<?php echo $id; ?>" style="display: none;"><?php echo $minute; ?></span>
65
+ <span id="expirationdate_enabled-<?php echo $id; ?>" style="display: none;"><?php echo $enabled; ?></span>
66
+ <span id="expirationdate_expireType-<?php echo $id; ?>" style="display: none;"><?php echo $expireType; ?></span>
67
+ <span id="expirationdate_categories-<?php echo $id; ?>" style="display: none;"><?php echo $categories; ?></span>
68
  </div>
views/how-to-expire.php CHANGED
@@ -1,35 +1,56 @@
1
  <?php
 
2
  // @TODO remove extract
3
- // phpcs:ignore WordPress.PHP.DontExtract.extract_extract
4
- extract( $opts );
5
 
6
- if ( ! isset( $name ) ) {
7
- return false;
8
  }
9
- if ( ! isset( $id ) ) {
10
- $id = $name;
11
  }
12
- if ( ! isset( $type ) ) {
13
- $type = '';
14
  }
15
 
16
  // maybe settings have not been configured
17
- if ( empty( $type ) && isset( $opts['post_type'] ) ) {
18
- $type = $opts['post_type'];
19
  }
20
 
21
- // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
22
  ?>
23
- <select name="<?php echo $name; ?>" id="<?php echo $id; ?>" class="pe-howtoexpire">
24
- <option value="draft" <?php echo $selected === 'draft' ? 'selected="selected"' : ''; ?>><?php _e( 'Draft', 'post-expirator' ); ?></option>
25
- <option value="delete" <?php echo $selected === 'delete' ? 'selected="selected"' : ''; ?>><?php _e( 'Delete', 'post-expirator' ); ?></option>
26
- <option value="trash" <?php echo $selected === 'trash' ? 'selected="selected"' : ''; ?>><?php _e( 'Trash', 'post-expirator' ); ?></option>
27
- <option value="private" <?php echo $selected === 'private' ? 'selected="selected"' : ''; ?>><?php _e( 'Private', 'post-expirator' ); ?></option>
28
- <option value="stick" <?php echo $selected === 'stick' ? 'selected="selected"' : ''; ?>><?php _e( 'Stick', 'post-expirator' ); ?></option>
29
- <option value="unstick" <?php echo $selected === 'unstick' ? 'selected="selected"' : ''; ?>><?php _e( 'Unstick', 'post-expirator' ); ?></option>
30
- <?php if ( $type !== 'page' ) { ?>
31
- <option value="category" <?php echo $selected === 'category' ? 'selected="selected"' : ''; ?>><?php _e( 'Category: Replace', 'post-expirator' ); ?></option>
32
- <option value="category-add" <?php echo $selected === 'category-add' ? 'selected="selected"' : ''; ?>><?php _e( 'Category: Add', 'post-expirator' ); ?></option>
33
- <option value="category-remove" <?php echo $selected === 'category-remove' ? 'selected="selected"' : ''; ?>><?php _e( 'Category: Remove', 'post-expirator' ); ?></option>
34
- <?php } ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  </select>
1
  <?php
2
+
3
  // @TODO remove extract
4
+ extract($opts);
 
5
 
6
+ if (! isset($name)) {
7
+ return false;
8
  }
9
+ if (! isset($id)) {
10
+ $id = $name;
11
  }
12
+ if (! isset($type)) {
13
+ $type = '';
14
  }
15
 
16
  // maybe settings have not been configured
17
+ if (empty($type) && isset($opts['post_type'])) {
18
+ $type = $opts['post_type'];
19
  }
20
 
 
21
  ?>
22
+ <select name="<?php
23
+ echo $name; ?>" id="<?php
24
+ echo $id; ?>" class="pe-howtoexpire">
25
+ <option value="draft" <?php
26
+ echo $selected === 'draft' ? 'selected="selected"' : ''; ?>><?php
27
+ _e('Draft', 'post-expirator'); ?></option>
28
+ <option value="delete" <?php
29
+ echo $selected === 'delete' ? 'selected="selected"' : ''; ?>><?php
30
+ _e('Delete', 'post-expirator'); ?></option>
31
+ <option value="trash" <?php
32
+ echo $selected === 'trash' ? 'selected="selected"' : ''; ?>><?php
33
+ _e('Trash', 'post-expirator'); ?></option>
34
+ <option value="private" <?php
35
+ echo $selected === 'private' ? 'selected="selected"' : ''; ?>><?php
36
+ _e('Private', 'post-expirator'); ?></option>
37
+ <option value="stick" <?php
38
+ echo $selected === 'stick' ? 'selected="selected"' : ''; ?>><?php
39
+ _e('Stick', 'post-expirator'); ?></option>
40
+ <option value="unstick" <?php
41
+ echo $selected === 'unstick' ? 'selected="selected"' : ''; ?>><?php
42
+ _e('Unstick', 'post-expirator'); ?></option>
43
+ <?php
44
+ if ($type !== 'page') { ?>
45
+ <option value="category" <?php
46
+ echo $selected === 'category' ? 'selected="selected"' : ''; ?>><?php
47
+ _e('Category: Replace', 'post-expirator'); ?></option>
48
+ <option value="category-add" <?php
49
+ echo $selected === 'category-add' ? 'selected="selected"' : ''; ?>><?php
50
+ _e('Category: Add', 'post-expirator'); ?></option>
51
+ <option value="category-remove" <?php
52
+ echo $selected === 'category-remove' ? 'selected="selected"' : ''; ?>><?php
53
+ _e('Category: Remove', 'post-expirator'); ?></option>
54
+ <?php
55
+ } ?>
56
  </select>
views/menu-defaults.php CHANGED
@@ -1,168 +1,252 @@
1
  <form method="post">
2
- <?php wp_nonce_field( 'postexpirator_menu_defaults', '_postExpiratorMenuDefaults_nonce' ); ?>
3
- <h3><?php _e( 'Default Expiration Values', 'post-expirator' ); ?></h3>
 
 
4
 
5
- <p><?php _e( 'Use the values below to set the default actions/values to be used for each for the corresponding post types. These values can all be overwritten when creating/editing the post/page.', 'post-expirator' ); ?></p>
 
 
 
 
6
 
7
- <?php
8
- foreach ( $types as $type ) {
9
- $post_type_object = get_post_type_object( $type );
10
- echo '<fieldset>';
11
- echo "<legend>&nbsp;{$post_type_object->labels->singular_name}&nbsp;</legend>";
12
- $defaults = get_option( 'expirationdateDefaults' . ucfirst( $type ) );
13
 
14
- // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
15
- if ( isset( $defaults['autoEnable'] ) && $defaults['autoEnable'] == 1 ) {
16
- $expiredautoenabled = 'checked = "checked"';
17
- $expiredautodisabled = '';
18
- } else {
19
- $expiredautoenabled = '';
20
- $expiredautodisabled = 'checked = "checked"';
21
- }
22
 
23
- $expiredactivemetaenabled = '';
24
- $expiredactivemetadisabled = 'checked = "checked"';
25
 
26
- // if settings are not configured, show the metabox by default only for posts and pages
27
- if ( ! isset( $defaults['activeMetaBox'] ) && in_array( $type, array( 'post', 'page' ), true ) ) {
28
- $expiredactivemetaenabled = 'checked = "checked"';
29
- $expiredactivemetadisabled = '';
30
- } elseif ( isset( $defaults['activeMetaBox'] ) ) {
31
- if ( $defaults['activeMetaBox'] === 'inactive' ) {
32
- $expiredactivemetaenabled = '';
33
- $expiredactivemetadisabled = 'checked = "checked"';
34
- } else {
35
- $expiredactivemetadisabled = '';
36
- $expiredactivemetaenabled = 'checked = "checked"';
37
- }
38
- }
39
- if ( ! isset( $defaults['taxonomy'] ) ) {
40
- $defaults['taxonomy'] = false;
41
- }
42
- if ( ! isset( $defaults['emailnotification'] ) ) {
43
- $defaults['emailnotification'] = '';
44
- }
45
- if ( ! isset( $defaults['default-expire-type'] ) ) {
46
- $defaults['default-expire-type'] = '';
47
- }
48
- ?>
49
- <table class="form-table">
50
- <tr valign="top">
51
- <th scope="row"><label
52
- for="expirationdate_activemeta-<?php echo $type; ?>"><?php _e( 'Active', 'post-expirator' ); ?></label>
53
- </th>
54
- <td>
55
- <input type="radio" name="expirationdate_activemeta-<?php echo $type; ?>"
56
- id="expirationdate_activemeta-true-<?php echo $type; ?>"
57
- value="active" <?php echo $expiredactivemetaenabled; ?>/> <label
58
- for="expirationdate_activemeta-true-<?php echo $type; ?>"><?php _e( 'Active', 'post-expirator' ); ?></label>
59
- &nbsp;&nbsp;
60
- <input type="radio" name="expirationdate_activemeta-<?php echo $type; ?>"
61
- id="expirationdate_activemeta-false-<?php echo $type; ?>"
62
- value="inactive" <?php echo $expiredactivemetadisabled; ?>/> <label
63
- for="expirationdate_activemeta-false-<?php echo $type; ?>"><?php _e( 'Inactive', 'post-expirator' ); ?></label>
64
- <p class="description"><?php _e( 'Select whether the post expirator meta box is active for this post type.', 'post-expirator' ); ?></p>
65
- </td>
66
- </tr>
67
- <tr valign="top">
68
- <th scope="row"><label
69
- for="expirationdate_expiretype-<?php echo $type; ?>"><?php _e( 'How to expire', 'post-expirator' ); ?></label>
70
- </th>
71
- <td>
72
- <?php _postexpirator_expire_type( array( 'name' => 'expirationdate_expiretype-' . $type,
73
- 'selected' => ( isset( $defaults['expireType'] ) ? $defaults['expireType'] : '' )
74
- ) ); ?>
75
- <p class="description"><?php _e( 'Select the default expire action for the post type.', 'post-expirator' ); ?></p>
76
- </td>
77
- </tr>
78
- <tr valign="top">
79
- <th scope="row"><label
80
- for="expirationdate_autoenable-<?php echo $type; ?>"><?php _e( 'Auto-Enable?', 'post-expirator' ); ?></label>
81
- </th>
82
- <td>
83
- <input type="radio" name="expirationdate_autoenable-<?php echo $type; ?>"
84
- id="expirationdate_autoenable-true-<?php echo $type; ?>"
85
- value="1" <?php echo $expiredautoenabled; ?>/> <label
86
- for="expirationdate_autoenable-true-<?php echo $type; ?>"><?php _e( 'Enabled', 'post-expirator' ); ?></label>
87
- &nbsp;&nbsp;
88
- <input type="radio" name="expirationdate_autoenable-<?php echo $type; ?>"
89
- id="expirationdate_autoenable-false-<?php echo $type; ?>"
90
- value="0" <?php echo $expiredautodisabled; ?>/> <label
91
- for="expirationdate_autoenable-false-<?php echo $type; ?>"><?php _e( 'Disabled', 'post-expirator' ); ?></label>
92
- <p class="description"><?php _e( 'Select whether the post expirator is enabled for all new posts.', 'post-expirator' ); ?></p>
93
- </td>
94
- </tr>
95
- <tr valign="top">
96
- <th scope="row"><label
97
- for="expirationdate_taxonomy-<?php echo $type; ?>"><?php _e( 'Taxonomy (hierarchical)', 'post-expirator' ); ?></label>
98
- </th>
99
- <td>
100
- <?php echo _postexpirator_taxonomy( array( 'type' => $type,
101
- 'name' => 'expirationdate_taxonomy-' . $type,
102
- 'selected' => $defaults['taxonomy']
103
- ) ); ?>
104
- </td>
105
- </tr>
106
- <tr valign="top">
107
- <th scope="row"><label
108
- for="expirationdate_emailnotification-<?php echo $type; ?>"><?php _e( 'Who to notify', 'post-expirator' ); ?></label>
109
- </th>
110
- <td>
111
- <input class="large-text" type="text" name="expirationdate_emailnotification-<?php echo $type; ?>"
112
- id="expirationdate_emailnotification-<?php echo $type; ?>"
113
- value="<?php echo $defaults['emailnotification']; ?>"/>
114
- <p class="description"><?php _e( 'Enter a comma separate list of emails that you would like to be notified when the post expires.', 'post-expirator' ); ?></p>
115
- </td>
116
- </tr>
117
- <?php
118
- $values = array(
119
- '' => __( 'None', 'post-expirator' ),
120
- 'inherit' => __( 'Inherit from General Settings', 'post-expirator' ),
121
- 'custom' => __( 'Custom', 'post-expirator' ),
122
- 'publish' => __( 'Publish Time', 'post-expirator' ),
123
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
 
125
- $show = 'none';
126
- $customDate = '';
127
- if ( $defaults['default-expire-type'] === 'custom' ) {
128
- $show = 'block';
129
- $customDate = $defaults['default-custom-date'];
130
- }
131
 
132
- ?>
133
 
134
- <tr valign="top">
135
- <th scope="row"><label
136
- for="expired-default-date-<?php echo $type; ?>"><?php _e( 'Default Date/Time Duration', 'post-expirator' ); ?></label>
137
- </th>
138
- <td>
139
- <select name="expired-default-date-<?php echo $type; ?>"
140
- id="expired-default-date-<?php echo $type; ?>" class="pe-custom-date-toggle">
141
- <?php foreach ( $values as $value => $label ) { ?>
142
- <option value="<?php echo $value; ?>" <?php selected( $value, $defaults['default-expire-type'] ); ?>><?php echo $label; ?></option>
143
- <?php } ?>
144
- </select>
145
- <p class="description"><?php _e( 'Set the default expiration date to be used when creating a new post of this type.' ); ?></p>
146
- <div id="expired-custom-container-<?php echo $type; ?>" class="pe-custom-date-container"
147
- style="display: <?php echo $show; ?>;">
148
- <br/>
149
- <label for="expired-custom-date-<?php echo $type; ?>"><?php _e( 'Custom', 'post-expirator' ); ?>
150
- :</label>
151
- <input type="text" value="<?php echo $customDate; ?>"
152
- name="expired-custom-date-<?php echo $type; ?>"
153
- id="expired-custom-date-<?php echo $type; ?>"/>
154
- <p class="description"><?php echo sprintf( __( 'Set the custom value to use for the default expiration date. For information on formatting, see %1$s. For example, you could enter %2$s+1 month%3$s or %4$s+1 week 2 days 4 hours 2 seconds%5$s or %6$snext Thursday%7$s.', 'post-expirator' ), '<a href="http://php.net/manual/en/function.strtotime.php" target="_new">PHP strtotime function</a>', '<code>', '</code>', '<code>', '</code>', '<code>', '</code>' ); ?></p>
155
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
 
157
- </td>
158
- </tr>
159
- </table>
160
- </fieldset>
161
- <?php
162
- }
163
- ?>
164
- <p class="submit">
165
- <input type="submit" name="expirationdateSaveDefaults" class="button-primary"
166
- value="<?php _e( 'Save Changes', 'post-expirator' ); ?>"/>
167
- </p>
 
168
  </form>
1
  <form method="post">
2
+ <?php
3
+ wp_nonce_field('postexpirator_menu_defaults', '_postExpiratorMenuDefaults_nonce'); ?>
4
+ <h3><?php
5
+ _e('Default Expiration Values', 'post-expirator'); ?></h3>
6
 
7
+ <p><?php
8
+ _e(
9
+ 'Use the values below to set the default actions/values to be used for each for the corresponding post types. These values can all be overwritten when creating/editing the post/page.',
10
+ 'post-expirator'
11
+ ); ?></p>
12
 
13
+ <?php
14
+ foreach ($types as $type) {
15
+ $post_type_object = get_post_type_object($type);
16
+ echo '<fieldset>';
17
+ echo "<legend>&nbsp;{$post_type_object->labels->singular_name}&nbsp;</legend>";
18
+ $defaults = get_option('expirationdateDefaults' . ucfirst($type));
19
 
20
+ // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
21
+ if (isset($defaults['autoEnable']) && $defaults['autoEnable'] == 1) {
22
+ $expiredautoenabled = 'checked = "checked"';
23
+ $expiredautodisabled = '';
24
+ } else {
25
+ $expiredautoenabled = '';
26
+ $expiredautodisabled = 'checked = "checked"';
27
+ }
28
 
29
+ $expiredactivemetaenabled = '';
30
+ $expiredactivemetadisabled = 'checked = "checked"';
31
 
32
+ // if settings are not configured, show the metabox by default only for posts and pages
33
+ if (! isset($defaults['activeMetaBox']) && in_array($type, array('post', 'page'), true)) {
34
+ $expiredactivemetaenabled = 'checked = "checked"';
35
+ $expiredactivemetadisabled = '';
36
+ } elseif (isset($defaults['activeMetaBox'])) {
37
+ if ($defaults['activeMetaBox'] === 'inactive') {
38
+ $expiredactivemetaenabled = '';
39
+ $expiredactivemetadisabled = 'checked = "checked"';
40
+ } else {
41
+ $expiredactivemetadisabled = '';
42
+ $expiredactivemetaenabled = 'checked = "checked"';
43
+ }
44
+ }
45
+ if (! isset($defaults['taxonomy'])) {
46
+ $defaults['taxonomy'] = false;
47
+ }
48
+ if (! isset($defaults['emailnotification'])) {
49
+ $defaults['emailnotification'] = '';
50
+ }
51
+ if (! isset($defaults['default-expire-type'])) {
52
+ $defaults['default-expire-type'] = '';
53
+ }
54
+ ?>
55
+ <table class="form-table">
56
+ <tr valign="top">
57
+ <th scope="row"><label
58
+ for="expirationdate_activemeta-<?php
59
+ echo $type; ?>"><?php
60
+ _e('Active', 'post-expirator'); ?></label>
61
+ </th>
62
+ <td>
63
+ <input type="radio" name="expirationdate_activemeta-<?php
64
+ echo $type; ?>"
65
+ id="expirationdate_activemeta-true-<?php
66
+ echo $type; ?>"
67
+ value="active" <?php
68
+ echo $expiredactivemetaenabled; ?>/> <label
69
+ for="expirationdate_activemeta-true-<?php
70
+ echo $type; ?>"><?php
71
+ _e('Active', 'post-expirator'); ?></label>
72
+ &nbsp;&nbsp;
73
+ <input type="radio" name="expirationdate_activemeta-<?php
74
+ echo $type; ?>"
75
+ id="expirationdate_activemeta-false-<?php
76
+ echo $type; ?>"
77
+ value="inactive" <?php
78
+ echo $expiredactivemetadisabled; ?>/> <label
79
+ for="expirationdate_activemeta-false-<?php
80
+ echo $type; ?>"><?php
81
+ _e('Inactive', 'post-expirator'); ?></label>
82
+ <p class="description"><?php
83
+ _e(
84
+ 'Select whether the post expirator meta box is active for this post type.',
85
+ 'post-expirator'
86
+ ); ?></p>
87
+ </td>
88
+ </tr>
89
+ <tr valign="top">
90
+ <th scope="row"><label
91
+ for="expirationdate_expiretype-<?php
92
+ echo $type; ?>"><?php
93
+ _e('How to expire', 'post-expirator'); ?></label>
94
+ </th>
95
+ <td>
96
+ <?php
97
+ _postexpirator_expire_type(array(
98
+ 'name' => 'expirationdate_expiretype-' . $type,
99
+ 'selected' => (isset($defaults['expireType']) ? $defaults['expireType'] : '')
100
+ )); ?>
101
+ <p class="description"><?php
102
+ _e('Select the default expire action for the post type.', 'post-expirator'); ?></p>
103
+ </td>
104
+ </tr>
105
+ <tr valign="top">
106
+ <th scope="row"><label
107
+ for="expirationdate_autoenable-<?php
108
+ echo $type; ?>"><?php
109
+ _e('Auto-Enable?', 'post-expirator'); ?></label>
110
+ </th>
111
+ <td>
112
+ <input type="radio" name="expirationdate_autoenable-<?php
113
+ echo $type; ?>"
114
+ id="expirationdate_autoenable-true-<?php
115
+ echo $type; ?>"
116
+ value="1" <?php
117
+ echo $expiredautoenabled; ?>/> <label
118
+ for="expirationdate_autoenable-true-<?php
119
+ echo $type; ?>"><?php
120
+ _e('Enabled', 'post-expirator'); ?></label>
121
+ &nbsp;&nbsp;
122
+ <input type="radio" name="expirationdate_autoenable-<?php
123
+ echo $type; ?>"
124
+ id="expirationdate_autoenable-false-<?php
125
+ echo $type; ?>"
126
+ value="0" <?php
127
+ echo $expiredautodisabled; ?>/> <label
128
+ for="expirationdate_autoenable-false-<?php
129
+ echo $type; ?>"><?php
130
+ _e('Disabled', 'post-expirator'); ?></label>
131
+ <p class="description"><?php
132
+ _e('Select whether the post expirator is enabled for all new posts.', 'post-expirator'); ?></p>
133
+ </td>
134
+ </tr>
135
+ <tr valign="top">
136
+ <th scope="row"><label
137
+ for="expirationdate_taxonomy-<?php
138
+ echo $type; ?>"><?php
139
+ _e('Taxonomy (hierarchical)', 'post-expirator'); ?></label>
140
+ </th>
141
+ <td>
142
+ <?php
143
+ echo _postexpirator_taxonomy(array(
144
+ 'type' => $type,
145
+ 'name' => 'expirationdate_taxonomy-' . $type,
146
+ 'selected' => $defaults['taxonomy']
147
+ )); ?>
148
+ </td>
149
+ </tr>
150
+ <tr valign="top">
151
+ <th scope="row"><label
152
+ for="expirationdate_emailnotification-<?php
153
+ echo $type; ?>"><?php
154
+ _e('Who to notify', 'post-expirator'); ?></label>
155
+ </th>
156
+ <td>
157
+ <input class="large-text" type="text" name="expirationdate_emailnotification-<?php
158
+ echo $type; ?>"
159
+ id="expirationdate_emailnotification-<?php
160
+ echo $type; ?>"
161
+ value="<?php
162
+ echo $defaults['emailnotification']; ?>"/>
163
+ <p class="description"><?php
164
+ _e(
165
+ 'Enter a comma separate list of emails that you would like to be notified when the post expires.',
166
+ 'post-expirator'
167
+ ); ?></p>
168
+ </td>
169
+ </tr>
170
+ <?php
171
+ $values = array(
172
+ '' => __('None', 'post-expirator'),
173
+ 'inherit' => __('Inherit from General Settings', 'post-expirator'),
174
+ 'custom' => __('Custom', 'post-expirator'),
175
+ 'publish' => __('Publish Time', 'post-expirator'),
176
+ );
177
 
178
+ $show = 'none';
179
+ $customDate = '';
180
+ if ($defaults['default-expire-type'] === 'custom') {
181
+ $show = 'block';
182
+ $customDate = $defaults['default-custom-date'];
183
+ }
184
 
185
+ ?>
186
 
187
+ <tr valign="top">
188
+ <th scope="row"><label
189
+ for="expired-default-date-<?php
190
+ echo $type; ?>"><?php
191
+ _e('Default Date/Time Duration', 'post-expirator'); ?></label>
192
+ </th>
193
+ <td>
194
+ <select name="expired-default-date-<?php
195
+ echo $type; ?>"
196
+ id="expired-default-date-<?php
197
+ echo $type; ?>" class="pe-custom-date-toggle">
198
+ <?php
199
+ foreach ($values as $value => $label) { ?>
200
+ <option value="<?php
201
+ echo $value; ?>" <?php
202
+ selected($value, $defaults['default-expire-type']); ?>><?php
203
+ echo $label; ?></option>
204
+ <?php
205
+ } ?>
206
+ </select>
207
+ <p class="description"><?php
208
+ _e('Set the default expiration date to be used when creating a new post of this type.'); ?></p>
209
+ <div id="expired-custom-container-<?php
210
+ echo $type; ?>" class="pe-custom-date-container"
211
+ style="display: <?php
212
+ echo $show; ?>;">
213
+ <br/>
214
+ <label for="expired-custom-date-<?php
215
+ echo $type; ?>"><?php
216
+ _e('Custom', 'post-expirator'); ?>
217
+ :</label>
218
+ <input type="text" value="<?php
219
+ echo $customDate; ?>"
220
+ name="expired-custom-date-<?php
221
+ echo $type; ?>"
222
+ id="expired-custom-date-<?php
223
+ echo $type; ?>"/>
224
+ <p class="description"><?php
225
+ echo sprintf(
226
+ __(
227
+ 'Set the custom value to use for the default expiration date. For information on formatting, see %1$s. For example, you could enter %2$s+1 month%3$s or %4$s+1 week 2 days 4 hours 2 seconds%5$s or %6$snext Thursday%7$s.',
228
+ 'post-expirator'
229
+ ),
230
+ '<a href="http://php.net/manual/en/function.strtotime.php" target="_new">PHP strtotime function</a>',
231
+ '<code>',
232
+ '</code>',
233
+ '<code>',
234
+ '</code>',
235
+ '<code>',
236
+ '</code>'
237
+ ); ?></p>
238
+ </div>
239
 
240
+ </td>
241
+ </tr>
242
+ </table>
243
+ </fieldset>
244
+ <?php
245
+ }
246
+ ?>
247
+ <p class="submit">
248
+ <input type="submit" name="expirationdateSaveDefaults" class="button-primary"
249
+ value="<?php
250
+ _e('Save Changes', 'post-expirator'); ?>"/>
251
+ </p>
252
  </form>
views/menu-diagnostics.php CHANGED
@@ -1,92 +1,131 @@
1
  <form method="post" id="postExpiratorMenuUpgrade">
2
- <?php wp_nonce_field( 'postexpirator_menu_diagnostics', '_postExpiratorMenuDiagnostics_nonce' ); ?>
3
- <h3><?php _e( 'Advanced Diagnostics', 'post-expirator' ); ?></h3>
4
- <table class="form-table">
5
- <tr valign="top">
6
- <th scope="row"><label for="postexpirator-log"><?php _e( 'Debug Logging', 'post-expirator' ); ?></label>
7
- </th>
8
- <td>
9
- <?php
10
- if ( POSTEXPIRATOR_DEBUG ) {
11
- echo '
12
- <input type="submit" class="button" name="debugging-disable" id="debugging-disable" value="(' . __( 'Status: Enabled', 'post-expirator' ) . ') ' . __( 'Disable Debugging', 'post-expirator' ) . '" />
13
- <br/><a href="' . admin_url( 'options-general.php?page=post-expirator.php&tab=viewdebug' ) . '">' . __( 'View Debug Logs', 'post-expirator' ) . '</a>';
14
- } else {
15
- echo '<input type="submit" class="button" name="debugging-enable" id="debugging-enable" value="(' . __( 'Status: Disabled', 'post-expirator' ) . ') ' . __( 'Enable Debugging', 'post-expirator' ) . '" />';
16
- }
17
- ?>
18
- </td>
19
- </tr>
20
- <tr valign="top">
21
- <th scope="row"><?php _e( 'Purge Debug Log', 'post-expirator' ); ?></th>
22
- <td>
23
- <input type="submit" class="button" name="purge-debug" id="purge-debug"
24
- value="<?php _e( 'Purge Debug Log', 'post-expirator' ); ?>"/>
25
- </td>
26
- </tr/>
27
- <tr valign="top">
28
- <th scope="row"><?php _e( 'WP-Cron Status', 'post-expirator' ); ?></th>
29
- <td>
30
- <?php
31
- if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON === true ) {
32
- _e( 'DISABLED', 'post-expirator' );
33
- } else {
34
- _e( 'ENABLED - OK', 'post-expirator' );
35
- }
36
- ?>
37
- </td>
38
- </tr/>
39
- <tr valign="top">
40
- <th scope="row"><label for="cron-schedule"><?php _e( 'Current Cron Schedule', 'post-expirator' ); ?></label>
41
- </th>
42
- <td>
43
- <p><?php _e( 'The below table will show all currently scheduled cron events with the next run time.', 'post-expirator' ); ?></p>
 
 
 
 
44
 
45
- <div class="pe-scroll">
46
- <table cellspacing="0" class="striped">
47
- <tr>
48
- <th style="width: 30%"><?php _e( 'Date', 'post-expirator' ); ?></th>
49
- <th style="width: 30%;"><?php _e( 'Event', 'post-expirator' ); ?></th>
50
- <th style="width: 30%;"><?php _e( 'Arguments / Schedule', 'post-expirator' ); ?></th>
51
- </tr>
52
- <?php
53
- $cron = _get_cron_array();
54
- foreach ( $cron as $key => $value ) {
55
- foreach ( $value as $eventkey => $eventvalue ) {
56
- $class = $eventkey === 'postExpiratorExpire' ? 'pe-event' : '';
57
- print '<tr class="' . $class . '">';
58
- print '<td>' . date_i18n( 'r', $key ) . '</td>';
59
- print '<td>' . $eventkey . '</td>';
60
- $arrkey = array_keys( $eventvalue );
61
- print '<td>';
62
- foreach ( $arrkey as $eventguid ) {
63
- print '<table><tr>';
64
- if ( empty( $eventvalue[ $eventguid ]['args'] ) ) {
65
- print '<td>' . __( 'No Arguments', 'post-expirator' ) . '</td>';
66
- } else {
67
- print '<td>';
68
- $args = array();
69
- foreach ( $eventvalue[ $eventguid ]['args'] as $key => $value ) {
70
- $args[] = "$key => $value";
71
- }
72
- print implode( "<br/>\n", $args );
73
- print '</td>';
74
- }
75
- if ( empty( $eventvalue[ $eventguid ]['schedule'] ) ) {
76
- print '<td>' . __( 'Single Event', 'post-expirator' ) . '</td>';
77
- } else {
78
- print '<td>' . $eventvalue[ $eventguid ]['schedule'] . ' (' . $eventvalue[ $eventguid ]['interval'] . ')</td>';
79
- }
80
- print '</tr></table>';
81
- }
82
- print '</td>';
83
- print '</tr>';
84
- }
85
- }
86
- ?>
87
- </table>
88
- </div>
89
- </td>
90
- </tr>
91
- </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  </form>
 
1
  <form method="post" id="postExpiratorMenuUpgrade">
2
+ <?php
3
+ wp_nonce_field('postexpirator_menu_diagnostics', '_postExpiratorMenuDiagnostics_nonce'); ?>
4
+ <h3><?php _e('Advanced Diagnostics', 'post-expirator'); ?></h3>
5
+ <table class="form-table">
6
+ <tr>
7
+ <th scope="row">
8
+ <label for="postexpirator-log"><?php _e('Debug Logging', 'post-expirator'); ?></label>
9
+ </th>
10
+ <td>
11
+ <?php if (defined('POSTEXPIRATOR_DEBUG') && POSTEXPIRATOR_DEBUG) : ?>
12
+ <i class="dashicons dashicons-yes-alt pe-status pe-status-enabled"></i> <span><?php _e('Enabled', 'post-expirator'); ?></span>
13
+ <?php echo '<input type="submit" class="button" name="debugging-disable" id="debugging-disable" value="' . __('Disable Debugging', 'post-expirator') . '" />'; ?>
14
+ <?php echo '<a href="' . admin_url('options-general.php?page=post-expirator.php&tab=viewdebug') . '">' . __('View Debug Logs', 'post-expirator') . '</a>'; ?>
15
+ <?php else: ?>
16
+ <i class="dashicons dashicons-no-alt pe-status pe-status-disabled"></i> <span><?php _e('Disabled', 'post-expirator'); ?></span>
17
+ <?php echo '<input type="submit" class="button" name="debugging-enable" id="debugging-enable" value="' . __('Enable Debugging', 'post-expirator') . '" />'; ?>
18
+ <?php endif; ?>
19
+ </td>
20
+ </tr>
21
+ <tr>
22
+ <th scope="row"><?php _e('Purge Debug Log', 'post-expirator'); ?></th>
23
+ <td>
24
+ <input type="submit"
25
+ class="button"
26
+ name="purge-debug"
27
+ id="purge-debug"
28
+ value="<?php _e('Purge Debug Log', 'post-expirator'); ?>"/>
29
+ </td>
30
+ </tr>
31
+ <tr>
32
+ <th scope="row"><?php _e('WP-Cron Status', 'post-expirator'); ?></th>
33
+ <td>
34
+ <?php if (PostExpirator_CronFacade::is_cron_enabled()) : ?>
35
+ <i class="dashicons dashicons-yes pe-status pe-status-enabled"></i> <span><?php _e('Enabled', 'post-expirator'); ?></span>
36
+ <?php else: ?>
37
+ <i class="dashicons dashicons-no pe-status pe-status-disabled"></i> <span><?php _e('Disabled', 'post-expirator'); ?></span>
38
+ <?php endif; ?>
39
+ </td>
40
+ </tr/>
41
+ <tr>
42
+ <th scope="row">
43
+ <label for="cron-schedule"><?php _e('Current Cron Schedule', 'post-expirator'); ?></label>
44
+ </th>
45
+ <td>
46
+ <?php
47
+ $cron = PostExpirator_CronFacade::get_plugin_cron_events();
48
 
49
+ if (empty($cron)) {
50
+ ?>
51
+ <p><?php _e('No cron events found for the plugin.', 'post-expirator'); ?></p>
52
+ <?php
53
+ } else {
54
+ ?>
55
+ <p><?php
56
+ _e(
57
+ 'The below table will show all currently scheduled cron events for the plugin with the next run time.',
58
+ 'post-expirator'
59
+ ); ?></p>
60
+
61
+ <div class="pe-scroll">
62
+ <table class="striped">
63
+ <tr>
64
+ <th><?php _e('Date', 'post-expirator'); ?></th>
65
+ <th><?php _e('Event', 'post-expirator'); ?></th>
66
+ <th><?php _e('Arguments / Schedule', 'post-expirator'); ?></th>
67
+ <th><?php _e('Post', 'post-expirator'); ?></th>
68
+ </tr>
69
+ <?php
70
+ foreach ($cron as $time => $value) {
71
+ foreach ($value as $eventkey => $eventvalue) {
72
+ echo '<tr class="pe-event">';
73
+ echo '<td>' . date_i18n('r', $time) . '</td>';
74
+ echo '<td>' . $eventkey . '</td>';
75
+ $arrkey = array_keys($eventvalue);
76
+ $firstArgsUid = null;
77
+ echo '<td>';
78
+ foreach ($arrkey as $eventguid) {
79
+ if (is_null($firstArgsUid)) {
80
+ $firstArgsUid = $eventguid;
81
+ }
82
+
83
+ if (empty($eventvalue[$eventguid]['args'])) {
84
+ echo '<div>' . __('No Arguments', 'post-expirator') . '</div>';
85
+ } else {
86
+ echo '<div>';
87
+ $args = array();
88
+ foreach ($eventvalue[$eventguid]['args'] as $key => $value) {
89
+ $args[] = "$key => $value";
90
+ }
91
+ echo implode("<br/>\n", $args);
92
+ echo '</div>';
93
+ }
94
+ }
95
+
96
+ echo '&nbsp;/&nbsp;';
97
+ if (empty($eventvalue[$eventguid]['schedule'])) {
98
+ echo __('Single Event', 'post-expirator');
99
+ } else {
100
+ echo $eventvalue[$eventguid]['schedule'] . ' (' . $eventvalue[$eventguid]['interval'] . ')';
101
+ }
102
+ echo '</td>';
103
+
104
+ echo '<td>';
105
+ if (
106
+ isset($eventvalue[$firstArgsUid])
107
+ && isset($eventvalue[$firstArgsUid]['args'])
108
+ && isset($eventvalue[$firstArgsUid]['args'][0])
109
+ && ! empty($eventvalue[$firstArgsUid]['args'][0])
110
+ ) {
111
+ $post = get_post((int)$eventvalue[$firstArgsUid]['args'][0]);
112
+
113
+ if (! empty($post) && ! is_wp_error($post) && is_object($post)) {
114
+ echo "{$post->ID}: {$post->post_title} ({$post->post_status})";
115
+ }
116
+ }
117
+ echo '</td>';
118
+ echo '</tr>';
119
+ }
120
+ }
121
+ ?>
122
+ </table>
123
+ </div>
124
+ <?php
125
+ }
126
+ ?>
127
+ </td>
128
+ </tr>
129
+ </table>
130
  </form>
131
+ <?php
views/menu-general.php CHANGED
@@ -1,270 +1,433 @@
1
  <?php
2
- // phpcs:disable WordPress.NamingConventions.ValidVariableName.InterpolatedVariableNotSnakeCase
3
- // phpcs:disable WordPress.PHP.StrictComparisons.LooseComparison
4
 
5
  // Get Option
6
- $expirationdateDefaultDateFormat = get_option( 'expirationdateDefaultDateFormat', POSTEXPIRATOR_DATEFORMAT );
7
- $expirationdateDefaultTimeFormat = get_option( 'expirationdateDefaultTimeFormat', POSTEXPIRATOR_TIMEFORMAT );
8
- $expireddisplayfooter = get_option( 'expirationdateDisplayFooter', POSTEXPIRATOR_FOOTERDISPLAY );
9
- $expiredemailnotification = get_option( 'expirationdateEmailNotification', POSTEXPIRATOR_EMAILNOTIFICATION );
10
- $expiredemailnotificationadmins = get_option( 'expirationdateEmailNotificationAdmins', POSTEXPIRATOR_EMAILNOTIFICATIONADMINS );
11
- $expiredemailnotificationlist = get_option( 'expirationdateEmailNotificationList', '' );
12
- $expirationdateFooterContents = get_option( 'expirationdateFooterContents', POSTEXPIRATOR_FOOTERCONTENTS );
13
- $expirationdateFooterStyle = get_option( 'expirationdateFooterStyle', POSTEXPIRATOR_FOOTERSTYLE );
14
- $expirationdateDefaultDate = get_option( 'expirationdateDefaultDate', POSTEXPIRATOR_EXPIREDEFAULT );
15
- $expirationdateDefaultDateCustom = get_option( 'expirationdateDefaultDateCustom' );
 
 
 
16
 
17
- $categories = get_option( 'expirationdateCategoryDefaults' );
18
 
19
- $expireddisplayfooterenabled = '';
20
  $expireddisplayfooterdisabled = '';
21
- if ( $expireddisplayfooter == 0 ) {
22
- $expireddisplayfooterdisabled = 'checked="checked"';
23
- } elseif ( $expireddisplayfooter == 1 ) {
24
- $expireddisplayfooterenabled = 'checked="checked"';
25
  }
26
 
27
- $expiredemailnotificationenabled = '';
28
  $expiredemailnotificationdisabled = '';
29
- if ( $expiredemailnotification == 0 ) {
30
- $expiredemailnotificationdisabled = 'checked="checked"';
31
- } elseif ( $expiredemailnotification == 1 ) {
32
- $expiredemailnotificationenabled = 'checked="checked"';
33
  }
34
 
35
- $expiredemailnotificationadminsenabled = '';
36
  $expiredemailnotificationadminsdisabled = '';
37
- if ( $expiredemailnotificationadmins == 0 ) {
38
- $expiredemailnotificationadminsdisabled = 'checked="checked"';
39
- } elseif ( $expiredemailnotificationadmins == 1 ) {
40
- $expiredemailnotificationadminsenabled = 'checked="checked"';
41
  }
42
 
43
- $user_roles = wp_roles()->get_names();
44
  $plugin_facade = PostExpirator_Facade::getInstance();
45
  ?>
46
- <p><?php _e( 'The post expirator plugin sets a custom meta value, and then optionally allows you to select if you want the post changed to a draft status or deleted when it expires.', 'post-expirator' ); ?></p>
 
 
 
 
47
 
48
- <h3><?php _e( 'Shortcode', 'post-expirator' ); ?></h3>
49
- <p><?php echo sprintf( __( 'Valid %s attributes:', 'post-expirator' ), '<code>[postexpirator]</code>' ); ?></p>
50
- <ul class="pe-list">
51
- <li>
52
- <p><?php echo sprintf( __( '%1$s - valid options are %2$sfull%3$s (default), %4$sdate%5$s, %6$stime%7$s', 'post-expirator' ), '<code>type</code>', '<code>', '</code>', '<code>', '</code>', '<code>', '</code>' ); ?></p>
53
- </li>
54
- <li>
55
- <p><?php echo sprintf( __( '%s - format set here will override the value set on the settings page', 'post-expirator' ), '<code>dateformat</code>' ); ?></p>
56
- </li>
57
- <li>
58
- <p><?php echo sprintf( __( '%s - format set here will override the value set on the settings page', 'post-expirator' ), '<code>timeformat</code>' ); ?></p>
59
- </li>
60
- </ul>
61
- <hr/>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
 
63
- <form method="post" id="expirationdate_save_options">
64
- <?php wp_nonce_field( 'postexpirator_menu_general', '_postExpiratorMenuGeneral_nonce' ); ?>
65
- <h3><?php _e( 'Defaults', 'post-expirator' ); ?></h3>
66
- <table class="form-table">
67
- <tr valign="top">
68
- <th scope="row"><label
69
- for="expired-default-date-format"><?php _e( 'Date Format', 'post-expirator' ); ?></label>
70
- </th>
71
- <td>
72
- <input type="text" name="expired-default-date-format" id="expired-default-date-format"
73
- value="<?php echo $expirationdateDefaultDateFormat; ?>" size="25"/> <span
74
- class="description">(<?php echo date_i18n( "$expirationdateDefaultDateFormat" ); ?>)</span>
75
- <p class="description"><?php echo sprintf( __( 'The default format to use when displaying the expiration date within a post using the shortcode or within the footer. For information on valid formatting options, see: %s.', 'post-expirator' ), '<a href="http://us2.php.net/manual/en/function.date.php" target="_blank">PHP Date Function</a>' ); ?></p>
76
- </td>
77
- </tr>
78
- <tr valign="top">
79
- <th scope="row"><label
80
- for="expired-default-time-format"><?php _e( 'Time Format', 'post-expirator' ); ?></label>
81
- </th>
82
- <td>
83
- <input type="text" name="expired-default-time-format" id="expired-default-time-format"
84
- value="<?php echo $expirationdateDefaultTimeFormat; ?>" size="25"/> <span
85
- class="description">(<?php echo date_i18n( "$expirationdateDefaultTimeFormat" ); ?>)</span>
86
- <p class="description"><?php echo sprintf( __( 'The default format to use when displaying the expiration time within a post using the shortcode or within the footer. For information on valid formatting options, see: %s.', 'post-expirator' ), '<a href="http://us2.php.net/manual/en/function.date.php" target="_blank">PHP Date Function</a>' ); ?>
87
- </td>
88
- </tr>
89
- <tr valign="top">
90
- <th scope="row"><label
91
- for="expired-default-expiration-date"><?php _e( 'Default Date/Time Duration', 'post-expirator' ); ?></label>
92
- </th>
93
- <td>
94
- <select name="expired-default-expiration-date" id="expired-default-expiration-date"
95
- class="pe-custom-date-toggle">
96
- <option value="null" <?php echo ( $expirationdateDefaultDate == 'null' ) ? ' selected="selected"' : ''; ?>><?php _e( 'None', 'post-expirator' ); ?></option>
97
- <option value="custom" <?php echo ( $expirationdateDefaultDate == 'custom' ) ? ' selected="selected"' : ''; ?>><?php _e( 'Custom', 'post-expirator' ); ?></option>
98
- <option value="publish" <?php echo ( $expirationdateDefaultDate == 'publish' ) ? ' selected="selected"' : ''; ?>><?php _e( 'Post/Page Publish Time', 'post-expirator' ); ?></option>
99
- </select>
100
- <p class="description"><?php _e( 'Set the default expiration date to be used when creating new posts and pages. Defaults to none.', 'post-expirator' ); ?></p>
101
- <?php $show = ( $expirationdateDefaultDate == 'custom' ) ? 'block' : 'none'; ?>
102
- <div id="expired-custom-container" style="display: <?php echo $show; ?>;"
103
- class="pe-custom-date-container">
104
- <br/>
105
- <label for="expired-custom-expiration-date"><?php _e( 'Custom', 'post-expirator' ); ?>:</label>
106
- <input type="text" value="<?php echo $expirationdateDefaultDateCustom; ?>"
107
- name="expired-custom-expiration-date" id="expired-custom-expiration-date"/>
108
- <p class="description"><?php echo sprintf( __( 'Set the custom value to use for the default expiration date. For information on formatting, see %1$s. For example, you could enter %2$s+1 month%3$s or %4$s+1 week 2 days 4 hours 2 seconds%5$s or %6$snext Thursday%7$s.', 'post-expirator' ), '<a href="http://php.net/manual/en/function.strtotime.php" target="_new">PHP strtotime function</a>', '<code>', '</code>', '<code>', '</code>', '<code>', '</code>' ); ?></p>
109
- </div>
110
- </td>
111
- </tr>
112
- <tr valign="top">
113
- <th scope="row"><?php _e( 'Default Expiration Category', 'post-expirator' ); ?></th>
114
- <td>
115
- <?php
116
- echo '<div class="wp-tab-panel" id="post-expirator-cat-list">';
117
- echo '<ul id="categorychecklist" class="list:category categorychecklist form-no-clear">';
118
- $walker = new Walker_PostExpirator_Category_Checklist();
119
- wp_terms_checklist( 0, array(
120
- 'taxonomy' => 'category',
121
- 'walker' => $walker,
122
- 'selected_cats' => $categories,
123
- 'checked_ontop' => false
124
- ) );
125
- echo '</ul>';
126
- echo '</div>';
127
- ?>
128
- <p class="description"><?php _e( 'Sets the default expiration category for the post.', 'post-expirator' ); ?></p>
129
- </td>
130
- </tr>
131
- </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
 
133
- <h3><?php _e( 'Expiration Email Notification', 'post-expirator' ); ?></h3>
134
- <p class="description"><?php _e( 'Whenever a post expires, an email can be sent to alert users of the expiration.', 'post-expirator' ); ?></p>
135
- <table class="form-table">
136
- <tr valign="top">
137
- <th scope="row"><?php _e( 'Enable Email Notification?', 'post-expirator' ); ?></th>
138
- <td>
139
- <input type="radio" name="expired-email-notification" id="expired-email-notification-true"
140
- value="1" <?php echo $expiredemailnotificationenabled; ?>/> <label
141
- for="expired-email-notification-true"><?php _e( 'Enabled', 'post-expirator' ); ?></label>
142
- &nbsp;&nbsp;
143
- <input type="radio" name="expired-email-notification" id="expired-email-notification-false"
144
- value="0" <?php echo $expiredemailnotificationdisabled; ?>/> <label
145
- for="expired-email-notification-false"><?php _e( 'Disabled', 'post-expirator' ); ?></label>
146
- <p class="description"><?php _e( 'This will enable or disable the send of email notification on post expiration.', 'post-expirator' ); ?></p>
147
- </td>
148
- </tr>
149
- <tr valign="top">
150
- <th scope="row"><?php _e( 'Include Blog Administrators?', 'post-expirator' ); ?></th>
151
- <td>
152
- <input type="radio" name="expired-email-notification-admins"
153
- id="expired-email-notification-admins-true"
154
- value="1" <?php echo $expiredemailnotificationadminsenabled; ?>/> <label
155
- for="expired-email-notification-admins-true"><?php _e( 'Enabled', 'post-expirator' ); ?></label>
156
- &nbsp;&nbsp;
157
- <input type="radio" name="expired-email-notification-admins"
158
- id="expired-email-notification-admins-false"
159
- value="0" <?php echo $expiredemailnotificationadminsdisabled; ?>/> <label
160
- for="expired-email-notification-admins-false"><?php _e( 'Disabled', 'post-expirator' ); ?></label>
161
- <p class="description"><?php _e( 'This will include all users with the role of "Administrator" in the post expiration email.', 'post-expirator' ); ?></p>
162
- </td>
163
- </tr>
164
- <tr valign="top">
165
- <th scope="row"><label
166
- for="expired-email-notification-list"><?php _e( 'Who to notify', 'post-expirator' ); ?></label>
167
- </th>
168
- <td>
169
- <input class="large-text" type="text" name="expired-email-notification-list"
170
- id="expired-email-notification-list" value="<?php echo $expiredemailnotificationlist; ?>"/>
171
- <p class="description"><?php _e( 'Enter a comma separate list of emails that you would like to be notified when the post expires. This will be applied to ALL post types. You can set post type specific emails on the Defaults tab.', 'post-expirator' ); ?></p>
172
- </td>
173
- </tr>
174
- </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
175
 
176
- <h3><?php _e( 'Post Footer Display', 'post-expirator' ); ?></h3>
177
- <p class="description"><?php _e( 'Enabling this below will display the expiration date automatically at the end of any post which is set to expire.', 'post-expirator' ); ?></p>
178
- <table class="form-table">
179
- <tr valign="top">
180
- <th scope="row"><?php _e( 'Show in post footer?', 'post-expirator' ); ?></th>
181
- <td>
182
- <input type="radio" name="expired-display-footer" id="expired-display-footer-true"
183
- value="1" <?php echo $expireddisplayfooterenabled; ?>/> <label
184
- for="expired-display-footer-true"><?php _e( 'Enabled', 'post-expirator' ); ?></label>
185
- &nbsp;&nbsp;
186
- <input type="radio" name="expired-display-footer" id="expired-display-footer-false"
187
- value="0" <?php echo $expireddisplayfooterdisabled; ?>/> <label
188
- for="expired-display-footer-false"><?php _e( 'Disabled', 'post-expirator' ); ?></label>
189
- <p class="description"><?php _e( 'This will enable or disable displaying the post expiration date in the post footer.', 'post-expirator' ); ?></p>
190
- </td>
191
- </tr>
192
- <tr valign="top">
193
- <th scope="row"><label
194
- for="expired-footer-contents"><?php _e( 'Footer Contents', 'post-expirator' ); ?></label>
195
- </th>
196
- <td>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
197
  <textarea id="expired-footer-contents" name="expired-footer-contents" rows="3"
198
- cols="50"><?php echo $expirationdateFooterContents; ?></textarea>
199
- <p class="description"><?php _e( 'Enter the text you would like to appear at the bottom of every post that will expire. The following placeholders will be replaced with the post expiration date in the following format:', 'post-expirator' ); ?></p>
200
- <ul class="pe-list">
201
- <li><p class="description">EXPIRATIONFULL
202
- -> <?php echo date_i18n( "$expirationdateDefaultDateFormat $expirationdateDefaultTimeFormat" ); ?></p>
203
- </li>
204
- <li><p class="description">EXPIRATIONDATE
205
- -> <?php echo date_i18n( "$expirationdateDefaultDateFormat" ); ?></p></li>
206
- <li><p class="description">EXPIRATIONTIME
207
- -> <?php echo date_i18n( "$expirationdateDefaultTimeFormat" ); ?></p></li>
208
- </ul>
209
- </td>
210
- </tr>
211
- <tr valign="top">
212
- <th scope="row"><label
213
- for="expired-footer-style"><?php _e( 'Footer Style', 'post-expirator' ); ?></label></th>
214
- <td>
215
- <input type="text" name="expired-footer-style" id="expired-footer-style"
216
- value="<?php echo $expirationdateFooterStyle; ?>" size="25"/>
217
- (<span style="<?php echo $expirationdateFooterStyle; ?>"><?php _e( 'This post will expire on', 'post-expirator' ); ?><?php echo date_i18n( "$expirationdateDefaultDateFormat $expirationdateDefaultTimeFormat" ); ?></span>)
218
- <p class="description"><?php _e( 'The inline css which will be used to style the footer text.', 'post-expirator' ); ?></p>
219
- </td>
220
- </tr>
221
- </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
222
 
223
- <h3><?php _e( 'Advanced Options', 'post-expirator' ); ?></h3>
224
- <p class="description"><?php _e( 'Please do not update anything here unless you know what it entails. For advanced users only.', 'post-expirator' ); ?></p>
225
- <?php
226
- $gutenberg = get_option( 'expirationdateGutenbergSupport', 1 );
227
- ?>
228
- <table class="form-table">
229
- <tr valign="top">
230
- <th scope="row"><?php _e( 'Block Editor Support', 'post-expirator' ); ?></th>
231
- <td>
232
- <input type="radio" name="gutenberg-support" id="gutenberg-support-enabled"
233
- value="1" <?php echo intval( $gutenberg ) === 1 ? 'checked' : ''; ?>/> <label
234
- for="gutenberg-support-enabled"><?php _e( 'Show Gutenberg style box', 'post-expirator' ); ?></label>
235
- &nbsp;&nbsp;
236
- <input type="radio" name="gutenberg-support" id="gutenberg-support-disabled"
237
- value="0" <?php echo intval( $gutenberg ) === 0 ? 'checked' : ''; ?>/> <label
238
- for="gutenberg-support-disabled"><?php _e( 'Show Classic Editor style box', 'post-expirator' ); ?></label>
239
- <p class="description"><?php _e( 'Toggle between native support for the Block Editor or the backward compatible Classic Editor style metabox.', 'post-expirator' ); ?></p>
240
- </td>
241
- </tr>
242
- <tr valign="top">
243
- <th scope="row">
244
- <?php _e( 'Choose which user roles can use Post Expirator', 'post-expirator' ); ?>
245
- </th>
246
- <td class="pe-checklist">
247
- <?php foreach ( $user_roles as $role_name => $role_label ) : ?>
248
- <label for="allow-user-role-<?php echo esc_attr( $role_name ); ?>">
249
- <input type="checkbox"
250
- id="allow-user-role-<?php echo esc_attr( $role_name ); ?>"
251
- name="allow-user-roles[]"
252
- <?php if ( 'administrator' === $role_name ) : echo 'disabled="disabled"'; endif; ?>
253
- value="<?php echo esc_attr( $role_name ); ?>"
254
- <?php if ( $plugin_facade->user_role_can_expire_posts( $role_name ) ) : ?>checked="checked"<?php endif; ?>
255
- />
256
- <?php echo esc_html( $role_label ); ?>
257
- </label>
258
- <?php endforeach; ?>
259
- </td>
260
- </tr>
261
- </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
262
 
263
- <p class="submit">
264
- <input type="submit" name="expirationdateSave" class="button-primary"
265
- value="<?php _e( 'Save Changes', 'post-expirator' ); ?>"/>
266
- </p>
267
- </form>
 
268
 
269
  <?php
270
- // phpcs:enable
1
  <?php
 
 
2
 
3
  // Get Option
4
+ $expirationdateDefaultDateFormat = get_option('expirationdateDefaultDateFormat', POSTEXPIRATOR_DATEFORMAT);
5
+ $expirationdateDefaultTimeFormat = get_option('expirationdateDefaultTimeFormat', POSTEXPIRATOR_TIMEFORMAT);
6
+ $expireddisplayfooter = get_option('expirationdateDisplayFooter', POSTEXPIRATOR_FOOTERDISPLAY);
7
+ $expiredemailnotification = get_option('expirationdateEmailNotification', POSTEXPIRATOR_EMAILNOTIFICATION);
8
+ $expiredemailnotificationadmins = get_option(
9
+ 'expirationdateEmailNotificationAdmins',
10
+ POSTEXPIRATOR_EMAILNOTIFICATIONADMINS
11
+ );
12
+ $expiredemailnotificationlist = get_option('expirationdateEmailNotificationList', '');
13
+ $expirationdateFooterContents = get_option('expirationdateFooterContents', POSTEXPIRATOR_FOOTERCONTENTS);
14
+ $expirationdateFooterStyle = get_option('expirationdateFooterStyle', POSTEXPIRATOR_FOOTERSTYLE);
15
+ $expirationdateDefaultDate = get_option('expirationdateDefaultDate', POSTEXPIRATOR_EXPIREDEFAULT);
16
+ $expirationdateDefaultDateCustom = get_option('expirationdateDefaultDateCustom');
17
 
18
+ $categories = get_option('expirationdateCategoryDefaults');
19
 
20
+ $expireddisplayfooterenabled = '';
21
  $expireddisplayfooterdisabled = '';
22
+ if ($expireddisplayfooter == 0) {
23
+ $expireddisplayfooterdisabled = 'checked="checked"';
24
+ } elseif ($expireddisplayfooter == 1) {
25
+ $expireddisplayfooterenabled = 'checked="checked"';
26
  }
27
 
28
+ $expiredemailnotificationenabled = '';
29
  $expiredemailnotificationdisabled = '';
30
+ if ($expiredemailnotification == 0) {
31
+ $expiredemailnotificationdisabled = 'checked="checked"';
32
+ } elseif ($expiredemailnotification == 1) {
33
+ $expiredemailnotificationenabled = 'checked="checked"';
34
  }
35
 
36
+ $expiredemailnotificationadminsenabled = '';
37
  $expiredemailnotificationadminsdisabled = '';
38
+ if ($expiredemailnotificationadmins == 0) {
39
+ $expiredemailnotificationadminsdisabled = 'checked="checked"';
40
+ } elseif ($expiredemailnotificationadmins == 1) {
41
+ $expiredemailnotificationadminsenabled = 'checked="checked"';
42
  }
43
 
44
+ $user_roles = wp_roles()->get_names();
45
  $plugin_facade = PostExpirator_Facade::getInstance();
46
  ?>
47
+ <p><?php
48
+ _e(
49
+ 'The post expirator plugin sets a custom meta value, and then optionally allows you to select if you want the post changed to a draft status or deleted when it expires.',
50
+ 'post-expirator'
51
+ ); ?></p>
52
 
53
+ <h3><?php
54
+ _e('Shortcode', 'post-expirator'); ?></h3>
55
+ <p><?php
56
+ echo sprintf(__('Valid %s attributes:', 'post-expirator'), '<code>[postexpirator]</code>'); ?></p>
57
+ <ul class="pe-list">
58
+ <li>
59
+ <p><?php
60
+ echo sprintf(
61
+ __('%1$s - valid options are %2$sfull%3$s (default), %4$sdate%5$s, %6$stime%7$s', 'post-expirator'),
62
+ '<code>type</code>',
63
+ '<code>',
64
+ '</code>',
65
+ '<code>',
66
+ '</code>',
67
+ '<code>',
68
+ '</code>'
69
+ ); ?></p>
70
+ </li>
71
+ <li>
72
+ <p><?php
73
+ echo sprintf(
74
+ __('%s - format set here will override the value set on the settings page', 'post-expirator'),
75
+ '<code>dateformat</code>'
76
+ ); ?></p>
77
+ </li>
78
+ <li>
79
+ <p><?php
80
+ echo sprintf(
81
+ __('%s - format set here will override the value set on the settings page', 'post-expirator'),
82
+ '<code>timeformat</code>'
83
+ ); ?></p>
84
+ </li>
85
+ </ul>
86
+ <hr/>
87
 
88
+ <form method="post" id="expirationdate_save_options">
89
+ <?php
90
+ wp_nonce_field('postexpirator_menu_general', '_postExpiratorMenuGeneral_nonce'); ?>
91
+ <h3><?php
92
+ _e('Defaults', 'post-expirator'); ?></h3>
93
+ <table class="form-table">
94
+ <tr valign="top">
95
+ <th scope="row"><label
96
+ for="expired-default-date-format"><?php
97
+ _e('Date Format', 'post-expirator'); ?></label>
98
+ </th>
99
+ <td>
100
+ <input type="text" name="expired-default-date-format" id="expired-default-date-format"
101
+ value="<?php
102
+ echo $expirationdateDefaultDateFormat; ?>" size="25"/> <span
103
+ class="description">(<?php
104
+ echo date_i18n("$expirationdateDefaultDateFormat"); ?>)</span>
105
+ <p class="description"><?php
106
+ echo sprintf(
107
+ __(
108
+ 'The default format to use when displaying the expiration date within a post using the shortcode or within the footer. For information on valid formatting options, see: %s.',
109
+ 'post-expirator'
110
+ ),
111
+ '<a href="http://us2.php.net/manual/en/function.date.php" target="_blank">PHP Date Function</a>'
112
+ ); ?></p>
113
+ </td>
114
+ </tr>
115
+ <tr valign="top">
116
+ <th scope="row"><label
117
+ for="expired-default-time-format"><?php
118
+ _e('Time Format', 'post-expirator'); ?></label>
119
+ </th>
120
+ <td>
121
+ <input type="text" name="expired-default-time-format" id="expired-default-time-format"
122
+ value="<?php
123
+ echo $expirationdateDefaultTimeFormat; ?>" size="25"/> <span
124
+ class="description">(<?php
125
+ echo date_i18n("$expirationdateDefaultTimeFormat"); ?>)</span>
126
+ <p class="description"><?php
127
+ echo sprintf(
128
+ __(
129
+ 'The default format to use when displaying the expiration time within a post using the shortcode or within the footer. For information on valid formatting options, see: %s.',
130
+ 'post-expirator'
131
+ ),
132
+ '<a href="http://us2.php.net/manual/en/function.date.php" target="_blank">PHP Date Function</a>'
133
+ ); ?>
134
+ </td>
135
+ </tr>
136
+ <tr valign="top">
137
+ <th scope="row"><label
138
+ for="expired-default-expiration-date"><?php
139
+ _e('Default Date/Time Duration', 'post-expirator'); ?></label>
140
+ </th>
141
+ <td>
142
+ <select name="expired-default-expiration-date" id="expired-default-expiration-date"
143
+ class="pe-custom-date-toggle">
144
+ <option value="null" <?php
145
+ echo ($expirationdateDefaultDate == 'null') ? ' selected="selected"' : ''; ?>><?php
146
+ _e('None', 'post-expirator'); ?></option>
147
+ <option value="custom" <?php
148
+ echo ($expirationdateDefaultDate == 'custom') ? ' selected="selected"' : ''; ?>><?php
149
+ _e('Custom', 'post-expirator'); ?></option>
150
+ <option value="publish" <?php
151
+ echo ($expirationdateDefaultDate == 'publish') ? ' selected="selected"' : ''; ?>><?php
152
+ _e('Post/Page Publish Time', 'post-expirator'); ?></option>
153
+ </select>
154
+ <p class="description"><?php
155
+ _e(
156
+ 'Set the default expiration date to be used when creating new posts and pages. Defaults to none.',
157
+ 'post-expirator'
158
+ ); ?></p>
159
+ <?php
160
+ $show = ($expirationdateDefaultDate == 'custom') ? 'block' : 'none'; ?>
161
+ <div id="expired-custom-container" style="display: <?php
162
+ echo $show; ?>;"
163
+ class="pe-custom-date-container">
164
+ <br/>
165
+ <label for="expired-custom-expiration-date"><?php
166
+ _e('Custom', 'post-expirator'); ?>:</label>
167
+ <input type="text" value="<?php
168
+ echo $expirationdateDefaultDateCustom; ?>"
169
+ name="expired-custom-expiration-date" id="expired-custom-expiration-date"/>
170
+ <p class="description"><?php
171
+ echo sprintf(
172
+ __(
173
+ 'Set the custom value to use for the default expiration date. For information on formatting, see %1$s. For example, you could enter %2$s+1 month%3$s or %4$s+1 week 2 days 4 hours 2 seconds%5$s or %6$snext Thursday%7$s.',
174
+ 'post-expirator'
175
+ ),
176
+ '<a href="http://php.net/manual/en/function.strtotime.php" target="_new">PHP strtotime function</a>',
177
+ '<code>',
178
+ '</code>',
179
+ '<code>',
180
+ '</code>',
181
+ '<code>',
182
+ '</code>'
183
+ ); ?></p>
184
+ </div>
185
+ </td>
186
+ </tr>
187
+ <tr valign="top">
188
+ <th scope="row"><?php
189
+ _e('Default Expiration Category', 'post-expirator'); ?></th>
190
+ <td>
191
+ <?php
192
+ echo '<div class="wp-tab-panel" id="post-expirator-cat-list">';
193
+ echo '<ul id="categorychecklist" class="list:category categorychecklist form-no-clear">';
194
+ $walker = new Walker_PostExpirator_Category_Checklist();
195
+ wp_terms_checklist(0, array(
196
+ 'taxonomy' => 'category',
197
+ 'walker' => $walker,
198
+ 'selected_cats' => $categories,
199
+ 'checked_ontop' => false
200
+ ));
201
+ echo '</ul>';
202
+ echo '</div>';
203
+ ?>
204
+ <p class="description"><?php
205
+ _e('Sets the default expiration category for the post.', 'post-expirator'); ?></p>
206
+ </td>
207
+ </tr>
208
+ </table>
209
 
210
+ <h3><?php
211
+ _e('Expiration Email Notification', 'post-expirator'); ?></h3>
212
+ <p class="description"><?php
213
+ _e(
214
+ 'Whenever a post expires, an email can be sent to alert users of the expiration.',
215
+ 'post-expirator'
216
+ ); ?></p>
217
+ <table class="form-table">
218
+ <tr valign="top">
219
+ <th scope="row"><?php
220
+ _e('Enable Email Notification?', 'post-expirator'); ?></th>
221
+ <td>
222
+ <input type="radio" name="expired-email-notification" id="expired-email-notification-true"
223
+ value="1" <?php
224
+ echo $expiredemailnotificationenabled; ?>/> <label
225
+ for="expired-email-notification-true"><?php
226
+ _e('Enabled', 'post-expirator'); ?></label>
227
+ &nbsp;&nbsp;
228
+ <input type="radio" name="expired-email-notification" id="expired-email-notification-false"
229
+ value="0" <?php
230
+ echo $expiredemailnotificationdisabled; ?>/> <label
231
+ for="expired-email-notification-false"><?php
232
+ _e('Disabled', 'post-expirator'); ?></label>
233
+ <p class="description"><?php
234
+ _e(
235
+ 'This will enable or disable the send of email notification on post expiration.',
236
+ 'post-expirator'
237
+ ); ?></p>
238
+ </td>
239
+ </tr>
240
+ <tr valign="top">
241
+ <th scope="row"><?php
242
+ _e('Include Blog Administrators?', 'post-expirator'); ?></th>
243
+ <td>
244
+ <input type="radio" name="expired-email-notification-admins"
245
+ id="expired-email-notification-admins-true"
246
+ value="1" <?php
247
+ echo $expiredemailnotificationadminsenabled; ?>/> <label
248
+ for="expired-email-notification-admins-true"><?php
249
+ _e('Enabled', 'post-expirator'); ?></label>
250
+ &nbsp;&nbsp;
251
+ <input type="radio" name="expired-email-notification-admins"
252
+ id="expired-email-notification-admins-false"
253
+ value="0" <?php
254
+ echo $expiredemailnotificationadminsdisabled; ?>/> <label
255
+ for="expired-email-notification-admins-false"><?php
256
+ _e('Disabled', 'post-expirator'); ?></label>
257
+ <p class="description"><?php
258
+ _e(
259
+ 'This will include all users with the role of "Administrator" in the post expiration email.',
260
+ 'post-expirator'
261
+ ); ?></p>
262
+ </td>
263
+ </tr>
264
+ <tr valign="top">
265
+ <th scope="row"><label
266
+ for="expired-email-notification-list"><?php
267
+ _e('Who to notify', 'post-expirator'); ?></label>
268
+ </th>
269
+ <td>
270
+ <input class="large-text" type="text" name="expired-email-notification-list"
271
+ id="expired-email-notification-list" value="<?php
272
+ echo $expiredemailnotificationlist; ?>"/>
273
+ <p class="description"><?php
274
+ _e(
275
+ 'Enter a comma separate list of emails that you would like to be notified when the post expires. This will be applied to ALL post types. You can set post type specific emails on the Defaults tab.',
276
+ 'post-expirator'
277
+ ); ?></p>
278
+ </td>
279
+ </tr>
280
+ </table>
281
 
282
+ <h3><?php
283
+ _e('Post Footer Display', 'post-expirator'); ?></h3>
284
+ <p class="description"><?php
285
+ _e(
286
+ 'Enabling this below will display the expiration date automatically at the end of any post which is set to expire.',
287
+ 'post-expirator'
288
+ ); ?></p>
289
+ <table class="form-table">
290
+ <tr valign="top">
291
+ <th scope="row"><?php
292
+ _e('Show in post footer?', 'post-expirator'); ?></th>
293
+ <td>
294
+ <input type="radio" name="expired-display-footer" id="expired-display-footer-true"
295
+ value="1" <?php
296
+ echo $expireddisplayfooterenabled; ?>/> <label
297
+ for="expired-display-footer-true"><?php
298
+ _e('Enabled', 'post-expirator'); ?></label>
299
+ &nbsp;&nbsp;
300
+ <input type="radio" name="expired-display-footer" id="expired-display-footer-false"
301
+ value="0" <?php
302
+ echo $expireddisplayfooterdisabled; ?>/> <label
303
+ for="expired-display-footer-false"><?php
304
+ _e('Disabled', 'post-expirator'); ?></label>
305
+ <p class="description"><?php
306
+ _e(
307
+ 'This will enable or disable displaying the post expiration date in the post footer.',
308
+ 'post-expirator'
309
+ ); ?></p>
310
+ </td>
311
+ </tr>
312
+ <tr valign="top">
313
+ <th scope="row"><label
314
+ for="expired-footer-contents"><?php
315
+ _e('Footer Contents', 'post-expirator'); ?></label>
316
+ </th>
317
+ <td>
318
  <textarea id="expired-footer-contents" name="expired-footer-contents" rows="3"
319
+ cols="50"><?php
320
+ echo $expirationdateFooterContents; ?></textarea>
321
+ <p class="description"><?php
322
+ _e(
323
+ 'Enter the text you would like to appear at the bottom of every post that will expire. The following placeholders will be replaced with the post expiration date in the following format:',
324
+ 'post-expirator'
325
+ ); ?></p>
326
+ <ul class="pe-list">
327
+ <li><p class="description">EXPIRATIONFULL
328
+ -> <?php
329
+ echo date_i18n(
330
+ "$expirationdateDefaultDateFormat $expirationdateDefaultTimeFormat"
331
+ ); ?></p>
332
+ </li>
333
+ <li><p class="description">EXPIRATIONDATE
334
+ -> <?php
335
+ echo date_i18n("$expirationdateDefaultDateFormat"); ?></p></li>
336
+ <li><p class="description">EXPIRATIONTIME
337
+ -> <?php
338
+ echo date_i18n("$expirationdateDefaultTimeFormat"); ?></p></li>
339
+ </ul>
340
+ </td>
341
+ </tr>
342
+ <tr valign="top">
343
+ <th scope="row"><label
344
+ for="expired-footer-style"><?php
345
+ _e('Footer Style', 'post-expirator'); ?></label></th>
346
+ <td>
347
+ <input type="text" name="expired-footer-style" id="expired-footer-style"
348
+ value="<?php
349
+ echo $expirationdateFooterStyle; ?>" size="25"/>
350
+ (<span style="<?php
351
+ echo $expirationdateFooterStyle; ?>"><?php
352
+ _e('This post will expire on', 'post-expirator'); ?><?php
353
+ echo date_i18n("$expirationdateDefaultDateFormat $expirationdateDefaultTimeFormat"); ?></span>)
354
+ <p class="description"><?php
355
+ _e('The inline css which will be used to style the footer text.', 'post-expirator'); ?></p>
356
+ </td>
357
+ </tr>
358
+ </table>
359
 
360
+ <h3><?php
361
+ _e('Advanced Options', 'post-expirator'); ?></h3>
362
+ <p class="description"><?php
363
+ _e(
364
+ 'Please do not update anything here unless you know what it entails. For advanced users only.',
365
+ 'post-expirator'
366
+ ); ?></p>
367
+ <?php
368
+ $gutenberg = get_option('expirationdateGutenbergSupport', 1);
369
+ ?>
370
+ <table class="form-table">
371
+ <tr valign="top">
372
+ <th scope="row"><?php
373
+ _e('Block Editor Support', 'post-expirator'); ?></th>
374
+ <td>
375
+ <input type="radio" name="gutenberg-support" id="gutenberg-support-enabled"
376
+ value="1" <?php
377
+ echo intval($gutenberg) === 1 ? 'checked' : ''; ?>/> <label
378
+ for="gutenberg-support-enabled"><?php
379
+ _e('Show Gutenberg style box', 'post-expirator'); ?></label>
380
+ &nbsp;&nbsp;
381
+ <input type="radio" name="gutenberg-support" id="gutenberg-support-disabled"
382
+ value="0" <?php
383
+ echo intval($gutenberg) === 0 ? 'checked' : ''; ?>/> <label
384
+ for="gutenberg-support-disabled"><?php
385
+ _e('Show Classic Editor style box', 'post-expirator'); ?></label>
386
+ <p class="description"><?php
387
+ _e(
388
+ 'Toggle between native support for the Block Editor or the backward compatible Classic Editor style metabox.',
389
+ 'post-expirator'
390
+ ); ?></p>
391
+ </td>
392
+ </tr>
393
+ <tr valign="top">
394
+ <th scope="row">
395
+ <?php
396
+ _e('Choose which user roles can use Post Expirator', 'post-expirator'); ?>
397
+ </th>
398
+ <td class="pe-checklist">
399
+ <?php
400
+ foreach ($user_roles as $role_name => $role_label) : ?>
401
+ <label for="allow-user-role-<?php
402
+ echo esc_attr($role_name); ?>">
403
+ <input type="checkbox"
404
+ id="allow-user-role-<?php
405
+ echo esc_attr($role_name); ?>"
406
+ name="allow-user-roles[]"
407
+ <?php
408
+ if ('administrator' === $role_name) : echo 'disabled="disabled"'; endif; ?>
409
+ value="<?php
410
+ echo esc_attr($role_name); ?>"
411
+ <?php
412
+ if ($plugin_facade->user_role_can_expire_posts(
413
+ $role_name
414
+ )) : ?>checked="checked"<?php
415
+ endif; ?>
416
+ />
417
+ <?php
418
+ echo esc_html($role_label); ?>
419
+ </label>
420
+ <?php
421
+ endforeach; ?>
422
+ </td>
423
+ </tr>
424
+ </table>
425
 
426
+ <p class="submit">
427
+ <input type="submit" name="expirationdateSave" class="button-primary"
428
+ value="<?php
429
+ _e('Save Changes', 'post-expirator'); ?>"/>
430
+ </p>
431
+ </form>
432
 
433
  <?php
 
views/quick-edit.php CHANGED
@@ -1,87 +1,108 @@
1
  <div style="clear:both"></div>
2
  <fieldset class="inline-edit-col-left post-expirator-quickedit">
3
- <div class="inline-edit-col">
4
- <div class="inline-edit-group">
5
- <label>
6
- <input name="enable-expirationdate" type="checkbox"/>
7
- <span class=""><?php _e( 'Enable Post Expiration', 'post-expirator' ); ?></span>
8
- </label>
9
- <fieldset class="inline-edit-date">
10
- <div class="pe-qe-fields" style="display: none">
11
- <div>
12
- <legend><span class="title"><?php _e( 'Date', 'post-expirator' ); ?></span></legend>
13
- <label>
14
- <span class="screen-reader-text"><?php _e( 'Month', 'post-expirator' ); ?></span>
15
- <select name="expirationdate_month">
16
- <?php
17
- for ( $x = 1; $x <= 12; $x ++ ) {
18
- $now = mktime( 0, 0, 0, $x, 1, date_i18n( 'Y' ) );
19
- $monthNumeric = date_i18n( 'm', $now );
20
- $monthStr = date_i18n( 'M', $now );
21
- ?>
22
- <option value="<?php echo $monthNumeric; ?>"
23
- data-text="<?php echo $monthStr; ?>"><?php echo $monthNumeric; ?>
24
- -<?php echo $monthStr; ?></option>
25
- <?php } ?>
 
 
 
 
 
 
 
 
26
 
27
- </select>
28
- </label>
29
- <label>
30
- <span class="screen-reader-text"><?php _e( 'Day', 'post-expirator' ); ?></span>
31
- <input name="expirationdate_day" value="" size="2" maxlength="2" autocomplete="off"
32
- type="text" placeholder="<?php echo date( 'd' ); ?>">
33
- </label>,
34
- <label>
35
- <span class="screen-reader-text"><?php _e( 'Year', 'post-expirator' ); ?></span>
36
- <input name="expirationdate_year" value="" size="4" maxlength="4" autocomplete="off"
37
- type="text" placeholder="<?php echo date( 'Y' ); ?>">
38
- </label> @
39
- <label>
40
- <span class="screen-reader-text"><?php _e( 'Hour', 'post-expirator' ); ?></span>
41
- <input name="expirationdate_hour" value="" size="2" maxlength="2" autocomplete="off"
42
- type="text" placeholder="00">
43
- </label> :
44
- <label>
45
- <span class="screen-reader-text"><?php _e( 'Minute', 'post-expirator' ); ?></span>
46
- <input name="expirationdate_minute" value="" size="2" maxlength="2" autocomplete="off"
47
- type="text" placeholder="00">
48
- </label>
49
- </div>
50
- <div>
51
- <legend>
52
- <span class="title"><?php _e( 'Type', 'post-expirator' ); ?></span>
53
- <span class="screen-reader-text"><?php _e( 'How to expire', 'post-expirator' ); ?></span>
54
- </legend>
55
- <?php
56
- $defaults = get_option( 'expirationdateDefaults' . ucfirst( $post_type ) );
57
- _postexpirator_expire_type( array( 'name' => 'expirationdate_expiretype',
58
- 'selected' => empty( $defaults ) ? 'draft' : $defaults['expireType'],
59
- 'post_type' => $post_type
60
- ) );
61
- ?>
62
- </div>
63
- <div class="pe-category-list">
64
- <legend>
65
- <span class="title"><?php echo $tax_label; ?></span>
66
- <span class="screen-reader-text"><?php _e( 'Expiration Categories', 'post-expirator' ); ?></span>
67
- </legend>
68
- <ul id="categorychecklist"
69
- class="list:category categorychecklist cat-checklist category-checklist">
70
- <?php
71
- if ( ! empty( $taxonomy ) ) {
72
- $walker = new Walker_PostExpirator_Category_Checklist();
73
- wp_terms_checklist( 0, array( 'taxonomy' => $taxonomy,
74
- 'walker' => $walker,
75
- 'checked_ontop' => false
76
- ) );
77
- }
78
- ?>
79
- </ul>
80
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
81
 
82
- </div>
83
- <input name="expirationdate_quickedit" value="true" type="hidden"/>
84
- </fieldset>
85
- </div>
86
- </div>
 
87
  </fieldset>
1
  <div style="clear:both"></div>
2
  <fieldset class="inline-edit-col-left post-expirator-quickedit">
3
+ <div class="inline-edit-col">
4
+ <div class="inline-edit-group">
5
+ <label>
6
+ <input name="enable-expirationdate" type="checkbox"/>
7
+ <span class=""><?php
8
+ _e('Enable Post Expiration', 'post-expirator'); ?></span>
9
+ </label>
10
+ <fieldset class="inline-edit-date">
11
+ <div class="pe-qe-fields" style="display: none">
12
+ <div>
13
+ <legend><span class="title"><?php
14
+ _e('Date', 'post-expirator'); ?></span></legend>
15
+ <label>
16
+ <span class="screen-reader-text"><?php
17
+ _e('Month', 'post-expirator'); ?></span>
18
+ <select name="expirationdate_month">
19
+ <?php
20
+ for ($x = 1; $x <= 12; $x++) {
21
+ $now = mktime(0, 0, 0, $x, 1, date_i18n('Y'));
22
+ $monthNumeric = date_i18n('m', $now);
23
+ $monthStr = date_i18n('M', $now);
24
+ ?>
25
+ <option value="<?php
26
+ echo $monthNumeric; ?>"
27
+ data-text="<?php
28
+ echo $monthStr; ?>"><?php
29
+ echo $monthNumeric; ?>
30
+ -<?php
31
+ echo $monthStr; ?></option>
32
+ <?php
33
+ } ?>
34
 
35
+ </select>
36
+ </label>
37
+ <label>
38
+ <span class="screen-reader-text"><?php
39
+ _e('Day', 'post-expirator'); ?></span>
40
+ <input name="expirationdate_day" value="" size="2" maxlength="2" autocomplete="off"
41
+ type="text" placeholder="<?php
42
+ echo date('d'); ?>">
43
+ </label>,
44
+ <label>
45
+ <span class="screen-reader-text"><?php
46
+ _e('Year', 'post-expirator'); ?></span>
47
+ <input name="expirationdate_year" value="" size="4" maxlength="4" autocomplete="off"
48
+ type="text" placeholder="<?php
49
+ echo date('Y'); ?>">
50
+ </label> @
51
+ <label>
52
+ <span class="screen-reader-text"><?php
53
+ _e('Hour', 'post-expirator'); ?></span>
54
+ <input name="expirationdate_hour" value="" size="2" maxlength="2" autocomplete="off"
55
+ type="text" placeholder="00">
56
+ </label> :
57
+ <label>
58
+ <span class="screen-reader-text"><?php
59
+ _e('Minute', 'post-expirator'); ?></span>
60
+ <input name="expirationdate_minute" value="" size="2" maxlength="2" autocomplete="off"
61
+ type="text" placeholder="00">
62
+ </label>
63
+ </div>
64
+ <div>
65
+ <legend>
66
+ <span class="title"><?php
67
+ _e('Type', 'post-expirator'); ?></span>
68
+ <span class="screen-reader-text"><?php
69
+ _e('How to expire', 'post-expirator'); ?></span>
70
+ </legend>
71
+ <?php
72
+ $defaults = get_option('expirationdateDefaults' . ucfirst($post_type));
73
+ _postexpirator_expire_type(array(
74
+ 'name' => 'expirationdate_expiretype',
75
+ 'selected' => empty($defaults) ? 'draft' : $defaults['expireType'],
76
+ 'post_type' => $post_type
77
+ ));
78
+ ?>
79
+ </div>
80
+ <div class="pe-category-list">
81
+ <legend>
82
+ <span class="title"><?php
83
+ echo $tax_label; ?></span>
84
+ <span class="screen-reader-text"><?php
85
+ _e('Expiration Categories', 'post-expirator'); ?></span>
86
+ </legend>
87
+ <ul id="categorychecklist"
88
+ class="list:category categorychecklist cat-checklist category-checklist">
89
+ <?php
90
+ if (! empty($taxonomy)) {
91
+ $walker = new Walker_PostExpirator_Category_Checklist();
92
+ wp_terms_checklist(0, array(
93
+ 'taxonomy' => $taxonomy,
94
+ 'walker' => $walker,
95
+ 'checked_ontop' => false
96
+ ));
97
+ }
98
+ ?>
99
+ </ul>
100
+ </div>
101
 
102
+ </div>
103
+ <input name="expirationdate_quickedit" value="true" type="hidden"/>
104
+ <input name="postexpirator_view" value="quick-edit" type="hidden"/>
105
+ </fieldset>
106
+ </div>
107
+ </div>
108
  </fieldset>
views/tabs.php CHANGED
@@ -1,24 +1,41 @@
1
  <?php
2
- $current_tab = empty( $_GET['tab'] ) ? 'general' : sanitize_title( wp_unslash( $_GET['tab'] ) );
 
3
  ?>
4
 
5
  <div class="wrap">
6
- <h2><?php __( 'Post Expirator Options', 'post-expirator' ); ?></h2>
7
- <div id="pe-settings-tabs">
8
- <nav class="nav-tab-wrapper postexpirator-nav-tab-wrapper">
9
- <a href="<?php echo admin_url( 'options-general.php?page=post-expirator.php&tab=general' ); ?>"
10
- class="pe-tab nav-tab <?php echo( $current_tab === 'general' ? 'nav-tab-active' : '' ); ?>"><?php _e( 'General Settings', 'post-expirator' ); ?></a>
11
- <a href="<?php echo admin_url( 'options-general.php?page=post-expirator.php&tab=defaults' ); ?>"
12
- class="pe-tab nav-tab <?php echo( $current_tab === 'defaults' ? 'nav-tab-active' : '' ); ?>"><?php _e( 'Post Types', 'post-expirator' ); ?></a>
13
- <a href="<?php echo admin_url( 'options-general.php?page=post-expirator.php&tab=diagnostics' ); ?>"
14
- class="pe-tab nav-tab <?php echo( $current_tab === 'diagnostics' ? 'nav-tab-active' : '' ); ?>"><?php _e( 'Diagnostics', 'post-expirator' ); ?></a>
15
- <?php if ( POSTEXPIRATOR_DEBUG ) { ?>
16
- <a href="<?php echo admin_url( 'options-general.php?page=post-expirator.php&tab=viewdebug' ); ?>"
17
- class="pe-tab nav-tab <?php echo( $current_tab === 'viewdebug' ? 'nav-tab-active' : '' ); ?>"><?php _e( 'View Debug Logs', 'post-expirator' ); ?></a>
18
- <?php } ?>
19
- </nav>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
21
- <?php echo $html; ?>
 
22
 
23
- </div>
24
  </div>
1
  <?php
2
+
3
+ $current_tab = empty($_GET['tab']) ? 'general' : sanitize_title(wp_unslash($_GET['tab']));
4
  ?>
5
 
6
  <div class="wrap">
7
+ <h2><?php
8
+ __('Post Expirator Options', 'post-expirator'); ?></h2>
9
+ <div id="pe-settings-tabs">
10
+ <nav class="nav-tab-wrapper postexpirator-nav-tab-wrapper">
11
+ <a href="<?php
12
+ echo admin_url('options-general.php?page=post-expirator.php&tab=general'); ?>"
13
+ class="pe-tab nav-tab <?php
14
+ echo($current_tab === 'general' ? 'nav-tab-active' : ''); ?>"><?php
15
+ _e('General Settings', 'post-expirator'); ?></a>
16
+ <a href="<?php
17
+ echo admin_url('options-general.php?page=post-expirator.php&tab=defaults'); ?>"
18
+ class="pe-tab nav-tab <?php
19
+ echo($current_tab === 'defaults' ? 'nav-tab-active' : ''); ?>"><?php
20
+ _e('Post Types', 'post-expirator'); ?></a>
21
+ <a href="<?php
22
+ echo admin_url('options-general.php?page=post-expirator.php&tab=diagnostics'); ?>"
23
+ class="pe-tab nav-tab <?php
24
+ echo($current_tab === 'diagnostics' ? 'nav-tab-active' : ''); ?>"><?php
25
+ _e('Diagnostics', 'post-expirator'); ?></a>
26
+ <?php
27
+ if (POSTEXPIRATOR_DEBUG) { ?>
28
+ <a href="<?php
29
+ echo admin_url('options-general.php?page=post-expirator.php&tab=viewdebug'); ?>"
30
+ class="pe-tab nav-tab <?php
31
+ echo($current_tab === 'viewdebug' ? 'nav-tab-active' : ''); ?>"><?php
32
+ _e('View Debug Logs', 'post-expirator'); ?></a>
33
+ <?php
34
+ } ?>
35
+ </nav>
36
 
37
+ <?php
38
+ echo $html; ?>
39
 
40
+ </div>
41
  </div>