├── web ├── app │ ├── themes │ │ ├── .gitkeep │ │ ├── sage │ │ │ ├── resources │ │ │ │ ├── assets │ │ │ │ │ ├── fonts │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ ├── images │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ ├── styles │ │ │ │ │ │ ├── common │ │ │ │ │ │ │ ├── _global.scss │ │ │ │ │ │ │ └── _variables.scss │ │ │ │ │ │ ├── layouts │ │ │ │ │ │ │ ├── _pages.scss │ │ │ │ │ │ │ ├── _posts.scss │ │ │ │ │ │ │ ├── _footer.scss │ │ │ │ │ │ │ ├── _sidebar.scss │ │ │ │ │ │ │ ├── _tinymce.scss │ │ │ │ │ │ │ └── _header.scss │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ ├── _buttons.scss │ │ │ │ │ │ │ ├── _forms.scss │ │ │ │ │ │ │ ├── _comments.scss │ │ │ │ │ │ │ └── _wp-classes.scss │ │ │ │ │ │ ├── autoload │ │ │ │ │ │ │ └── _bootstrap.scss │ │ │ │ │ │ └── main.scss │ │ │ │ │ ├── scripts │ │ │ │ │ │ ├── routes │ │ │ │ │ │ │ ├── about.js │ │ │ │ │ │ │ ├── home.js │ │ │ │ │ │ │ └── common.js │ │ │ │ │ │ ├── customizer.js │ │ │ │ │ │ ├── autoload │ │ │ │ │ │ │ └── _bootstrap.js │ │ │ │ │ │ ├── util │ │ │ │ │ │ │ ├── camelCase.js │ │ │ │ │ │ │ └── Router.js │ │ │ │ │ │ └── main.js │ │ │ │ │ ├── build │ │ │ │ │ │ ├── helpers │ │ │ │ │ │ │ ├── hmr-client.js │ │ │ │ │ │ │ └── public-path.js │ │ │ │ │ │ ├── util │ │ │ │ │ │ │ ├── desire.js │ │ │ │ │ │ │ ├── addHotMiddleware.js │ │ │ │ │ │ │ └── assetManifestsFormatter.js │ │ │ │ │ │ ├── postcss.config.js │ │ │ │ │ │ ├── webpack.config.optimize.js │ │ │ │ │ │ ├── webpack.config.watch.js │ │ │ │ │ │ ├── config.js │ │ │ │ │ │ └── webpack.config.js │ │ │ │ │ └── config.json │ │ │ │ ├── index.php │ │ │ │ ├── views │ │ │ │ │ ├── partials │ │ │ │ │ │ ├── sidebar.blade.php │ │ │ │ │ │ ├── page-header.blade.php │ │ │ │ │ │ ├── footer.blade.php │ │ │ │ │ │ ├── content-page.blade.php │ │ │ │ │ │ ├── head.blade.php │ │ │ │ │ │ ├── entry-meta.blade.php │ │ │ │ │ │ ├── content.blade.php │ │ │ │ │ │ ├── content-search.blade.php │ │ │ │ │ │ ├── header.blade.php │ │ │ │ │ │ ├── content-single.blade.php │ │ │ │ │ │ └── comments.blade.php │ │ │ │ │ ├── single.blade.php │ │ │ │ │ ├── page.blade.php │ │ │ │ │ ├── template-custom.blade.php │ │ │ │ │ ├── 404.blade.php │ │ │ │ │ ├── search.blade.php │ │ │ │ │ ├── index.blade.php │ │ │ │ │ └── layouts │ │ │ │ │ │ └── app.blade.php │ │ │ │ ├── screenshot.png │ │ │ │ ├── style.css │ │ │ │ └── functions.php │ │ │ ├── app │ │ │ │ ├── Controllers │ │ │ │ │ ├── FrontPage.php │ │ │ │ │ └── App.php │ │ │ │ ├── admin.php │ │ │ │ ├── filters.php │ │ │ │ ├── helpers.php │ │ │ │ └── setup.php │ │ │ ├── .gitignore │ │ │ ├── .editorconfig │ │ │ ├── .stylelintrc.js │ │ │ ├── config │ │ │ │ ├── theme.php │ │ │ │ ├── assets.php │ │ │ │ └── view.php │ │ │ ├── LICENSE.md │ │ │ ├── .eslintrc.js │ │ │ ├── composer.json │ │ │ ├── phpcs.xml │ │ │ ├── package.json │ │ │ ├── CODE_OF_CONDUCT.md │ │ │ ├── README.md │ │ │ └── CHANGELOG.md │ │ └── yarn.lock │ ├── plugins │ │ └── .gitkeep │ ├── uploads │ │ ├── .gitkeep │ │ └── cache │ │ │ ├── 21485a3ade0d9fc2166570cb61146c2e61571941.php │ │ │ ├── b0ca68e62983674b70735c799f4be1f5fd5b3941.php │ │ │ ├── 43b63bd38c6fa4d253b4c4718cf01a8318b90ca3.php │ │ │ ├── 60278962fc7a7b02def72b914b0d0b22e8831057.php │ │ │ ├── 4a086ae0a37dd94171fb8d45dbdcf8655676bfbe.php │ │ │ ├── b050821e50e2ad96173eb000996bccc81c23af24.php │ │ │ ├── b3b2e514e95a56335b37d7d4feb045e0a17335ea.php │ │ │ ├── 4b737d4c14aa77d9679ac1c2b2827880627405ce.php │ │ │ └── 539a93f574588a16287a69293b6fa1324d597749.php │ └── mu-plugins │ │ ├── register-theme-directory.php │ │ ├── disallow-indexing.php │ │ └── bedrock-autoloader.php ├── index.php ├── .htaccess └── wp-config.php ├── Procfile ├── wp-cli.yml ├── config ├── environments │ ├── staging.php │ └── development.php └── application.php ├── .lando.yml ├── .gitignore ├── .env.example ├── package.json ├── LICENSE.md ├── composer.json ├── README.md ├── CHANGELOG.md └── composer.lock /web/app/themes/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/app/plugins/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/app/uploads/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: vendor/bin/heroku-php-apache2 web/ -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/fonts/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/images/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /wp-cli.yml: -------------------------------------------------------------------------------- 1 | path: web/wp 2 | server: 3 | docroot: web 4 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/styles/common/_global.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/styles/layouts/_pages.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/styles/layouts/_posts.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/styles/components/_buttons.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/styles/layouts/_footer.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/styles/layouts/_sidebar.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/index.php: -------------------------------------------------------------------------------- 1 | 2 |

{!! App::title() !!}

3 | 4 | -------------------------------------------------------------------------------- /web/app/uploads/cache/21485a3ade0d9fc2166570cb61146c2e61571941.php: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /web/index.php: -------------------------------------------------------------------------------- 1 | { 4 | value.bind(to => $('.brand').text(to)); 5 | }); 6 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/views/partials/footer.blade.php: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /web/app/uploads/cache/b0ca68e62983674b70735c799f4be1f5fd5b3941.php: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /web/app/themes/sage/app/Controllers/FrontPage.php: -------------------------------------------------------------------------------- 1 | 0, 'before' => '']) !!} 3 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/views/single.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 | @while(have_posts()) @php the_post() @endphp 5 | @include('partials.content-single-'.get_post_type()) 6 | @endwhile 7 | @endsection 8 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/scripts/routes/home.js: -------------------------------------------------------------------------------- 1 | export default { 2 | init() { 3 | // JavaScript to be fired on the home page 4 | }, 5 | finalize() { 6 | // JavaScript to be fired on the home page, after the init JS 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/scripts/routes/common.js: -------------------------------------------------------------------------------- 1 | export default { 2 | init() { 3 | // JavaScript to be fired on all pages 4 | }, 5 | finalize() { 6 | // JavaScript to be fired on all pages, after page specific JS is fired 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/views/page.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 | @while(have_posts()) @php the_post() @endphp 5 | @include('partials.page-header') 6 | @include('partials.content-page') 7 | @endwhile 8 | @endsection 9 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/views/partials/head.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | @php wp_head() @endphp 6 | 7 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/scripts/autoload/_bootstrap.js: -------------------------------------------------------------------------------- 1 | // `sage preset` installed this file automatically. 2 | // Running `sage preset` again could result in automatic deletion of this file. 3 | // Because of this, we do not recommend editing this file. 4 | import 'bootstrap'; 5 | -------------------------------------------------------------------------------- /web/app/uploads/cache/43b63bd38c6fa4d253b4c4718cf01a8318b90ca3.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/styles/autoload/_bootstrap.scss: -------------------------------------------------------------------------------- 1 | // `sage preset` installed this file automatically. 2 | // Running `sage preset` again could result in automatic deletion of this file. 3 | // Because of this, we do not recommend editing this file. 4 | @import "~bootstrap/scss/bootstrap"; 5 | -------------------------------------------------------------------------------- /web/app/themes/sage/.gitignore: -------------------------------------------------------------------------------- 1 | # Include your project-specific ignores in this file 2 | # Read about how to use .gitignore: https://help.github.com/articles/ignoring-files 3 | .cache-loader 4 | dist 5 | node_modules 6 | npm-debug.log 7 | yarn-error.log 8 | /vendor 9 | resources/assets/config-local.json 10 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/build/helpers/hmr-client.js: -------------------------------------------------------------------------------- 1 | const hotMiddlewareScript = require('webpack-hot-middleware/client?noInfo=true&timeout=20000&reload=true'); 2 | 3 | hotMiddlewareScript.subscribe(event => { 4 | if (event.action === 'reload') { 5 | window.location.reload(); 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/build/helpers/public-path.js: -------------------------------------------------------------------------------- 1 | /* eslint-env browser */ 2 | /* globals SAGE_DIST_PATH */ 3 | 4 | /** Dynamically set absolute public path from current protocol and host */ 5 | if (SAGE_DIST_PATH) { 6 | __webpack_public_path__ = SAGE_DIST_PATH; // eslint-disable-line no-undef, camelcase 7 | } 8 | -------------------------------------------------------------------------------- /web/app/themes/sage/.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | charset = utf-8 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true 12 | 13 | [*.php] 14 | indent_size = 4 15 | 16 | [resources/views/**.php] 17 | indent_size = 2 18 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/styles/common/_variables.scss: -------------------------------------------------------------------------------- 1 | /** Import Bootstrap functions */ 2 | @import "~bootstrap/scss/functions"; 3 | 4 | $theme-colors: ( 5 | primary: #525ddc 6 | ); 7 | 8 | /** Bootstrap navbar fix (https://git.io/fADqW) */ 9 | $navbar-dark-toggler-icon-bg: none; 10 | $navbar-light-toggler-icon-bg: none; 11 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/views/template-custom.blade.php: -------------------------------------------------------------------------------- 1 | {{-- 2 | Template Name: Custom Template 3 | --}} 4 | 5 | @extends('layouts.app') 6 | 7 | @section('content') 8 | @while(have_posts()) @php the_post() @endphp 9 | @include('partials.page-header') 10 | @include('partials.content-page') 11 | @endwhile 12 | @endsection 13 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/views/partials/entry-meta.blade.php: -------------------------------------------------------------------------------- 1 | 2 |

3 | {{ __('By', 'sage') }} 6 |

7 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/views/partials/content.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |

{!! get_the_title() !!}

4 | @include('partials/entry-meta') 5 |
6 |
7 | @php the_excerpt() @endphp 8 |
9 |
10 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/views/404.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 | @include('partials.page-header') 5 | 6 | @if (!have_posts()) 7 |
8 | {{ __('Sorry, but the page you were trying to view does not exist.', 'sage') }} 9 |
10 | {!! get_search_form(false) !!} 11 | @endif 12 | @endsection 13 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/styles/components/_forms.scss: -------------------------------------------------------------------------------- 1 | /** Search form */ 2 | .search-form { 3 | @extend .form-inline; 4 | } 5 | 6 | .search-form label { 7 | @extend .form-group; 8 | 9 | font-weight: normal; 10 | } 11 | 12 | .search-form .search-field { 13 | @extend .form-control; 14 | } 15 | 16 | .search-form .search-submit { 17 | @extend .btn; 18 | @extend .btn-secondary; 19 | } 20 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/build/util/desire.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @export 3 | * @param {string} dependency 4 | * @param {any} [fallback] 5 | * @return {any} 6 | */ 7 | module.exports = (dependency, fallback) => { 8 | try { 9 | require.resolve(dependency); 10 | } catch (err) { 11 | return fallback; 12 | } 13 | return require(dependency); // eslint-disable-line import/no-dynamic-require 14 | }; 15 | -------------------------------------------------------------------------------- /web/app/uploads/cache/60278962fc7a7b02def72b914b0d0b22e8831057.php: -------------------------------------------------------------------------------- 1 | 2 |

3 | 7 |

8 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/style.css: -------------------------------------------------------------------------------- 1 | /* 2 | Theme Name: Sage Starter Theme 3 | Theme URI: https://roots.io/sage/ 4 | Description: Sage is a WordPress starter theme. 5 | Version: 9.0.9 6 | Author: Roots 7 | Author URI: https://roots.io/ 8 | Text Domain: sage 9 | 10 | License: MIT License 11 | License URI: http://opensource.org/licenses/MIT 12 | */ 13 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/views/partials/content-search.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |

{!! get_the_title() !!}

4 | @if (get_post_type() === 'post') 5 | @include('partials/entry-meta') 6 | @endif 7 |
8 |
9 | @php the_excerpt() @endphp 10 |
11 |
12 | -------------------------------------------------------------------------------- /web/app/mu-plugins/register-theme-directory.php: -------------------------------------------------------------------------------- 1 | 2 |
3 | {{ get_bloginfo('name', 'display') }} 4 | 9 |
10 | 11 | -------------------------------------------------------------------------------- /web/.htaccess: -------------------------------------------------------------------------------- 1 | # 1 Month for most static assets 2 | 3 | Header set Cache-Control "max-age=2592000, public" 4 | 5 | 6 | # BEGIN WordPress 7 | 8 | RewriteEngine On 9 | RewriteBase / 10 | RewriteRule ^index\.php$ - [L] 11 | RewriteCond %{REQUEST_FILENAME} !-f 12 | RewriteCond %{REQUEST_FILENAME} !-d 13 | RewriteRule . /index.php [L] 14 | 15 | 16 | # END WordPress -------------------------------------------------------------------------------- /web/wp-config.php: -------------------------------------------------------------------------------- 1 | > 2 |
3 |

4 | make('partials/entry-meta', array_except(get_defined_vars(), array('__data', '__path')))->render(); ?> 5 |
6 |
7 | 8 |
9 | 10 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/build/postcss.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | const cssnanoConfig = { 4 | preset: ['default', { discardComments: { removeAll: true } }] 5 | }; 6 | 7 | module.exports = ({ file, options }) => { 8 | return { 9 | parser: options.enabled.optimize ? 'postcss-safe-parser' : undefined, 10 | plugins: { 11 | autoprefixer: true, 12 | cssnano: options.enabled.optimize ? cssnanoConfig : false, 13 | }, 14 | }; 15 | }; 16 | -------------------------------------------------------------------------------- /web/app/mu-plugins/disallow-indexing.php: -------------------------------------------------------------------------------- 1 | `${str.charAt(0).toLowerCase()}${str.replace(/[\W_]/g, '|').split('|') 7 | .map(part => `${part.charAt(0).toUpperCase()}${part.slice(1)}`) 8 | .join('') 9 | .slice(1)}`; 10 | -------------------------------------------------------------------------------- /web/app/uploads/cache/b050821e50e2ad96173eb000996bccc81c23af24.php: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /.lando.yml: -------------------------------------------------------------------------------- 1 | name: bedrock 2 | recipe: wordpress 3 | proxy: 4 | theme: # Optional: add this if you include the Sage specific config down below 5 | - localhost:3000 6 | config: 7 | php: '7.2' 8 | via: nginx 9 | webroot: web 10 | database: mysql 11 | xdebug: true 12 | 13 | # Add the following if you plan to use Sage as a starter theme 14 | services: 15 | theme: 16 | type: node 17 | services: 18 | ports: 19 | - 3000:3000 20 | tooling: 21 | yarn: 22 | service: theme -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "entry": { 3 | "main": [ 4 | "./scripts/main.js", 5 | "./styles/main.scss" 6 | ], 7 | "customizer": [ 8 | "./scripts/customizer.js" 9 | ] 10 | }, 11 | "publicPath": "/app/themes/sage", 12 | "devUrl": "http://bedrock.lndo.site", 13 | "proxyUrl": "http://localhost:3000", 14 | "cacheBusting": "[name]_[hash:8]", 15 | "watch": [ 16 | "app/**/*.php", 17 | "config/**/*.php", 18 | "resources/views/**/*.php" 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/views/search.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 | @include('partials.page-header') 5 | 6 | @if (!have_posts()) 7 |
8 | {{ __('Sorry, no results were found.', 'sage') }} 9 |
10 | {!! get_search_form(false) !!} 11 | @endif 12 | 13 | @while(have_posts()) @php the_post() @endphp 14 | @include('partials.content-search') 15 | @endwhile 16 | 17 | {!! get_the_posts_navigation() !!} 18 | @endsection 19 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/styles/components/_comments.scss: -------------------------------------------------------------------------------- 1 | .comment-list { 2 | @extend .list-unstyled; 3 | } 4 | 5 | .comment-list ol { 6 | list-style: none; 7 | } 8 | 9 | .comment-form p { 10 | @extend .form-group; 11 | } 12 | 13 | .comment-form input[type="text"], 14 | .comment-form input[type="email"], 15 | .comment-form input[type="url"], 16 | .comment-form textarea { 17 | @extend .form-control; 18 | } 19 | 20 | .comment-form input[type="submit"] { 21 | @extend .btn; 22 | @extend .btn-secondary; 23 | } 24 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/views/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 | @include('partials.page-header') 5 | 6 | @if (!have_posts()) 7 |
8 | {{ __('Sorry, no results were found.', 'sage') }} 9 |
10 | {!! get_search_form(false) !!} 11 | @endif 12 | 13 | @while (have_posts()) @php the_post() @endphp 14 | @include('partials.content-'.get_post_type()) 15 | @endwhile 16 | 17 | {!! get_the_posts_navigation() !!} 18 | @endsection 19 | -------------------------------------------------------------------------------- /config/environments/development.php: -------------------------------------------------------------------------------- 1 | { 8 | const results = {}; 9 | 10 | Object.keys(entry).forEach((name) => { 11 | results[name] = Array.isArray(entry[name]) ? entry[name].slice(0) : [entry[name]]; 12 | results[name].unshift(`${__dirname}/../helpers/hmr-client.js`); 13 | }); 14 | return results; 15 | }; 16 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/views/partials/content-single.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |

{!! get_the_title() !!}

4 | @include('partials/entry-meta') 5 |
6 |
7 | @php the_content() @endphp 8 |
9 | 12 | @php comments_template('/partials/comments.blade.php') @endphp 13 |
14 | -------------------------------------------------------------------------------- /web/app/uploads/cache/b3b2e514e95a56335b37d7d4feb045e0a17335ea.php: -------------------------------------------------------------------------------- 1 | startSection('content'); ?> 2 | make('partials.page-header', array_except(get_defined_vars(), array('__data', '__path')))->render(); ?> 3 | 4 | 5 |
6 | 7 | 8 |
9 | 10 | 11 | 12 | stopSection(); ?> 13 | 14 | make('layouts.app', array_except(get_defined_vars(), array('__data', '__path')))->render(); ?> -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/scripts/main.js: -------------------------------------------------------------------------------- 1 | // import external dependencies 2 | import 'jquery'; 3 | 4 | // Import everything from autoload 5 | import './autoload/**/*' 6 | 7 | // import local dependencies 8 | import Router from './util/Router'; 9 | import common from './routes/common'; 10 | import home from './routes/home'; 11 | import aboutUs from './routes/about'; 12 | 13 | /** Populate Router instance with DOM routes */ 14 | const routes = new Router({ 15 | // All pages 16 | common, 17 | // Home page 18 | home, 19 | // About Us page, note the change from about-us to aboutUs. 20 | aboutUs, 21 | }); 22 | 23 | // Load Events 24 | jQuery(document).ready(() => routes.loadEvents()); 25 | -------------------------------------------------------------------------------- /web/app/themes/sage/app/admin.php: -------------------------------------------------------------------------------- 1 | get_setting('blogname')->transport = 'postMessage'; 11 | $wp_customize->selective_refresh->add_partial('blogname', [ 12 | 'selector' => '.brand', 13 | 'render_callback' => function () { 14 | bloginfo('name'); 15 | } 16 | ]); 17 | }); 18 | 19 | /** 20 | * Customizer JS 21 | */ 22 | add_action('customize_preview_init', function () { 23 | wp_enqueue_script('sage/customizer.js', asset_path('scripts/customizer.js'), ['customize-preview'], null, true); 24 | }); 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Application 3 | #web/app/plugins/* 4 | !web/app/plugins/.gitkeep 5 | web/app/mu-plugins/* 6 | !web/app/mu-plugins/.gitkeep 7 | web/app/upgrade 8 | #web/app/uploads/* 9 | !web/app/uploads/.gitkeep 10 | !web/app/mu-plugins/disallow-indexing.php 11 | !web/app/mu-plugins/register-theme-directory.php 12 | !web/app/mu-plugins/bedrock-autoloader.php 13 | 14 | # WordPress 15 | web/wp 16 | #web/.htaccess 17 | 18 | # WP-CLI 19 | db-sync 20 | sql-dump-*.sql 21 | 22 | # Dotenv 23 | .env 24 | .env.* 25 | !.env.example 26 | 27 | # Vendor (e.g. Composer) 28 | vendor/* 29 | !vendor/.gitkeep 30 | 31 | # Node Package Manager 32 | node_modules 33 | 34 | # Vagrant 35 | bin 36 | .vagrant 37 | 38 | # Ignore Database Command File 39 | db-push.txt 40 | 41 | .DS_store 42 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/styles/main.scss: -------------------------------------------------------------------------------- 1 | @import "common/variables"; 2 | 3 | /** Import everything from autoload */ 4 | @import "./autoload/**/*"; 5 | 6 | /** 7 | * Import npm dependencies 8 | * 9 | * Prefix your imports with `~` to grab from node_modules/ 10 | * @see https://github.com/webpack-contrib/sass-loader#imports 11 | */ 12 | // @import "~some-node-module"; 13 | 14 | /** Import theme styles */ 15 | @import "common/global"; 16 | @import "components/buttons"; 17 | @import "components/comments"; 18 | @import "components/forms"; 19 | @import "components/wp-classes"; 20 | @import "layouts/header"; 21 | @import "layouts/sidebar"; 22 | @import "layouts/footer"; 23 | @import "layouts/pages"; 24 | @import "layouts/posts"; 25 | @import "layouts/tinymce"; 26 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/views/layouts/app.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | @include('partials.head') 4 | 5 | @php do_action('get_header') @endphp 6 | @include('partials.header') 7 |
8 |
9 |
10 | @yield('content') 11 |
12 | @if (App\display_sidebar()) 13 | 16 | @endif 17 |
18 |
19 | @php do_action('get_footer') @endphp 20 | @include('partials.footer') 21 | @php wp_footer() @endphp 22 | 23 | 24 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | DB_NAME=database_name 2 | DB_USER=database_user 3 | DB_PASSWORD=database_password 4 | 5 | # Optionally, you can use a data source name (DSN) 6 | # When using a DSN, you can remove the DB_NAME, DB_USER, DB_PASSWORD, and DB_HOST variables 7 | # DATABASE_URL=mysql://database_user:database_password@database_host:database_port/database_name 8 | 9 | # Optional variables 10 | # DB_HOST=localhost 11 | # DB_PREFIX=wp_ 12 | 13 | WP_ENV=development 14 | WP_HOME=http://example.com 15 | WP_SITEURL=${WP_HOME}/wp 16 | 17 | # Generate your keys here: https://roots.io/salts.html 18 | AUTH_KEY='generateme' 19 | SECURE_AUTH_KEY='generateme' 20 | LOGGED_IN_KEY='generateme' 21 | NONCE_KEY='generateme' 22 | AUTH_SALT='generateme' 23 | SECURE_AUTH_SALT='generateme' 24 | LOGGED_IN_SALT='generateme' 25 | NONCE_SALT='generateme' 26 | -------------------------------------------------------------------------------- /web/app/themes/sage/.stylelintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'extends': 'stylelint-config-standard', 3 | 'rules': { 4 | 'no-empty-source': null, 5 | 'string-quotes': 'double', 6 | 'at-rule-no-unknown': [ 7 | true, 8 | { 9 | 'ignoreAtRules': [ 10 | 'extend', 11 | 'at-root', 12 | 'debug', 13 | 'warn', 14 | 'error', 15 | 'if', 16 | 'else', 17 | 'for', 18 | 'each', 19 | 'while', 20 | 'mixin', 21 | 'include', 22 | 'content', 23 | 'return', 24 | 'function', 25 | 'tailwind', 26 | 'apply', 27 | 'responsive', 28 | 'variants', 29 | 'screen', 30 | ], 31 | }, 32 | ], 33 | }, 34 | }; 35 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lando-bedrock", 3 | "version": "1.0.0", 4 | "description": "[![Packagist](https://img.shields.io/packagist/v/roots/bedrock.svg?style=flat-square)](https://packagist.org/packages/roots/bedrock) [![Build Status](https://img.shields.io/travis/roots/bedrock.svg?style=flat-square)](https://travis-ci.org/roots/bedrock)", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/sam-g-roberts/lando-bedrock.git" 12 | }, 13 | "author": "", 14 | "license": "ISC", 15 | "bugs": { 16 | "url": "https://github.com/sam-g-roberts/lando-bedrock/issues" 17 | }, 18 | "homepage": "https://github.com/sam-g-roberts/lando-bedrock#readme" 19 | } 20 | -------------------------------------------------------------------------------- /web/app/uploads/cache/4b737d4c14aa77d9679ac1c2b2827880627405ce.php: -------------------------------------------------------------------------------- 1 | startSection('content'); ?> 2 | make('partials.page-header', array_except(get_defined_vars(), array('__data', '__path')))->render(); ?> 3 | 4 | 5 |
6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | make('partials.content-'.get_post_type(), array_except(get_defined_vars(), array('__data', '__path')))->render(); ?> 15 | 16 | 17 | 18 | 19 | stopSection(); ?> 20 | 21 | make('layouts.app', array_except(get_defined_vars(), array('__data', '__path')))->render(); ?> -------------------------------------------------------------------------------- /web/app/themes/sage/app/Controllers/App.php: -------------------------------------------------------------------------------- 1 | get_theme_file_path(), 18 | 19 | /* 20 | |-------------------------------------------------------------------------- 21 | | Theme Directory URI 22 | |-------------------------------------------------------------------------- 23 | | 24 | | This is the web server URI to your theme directory. 25 | | 26 | | Example: 27 | | https://example.com/app/themes/sage 28 | | 29 | */ 30 | 31 | 'uri' => get_theme_file_uri(), 32 | ]; 33 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/build/util/assetManifestsFormatter.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | module.exports = (key, value) => { 4 | if (typeof value === 'string') { 5 | return value; 6 | } 7 | const manifest = value; 8 | /** 9 | * Hack to prepend scripts/ or styles/ to manifest keys 10 | * 11 | * This might need to be reworked at some point. 12 | * 13 | * Before: 14 | * { 15 | * "main.js": "scripts/main_abcdef.js" 16 | * "main.css": "styles/main_abcdef.css" 17 | * } 18 | * After: 19 | * { 20 | * "scripts/main.js": "scripts/main_abcdef.js" 21 | * "styles/main.css": "styles/main_abcdef.css" 22 | * } 23 | */ 24 | Object.keys(manifest).forEach((src) => { 25 | const sourcePath = path.basename(path.dirname(src)); 26 | const targetPath = path.basename(path.dirname(manifest[src])); 27 | if (sourcePath === targetPath) { 28 | return; 29 | } 30 | manifest[`${targetPath}/${src}`] = manifest[src]; 31 | delete manifest[src]; 32 | }); 33 | return manifest; 34 | }; 35 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/build/webpack.config.optimize.js: -------------------------------------------------------------------------------- 1 | 'use strict'; // eslint-disable-line 2 | 3 | const { default: ImageminPlugin } = require('imagemin-webpack-plugin'); 4 | const imageminMozjpeg = require('imagemin-mozjpeg'); 5 | const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); 6 | 7 | const config = require('./config'); 8 | 9 | module.exports = { 10 | plugins: [ 11 | new ImageminPlugin({ 12 | optipng: { optimizationLevel: 2 }, 13 | gifsicle: { optimizationLevel: 3 }, 14 | pngquant: { quality: '65-90', speed: 4 }, 15 | svgo: { 16 | plugins: [ 17 | { removeUnknownsAndDefaults: false }, 18 | { cleanupIDs: false }, 19 | { removeViewBox: false }, 20 | ], 21 | }, 22 | plugins: [imageminMozjpeg({ quality: 75 })], 23 | disable: (config.enabled.watcher), 24 | }), 25 | new UglifyJsPlugin({ 26 | uglifyOptions: { 27 | ecma: 5, 28 | compress: { 29 | warnings: true, 30 | drop_console: true, 31 | }, 32 | }, 33 | }), 34 | ], 35 | }; 36 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) Roots 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 7 | of the Software, and to permit persons to whom the Software is furnished to do 8 | so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/build/webpack.config.watch.js: -------------------------------------------------------------------------------- 1 | const url = require('url'); 2 | const webpack = require('webpack'); 3 | const BrowserSyncPlugin = require('browsersync-webpack-plugin'); 4 | 5 | const config = require('./config'); 6 | 7 | const target = process.env.DEVURL || config.devUrl; 8 | 9 | /** 10 | * We do this to enable injection over SSL. 11 | */ 12 | if (url.parse(target).protocol === 'https:') { 13 | process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0; 14 | 15 | config.proxyUrl = config.proxyUrl.replace('http:', 'https:'); 16 | } 17 | 18 | module.exports = { 19 | output: { 20 | pathinfo: true, 21 | publicPath: config.proxyUrl + config.publicPath, 22 | }, 23 | devtool: '#cheap-module-source-map', 24 | stats: false, 25 | plugins: [ 26 | new webpack.optimize.OccurrenceOrderPlugin(), 27 | new webpack.HotModuleReplacementPlugin(), 28 | new webpack.NoEmitOnErrorsPlugin(), 29 | new BrowserSyncPlugin({ 30 | target, 31 | open: config.open, 32 | proxyUrl: config.proxyUrl, 33 | watch: config.watch, 34 | delay: 500, 35 | }), 36 | ], 37 | }; 38 | -------------------------------------------------------------------------------- /web/app/themes/sage/config/assets.php: -------------------------------------------------------------------------------- 1 | get_theme_file_path().'/dist/assets.json', 18 | 19 | /* 20 | |-------------------------------------------------------------------------- 21 | | Assets Path URI 22 | |-------------------------------------------------------------------------- 23 | | 24 | | The asset manifest contains relative paths to your assets. This URI will 25 | | be prepended when using Sage's asset management system. Change this if 26 | | you are using a CDN. 27 | | 28 | */ 29 | 30 | 'uri' => get_theme_file_uri().'/dist', 31 | ]; 32 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/styles/components/_wp-classes.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress Generated Classes 3 | * @see http://codex.wordpress.org/CSS#WordPress_Generated_Classes 4 | */ 5 | 6 | /** Media alignment */ 7 | .alignnone { 8 | margin-left: 0; 9 | margin-right: 0; 10 | max-width: 100%; 11 | height: auto; 12 | } 13 | 14 | .aligncenter { 15 | display: block; 16 | margin: ($spacer / 2) auto; 17 | height: auto; 18 | } 19 | 20 | .alignleft, 21 | .alignright { 22 | margin-bottom: ($spacer / 2); 23 | height: auto; 24 | } 25 | 26 | @include media-breakpoint-up(sm) { 27 | .alignleft { 28 | float: left; 29 | margin-right: ($spacer / 2); 30 | } 31 | 32 | .alignright { 33 | float: right; 34 | margin-left: ($spacer / 2); 35 | } 36 | } 37 | 38 | /** Captions */ 39 | .wp-caption { 40 | @extend .figure; 41 | } 42 | 43 | .wp-caption img { 44 | @extend .figure-img; 45 | @extend .img-fluid; 46 | } 47 | 48 | .wp-caption-text { 49 | @extend .figure-caption; 50 | } 51 | 52 | /** Text meant only for screen readers */ 53 | .screen-reader-text { 54 | @extend .sr-only; 55 | @extend .sr-only-focusable; 56 | } 57 | -------------------------------------------------------------------------------- /web/app/themes/sage/LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) Ben Word and Scott Walkinshaw 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 7 | of the Software, and to permit persons to whom the Software is furnished to do 8 | so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /web/app/uploads/cache/539a93f574588a16287a69293b6fa1324d597749.php: -------------------------------------------------------------------------------- 1 | 2 | > 3 | make('partials.head', array_except(get_defined_vars(), array('__data', '__path')))->render(); ?> 4 | > 5 | 6 | make('partials.header', array_except(get_defined_vars(), array('__data', '__path')))->render(); ?> 7 |
8 |
9 |
10 | yieldContent('content'); ?> 11 |
12 | 13 | 16 | 17 |
18 |
19 | 20 | make('partials.footer', array_except(get_defined_vars(), array('__data', '__path')))->render(); ?> 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /web/app/themes/sage/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'root': true, 3 | 'extends': 'eslint:recommended', 4 | 'globals': { 5 | 'wp': true, 6 | }, 7 | 'env': { 8 | 'node': true, 9 | 'es6': true, 10 | 'amd': true, 11 | 'browser': true, 12 | 'jquery': true, 13 | }, 14 | 'parserOptions': { 15 | 'ecmaFeatures': { 16 | 'globalReturn': true, 17 | 'generators': false, 18 | 'objectLiteralDuplicateProperties': false, 19 | 'experimentalObjectRestSpread': true, 20 | }, 21 | 'ecmaVersion': 2017, 22 | 'sourceType': 'module', 23 | }, 24 | 'plugins': [ 25 | 'import', 26 | ], 27 | 'settings': { 28 | 'import/core-modules': [], 29 | 'import/ignore': [ 30 | 'node_modules', 31 | '\\.(coffee|scss|css|less|hbs|svg|json)$', 32 | ], 33 | }, 34 | 'rules': { 35 | 'no-console': 0, 36 | 'quotes': ['error', 'single'], 37 | 'comma-dangle': [ 38 | 'error', 39 | { 40 | 'arrays': 'always-multiline', 41 | 'objects': 'always-multiline', 42 | 'imports': 'always-multiline', 43 | 'exports': 'always-multiline', 44 | 'functions': 'ignore', 45 | }, 46 | ], 47 | }, 48 | }; 49 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/views/partials/comments.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | if (post_password_required()) { 3 | return; 4 | } 5 | @endphp 6 | 7 |
8 | @if (have_comments()) 9 |

10 | {!! sprintf(_nx('One response to “%2$s”', '%1$s responses to “%2$s”', get_comments_number(), 'comments title', 'sage'), number_format_i18n(get_comments_number()), '' . get_the_title() . '') !!} 11 |

12 | 13 |
    14 | {!! wp_list_comments(['style' => 'ol', 'short_ping' => true]) !!} 15 |
16 | 17 | @if (get_comment_pages_count() > 1 && get_option('page_comments')) 18 | 28 | @endif 29 | @endif 30 | 31 | @if (!comments_open() && get_comments_number() != '0' && post_type_supports(get_post_type(), 'comments')) 32 |
33 | {{ __('Comments are closed.', 'sage') }} 34 |
35 | @endif 36 | 37 | @php comment_form() @endphp 38 |
39 | -------------------------------------------------------------------------------- /web/app/themes/sage/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roots/sage", 3 | "type": "wordpress-theme", 4 | "license": "MIT", 5 | "description": "WordPress starter theme with a modern development workflow", 6 | "homepage": "https://roots.io/sage/", 7 | "authors": [ 8 | { 9 | "name": "Ben Word", 10 | "email": "ben@benword.com", 11 | "homepage": "https://github.com/retlehs" 12 | }, 13 | { 14 | "name": "Scott Walkinshaw", 15 | "email": "scott.walkinshaw@gmail.com", 16 | "homepage": "https://github.com/swalkinshaw" 17 | }, 18 | { 19 | "name": "QWp6t", 20 | "email": "hi@qwp6t.me", 21 | "homepage": "https://github.com/qwp6t" 22 | } 23 | ], 24 | "keywords": ["wordpress"], 25 | "support": { 26 | "issues": "https://github.com/roots/sage/issues", 27 | "forum": "https://discourse.roots.io/" 28 | }, 29 | "autoload": { 30 | "psr-4": { 31 | "App\\": "app/" 32 | } 33 | }, 34 | "require": { 35 | "php": ">=7.1", 36 | "composer/installers": "~1.0", 37 | "illuminate/support": "5.6.*", 38 | "roots/sage-lib": "~9.0.9", 39 | "soberwp/controller": "~2.1.0" 40 | }, 41 | "require-dev": { 42 | "squizlabs/php_codesniffer": "^2.8.0", 43 | "roots/sage-installer": "~1.6" 44 | }, 45 | "scripts": { 46 | "test": ["phpcs"], 47 | "post-create-project-cmd": [ 48 | "Roots\\Sage\\Installer\\ComposerScript::postCreateProject" 49 | ] 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /web/app/themes/sage/config/view.php: -------------------------------------------------------------------------------- 1 | [ 16 | get_theme_file_path().'/resources/views', 17 | get_parent_theme_file_path().'/resources/views', 18 | ], 19 | 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Compiled View Path 24 | |-------------------------------------------------------------------------- 25 | | 26 | | This option determines where all the compiled Blade templates will be 27 | | stored for your application. Typically, this is within the uploads 28 | | directory. However, as usual, you are free to change this value. 29 | | 30 | */ 31 | 32 | 'compiled' => wp_upload_dir()['basedir'].'/cache', 33 | 34 | 35 | /* 36 | |-------------------------------------------------------------------------- 37 | | View Namespaces 38 | |-------------------------------------------------------------------------- 39 | | 40 | | Blade has an underutilized feature that allows developers to add 41 | | supplemental view paths that may contain conflictingly named views. 42 | | These paths are prefixed with a namespace to get around the conflicts. 43 | | A use case might be including views from within a plugin folder. 44 | | 45 | */ 46 | 47 | 'namespaces' => [ 48 | /* Given the below example, in your views use something like: @include('WC::some.view.or.partial.here') */ 49 | // 'WC' => WP_PLUGIN_DIR.'/woocommerce/templates/', 50 | ], 51 | ]; 52 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/scripts/util/Router.js: -------------------------------------------------------------------------------- 1 | import camelCase from './camelCase'; 2 | 3 | /** 4 | * DOM-based Routing 5 | * 6 | * Based on {@link http://goo.gl/EUTi53|Markup-based Unobtrusive Comprehensive DOM-ready Execution} by Paul Irish 7 | * 8 | * The routing fires all common scripts, followed by the page specific scripts. 9 | * Add additional events for more control over timing e.g. a finalize event 10 | */ 11 | class Router { 12 | 13 | /** 14 | * Create a new Router 15 | * @param {Object} routes 16 | */ 17 | constructor(routes) { 18 | this.routes = routes; 19 | } 20 | 21 | /** 22 | * Fire Router events 23 | * @param {string} route DOM-based route derived from body classes (``) 24 | * @param {string} [event] Events on the route. By default, `init` and `finalize` events are called. 25 | * @param {string} [arg] Any custom argument to be passed to the event. 26 | */ 27 | fire(route, event = 'init', arg) { 28 | document.dispatchEvent(new CustomEvent('routed', { 29 | bubbles: true, 30 | detail: { 31 | route, 32 | fn: event, 33 | }, 34 | })); 35 | 36 | const fire = route !== '' && this.routes[route] && typeof this.routes[route][event] === 'function'; 37 | if (fire) { 38 | this.routes[route][event](arg); 39 | } 40 | } 41 | 42 | /** 43 | * Automatically load and fire Router events 44 | * 45 | * Events are fired in the following order: 46 | * * common init 47 | * * page-specific init 48 | * * page-specific finalize 49 | * * common finalize 50 | */ 51 | loadEvents() { 52 | // Fire common init JS 53 | this.fire('common'); 54 | 55 | // Fire page-specific init JS, and then finalize JS 56 | document.body.className 57 | .toLowerCase() 58 | .replace(/-/g, '_') 59 | .split(/\s+/) 60 | .map(camelCase) 61 | .forEach((className) => { 62 | this.fire(className); 63 | this.fire(className, 'finalize'); 64 | }); 65 | 66 | // Fire common finalize JS 67 | this.fire('common', 'finalize'); 68 | } 69 | } 70 | 71 | export default Router; 72 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roots/bedrock", 3 | "type": "project", 4 | "license": "MIT", 5 | "description": "WordPress boilerplate with modern development tools, easier configuration, and an improved folder structure", 6 | "homepage": "https://roots.io/bedrock/", 7 | "authors": [ 8 | { 9 | "name": "Scott Walkinshaw", 10 | "email": "scott.walkinshaw@gmail.com", 11 | "homepage": "https://github.com/swalkinshaw" 12 | }, 13 | { 14 | "name": "Ben Word", 15 | "email": "ben@benword.com", 16 | "homepage": "https://github.com/retlehs" 17 | } 18 | ], 19 | "keywords": [ 20 | "bedrock", "composer", "roots", "wordpress", "wp", "wp-config" 21 | ], 22 | "support": { 23 | "issues": "https://github.com/roots/bedrock/issues", 24 | "forum": "https://discourse.roots.io/category/bedrock" 25 | }, 26 | "config": { 27 | "preferred-install": "dist" 28 | }, 29 | "repositories": [ 30 | { 31 | "type": "composer", 32 | "url": "https://wpackagist.org" 33 | } 34 | ], 35 | "require": { 36 | "php": ">=7.1", 37 | "composer/installers": "^1.4", 38 | "vlucas/phpdotenv": "^3.0.0", 39 | "oscarotero/env": "^1.1.0", 40 | "roots/wordpress": "5.2.1", 41 | "roots/wp-config": "1.0.0", 42 | "roots/wp-password-bcrypt": "1.0.0", 43 | "ext-gd": "*", 44 | "ext-mbstring": "*" 45 | }, 46 | "require-dev": { 47 | "squizlabs/php_codesniffer": "^3.0.2", 48 | "roave/security-advisories": "dev-master" 49 | }, 50 | "extra": { 51 | "installer-paths": { 52 | "web/app/mu-plugins/{$name}/": ["type:wordpress-muplugin"], 53 | "web/app/plugins/{$name}/": ["type:wordpress-plugin"], 54 | "web/app/themes/{$name}/": ["type:wordpress-theme"] 55 | }, 56 | "wordpress-install-dir": "web/wp" 57 | }, 58 | "scripts": { 59 | "post-install-cmd": [ 60 | "cd web/app/themes/sage && composer install", 61 | "cd web/app/themes/sage && npm install", 62 | "cd web/app/themes/sage && npm run build" 63 | ], 64 | "post-root-package-install": [ 65 | "php -r \"copy('.env.example', '.env');\"" 66 | ], 67 | "test": [ 68 | "phpcs" 69 | ] 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/build/config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const { argv } = require('yargs'); 3 | const merge = require('webpack-merge'); 4 | 5 | const desire = require('./util/desire'); 6 | 7 | const userConfig = merge(desire(`${__dirname}/../config`), desire(`${__dirname}/../config-local`)); 8 | 9 | const isProduction = !!((argv.env && argv.env.production) || argv.p); 10 | const rootPath = (userConfig.paths && userConfig.paths.root) 11 | ? userConfig.paths.root 12 | : process.cwd(); 13 | 14 | const config = merge({ 15 | open: true, 16 | copy: 'images/**/*', 17 | proxyUrl: 'http://localhost:3000', 18 | cacheBusting: '[name]_[hash]', 19 | paths: { 20 | root: rootPath, 21 | assets: path.join(rootPath, 'resources/assets'), 22 | dist: path.join(rootPath, 'dist'), 23 | }, 24 | enabled: { 25 | sourceMaps: !isProduction, 26 | optimize: isProduction, 27 | cacheBusting: isProduction, 28 | watcher: !!argv.watch, 29 | }, 30 | watch: [], 31 | }, userConfig); 32 | 33 | module.exports = merge(config, { 34 | env: Object.assign({ production: isProduction, development: !isProduction }, argv.env), 35 | publicPath: `${config.publicPath}/${path.basename(config.paths.dist)}/`, 36 | manifest: {}, 37 | }); 38 | 39 | if (process.env.NODE_ENV === undefined) { 40 | process.env.NODE_ENV = isProduction ? 'production' : 'development'; 41 | } 42 | 43 | /** 44 | * If your publicPath differs between environments, but you know it at compile time, 45 | * then set SAGE_DIST_PATH as an environment variable before compiling. 46 | * Example: 47 | * SAGE_DIST_PATH=/wp-content/themes/sage/dist/ yarn build:production 48 | */ 49 | if (process.env.SAGE_DIST_PATH) { 50 | module.exports.publicPath = process.env.SAGE_DIST_PATH; 51 | } 52 | 53 | /** 54 | * If you don't know your publicPath at compile time, then uncomment the lines 55 | * below and use WordPress's wp_localize_script() to set SAGE_DIST_PATH global. 56 | * Example: 57 | * wp_localize_script('sage/main.js', 'SAGE_DIST_PATH', get_theme_file_uri('dist/')) 58 | */ 59 | // Object.keys(module.exports.entry).forEach(id => 60 | // module.exports.entry[id].unshift(path.join(__dirname, 'helpers/public-path.js'))); 61 | -------------------------------------------------------------------------------- /web/app/themes/sage/phpcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Roots Coding Standards 4 | 5 | 6 | resources/functions.php 7 | resources/index.php 8 | app 9 | resources/views 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | resources/views 25 | 26 | 27 | 28 | 29 | resources/views 30 | 31 | 32 | 33 | 34 | resources/views 35 | 36 | 37 | 38 | 39 | resources/views 40 | 41 | 42 | 43 | 44 | resources/views 45 | 46 | 47 | 48 | 49 | resources/views 50 | 51 | 52 | 53 | 54 | resources/views 55 | 56 | 57 | 58 | 59 | resources/views 60 | 61 | 62 | 63 | 64 | resources/views 65 | 66 | 67 | 68 | 69 | resources/views 70 | 71 | 72 | -------------------------------------------------------------------------------- /web/app/themes/sage/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sage", 3 | "version": "9.0.9", 4 | "author": "Roots ", 5 | "homepage": "https://roots.io/sage/", 6 | "private": true, 7 | "repository": { 8 | "type": "git", 9 | "url": "git://github.com/roots/sage.git" 10 | }, 11 | "bugs": { 12 | "url": "https://github.com/roots/sage/issues" 13 | }, 14 | "licenses": [ 15 | { 16 | "type": "MIT", 17 | "url": "http://opensource.org/licenses/MIT" 18 | } 19 | ], 20 | "browserslist": [ 21 | "last 2 versions", 22 | "android 4", 23 | "opera 12" 24 | ], 25 | "scripts": { 26 | "build": "webpack --progress --config resources/assets/build/webpack.config.js", 27 | "build:production": "webpack --env.production --progress --config resources/assets/build/webpack.config.js", 28 | "build:profile": "webpack --progress --profile --json --config resources/assets/build/webpack.config.js", 29 | "start": "webpack --hide-modules --watch --config resources/assets/build/webpack.config.js", 30 | "rmdist": "rimraf dist", 31 | "lint": "npm run -s lint:scripts && npm run -s lint:styles", 32 | "lint:scripts": "eslint resources/assets/scripts resources/assets/build", 33 | "lint:styles": "stylelint \"resources/assets/styles/**/*.{css,sass,scss,sss,less}\"", 34 | "test": "npm run -s lint" 35 | }, 36 | "engines": { 37 | "node": ">= 8.0.0" 38 | }, 39 | "devDependencies": { 40 | "autoprefixer": "~8.2.0", 41 | "browser-sync": "~2.24.7", 42 | "browsersync-webpack-plugin": "^0.6.0", 43 | "bs-html-injector": "~3.0", 44 | "buble-loader": "^0.4.1", 45 | "cache-loader": "~1.2.5", 46 | "clean-webpack-plugin": "^0.1.18", 47 | "copy-globs-webpack-plugin": "^0.2.0", 48 | "css-loader": "^0.28.9", 49 | "cssnano": "~4.0.5", 50 | "eslint": "~4.19.1", 51 | "eslint-loader": "~1.9", 52 | "eslint-plugin-import": "~2.14.0", 53 | "extract-text-webpack-plugin": "~3.0.2", 54 | "file-loader": "^1.1.6", 55 | "friendly-errors-webpack-plugin": "^1.6.1", 56 | "imagemin-mozjpeg": "~7.0.0", 57 | "imagemin-webpack-plugin": "~2.2.0", 58 | "import-glob": "~1.5", 59 | "node-sass": "~4.9.4", 60 | "postcss-loader": "~2.1.0", 61 | "postcss-safe-parser": "~3.0", 62 | "resolve-url-loader": "~2.3.1", 63 | "rimraf": "~2.6", 64 | "sass-loader": "~6.0", 65 | "style-loader": "^0.22.1", 66 | "stylelint": "^8.4.0", 67 | "stylelint-config-standard": "~18.2.0", 68 | "stylelint-webpack-plugin": "^0.10.5", 69 | "uglifyjs-webpack-plugin": "^1.3.0", 70 | "url-loader": "^0.6.2", 71 | "webpack": "~3.10.0", 72 | "webpack-assets-manifest": "^1.0.0", 73 | "webpack-dev-middleware": "~2.0.4", 74 | "webpack-hot-middleware": "~2.22.3", 75 | "webpack-merge": "~4.1.4", 76 | "yargs": "~11.0.0" 77 | }, 78 | "dependencies": { 79 | "bootstrap": "v4.3.1", 80 | "jquery": "^3.3.1", 81 | "popper.js": "^1.14.7" 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /web/app/themes/sage/app/filters.php: -------------------------------------------------------------------------------- 1 | classes 7 | */ 8 | add_filter('body_class', function (array $classes) { 9 | /** Add page slug if it doesn't exist */ 10 | if (is_single() || is_page() && !is_front_page()) { 11 | if (!in_array(basename(get_permalink()), $classes)) { 12 | $classes[] = basename(get_permalink()); 13 | } 14 | } 15 | 16 | /** Add class if sidebar is active */ 17 | if (display_sidebar()) { 18 | $classes[] = 'sidebar-primary'; 19 | } 20 | 21 | /** Clean up class names for custom templates */ 22 | $classes = array_map(function ($class) { 23 | return preg_replace(['/-blade(-php)?$/', '/^page-template-views/'], '', $class); 24 | }, $classes); 25 | 26 | return array_filter($classes); 27 | }); 28 | 29 | /** 30 | * Add "… Continued" to the excerpt 31 | */ 32 | add_filter('excerpt_more', function () { 33 | return ' … ' . __('Continued', 'sage') . ''; 34 | }); 35 | 36 | /** 37 | * Template Hierarchy should search for .blade.php files 38 | */ 39 | collect([ 40 | 'index', '404', 'archive', 'author', 'category', 'tag', 'taxonomy', 'date', 'home', 41 | 'frontpage', 'page', 'paged', 'search', 'single', 'singular', 'attachment', 'embed' 42 | ])->map(function ($type) { 43 | add_filter("{$type}_template_hierarchy", __NAMESPACE__.'\\filter_templates'); 44 | }); 45 | 46 | /** 47 | * Render page using Blade 48 | */ 49 | add_filter('template_include', function ($template) { 50 | collect(['get_header', 'wp_head'])->each(function ($tag) { 51 | ob_start(); 52 | do_action($tag); 53 | $output = ob_get_clean(); 54 | remove_all_actions($tag); 55 | add_action($tag, function () use ($output) { 56 | echo $output; 57 | }); 58 | }); 59 | $data = collect(get_body_class())->reduce(function ($data, $class) use ($template) { 60 | return apply_filters("sage/template/{$class}/data", $data, $template); 61 | }, []); 62 | if ($template) { 63 | echo template($template, $data); 64 | return get_stylesheet_directory().'/index.php'; 65 | } 66 | return $template; 67 | }, PHP_INT_MAX); 68 | 69 | /** 70 | * Render comments.blade.php 71 | */ 72 | add_filter('comments_template', function ($comments_template) { 73 | $comments_template = str_replace( 74 | [get_stylesheet_directory(), get_template_directory()], 75 | '', 76 | $comments_template 77 | ); 78 | 79 | $data = collect(get_body_class())->reduce(function ($data, $class) use ($comments_template) { 80 | return apply_filters("sage/template/{$class}/data", $data, $comments_template); 81 | }, []); 82 | 83 | $theme_template = locate_template(["views/{$comments_template}", $comments_template]); 84 | 85 | if ($theme_template) { 86 | echo template($theme_template, $data); 87 | return get_stylesheet_directory().'/index.php'; 88 | } 89 | 90 | return $comments_template; 91 | }, 100); 92 | -------------------------------------------------------------------------------- /web/app/themes/sage/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at team@roots.io. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/functions.php: -------------------------------------------------------------------------------- 1 | roots.io/sage/docs/'; 19 | $message = "

{$title}
{$subtitle}

{$message}

{$footer}

"; 20 | wp_die($message, $title); 21 | }; 22 | 23 | /** 24 | * Ensure compatible version of PHP is used 25 | */ 26 | if (version_compare('7.1', phpversion(), '>=')) { 27 | $sage_error(__('You must be using PHP 7.1 or greater.', 'sage'), __('Invalid PHP version', 'sage')); 28 | } 29 | 30 | /** 31 | * Ensure compatible version of WordPress is used 32 | */ 33 | if (version_compare('4.7.0', get_bloginfo('version'), '>=')) { 34 | $sage_error(__('You must be using WordPress 4.7.0 or greater.', 'sage'), __('Invalid WordPress version', 'sage')); 35 | } 36 | 37 | /** 38 | * Ensure dependencies are loaded 39 | */ 40 | if (!class_exists('Roots\\Sage\\Container')) { 41 | if (!file_exists($composer = __DIR__.'/../vendor/autoload.php')) { 42 | $sage_error( 43 | __('You must run composer install from the Sage directory.', 'sage'), 44 | __('Autoloader not found.', 'sage') 45 | ); 46 | } 47 | require_once $composer; 48 | } 49 | 50 | /** 51 | * Sage required files 52 | * 53 | * The mapped array determines the code library included in your theme. 54 | * Add or remove files to the array as needed. Supports child theme overrides. 55 | */ 56 | array_map(function ($file) use ($sage_error) { 57 | $file = "../app/{$file}.php"; 58 | if (!locate_template($file, true, true)) { 59 | $sage_error(sprintf(__('Error locating %s for inclusion.', 'sage'), $file), 'File not found'); 60 | } 61 | }, ['helpers', 'setup', 'filters', 'admin']); 62 | 63 | /** 64 | * Here's what's happening with these hooks: 65 | * 1. WordPress initially detects theme in themes/sage/resources 66 | * 2. Upon activation, we tell WordPress that the theme is actually in themes/sage/resources/views 67 | * 3. When we call get_template_directory() or get_template_directory_uri(), we point it back to themes/sage/resources 68 | * 69 | * We do this so that the Template Hierarchy will look in themes/sage/resources/views for core WordPress themes 70 | * But functions.php, style.css, and index.php are all still located in themes/sage/resources 71 | * 72 | * This is not compatible with the WordPress Customizer theme preview prior to theme activation 73 | * 74 | * get_template_directory() -> /srv/www/example.com/current/web/app/themes/sage/resources 75 | * get_stylesheet_directory() -> /srv/www/example.com/current/web/app/themes/sage/resources 76 | * locate_template() 77 | * ├── STYLESHEETPATH -> /srv/www/example.com/current/web/app/themes/sage/resources/views 78 | * └── TEMPLATEPATH -> /srv/www/example.com/current/web/app/themes/sage/resources 79 | */ 80 | array_map( 81 | 'add_filter', 82 | ['theme_file_path', 'theme_file_uri', 'parent_theme_file_path', 'parent_theme_file_uri'], 83 | array_fill(0, 4, 'dirname') 84 | ); 85 | Container::getInstance() 86 | ->bindIf('config', function () { 87 | return new Config([ 88 | 'assets' => require dirname(__DIR__).'/config/assets.php', 89 | 'theme' => require dirname(__DIR__).'/config/theme.php', 90 | 'view' => require dirname(__DIR__).'/config/view.php', 91 | ]); 92 | }, true); 93 | -------------------------------------------------------------------------------- /web/app/themes/sage/app/helpers.php: -------------------------------------------------------------------------------- 1 | bound($abstract) 22 | ? $container->makeWith($abstract, $parameters) 23 | : $container->makeWith("sage.{$abstract}", $parameters); 24 | } 25 | 26 | /** 27 | * Get / set the specified configuration value. 28 | * 29 | * If an array is passed as the key, we will assume you want to set an array of values. 30 | * 31 | * @param array|string $key 32 | * @param mixed $default 33 | * @return mixed|\Roots\Sage\Config 34 | * @copyright Taylor Otwell 35 | * @link https://github.com/laravel/framework/blob/c0970285/src/Illuminate/Foundation/helpers.php#L254-L265 36 | */ 37 | function config($key = null, $default = null) 38 | { 39 | if (is_null($key)) { 40 | return sage('config'); 41 | } 42 | if (is_array($key)) { 43 | return sage('config')->set($key); 44 | } 45 | return sage('config')->get($key, $default); 46 | } 47 | 48 | /** 49 | * @param string $file 50 | * @param array $data 51 | * @return string 52 | */ 53 | function template($file, $data = []) 54 | { 55 | return sage('blade')->render($file, $data); 56 | } 57 | 58 | /** 59 | * Retrieve path to a compiled blade view 60 | * @param $file 61 | * @param array $data 62 | * @return string 63 | */ 64 | function template_path($file, $data = []) 65 | { 66 | return sage('blade')->compiledPath($file, $data); 67 | } 68 | 69 | /** 70 | * @param $asset 71 | * @return string 72 | */ 73 | function asset_path($asset) 74 | { 75 | return sage('assets')->getUri($asset); 76 | } 77 | 78 | /** 79 | * @param string|string[] $templates Possible template files 80 | * @return array 81 | */ 82 | function filter_templates($templates) 83 | { 84 | $paths = apply_filters('sage/filter_templates/paths', [ 85 | 'views', 86 | 'resources/views' 87 | ]); 88 | $paths_pattern = "#^(" . implode('|', $paths) . ")/#"; 89 | 90 | return collect($templates) 91 | ->map(function ($template) use ($paths_pattern) { 92 | /** Remove .blade.php/.blade/.php from template names */ 93 | $template = preg_replace('#\.(blade\.?)?(php)?$#', '', ltrim($template)); 94 | 95 | /** Remove partial $paths from the beginning of template names */ 96 | if (strpos($template, '/')) { 97 | $template = preg_replace($paths_pattern, '', $template); 98 | } 99 | 100 | return $template; 101 | }) 102 | ->flatMap(function ($template) use ($paths) { 103 | return collect($paths) 104 | ->flatMap(function ($path) use ($template) { 105 | return [ 106 | "{$path}/{$template}.blade.php", 107 | "{$path}/{$template}.php", 108 | ]; 109 | }) 110 | ->concat([ 111 | "{$template}.blade.php", 112 | "{$template}.php", 113 | ]); 114 | }) 115 | ->filter() 116 | ->unique() 117 | ->all(); 118 | } 119 | 120 | /** 121 | * @param string|string[] $templates Relative path to possible template files 122 | * @return string Location of the template 123 | */ 124 | function locate_template($templates) 125 | { 126 | return \locate_template(filter_templates($templates)); 127 | } 128 | 129 | /** 130 | * Determine whether to show the sidebar 131 | * @return bool 132 | */ 133 | function display_sidebar() 134 | { 135 | static $display; 136 | isset($display) || $display = apply_filters('sage/display_sidebar', false); 137 | return $display; 138 | } 139 | -------------------------------------------------------------------------------- /config/application.php: -------------------------------------------------------------------------------- 1 | load(); 30 | $dotenv->required(['WP_HOME', 'WP_SITEURL']); 31 | if (!env('DATABASE_URL')) { 32 | $dotenv->required(['DB_NAME', 'DB_USER', 'DB_PASSWORD']); 33 | } 34 | } 35 | 36 | /** 37 | * Set up our global environment constant and load its config first 38 | * Default: production 39 | */ 40 | define('WP_ENV', env('WP_ENV') ?: 'production'); 41 | 42 | /** 43 | * URLs 44 | */ 45 | Config::define('WP_HOME', env('WP_HOME')); 46 | Config::define('WP_SITEURL', env('WP_SITEURL')); 47 | 48 | /** 49 | * Custom Content Directory 50 | */ 51 | Config::define('CONTENT_DIR', '/app'); 52 | Config::define('WP_CONTENT_DIR', $webroot_dir . Config::get('CONTENT_DIR')); 53 | Config::define('WP_CONTENT_URL', Config::get('WP_HOME') . Config::get('CONTENT_DIR')); 54 | 55 | /** 56 | * DB settings 57 | */ 58 | Config::define('DB_NAME', env('DB_NAME')); 59 | Config::define('DB_USER', env('DB_USER')); 60 | Config::define('DB_PASSWORD', env('DB_PASSWORD')); 61 | Config::define('DB_HOST', env('DB_HOST') ?: 'localhost'); 62 | Config::define('DB_CHARSET', 'utf8mb4'); 63 | Config::define('DB_COLLATE', ''); 64 | $table_prefix = env('DB_PREFIX') ?: 'wp_'; 65 | 66 | if (env('DATABASE_URL')) { 67 | $dsn = (object) parse_url(env('DATABASE_URL')); 68 | 69 | Config::define('DB_NAME', substr($dsn->path, 1)); 70 | Config::define('DB_USER', $dsn->user); 71 | Config::define('DB_PASSWORD', isset($dsn->pass) ? $dsn->pass : null); 72 | Config::define('DB_HOST', isset($dsn->port) ? "{$dsn->host}:{$dsn->port}" : $dsn->host); 73 | } 74 | 75 | /** 76 | * Authentication Unique Keys and Salts 77 | */ 78 | Config::define('AUTH_KEY', env('AUTH_KEY')); 79 | Config::define('SECURE_AUTH_KEY', env('SECURE_AUTH_KEY')); 80 | Config::define('LOGGED_IN_KEY', env('LOGGED_IN_KEY')); 81 | Config::define('NONCE_KEY', env('NONCE_KEY')); 82 | Config::define('AUTH_SALT', env('AUTH_SALT')); 83 | Config::define('SECURE_AUTH_SALT', env('SECURE_AUTH_SALT')); 84 | Config::define('LOGGED_IN_SALT', env('LOGGED_IN_SALT')); 85 | Config::define('NONCE_SALT', env('NONCE_SALT')); 86 | 87 | /** 88 | * Custom Settings 89 | */ 90 | Config::define('AUTOMATIC_UPDATER_DISABLED', true); 91 | Config::define('DISABLE_WP_CRON', env('DISABLE_WP_CRON') ?: false); 92 | // Disable the plugin and theme file editor in the admin 93 | Config::define('DISALLOW_FILE_EDIT', true); 94 | // Disable plugin and theme updates and installation from the admin 95 | Config::define('DISALLOW_FILE_MODS', true); 96 | 97 | /** 98 | * Debugging Settings 99 | */ 100 | Config::define('WP_DEBUG_DISPLAY', false); 101 | Config::define('SCRIPT_DEBUG', false); 102 | ini_set('display_errors', 0); 103 | 104 | /** 105 | * Allow WordPress to detect HTTPS when used behind a reverse proxy or a load balancer 106 | * See https://codex.wordpress.org/Function_Reference/is_ssl#Notes 107 | */ 108 | if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { 109 | $_SERVER['HTTPS'] = 'on'; 110 | } 111 | 112 | $env_config = __DIR__ . '/environments/' . WP_ENV . '.php'; 113 | 114 | if (file_exists($env_config)) { 115 | require_once $env_config; 116 | } 117 | 118 | Config::apply(); 119 | 120 | /** 121 | * Bootstrap WordPress 122 | */ 123 | if (!defined('ABSPATH')) { 124 | define('ABSPATH', $webroot_dir . '/wp/'); 125 | } 126 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Lando/Bedrock/Sage Wordpress Base 2 | 3 | This is a modern code base for wordpress development that should be used as the base for all new wordpress projects. It implements: 4 | 5 | * Lando (docker) for easy local site setup on any OS. https://docs.devwithlando.io/ 6 | * Bedrock for dependancy management of wordpress and plugins. https://roots.io/bedrock/ 7 | * Sage for a modern theme development setup using bootstrap, scss and blade templating. https://roots.io/sage/ 8 | 9 | Please leave this repo as you would wish to find it and when starting a new project first make any relevant updates to the base before branching off and creating your own project. 10 | 11 | 12 | 13 | ## Installation 14 | 15 | This installation guide already assumes that you have both Docker and Lando installed. To install both of these please Visit: 16 | * https://hub.docker.com/signup 17 | * https://docs.devwithlando.io/installation/macos.html 18 | * https://docs.devwithlando.io/installation/linux.html 19 | * https://docs.devwithlando.io/installation/windows.html 20 | 21 | 22 | 23 | ### Download the repo 24 | First off your going to need to download the repository localy. Open up your terminal and Head to whichever folder you would like the project to be created. 25 | ``` 26 | git clone https://github.com/sam-g-roberts/docker-lando-wordpress-bedrock.git 27 | cd docker-lando-wordpress-bedrock 28 | ``` 29 | 30 | if you need to make changes to the core repo before creating your new project do it now. Otherwise do. 31 | ``` 32 | git remote remove origin 33 | ``` 34 | 35 | 36 | 37 | ### Spin up lando 38 | You might want to now go into the .lando.yml in the root and change the name as this is what your local url will be based off of. 39 | 40 | Now lets get your site running locally on lando. There's alot of work involved in this one... 41 | ``` 42 | lando start 43 | ``` 44 | 45 | Done. to see all lando commands just type and enter the below into the terminal 46 | ``` 47 | lando 48 | ``` 49 | 50 | 51 | 52 | ### Add your site and connection details 53 | First off go to the root of the repo and copy .env.example into a new file called .env This is an enviroment variables file. 54 | 55 | Your going to need to add some database details and also the url for your site. To find out the url and your database connection details type and enter the below into the terminal. 56 | ``` 57 | lando info 58 | ``` 59 | 60 | you'll notice database connections has internal and external. You would use the external details for somehting like sequel pro and internal details on your local 61 | 62 | Add these connection details to your env AND change the WP_HOME to the url from your lando info 63 | 64 | ``` 65 | DB_NAME=wordpress 66 | DB_USER=wordpress 67 | DB_PASSWORD=wordpress 68 | DB_HOST=database 69 | ``` 70 | 71 | 72 | ### Install dependencies 73 | Now lets start getting the guts installed 74 | 75 | To install wordpress the plugins and any other php dependencies run 76 | ``` 77 | lando composer install 78 | ``` 79 | 80 | Now lets head into the theme folder and install their dependencies as well 81 | ``` 82 | cd web/app/themes/sage 83 | lando composer install 84 | lando yarn 85 | ``` 86 | 87 | 88 | ### Compiling assets and watching them 89 | Run the below to get your assets compiling 90 | ``` 91 | lando yarn build 92 | lando yarn start 93 | ``` 94 | 95 | ### Visit your site and setup the db 96 | Final Step!! Now you just need to go to /wp-admin on the site url that lando has created for you and setup your WP site creds 97 | 98 | Once that is done please active the theme and plugins 99 | 100 | ## Fini!!! 101 | 102 | 103 | 104 | 105 | 106 | # Production considerations 107 | For using on production you should setup git hooks to compile the assets on deployment using the same methods above, lando is irrelevant on production though so exclude the lando prefix on all the commands 108 | 109 | You could also setup post isntall scripts in the composer .json so you only need to deploy the code to the server then run the compoaser install (server will also need to be running node) 110 | 111 | You'll also need to make /web the public root the traffice goes to this should already have an .htaccess in it 112 | 113 | The server will also need enviroment variables setup like local. 114 | 115 | 116 | -------------------------------------------------------------------------------- /web/app/themes/sage/app/setup.php: -------------------------------------------------------------------------------- 1 | __('Primary Navigation', 'sage') 48 | ]); 49 | 50 | /** 51 | * Enable post thumbnails 52 | * @link https://developer.wordpress.org/themes/functionality/featured-images-post-thumbnails/ 53 | */ 54 | add_theme_support('post-thumbnails'); 55 | 56 | /** 57 | * Enable HTML5 markup support 58 | * @link https://developer.wordpress.org/reference/functions/add_theme_support/#html5 59 | */ 60 | add_theme_support('html5', ['caption', 'comment-form', 'comment-list', 'gallery', 'search-form']); 61 | 62 | /** 63 | * Enable selective refresh for widgets in customizer 64 | * @link https://developer.wordpress.org/themes/advanced-topics/customizer-api/#theme-support-in-sidebars 65 | */ 66 | add_theme_support('customize-selective-refresh-widgets'); 67 | 68 | /** 69 | * Use main stylesheet for visual editor 70 | * @see resources/assets/styles/layouts/_tinymce.scss 71 | */ 72 | add_editor_style(asset_path('styles/main.css')); 73 | }, 20); 74 | 75 | /** 76 | * Register sidebars 77 | */ 78 | add_action('widgets_init', function () { 79 | $config = [ 80 | 'before_widget' => '
', 81 | 'after_widget' => '
', 82 | 'before_title' => '

', 83 | 'after_title' => '

' 84 | ]; 85 | register_sidebar([ 86 | 'name' => __('Primary', 'sage'), 87 | 'id' => 'sidebar-primary' 88 | ] + $config); 89 | register_sidebar([ 90 | 'name' => __('Footer', 'sage'), 91 | 'id' => 'sidebar-footer' 92 | ] + $config); 93 | }); 94 | 95 | /** 96 | * Updates the `$post` variable on each iteration of the loop. 97 | * Note: updated value is only available for subsequently loaded views, such as partials 98 | */ 99 | add_action('the_post', function ($post) { 100 | sage('blade')->share('post', $post); 101 | }); 102 | 103 | /** 104 | * Setup Sage options 105 | */ 106 | add_action('after_setup_theme', function () { 107 | /** 108 | * Add JsonManifest to Sage container 109 | */ 110 | sage()->singleton('sage.assets', function () { 111 | return new JsonManifest(config('assets.manifest'), config('assets.uri')); 112 | }); 113 | 114 | /** 115 | * Add Blade to Sage container 116 | */ 117 | sage()->singleton('sage.blade', function (Container $app) { 118 | $cachePath = config('view.compiled'); 119 | if (!file_exists($cachePath)) { 120 | wp_mkdir_p($cachePath); 121 | } 122 | (new BladeProvider($app))->register(); 123 | return new Blade($app['view']); 124 | }); 125 | 126 | /** 127 | * Create @asset() Blade directive 128 | */ 129 | sage('blade')->compiler()->directive('asset', function ($asset) { 130 | return ""; 131 | }); 132 | }); 133 | -------------------------------------------------------------------------------- /web/app/themes/sage/README.md: -------------------------------------------------------------------------------- 1 | # [Sage](https://roots.io/sage/) 2 | [![Packagist](https://img.shields.io/packagist/vpre/roots/sage.svg?style=flat-square)](https://packagist.org/packages/roots/sage) 3 | [![devDependency Status](https://img.shields.io/david/dev/roots/sage.svg?style=flat-square)](https://david-dm.org/roots/sage#info=devDependencies) 4 | [![Build Status](https://img.shields.io/travis/roots/sage.svg?style=flat-square)](https://travis-ci.org/roots/sage) 5 | 6 | Sage is a WordPress starter theme with a modern development workflow. 7 | 8 | ## Features 9 | 10 | * Sass for stylesheets 11 | * Modern JavaScript 12 | * [Webpack](https://webpack.github.io/) for compiling assets, optimizing images, and concatenating and minifying files 13 | * [Browsersync](http://www.browsersync.io/) for synchronized browser testing 14 | * [Blade](https://laravel.com/docs/5.6/blade) as a templating engine 15 | * [Controller](https://github.com/soberwp/controller) for passing data to Blade templates 16 | * CSS framework (optional): [Bootstrap 4](https://getbootstrap.com/), [Bulma](https://bulma.io/), [Foundation](https://foundation.zurb.com/), [Tachyons](http://tachyons.io/), [Tailwind](https://tailwindcss.com/) 17 | 18 | See a working example at [roots-example-project.com](https://roots-example-project.com/). 19 | 20 | ## Requirements 21 | 22 | Make sure all dependencies have been installed before moving on: 23 | 24 | * [WordPress](https://wordpress.org/) >= 4.7 25 | * [PHP](https://secure.php.net/manual/en/install.php) >= 7.1.3 (with [`php-mbstring`](https://secure.php.net/manual/en/book.mbstring.php) enabled) 26 | * [Composer](https://getcomposer.org/download/) 27 | * [Node.js](http://nodejs.org/) >= 8.0.0 28 | * [Yarn](https://yarnpkg.com/en/docs/install) 29 | 30 | ## Theme installation 31 | 32 | Install Sage using Composer from your WordPress themes directory (replace `your-theme-name` below with the name of your theme): 33 | 34 | ```shell 35 | # @ app/themes/ or wp-content/themes/ 36 | $ composer create-project roots/sage your-theme-name 37 | ``` 38 | 39 | To install the latest development version of Sage, add `dev-master` to the end of the command: 40 | 41 | ```shell 42 | $ composer create-project roots/sage your-theme-name dev-master 43 | ``` 44 | 45 | During theme installation you will have options to update `style.css` theme headers, select a CSS framework, and configure Browsersync. 46 | 47 | ## Theme structure 48 | 49 | ```shell 50 | themes/your-theme-name/ # → Root of your Sage based theme 51 | ├── app/ # → Theme PHP 52 | │ ├── Controllers/ # → Controller files 53 | │ ├── admin.php # → Theme customizer setup 54 | │ ├── filters.php # → Theme filters 55 | │ ├── helpers.php # → Helper functions 56 | │ └── setup.php # → Theme setup 57 | ├── composer.json # → Autoloading for `app/` files 58 | ├── composer.lock # → Composer lock file (never edit) 59 | ├── dist/ # → Built theme assets (never edit) 60 | ├── node_modules/ # → Node.js packages (never edit) 61 | ├── package.json # → Node.js dependencies and scripts 62 | ├── resources/ # → Theme assets and templates 63 | │ ├── assets/ # → Front-end assets 64 | │ │ ├── config.json # → Settings for compiled assets 65 | │ │ ├── build/ # → Webpack and ESLint config 66 | │ │ ├── fonts/ # → Theme fonts 67 | │ │ ├── images/ # → Theme images 68 | │ │ ├── scripts/ # → Theme JS 69 | │ │ └── styles/ # → Theme stylesheets 70 | │ ├── functions.php # → Composer autoloader, theme includes 71 | │ ├── index.php # → Never manually edit 72 | │ ├── screenshot.png # → Theme screenshot for WP admin 73 | │ ├── style.css # → Theme meta information 74 | │ └── views/ # → Theme templates 75 | │ ├── layouts/ # → Base templates 76 | │ └── partials/ # → Partial templates 77 | └── vendor/ # → Composer packages (never edit) 78 | ``` 79 | 80 | ## Theme setup 81 | 82 | Edit `app/setup.php` to enable or disable theme features, setup navigation menus, post thumbnail sizes, and sidebars. 83 | 84 | ## Theme development 85 | 86 | * Run `yarn` from the theme directory to install dependencies 87 | * Update `resources/assets/config.json` settings: 88 | * `devUrl` should reflect your local development hostname 89 | * `publicPath` should reflect your WordPress folder structure (`/wp-content/themes/sage` for non-[Bedrock](https://roots.io/bedrock/) installs) 90 | 91 | ### Build commands 92 | 93 | * `yarn start` — Compile assets when file changes are made, start Browsersync session 94 | * `yarn build` — Compile and optimize the files in your assets directory 95 | * `yarn build:production` — Compile assets for production 96 | 97 | ## Documentation 98 | 99 | * [Sage documentation](https://roots.io/sage/docs/) 100 | * [Controller documentation](https://github.com/soberwp/controller#usage) 101 | 102 | ## Contributing 103 | 104 | Contributions are welcome from everyone. We have [contributing guidelines](https://github.com/roots/guidelines/blob/master/CONTRIBUTING.md) to help you get started. 105 | 106 | ## Sage sponsors 107 | 108 | Help support our open-source development efforts by [becoming a patron](https://www.patreon.com/rootsdev). 109 | 110 | Kinsta KM Digital itineris Helsingborg Design LAB 111 | 112 | ## Community 113 | 114 | Keep track of development and community news. 115 | 116 | * Participate on the [Roots Discourse](https://discourse.roots.io/) 117 | * Follow [@rootswp on Twitter](https://twitter.com/rootswp) 118 | * Read and subscribe to the [Roots Blog](https://roots.io/blog/) 119 | * Subscribe to the [Roots Newsletter](https://roots.io/subscribe/) 120 | * Listen to the [Roots Radio podcast](https://roots.io/podcast/) 121 | -------------------------------------------------------------------------------- /web/app/mu-plugins/bedrock-autoloader.php: -------------------------------------------------------------------------------- 1 | loadPlugins(); 64 | } 65 | 66 | /** 67 | * Run some checks then autoload our plugins. 68 | */ 69 | public function loadPlugins() 70 | { 71 | $this->checkCache(); 72 | $this->validatePlugins(); 73 | $this->countPlugins(); 74 | 75 | array_map(static function () { 76 | include_once WPMU_PLUGIN_DIR . '/' . func_get_args()[0]; 77 | }, array_keys(self::$cache['plugins'])); 78 | 79 | $this->pluginHooks(); 80 | } 81 | 82 | /** 83 | * Filter show_advanced_plugins to display the autoloaded plugins. 84 | * @param $show bool Whether to show the advanced plugins for the specified plugin type. 85 | * @param $type string The plugin type, i.e., `mustuse` or `dropins` 86 | * @return bool We return `false` to prevent WordPress from overriding our work 87 | * {@internal We add the plugin details ourselves, so we return false to disable the filter.} 88 | */ 89 | public function showInAdmin($show, $type) 90 | { 91 | $screen = get_current_screen(); 92 | $current = is_multisite() ? 'plugins-network' : 'plugins'; 93 | 94 | if ($screen->base !== $current || $type !== 'mustuse' || !current_user_can('activate_plugins')) { 95 | return $show; 96 | } 97 | 98 | $this->updateCache(); 99 | 100 | self::$auto_plugins = array_map(function ($auto_plugin) { 101 | $auto_plugin['Name'] .= ' *'; 102 | return $auto_plugin; 103 | }, self::$auto_plugins); 104 | 105 | $GLOBALS['plugins']['mustuse'] = array_unique(array_merge(self::$auto_plugins, self::$mu_plugins), SORT_REGULAR); 106 | 107 | return false; 108 | } 109 | 110 | /** 111 | * This sets the cache or calls for an update 112 | */ 113 | private function checkCache() 114 | { 115 | $cache = get_site_option('bedrock_autoloader'); 116 | 117 | if ($cache === false || (isset($cache['plugins'], $cache['count']) && count($cache['plugins']) !== $cache['count'])) { 118 | $this->updateCache(); 119 | return; 120 | } 121 | 122 | self::$cache = $cache; 123 | } 124 | 125 | /** 126 | * Get the plugins and mu-plugins from the mu-plugin path and remove duplicates. 127 | * Check cache against current plugins for newly activated plugins. 128 | * After that, we can update the cache. 129 | */ 130 | private function updateCache() 131 | { 132 | require_once ABSPATH . 'wp-admin/includes/plugin.php'; 133 | 134 | self::$auto_plugins = get_plugins(self::$relative_path); 135 | self::$mu_plugins = get_mu_plugins(); 136 | $plugins = array_diff_key(self::$auto_plugins, self::$mu_plugins); 137 | $rebuild = !is_array(self::$cache['plugins']); 138 | self::$activated = $rebuild ? $plugins : array_diff_key($plugins, self::$cache['plugins']); 139 | self::$cache = ['plugins' => $plugins, 'count' => $this->countPlugins()]; 140 | 141 | update_site_option('bedrock_autoloader', self::$cache); 142 | } 143 | 144 | /** 145 | * This accounts for the plugin hooks that would run if the plugins were 146 | * loaded as usual. Plugins are removed by deletion, so there's no way 147 | * to deactivate or uninstall. 148 | */ 149 | private function pluginHooks() 150 | { 151 | if (!is_array(self::$activated)) { 152 | return; 153 | } 154 | 155 | foreach (self::$activated as $plugin_file => $plugin_info) { 156 | do_action('activate_' . $plugin_file); 157 | } 158 | } 159 | 160 | /** 161 | * Check that the plugin file exists, if it doesn't update the cache. 162 | */ 163 | private function validatePlugins() 164 | { 165 | foreach (self::$cache['plugins'] as $plugin_file => $plugin_info) { 166 | if (!file_exists(WPMU_PLUGIN_DIR . '/' . $plugin_file)) { 167 | $this->updateCache(); 168 | break; 169 | } 170 | } 171 | } 172 | 173 | /** 174 | * Count the number of autoloaded plugins. 175 | * 176 | * Count our plugins (but only once) by counting the top level folders in the 177 | * mu-plugins dir. If it's more or less than last time, update the cache. 178 | * 179 | * @return int Number of autoloaded plugins. 180 | */ 181 | private function countPlugins() 182 | { 183 | if (isset(self::$count)) { 184 | return self::$count; 185 | } 186 | 187 | $count = count(glob(WPMU_PLUGIN_DIR . '/*/', GLOB_ONLYDIR | GLOB_NOSORT)); 188 | 189 | if (!isset(self::$cache['count']) || $count !== self::$cache['count']) { 190 | self::$count = $count; 191 | $this->updateCache(); 192 | } 193 | 194 | return self::$count; 195 | } 196 | } 197 | 198 | new Autoloader(); 199 | -------------------------------------------------------------------------------- /web/app/themes/sage/resources/assets/build/webpack.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; // eslint-disable-line 2 | 3 | const webpack = require('webpack'); 4 | const merge = require('webpack-merge'); 5 | const CleanPlugin = require('clean-webpack-plugin'); 6 | const ExtractTextPlugin = require('extract-text-webpack-plugin'); 7 | const StyleLintPlugin = require('stylelint-webpack-plugin'); 8 | const CopyGlobsPlugin = require('copy-globs-webpack-plugin'); 9 | const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin'); 10 | 11 | const desire = require('./util/desire'); 12 | const config = require('./config'); 13 | 14 | const assetsFilenames = (config.enabled.cacheBusting) ? config.cacheBusting : '[name]'; 15 | 16 | let webpackConfig = { 17 | context: config.paths.assets, 18 | entry: config.entry, 19 | devtool: (config.enabled.sourceMaps ? '#source-map' : undefined), 20 | output: { 21 | path: config.paths.dist, 22 | publicPath: config.publicPath, 23 | filename: `scripts/${assetsFilenames}.js`, 24 | }, 25 | stats: { 26 | hash: false, 27 | version: false, 28 | timings: false, 29 | children: false, 30 | errors: false, 31 | errorDetails: false, 32 | warnings: false, 33 | chunks: false, 34 | modules: false, 35 | reasons: false, 36 | source: false, 37 | publicPath: false, 38 | }, 39 | module: { 40 | rules: [ 41 | { 42 | enforce: 'pre', 43 | test: /\.js$/, 44 | include: config.paths.assets, 45 | use: 'eslint', 46 | }, 47 | { 48 | enforce: 'pre', 49 | test: /\.(js|s?[ca]ss)$/, 50 | include: config.paths.assets, 51 | loader: 'import-glob', 52 | }, 53 | { 54 | test: /\.js$/, 55 | exclude: [/node_modules(?![/|\\](bootstrap|foundation-sites))/], 56 | use: [ 57 | { loader: 'cache' }, 58 | { loader: 'buble', options: { objectAssign: 'Object.assign' } }, 59 | ], 60 | }, 61 | { 62 | test: /\.css$/, 63 | include: config.paths.assets, 64 | use: ExtractTextPlugin.extract({ 65 | fallback: 'style', 66 | use: [ 67 | { loader: 'cache' }, 68 | { loader: 'css', options: { sourceMap: config.enabled.sourceMaps } }, 69 | { 70 | loader: 'postcss', options: { 71 | config: { path: __dirname, ctx: config }, 72 | sourceMap: config.enabled.sourceMaps, 73 | }, 74 | }, 75 | ], 76 | }), 77 | }, 78 | { 79 | test: /\.scss$/, 80 | include: config.paths.assets, 81 | use: ExtractTextPlugin.extract({ 82 | fallback: 'style', 83 | use: [ 84 | { loader: 'cache' }, 85 | { loader: 'css', options: { sourceMap: config.enabled.sourceMaps } }, 86 | { 87 | loader: 'postcss', options: { 88 | config: { path: __dirname, ctx: config }, 89 | sourceMap: config.enabled.sourceMaps, 90 | }, 91 | }, 92 | { loader: 'resolve-url', options: { sourceMap: config.enabled.sourceMaps } }, 93 | { 94 | loader: 'sass', options: { 95 | sourceMap: config.enabled.sourceMaps, 96 | sourceComments: true, 97 | }, 98 | }, 99 | ], 100 | }), 101 | }, 102 | { 103 | test: /\.(ttf|otf|eot|woff2?|png|jpe?g|gif|svg|ico)$/, 104 | include: config.paths.assets, 105 | loader: 'url', 106 | options: { 107 | limit: 4096, 108 | name: `[path]${assetsFilenames}.[ext]`, 109 | }, 110 | }, 111 | { 112 | test: /\.(ttf|otf|eot|woff2?|png|jpe?g|gif|svg|ico)$/, 113 | include: /node_modules/, 114 | loader: 'url', 115 | options: { 116 | limit: 4096, 117 | outputPath: 'vendor/', 118 | name: `${config.cacheBusting}.[ext]`, 119 | }, 120 | }, 121 | ], 122 | }, 123 | resolve: { 124 | modules: [ 125 | config.paths.assets, 126 | 'node_modules', 127 | ], 128 | enforceExtension: false, 129 | }, 130 | resolveLoader: { 131 | moduleExtensions: ['-loader'], 132 | }, 133 | externals: { 134 | jquery: 'jQuery', 135 | }, 136 | plugins: [ 137 | new CleanPlugin([config.paths.dist], { 138 | root: config.paths.root, 139 | verbose: false, 140 | }), 141 | /** 142 | * It would be nice to switch to copy-webpack-plugin, but 143 | * unfortunately it doesn't provide a reliable way of 144 | * tracking the before/after file names 145 | */ 146 | new CopyGlobsPlugin({ 147 | pattern: config.copy, 148 | output: `[path]${assetsFilenames}.[ext]`, 149 | manifest: config.manifest, 150 | }), 151 | new ExtractTextPlugin({ 152 | filename: `styles/${assetsFilenames}.css`, 153 | allChunks: true, 154 | disable: (config.enabled.watcher), 155 | }), 156 | new webpack.ProvidePlugin({ 157 | $: 'jquery', 158 | jQuery: 'jquery', 159 | 'window.jQuery': 'jquery', 160 | Popper: 'popper.js/dist/umd/popper.js', 161 | }), 162 | new webpack.LoaderOptionsPlugin({ 163 | minimize: config.enabled.optimize, 164 | debug: config.enabled.watcher, 165 | stats: { colors: true }, 166 | }), 167 | new webpack.LoaderOptionsPlugin({ 168 | test: /\.s?css$/, 169 | options: { 170 | output: { path: config.paths.dist }, 171 | context: config.paths.assets, 172 | }, 173 | }), 174 | new webpack.LoaderOptionsPlugin({ 175 | test: /\.js$/, 176 | options: { 177 | eslint: { failOnWarning: false, failOnError: true }, 178 | }, 179 | }), 180 | new StyleLintPlugin({ 181 | failOnError: !config.enabled.watcher, 182 | syntax: 'scss', 183 | }), 184 | new FriendlyErrorsWebpackPlugin(), 185 | ], 186 | }; 187 | 188 | /* eslint-disable global-require */ /** Let's only load dependencies as needed */ 189 | 190 | if (config.enabled.optimize) { 191 | webpackConfig = merge(webpackConfig, require('./webpack.config.optimize')); 192 | } 193 | 194 | if (config.env.production) { 195 | webpackConfig.plugins.push(new webpack.NoEmitOnErrorsPlugin()); 196 | } 197 | 198 | if (config.enabled.cacheBusting) { 199 | const WebpackAssetsManifest = require('webpack-assets-manifest'); 200 | 201 | webpackConfig.plugins.push( 202 | new WebpackAssetsManifest({ 203 | output: 'assets.json', 204 | space: 2, 205 | writeToDisk: false, 206 | assets: config.manifest, 207 | replacer: require('./util/assetManifestsFormatter'), 208 | }) 209 | ); 210 | } 211 | 212 | if (config.enabled.watcher) { 213 | webpackConfig.entry = require('./util/addHotMiddleware')(webpackConfig.entry); 214 | webpackConfig = merge(webpackConfig, require('./webpack.config.watch')); 215 | } 216 | 217 | /** 218 | * During installation via sage-installer (i.e. composer create-project) some 219 | * presets may generate a preset specific config (webpack.config.preset.js) to 220 | * override some of the default options set here. We use webpack-merge to merge 221 | * them in. If you need to modify Sage's default webpack config, we recommend 222 | * that you modify this file directly, instead of creating your own preset 223 | * file, as there are limitations to using webpack-merge which can hinder your 224 | * ability to change certain options. 225 | */ 226 | module.exports = merge.smartStrategy({ 227 | 'module.loaders': 'replace', 228 | })(webpackConfig, desire(`${__dirname}/webpack.config.preset`)); 229 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### 1.12.6: 2019-05-21 2 | 3 | * Update to WordPress 5.2.1 ([#436](https://github.com/roots/bedrock/pull/436)) 4 | 5 | ### 1.12.5: 2019-05-14 6 | 7 | * Disable WordPress' built-in fatal error handler on development ([#432](https://github.com/roots/bedrock/pull/434)) 8 | 9 | ### 1.12.4: 2019-05-07 10 | 11 | * Update to WordPress 5.2 ([#432](https://github.com/roots/bedrock/pull/432)) 12 | * Configure WP-CLI `wp server` webroot ([#427](https://github.com/roots/bedrock/pull/427)) 13 | * Fix issue with `bedrock_autoloader` option ([#386](https://github.com/roots/bedrock/pull/386)) 14 | 15 | ### 1.12.3: 2019-03-13 16 | 17 | * Update to WordPress 5.1.1 ([#426](https://github.com/roots/bedrock/pull/426)) 18 | 19 | ### 1.12.2: 2019-02-21 20 | 21 | * Update to WordPress 5.1 ([#420](https://github.com/roots/bedrock/pull/420)) 22 | 23 | ### 1.12.1: 2019-02-14 24 | 25 | * Update `vlucas/phpdotenv` ([#417](https://github.com/roots/bedrock/pull/417)) 26 | * Make DSN implementation more uniform ([#415](https://github.com/roots/bedrock/pull/415)) 27 | 28 | ### 1.12.0: 2019-02-07 29 | 30 | * Support database DSN ([#414](https://github.com/roots/bedrock/pull/414)) 31 | * Detect HTTPS if WordPress is behind a reverse proxy ([#413](https://github.com/roots/bedrock/pull/413)) 32 | * Update `vlucas/phpdotenv` to `^3` ([#412](https://github.com/roots/bedrock/pull/412)) 33 | 34 | ### 1.11.1: 2019-01-09 35 | 36 | * Update to WordPress 5.0.3 ([#408](https://github.com/roots/bedrock/pull/408)) 37 | 38 | ### 1.11.0: 2018-12-19 39 | 40 | * Bump PHP requirement to >= 7.1 ([#405](https://github.com/roots/bedrock/pull/405)) 41 | 42 | ### 1.10.2: 2018-12-19 43 | 44 | * Update to WordPress 5.0.2 ([#406](https://github.com/roots/bedrock/pull/406)) 45 | 46 | ### 1.10.1: 2018-12-12 47 | 48 | * Update to WordPress 5.0.1 ([#403](https://github.com/roots/bedrock/pull/403)) 49 | 50 | ### 1.10.0: 2018-12-09 51 | 52 | * Update to WordPress 5.0, switch from `johnpbloch/wordpress` to `roots/wordpress` package ([#395](https://github.com/roots/bedrock/pull/395)) 53 | 54 | ### 1.9.0: 2018-09-17 55 | 56 | * Fix error display in development environments ([c457082](https://github.com/roots/bedrock/commit/c457082cf4b153400d3e34f4f68a30eea4cc7c38)) 57 | * --prefer-dist on roave/security-advisories ([#381](https://github.com/roots/bedrock/pull/381)) 58 | * New Bedrock Configuration Model ([#380](https://github.com/roots/bedrock/pull/380)) 59 | * Remove vendor/.gitkeep ([#379](https://github.com/roots/bedrock/pull/379)) 60 | * Composer 1.7.0 lockfile ([#378](https://github.com/roots/bedrock/pull/378)) 61 | * Adds roave/security-advisories to composer dev deps ([#376](https://github.com/roots/bedrock/pull/376)) 62 | 63 | ### 1.8.12: 2018-08-03 64 | 65 | * Update to WordPress 4.9.8 66 | 67 | ### 1.8.11: 2018-07-09 68 | 69 | * Update to WordPress 4.9.7 70 | 71 | ### 1.8.10: 2018-05-18 72 | 73 | * Update to WordPress 4.9.6 74 | 75 | ### 1.8.9: 2018-04-04 76 | 77 | * Update to WordPress 4.9.5 78 | 79 | ### 1.8.8: 2018-02-06 80 | 81 | * Update to WordPress 4.9.4 82 | 83 | ### 1.8.7: 2018-02-05 84 | 85 | * Update to WordPress 4.9.3 86 | 87 | ### 1.8.6: 2018-01-16 88 | 89 | * Update to WordPress 4.9.2 90 | 91 | ### 1.8.5: 2017-11-29 92 | 93 | * Update to WordPress 4.9.1 94 | 95 | ### 1.8.4: 2017-11-16 96 | 97 | * Update to WordPress 4.9.0 98 | 99 | ### 1.8.3: 2017-10-31 100 | 101 | * Update to WordPress 4.8.3 102 | 103 | ### 1.8.2: 2017-09-19 104 | 105 | * Update to WordPress 4.8.2 106 | 107 | ### 1.8.1: 2017-08-02 108 | 109 | * Update to WordPress 4.8.1 110 | 111 | ### 1.8.0: 2017-06-08 112 | 113 | * Update to WordPress 4.8.0 114 | 115 | ### 1.7.9: 2017-05-16 116 | 117 | * Update to WordPress 4.7.5 118 | 119 | ### 1.7.8: 2017-05-03 120 | 121 | * Update `johnpbloch/wordpress` to 4.7.4.1 (see https://github.com/johnpbloch/wordpress/issues/32) 122 | 123 | ### 1.7.7: 2017-04-20 124 | 125 | * Update to WordPress 4.7.4 126 | 127 | ### 1.7.6: 2017-03-06 128 | 129 | * Update to WordPress 4.7.3 130 | 131 | ### 1.7.5: 2017-01-26 132 | 133 | * Update to WordPress 4.7.2 134 | 135 | ### 1.7.4: 2017-01-11 136 | 137 | * Update to WordPress 4.7.1 138 | * Add Optional variables to `.env.example` 139 | * Remove unnecessary gitignore rules ([#286](https://github.com/roots/bedrock/pull/286)) 140 | 141 | ### 1.7.3: 2016-12-06 142 | 143 | * Update to WordPress 4.7 144 | * Default `WP_ENV` to `production` instead of `development` ([#277](https://github.com/roots/bedrock/pull/277)) 145 | 146 | ### 1.7.2: 2016-09-07 147 | 148 | * Update to WordPress 4.6.1 149 | 150 | ### 1.7.1: 2016-08-16 151 | 152 | * Update to WordPress 4.6 153 | 154 | ### 1.7.0: 2016-07-10 155 | 156 | * Bump PHP requirement to >= 5.6 (5.5 is no longer supported) 157 | 158 | ### 1.6.4: 2016-06-21 159 | 160 | * Update to WordPress 4.5.3 161 | 162 | ### 1.6.3: 2016-05-06 163 | 164 | * Update to WordPress 4.5.2 165 | 166 | ### 1.6.2: 2016-04-26 167 | 168 | * Update to WordPress 4.5.1 169 | 170 | ### 1.6.1: 2016-04-12 171 | 172 | * Update to WordPress 4.5 173 | * Update coding standards (PSR-2) ([#244](https://github.com/roots/bedrock/pull/244)) 174 | 175 | ### 1.6.0: 2016-03-03 176 | 177 | * Add wp-password-bcrypt for more secure passwords ([#243](https://github.com/roots/bedrock/pull/243)) 178 | 179 | ### 1.5.4: 2016-02-29 180 | 181 | * Use HTTPS for wpackagist.org 182 | 183 | ### 1.5.3: 2016-02-03 184 | 185 | * Update to WordPress 4.4.2 186 | 187 | ### 1.5.2: 2016-02-01 188 | 189 | * Bump `composer/installers` dependency to 1.0.23 to fix deprecation notice 190 | 191 | ### 1.5.1: 2016-01-27 192 | 193 | * Use [oscarotero/env](https://github.com/oscarotero/env) instead of `getenv` ([#229](https://github.com/roots/bedrock/pull/233)) 194 | 195 | ### 1.5.0: 2016-01-17 196 | 197 | * Fix `DISABLE_WP_CRON` setting via ENV variable ([#229](https://github.com/roots/bedrock/pull/229)) 198 | * Set default `DB_CHARSET` to `utf8mb4` 199 | 200 | ### 1.4.7: 2016-01-07 201 | 202 | * Update to WordPress 4.4.1 203 | 204 | ### 1.4.6: 2015-12-09 205 | 206 | * Update to WordPress 4.4 207 | 208 | ### 1.4.5: 2015-09-16 209 | 210 | * Update to WordPress 4.3.1 211 | * Bump minimum required PHP version to 5.5 ([#201](https://github.com/roots/bedrock/pull/201)) 212 | 213 | ### 1.4.4: 2015-08-18 214 | 215 | * Update to WordPress 4.3 216 | 217 | ### 1.4.3: 2015-08-04 218 | 219 | * Update to WordPress 4.2.4 220 | 221 | ### 1.4.2: 2015-07-24 222 | 223 | * Update to WordPress 4.2.3 224 | 225 | ### 1.4.1: 2015-06-30 226 | 227 | * Dotenv 2.0.1 update 228 | 229 | ### 1.4.0: 2015-06-07 230 | 231 | * Removed .env generation script 232 | 233 | ### 1.3.7: 2015-05-07 234 | 235 | * Update to WordPress 4.2.2 236 | 237 | ### 1.3.6: 2015-04-27 238 | 239 | * Update to WordPress 4.2.1 240 | 241 | ### 1.3.5: 2015-04-23 242 | 243 | * Update to WordPress 4.2 244 | * Update to WordPress 4.1.2 245 | * Don't register theme directory if `WP_DEFAULT_THEME` is defined 246 | * Move Capistrano configs to https://github.com/roots/bedrock-capistrano 247 | 248 | ### 1.3.4: 2015-02-18 249 | 250 | * WordPress 4.1.1 fix 251 | 252 | ### 1.3.3: 2015-02-18 253 | 254 | * Update to WordPress 4.1.1 255 | * mu-plugins autoloader Multisite fix 256 | * Coding standards update + TravisCI integration 257 | 258 | ### 1.3.2: 2014-12-18 259 | 260 | * Update to WordPress 4.1 261 | * Remove WPLANG constant 262 | 263 | ### 1.3.1: 2014-11-28 264 | 265 | * Add Capistrano task to fix/update WP theme paths after deploys 266 | 267 | ### 1.3.0: 2014-11-20 268 | 269 | * Update to WordPress 4.0.1 270 | * Use johnpbloch/wordpress package instead of custom repository 271 | * Update default deploy.rb 272 | * Require PHP >= 5.4 in composer.json 273 | * Better PSR-1 adherence 274 | * Update phpdotenv dependency to 1.0.9 275 | * Fix Composer installer path plugin order 276 | * Add bedrock-autoloader mu-plugin 277 | 278 | ### 1.2.7: 2014-09-04 279 | 280 | * Update to WordPress 4.0 281 | 282 | ### 1.2.6: 2014-08-06 283 | 284 | * Update to WordPress 3.9.2 285 | * Minor deploy fix 286 | * Doc updates 287 | 288 | ### 1.2.5: 2014-07-16 289 | 290 | * Update to WordPress 3.9.1 291 | * Doc updates 292 | * Add `DB_PREFIX` constant 293 | * Update Gem versions 294 | * Disallow indexing in non-production environments 295 | 296 | ### 1.2.4: 2014-04-17 297 | 298 | * Fixes issue with 3.9 update (`composer.lock` wasn't updated) 299 | 300 | ### 1.2.3: 2014-04-16 301 | 302 | * Update to WordPress 3.9 303 | 304 | ### 1.2.2: 2014-04-14 305 | 306 | * Update to WordPress 3.8.3 307 | * Only run `Dotenv::load` if `.env` file exists 308 | 309 | ### 1.2.1: 2014-04-08 310 | 311 | * Update to WordPress 3.8.2 312 | 313 | ### 1.2.0: 2014-04-07 314 | 315 | * WP package now has `wordpress` vendor name: `wordpress/wordpress` 316 | * Remove wp-cli and add `wp-cli.yml` config 317 | 318 | ### 1.1.1: 2014-03-11 319 | 320 | * Update phpdotenv to 1.0.6 321 | * Update wp-cli to v0.14.1 322 | * Update README to refence new WordPress Packagist namespaces 323 | * Fix uploads path in `linked_dirs` for Capistrano deploys 324 | 325 | ### 1.1.0: 2014-03-01 326 | 327 | * Update to Capistrano 3.1.0: `deploy:restart` is no longer run by default 328 | * Better webroot structure: introduces the `/web` directory as the document/web root for web server vhosts 329 | 330 | ### 1.0.0: 2013-12-18 331 | 332 | * Initial release 333 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 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": "a9772e642055110fce9d72321a68b876", 8 | "packages": [ 9 | { 10 | "name": "composer/installers", 11 | "version": "v1.6.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/composer/installers.git", 15 | "reference": "cfcca6b1b60bc4974324efb5783c13dca6932b5b" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/composer/installers/zipball/cfcca6b1b60bc4974324efb5783c13dca6932b5b", 20 | "reference": "cfcca6b1b60bc4974324efb5783c13dca6932b5b", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "composer-plugin-api": "^1.0" 25 | }, 26 | "replace": { 27 | "roundcube/plugin-installer": "*", 28 | "shama/baton": "*" 29 | }, 30 | "require-dev": { 31 | "composer/composer": "1.0.*@dev", 32 | "phpunit/phpunit": "^4.8.36" 33 | }, 34 | "type": "composer-plugin", 35 | "extra": { 36 | "class": "Composer\\Installers\\Plugin", 37 | "branch-alias": { 38 | "dev-master": "1.0-dev" 39 | } 40 | }, 41 | "autoload": { 42 | "psr-4": { 43 | "Composer\\Installers\\": "src/Composer/Installers" 44 | } 45 | }, 46 | "notification-url": "https://packagist.org/downloads/", 47 | "license": [ 48 | "MIT" 49 | ], 50 | "authors": [ 51 | { 52 | "name": "Kyle Robinson Young", 53 | "email": "kyle@dontkry.com", 54 | "homepage": "https://github.com/shama" 55 | } 56 | ], 57 | "description": "A multi-framework Composer library installer", 58 | "homepage": "https://composer.github.io/installers/", 59 | "keywords": [ 60 | "Craft", 61 | "Dolibarr", 62 | "Eliasis", 63 | "Hurad", 64 | "ImageCMS", 65 | "Kanboard", 66 | "Lan Management System", 67 | "MODX Evo", 68 | "Mautic", 69 | "Maya", 70 | "OXID", 71 | "Plentymarkets", 72 | "Porto", 73 | "RadPHP", 74 | "SMF", 75 | "Thelia", 76 | "WolfCMS", 77 | "agl", 78 | "aimeos", 79 | "annotatecms", 80 | "attogram", 81 | "bitrix", 82 | "cakephp", 83 | "chef", 84 | "cockpit", 85 | "codeigniter", 86 | "concrete5", 87 | "croogo", 88 | "dokuwiki", 89 | "drupal", 90 | "eZ Platform", 91 | "elgg", 92 | "expressionengine", 93 | "fuelphp", 94 | "grav", 95 | "installer", 96 | "itop", 97 | "joomla", 98 | "kohana", 99 | "laravel", 100 | "lavalite", 101 | "lithium", 102 | "magento", 103 | "majima", 104 | "mako", 105 | "mediawiki", 106 | "modulework", 107 | "modx", 108 | "moodle", 109 | "osclass", 110 | "phpbb", 111 | "piwik", 112 | "ppi", 113 | "puppet", 114 | "pxcms", 115 | "reindex", 116 | "roundcube", 117 | "shopware", 118 | "silverstripe", 119 | "sydes", 120 | "symfony", 121 | "typo3", 122 | "wordpress", 123 | "yawik", 124 | "zend", 125 | "zikula" 126 | ], 127 | "time": "2018-08-27T06:10:37+00:00" 128 | }, 129 | { 130 | "name": "oscarotero/env", 131 | "version": "v1.2.0", 132 | "source": { 133 | "type": "git", 134 | "url": "https://github.com/oscarotero/env.git", 135 | "reference": "4ab45ce5c1f2c62549208426bfa20a3d5fa008c6" 136 | }, 137 | "dist": { 138 | "type": "zip", 139 | "url": "https://api.github.com/repos/oscarotero/env/zipball/4ab45ce5c1f2c62549208426bfa20a3d5fa008c6", 140 | "reference": "4ab45ce5c1f2c62549208426bfa20a3d5fa008c6", 141 | "shasum": "" 142 | }, 143 | "require": { 144 | "ext-ctype": "*", 145 | "php": ">=5.2" 146 | }, 147 | "type": "library", 148 | "autoload": { 149 | "psr-0": { 150 | "Env": "src/" 151 | } 152 | }, 153 | "notification-url": "https://packagist.org/downloads/", 154 | "license": [ 155 | "MIT" 156 | ], 157 | "authors": [ 158 | { 159 | "name": "Oscar Otero", 160 | "email": "oom@oscarotero.com", 161 | "homepage": "http://oscarotero.com", 162 | "role": "Developer" 163 | } 164 | ], 165 | "description": "Simple library to consume environment variables", 166 | "homepage": "https://github.com/oscarotero/env", 167 | "keywords": [ 168 | "env" 169 | ], 170 | "time": "2019-04-03T18:28:43+00:00" 171 | }, 172 | { 173 | "name": "phpoption/phpoption", 174 | "version": "1.5.0", 175 | "source": { 176 | "type": "git", 177 | "url": "https://github.com/schmittjoh/php-option.git", 178 | "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed" 179 | }, 180 | "dist": { 181 | "type": "zip", 182 | "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/94e644f7d2051a5f0fcf77d81605f152eecff0ed", 183 | "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed", 184 | "shasum": "" 185 | }, 186 | "require": { 187 | "php": ">=5.3.0" 188 | }, 189 | "require-dev": { 190 | "phpunit/phpunit": "4.7.*" 191 | }, 192 | "type": "library", 193 | "extra": { 194 | "branch-alias": { 195 | "dev-master": "1.3-dev" 196 | } 197 | }, 198 | "autoload": { 199 | "psr-0": { 200 | "PhpOption\\": "src/" 201 | } 202 | }, 203 | "notification-url": "https://packagist.org/downloads/", 204 | "license": [ 205 | "Apache2" 206 | ], 207 | "authors": [ 208 | { 209 | "name": "Johannes M. Schmitt", 210 | "email": "schmittjoh@gmail.com" 211 | } 212 | ], 213 | "description": "Option Type for PHP", 214 | "keywords": [ 215 | "language", 216 | "option", 217 | "php", 218 | "type" 219 | ], 220 | "time": "2015-07-25T16:39:46+00:00" 221 | }, 222 | { 223 | "name": "roots/wordpress", 224 | "version": "5.2.1", 225 | "source": { 226 | "type": "git", 227 | "url": "https://github.com/WordPress/WordPress.git", 228 | "reference": "5.2.1" 229 | }, 230 | "dist": { 231 | "type": "zip", 232 | "url": "https://api.github.com/repos/WordPress/WordPress/zipball/5.2.1", 233 | "reference": "5.2.1" 234 | }, 235 | "require": { 236 | "php": ">=5.3.2", 237 | "roots/wordpress-core-installer": ">=1.0.0" 238 | }, 239 | "type": "wordpress-core", 240 | "notification-url": "https://packagist.org/downloads/", 241 | "license": [ 242 | "GPL-2.0-or-later" 243 | ], 244 | "authors": [ 245 | { 246 | "name": "WordPress Community", 247 | "homepage": "https://wordpress.org/about/" 248 | } 249 | ], 250 | "description": "WordPress is web software you can use to create a beautiful website or blog.", 251 | "homepage": "https://wordpress.org/", 252 | "keywords": [ 253 | "blog", 254 | "cms", 255 | "wordpress" 256 | ], 257 | "time": "2019-05-21T19:53:10+00:00" 258 | }, 259 | { 260 | "name": "roots/wordpress-core-installer", 261 | "version": "1.1.0", 262 | "source": { 263 | "type": "git", 264 | "url": "https://github.com/roots/wordpress-core-installer.git", 265 | "reference": "83744b1ba5bbdb5bb225f47e24da61a6cf6c5b80" 266 | }, 267 | "dist": { 268 | "type": "zip", 269 | "url": "https://api.github.com/repos/roots/wordpress-core-installer/zipball/83744b1ba5bbdb5bb225f47e24da61a6cf6c5b80", 270 | "reference": "83744b1ba5bbdb5bb225f47e24da61a6cf6c5b80", 271 | "shasum": "" 272 | }, 273 | "require": { 274 | "composer-plugin-api": "^1.0" 275 | }, 276 | "conflict": { 277 | "composer/installers": "<1.0.6" 278 | }, 279 | "replace": { 280 | "johnpbloch/wordpress-core-installer": "*" 281 | }, 282 | "require-dev": { 283 | "composer/composer": "^1.0", 284 | "phpunit/phpunit": ">=4.8.35" 285 | }, 286 | "type": "composer-plugin", 287 | "extra": { 288 | "class": "Roots\\Composer\\WordPressCorePlugin" 289 | }, 290 | "autoload": { 291 | "psr-4": { 292 | "Roots\\Composer\\": "src/" 293 | } 294 | }, 295 | "notification-url": "https://packagist.org/downloads/", 296 | "license": [ 297 | "GPL-2.0-or-later" 298 | ], 299 | "authors": [ 300 | { 301 | "name": "John P. Bloch", 302 | "email": "me@johnpbloch.com" 303 | }, 304 | { 305 | "name": "Roots", 306 | "email": "team@roots.io" 307 | } 308 | ], 309 | "description": "A custom installer to handle deploying WordPress with composer", 310 | "keywords": [ 311 | "wordpress" 312 | ], 313 | "time": "2018-12-10T00:22:15+00:00" 314 | }, 315 | { 316 | "name": "roots/wp-config", 317 | "version": "1.0.0", 318 | "source": { 319 | "type": "git", 320 | "url": "https://github.com/roots/wp-config.git", 321 | "reference": "37c38230796119fb487fa03346ab0706ce6d4962" 322 | }, 323 | "dist": { 324 | "type": "zip", 325 | "url": "https://api.github.com/repos/roots/wp-config/zipball/37c38230796119fb487fa03346ab0706ce6d4962", 326 | "reference": "37c38230796119fb487fa03346ab0706ce6d4962", 327 | "shasum": "" 328 | }, 329 | "require": { 330 | "php": ">=5.6" 331 | }, 332 | "require-dev": { 333 | "php-coveralls/php-coveralls": "^2.1", 334 | "phpunit/phpunit": "^5.7", 335 | "roave/security-advisories": "dev-master", 336 | "squizlabs/php_codesniffer": "^3.3" 337 | }, 338 | "type": "library", 339 | "autoload": { 340 | "psr-4": { 341 | "Roots\\WPConfig\\": "src" 342 | } 343 | }, 344 | "notification-url": "https://packagist.org/downloads/", 345 | "license": [ 346 | "MIT" 347 | ], 348 | "authors": [ 349 | { 350 | "name": "Austin Pray", 351 | "email": "austin@austinpray.com" 352 | } 353 | ], 354 | "description": "Collect configuration values and safely define() them", 355 | "time": "2018-08-10T14:18:38+00:00" 356 | }, 357 | { 358 | "name": "roots/wp-password-bcrypt", 359 | "version": "1.0.0", 360 | "source": { 361 | "type": "git", 362 | "url": "https://github.com/roots/wp-password-bcrypt.git", 363 | "reference": "5cecd2e98ccc3193443cc5c5db9b3bc7abed5ffa" 364 | }, 365 | "dist": { 366 | "type": "zip", 367 | "url": "https://api.github.com/repos/roots/wp-password-bcrypt/zipball/5cecd2e98ccc3193443cc5c5db9b3bc7abed5ffa", 368 | "reference": "5cecd2e98ccc3193443cc5c5db9b3bc7abed5ffa", 369 | "shasum": "" 370 | }, 371 | "require": { 372 | "composer/installers": "~1.0", 373 | "php": ">=5.5.0" 374 | }, 375 | "require-dev": { 376 | "brain/monkey": "^1.3.1", 377 | "mockery/mockery": "^0.9.4", 378 | "phpunit/phpunit": "^4.8.23|^5.2.9", 379 | "squizlabs/php_codesniffer": "^2.5.1" 380 | }, 381 | "type": "library", 382 | "autoload": { 383 | "files": [ 384 | "wp-password-bcrypt.php" 385 | ] 386 | }, 387 | "notification-url": "https://packagist.org/downloads/", 388 | "license": [ 389 | "MIT" 390 | ], 391 | "authors": [ 392 | { 393 | "name": "Scott Walkinshaw", 394 | "email": "scott.walkinshaw@gmail.com", 395 | "homepage": "https://github.com/swalkinshaw" 396 | }, 397 | { 398 | "name": "qwp6t", 399 | "homepage": "https://github.com/qwp6t" 400 | }, 401 | { 402 | "name": "Jan Pingel", 403 | "email": "jpingel@bitpiston.com", 404 | "homepage": "http://janpingel.com" 405 | } 406 | ], 407 | "description": "WordPress plugin which replaces wp_hash_password and wp_check_password's phpass hasher with PHP 5.5's password_hash and password_verify using bcrypt.", 408 | "homepage": "https://roots.io/plugins/wp-password-bcrypt", 409 | "keywords": [ 410 | "wordpress wp bcrypt password" 411 | ], 412 | "time": "2016-03-01T16:27:06+00:00" 413 | }, 414 | { 415 | "name": "symfony/polyfill-ctype", 416 | "version": "v1.11.0", 417 | "source": { 418 | "type": "git", 419 | "url": "https://github.com/symfony/polyfill-ctype.git", 420 | "reference": "82ebae02209c21113908c229e9883c419720738a" 421 | }, 422 | "dist": { 423 | "type": "zip", 424 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", 425 | "reference": "82ebae02209c21113908c229e9883c419720738a", 426 | "shasum": "" 427 | }, 428 | "require": { 429 | "php": ">=5.3.3" 430 | }, 431 | "suggest": { 432 | "ext-ctype": "For best performance" 433 | }, 434 | "type": "library", 435 | "extra": { 436 | "branch-alias": { 437 | "dev-master": "1.11-dev" 438 | } 439 | }, 440 | "autoload": { 441 | "psr-4": { 442 | "Symfony\\Polyfill\\Ctype\\": "" 443 | }, 444 | "files": [ 445 | "bootstrap.php" 446 | ] 447 | }, 448 | "notification-url": "https://packagist.org/downloads/", 449 | "license": [ 450 | "MIT" 451 | ], 452 | "authors": [ 453 | { 454 | "name": "Symfony Community", 455 | "homepage": "https://symfony.com/contributors" 456 | }, 457 | { 458 | "name": "Gert de Pagter", 459 | "email": "BackEndTea@gmail.com" 460 | } 461 | ], 462 | "description": "Symfony polyfill for ctype functions", 463 | "homepage": "https://symfony.com", 464 | "keywords": [ 465 | "compatibility", 466 | "ctype", 467 | "polyfill", 468 | "portable" 469 | ], 470 | "time": "2019-02-06T07:57:58+00:00" 471 | }, 472 | { 473 | "name": "vlucas/phpdotenv", 474 | "version": "v3.3.3", 475 | "source": { 476 | "type": "git", 477 | "url": "https://github.com/vlucas/phpdotenv.git", 478 | "reference": "dbcc609971dd9b55f48b8008b553d79fd372ddde" 479 | }, 480 | "dist": { 481 | "type": "zip", 482 | "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/dbcc609971dd9b55f48b8008b553d79fd372ddde", 483 | "reference": "dbcc609971dd9b55f48b8008b553d79fd372ddde", 484 | "shasum": "" 485 | }, 486 | "require": { 487 | "php": "^5.4 || ^7.0", 488 | "phpoption/phpoption": "^1.5", 489 | "symfony/polyfill-ctype": "^1.9" 490 | }, 491 | "require-dev": { 492 | "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0" 493 | }, 494 | "type": "library", 495 | "extra": { 496 | "branch-alias": { 497 | "dev-master": "3.3-dev" 498 | } 499 | }, 500 | "autoload": { 501 | "psr-4": { 502 | "Dotenv\\": "src/" 503 | } 504 | }, 505 | "notification-url": "https://packagist.org/downloads/", 506 | "license": [ 507 | "BSD-3-Clause" 508 | ], 509 | "authors": [ 510 | { 511 | "name": "Vance Lucas", 512 | "email": "vance@vancelucas.com", 513 | "homepage": "http://www.vancelucas.com" 514 | } 515 | ], 516 | "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", 517 | "keywords": [ 518 | "dotenv", 519 | "env", 520 | "environment" 521 | ], 522 | "time": "2019-03-06T09:39:45+00:00" 523 | } 524 | ], 525 | "packages-dev": [ 526 | { 527 | "name": "roave/security-advisories", 528 | "version": "dev-master", 529 | "source": { 530 | "type": "git", 531 | "url": "https://github.com/Roave/SecurityAdvisories.git", 532 | "reference": "4c0ba8a35f1f12dd9236452e9fae4346b0bf2a56" 533 | }, 534 | "dist": { 535 | "type": "zip", 536 | "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/4c0ba8a35f1f12dd9236452e9fae4346b0bf2a56", 537 | "reference": "4c0ba8a35f1f12dd9236452e9fae4346b0bf2a56", 538 | "shasum": "" 539 | }, 540 | "conflict": { 541 | "3f/pygmentize": "<1.2", 542 | "adodb/adodb-php": "<5.20.12", 543 | "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", 544 | "amphp/artax": "<1.0.6|>=2,<2.0.6", 545 | "amphp/http": "<1.0.1", 546 | "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", 547 | "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", 548 | "aws/aws-sdk-php": ">=3,<3.2.1", 549 | "brightlocal/phpwhois": "<=4.2.5", 550 | "bugsnag/bugsnag-laravel": ">=2,<2.0.2", 551 | "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", 552 | "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", 553 | "cartalyst/sentry": "<=2.1.6", 554 | "codeigniter/framework": "<=3.0.6", 555 | "composer/composer": "<=1-alpha.11", 556 | "contao-components/mediaelement": ">=2.14.2,<2.21.1", 557 | "contao/core": ">=2,<3.5.39", 558 | "contao/core-bundle": ">=4,<4.4.39|>=4.5,<4.7.5", 559 | "contao/listing-bundle": ">=4,<4.4.8", 560 | "contao/newsletter-bundle": ">=4,<4.1", 561 | "david-garcia/phpwhois": "<=4.3.1", 562 | "doctrine/annotations": ">=1,<1.2.7", 563 | "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", 564 | "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", 565 | "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", 566 | "doctrine/doctrine-bundle": "<1.5.2", 567 | "doctrine/doctrine-module": "<=0.7.1", 568 | "doctrine/mongodb-odm": ">=1,<1.0.2", 569 | "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", 570 | "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", 571 | "dompdf/dompdf": ">=0.6,<0.6.2", 572 | "drupal/core": ">=7,<7.67|>=8,<8.6.16|>=8.7,<8.7.1", 573 | "drupal/drupal": ">=7,<7.67|>=8,<8.6.16|>=8.7,<8.7.1", 574 | "erusev/parsedown": "<1.7.2", 575 | "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.13.1|>=6,<6.7.9.1|>=6.8,<6.13.5.1|>=7,<7.2.4.1|>=7.3,<7.3.2.1", 576 | "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.12.3|>=2011,<2017.12.4.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3", 577 | "ezsystems/repository-forms": ">=2.3,<2.3.2.1", 578 | "ezyang/htmlpurifier": "<4.1.1", 579 | "firebase/php-jwt": "<2", 580 | "fooman/tcpdf": "<6.2.22", 581 | "fossar/tcpdf-parser": "<6.2.22", 582 | "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", 583 | "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", 584 | "fuel/core": "<1.8.1", 585 | "gree/jose": "<=2.2", 586 | "gregwar/rst": "<1.0.3", 587 | "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", 588 | "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", 589 | "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", 590 | "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", 591 | "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", 592 | "ivankristianto/phpwhois": "<=4.3", 593 | "james-heinrich/getid3": "<1.9.9", 594 | "joomla/session": "<1.3.1", 595 | "jsmitty12/phpwhois": "<5.1", 596 | "kazist/phpwhois": "<=4.2.6", 597 | "kreait/firebase-php": ">=3.2,<3.8.1", 598 | "la-haute-societe/tcpdf": "<6.2.22", 599 | "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", 600 | "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", 601 | "league/commonmark": "<0.18.3", 602 | "magento/magento1ce": "<1.9.4.1", 603 | "magento/magento1ee": ">=1.9,<1.14.4.1", 604 | "magento/product-community-edition": ">=2,<2.2.8|>=2.3,<2.3.1", 605 | "monolog/monolog": ">=1.8,<1.12", 606 | "namshi/jose": "<2.2", 607 | "onelogin/php-saml": "<2.10.4", 608 | "openid/php-openid": "<2.3", 609 | "oro/crm": ">=1.7,<1.7.4", 610 | "oro/platform": ">=1.7,<1.7.4", 611 | "padraic/humbug_get_contents": "<1.1.2", 612 | "pagarme/pagarme-php": ">=0,<3", 613 | "paragonie/random_compat": "<2", 614 | "paypal/merchant-sdk-php": "<3.12", 615 | "pear/archive_tar": "<1.4.4", 616 | "phpmailer/phpmailer": ">=5,<5.2.27|>=6,<6.0.6", 617 | "phpoffice/phpexcel": "<=1.8.1", 618 | "phpoffice/phpspreadsheet": "<=1.5", 619 | "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", 620 | "phpwhois/phpwhois": "<=4.2.5", 621 | "phpxmlrpc/extras": "<0.6.1", 622 | "propel/propel": ">=2-alpha.1,<=2-alpha.7", 623 | "propel/propel1": ">=1,<=1.7.1", 624 | "pusher/pusher-php-server": "<2.2.1", 625 | "robrichards/xmlseclibs": ">=1,<3.0.2", 626 | "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", 627 | "sensiolabs/connect": "<4.2.3", 628 | "serluck/phpwhois": "<=4.2.6", 629 | "shopware/shopware": "<5.3.7", 630 | "silverstripe/cms": ">=3,<=3.0.11|>=3.1,<3.1.11", 631 | "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", 632 | "silverstripe/framework": ">=3,<3.6.7|>=3.7,<3.7.3|>=4,<4.0.7|>=4.1,<4.1.5|>=4.2,<4.2.4|>=4.3,<4.3.1", 633 | "silverstripe/userforms": "<3", 634 | "simple-updates/phpwhois": "<=1", 635 | "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", 636 | "simplesamlphp/simplesamlphp": "<1.15.2|>=1.16,<1.16.3", 637 | "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", 638 | "slim/slim": "<2.6", 639 | "smarty/smarty": "<3.1.33", 640 | "socalnick/scn-social-auth": "<1.15.2", 641 | "spoonity/tcpdf": "<6.2.22", 642 | "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", 643 | "stormpath/sdk": ">=0,<9.9.99", 644 | "swiftmailer/swiftmailer": ">=4,<5.4.5", 645 | "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", 646 | "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", 647 | "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", 648 | "sylius/sylius": ">=1,<1.1.18|>=1.2,<1.2.17|>=1.3,<1.3.12|>=1.4,<1.4.4", 649 | "symfony/cache": ">=3.2,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 650 | "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 651 | "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", 652 | "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 653 | "symfony/http-foundation": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 654 | "symfony/http-kernel": ">=2,<2.3.29|>=2.4,<2.5.12|>=2.6,<2.6.8", 655 | "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", 656 | "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 657 | "symfony/polyfill": ">=1,<1.10", 658 | "symfony/polyfill-php55": ">=1,<1.10", 659 | "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 660 | "symfony/routing": ">=2,<2.0.19", 661 | "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 662 | "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", 663 | "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", 664 | "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", 665 | "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", 666 | "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 667 | "symfony/serializer": ">=2,<2.0.11", 668 | "symfony/symfony": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 669 | "symfony/translation": ">=2,<2.0.17", 670 | "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", 671 | "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", 672 | "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", 673 | "tecnickcom/tcpdf": "<6.2.22", 674 | "thelia/backoffice-default-template": ">=2.1,<2.1.2", 675 | "thelia/thelia": ">=2.1-beta.1,<2.1.3", 676 | "theonedemon/phpwhois": "<=4.2.5", 677 | "titon/framework": ">=0,<9.9.99", 678 | "truckersmp/phpwhois": "<=4.3.1", 679 | "twig/twig": "<1.38|>=2,<2.7", 680 | "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.25|>=9,<9.5.6", 681 | "typo3/cms-core": ">=8,<8.7.25|>=9,<9.5.6", 682 | "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", 683 | "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", 684 | "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", 685 | "ua-parser/uap-php": "<3.8", 686 | "wallabag/tcpdf": "<6.2.22", 687 | "willdurand/js-translation-bundle": "<2.1.1", 688 | "yiisoft/yii": ">=1.1.14,<1.1.15", 689 | "yiisoft/yii2": "<2.0.15", 690 | "yiisoft/yii2-bootstrap": "<2.0.4", 691 | "yiisoft/yii2-dev": "<2.0.15", 692 | "yiisoft/yii2-elasticsearch": "<2.0.5", 693 | "yiisoft/yii2-gii": "<2.0.4", 694 | "yiisoft/yii2-jui": "<2.0.4", 695 | "yiisoft/yii2-redis": "<2.0.8", 696 | "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", 697 | "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", 698 | "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", 699 | "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", 700 | "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", 701 | "zendframework/zend-diactoros": ">=1,<1.8.4", 702 | "zendframework/zend-feed": ">=1,<2.10.3", 703 | "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", 704 | "zendframework/zend-http": ">=1,<2.8.1", 705 | "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", 706 | "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", 707 | "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", 708 | "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", 709 | "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", 710 | "zendframework/zend-validator": ">=2.3,<2.3.6", 711 | "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", 712 | "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", 713 | "zendframework/zendframework": "<2.5.1", 714 | "zendframework/zendframework1": "<1.12.20", 715 | "zendframework/zendopenid": ">=2,<2.0.2", 716 | "zendframework/zendxml": ">=1,<1.0.1", 717 | "zetacomponents/mail": "<1.8.2", 718 | "zf-commons/zfc-user": "<1.2.2", 719 | "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", 720 | "zfr/zfr-oauth2-server-module": "<0.1.2" 721 | }, 722 | "type": "metapackage", 723 | "notification-url": "https://packagist.org/downloads/", 724 | "license": [ 725 | "MIT" 726 | ], 727 | "authors": [ 728 | { 729 | "name": "Marco Pivetta", 730 | "email": "ocramius@gmail.com", 731 | "role": "maintainer" 732 | } 733 | ], 734 | "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", 735 | "time": "2019-05-23T20:42:12+00:00" 736 | }, 737 | { 738 | "name": "squizlabs/php_codesniffer", 739 | "version": "3.4.2", 740 | "source": { 741 | "type": "git", 742 | "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", 743 | "reference": "b8a7362af1cc1aadb5bd36c3defc4dda2cf5f0a8" 744 | }, 745 | "dist": { 746 | "type": "zip", 747 | "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/b8a7362af1cc1aadb5bd36c3defc4dda2cf5f0a8", 748 | "reference": "b8a7362af1cc1aadb5bd36c3defc4dda2cf5f0a8", 749 | "shasum": "" 750 | }, 751 | "require": { 752 | "ext-simplexml": "*", 753 | "ext-tokenizer": "*", 754 | "ext-xmlwriter": "*", 755 | "php": ">=5.4.0" 756 | }, 757 | "require-dev": { 758 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" 759 | }, 760 | "bin": [ 761 | "bin/phpcs", 762 | "bin/phpcbf" 763 | ], 764 | "type": "library", 765 | "extra": { 766 | "branch-alias": { 767 | "dev-master": "3.x-dev" 768 | } 769 | }, 770 | "notification-url": "https://packagist.org/downloads/", 771 | "license": [ 772 | "BSD-3-Clause" 773 | ], 774 | "authors": [ 775 | { 776 | "name": "Greg Sherwood", 777 | "role": "lead" 778 | } 779 | ], 780 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 781 | "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", 782 | "keywords": [ 783 | "phpcs", 784 | "standards" 785 | ], 786 | "time": "2019-04-10T23:49:02+00:00" 787 | } 788 | ], 789 | "aliases": [], 790 | "minimum-stability": "stable", 791 | "stability-flags": { 792 | "roave/security-advisories": 20 793 | }, 794 | "prefer-stable": false, 795 | "prefer-lowest": false, 796 | "platform": { 797 | "php": ">=7.1", 798 | "ext-gd": "*", 799 | "ext-mbstring": "*" 800 | }, 801 | "platform-dev": [] 802 | } 803 | -------------------------------------------------------------------------------- /web/app/themes/sage/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### 9.0.9: February 13th, 2019 2 | * Update to Bootstrap 4.3.1 ([#2153](https://github.com/roots/sage/pull/2153)) 3 | 4 | ### 9.0.8: February 11th, 2019 5 | * Update to Bootstrap 4.3.0 ([#2152](https://github.com/roots/sage/pull/2152)) 6 | * Filter template hierarchy for embed templates ([#2145](https://github.com/roots/sage/pull/2145)) 7 | * Decrease optipng level ([#2143](https://github.com/roots/sage/pull/2143)) 8 | * Unescape post titles ([#2141](https://github.com/roots/sage/pull/2141)) 9 | 10 | ### 9.0.7: December 28th, 2018 11 | * Update sage-installer which now allows to opt-in for sending framework selection data ([#2137](https://github.com/roots/sage/pull/2137)) 12 | 13 | ### 9.0.6: December 21st, 2018 14 | * Update to Bootstrap 4.2.1 ([#2136](https://github.com/roots/sage/pull/2136)) 15 | * Do not ignore vendors for plugins ([#2132](https://github.com/roots/sage/pull/2132)) 16 | * Fix stylelint and eslint validation errors ([#2131](https://github.com/roots/sage/pull/2131)) 17 | * Hook run sequence fix ([#2123](https://github.com/roots/sage/pull/2123)) 18 | * Dispatch event when firing routes ([#2080](https://github.com/roots/sage/pull/2080)) 19 | * Normalize and enforce single quotes ([#2076](https://github.com/roots/sage/pull/2076)) 20 | 21 | ### 9.0.5: September 17th, 2018 22 | * Workaround for Bootstrap incompatibility with webpack. Fixes #2017 ([e72b490](https://github.com/roots/sage/commit/e72b4906264551dc00cd0890de74ae2bce0d77c8)) 23 | 24 | ### 9.0.4: September 7th, 2018 25 | * Force `illuminate/support` to `5.6.*` ([#2112](https://github.com/roots/sage/pull/2112)) 26 | 27 | ### 9.0.3: September 7th, 2018 28 | * Revert "Add searchform partial and function to replace default WordPress functionality" ([#2110](https://github.com/roots/sage/pull/2110)) 29 | * Unescape get_language_attributes() ([#2108](https://github.com/roots/sage/pull/2108)) 30 | * Add data from controller to comments template ([#2100](https://github.com/roots/sage/pull/2100)) 31 | 32 | ### 9.0.2: August 21st, 2018 33 | * Update to Bootstrap 4.1.3 ([#2097](https://github.com/roots/sage/pull/2097)) 34 | * Comments template fix ([#2095](https://github.com/roots/sage/pull/2095)) 35 | * UglifyJs: Change the ecma option from 8 to 5 ([#2092](https://github.com/roots/sage/pull/2092)) 36 | * Add searchform partial and function to replace default WordPress functionality ([#2090](https://github.com/roots/sage/pull/2090)) 37 | * Change language_attributes() to get_language_attributes() ([#2089](https://github.com/roots/sage/pull/2089)) 38 | * Fix missing comment-reply JS ([#2085](https://github.com/roots/sage/pull/2085)) 39 | * Use better merge method for Webpack Preset config ([#2084](https://github.com/roots/sage/pull/2084)) 40 | * Add support for preset specific Webpack config ([#2083](https://github.com/roots/sage/pull/2083)) 41 | * Enable Sass comments and run prefixing before minification ([#2078](https://github.com/roots/sage/pull/2078)) 42 | * Set removeViewBox to 'false' in webpack's optimization settings ([#2075](https://github.com/roots/sage/pull/2075)) 43 | * Add uglifyjs plugin ([#2070](https://github.com/roots/sage/pull/2070)) 44 | * Make template() compatible with wp admin ([#2068](https://github.com/roots/sage/pull/2068)) 45 | * Upgrade to Controller 2.1.0 ([#2025](https://github.com/roots/sage/pull/2025)) 46 | 47 | ### 9.0.1: April 30th, 2018 48 | * Update to Bootstrap 4.1.1 ([#2065](https://github.com/roots/sage/pull/2065)) 49 | * Auto-detect `proxyUrl` scheme ([#2062](https://github.com/roots/sage/pull/2062)) 50 | * Bump to Laravel 5.6 ([#2061](https://github.com/roots/sage/pull/2061)) 51 | * Update to Bootstrap 4.1.0 ([#2056](https://github.com/roots/sage/pull/2056)) 52 | * Change inline `@php` directive to full form ([#2042](https://github.com/roots/sage/pull/2042)) 53 | * PHP 7.1.3+ is now required ([#2037](https://github.com/roots/sage/pull/2037)) 54 | 55 | ### 9.0.0: February 7th, 2018 56 | * Update to Bootstrap 4 ([#2015](https://github.com/roots/sage/pull/2015)) 57 | * Allow `no-console` development ([#2008](https://github.com/roots/sage/pull/2008)) 58 | * Move variables and Bootstrap lines to autoload ([#1993](https://github.com/roots/sage/pull/1993)) 59 | * Update controller examples ([#1986](https://github.com/roots/sage/pull/1986)) 60 | * Update to Bootstrap 4 Beta 2 ([#1981](https://github.com/roots/sage/pull/1981)) 61 | * Add friendly-errors-webpack-plugin ([#1961](https://github.com/roots/sage/pull/1961)) 62 | * Update to Controller 9.0.0-beta.4 ([#1959](https://github.com/roots/sage/pull/1959)) 63 | * Change default Controller path to `app/controllers/` ([#1954](https://github.com/roots/sage/pull/1954)) 64 | * Fix `lint:styles` task with cmd.exe ([#1955](https://github.com/roots/sage/pull/1955)) 65 | * Ensure template filenames are without path and extension ([#1941](https://github.com/roots/sage/pull/1941)) 66 | * Moved `title()` helper to `app.php` controller ([#1912](https://github.com/roots/sage/pull/1912)) 67 | * Fix `lint:styles` script not matching files in deep subdirectories ([#1951](https://github.com/roots/sage/pull/1951)) 68 | * Fix for plugins that don't enqueue their scripts properly ([#1949](https://github.com/roots/sage/pull/1949)) 69 | * Fix Popper for Bootstrap 4 ([#1946](https://github.com/roots/sage/pull/1946)) 70 | 71 | ### 9.0.0-beta.4: August 11th, 2017 72 | * Update to Bootstrap 4.0.0-beta ([#1943](https://github.com/roots/sage/pull/1943)) 73 | * PHP 7+ is now required ([#1935](https://github.com/roots/sage/pull/1935)) 74 | * Update dependencies, support `config-local.json`, implement autoload system for styles/scripts, use `roots/sage-installer`, use `roots/sage-lib` ([#1919](https://github.com/roots/sage/pull/1919)) 75 | * Add soberwp/controller ([#1903](https://github.com/roots/sage/pull/1903)) 76 | * Change syntax of template call to match other files in views ([#1908](https://github.com/roots/sage/pull/1908)) 77 | * Add Tachyons as a CSS framework option ([#1867](https://github.com/roots/sage/pull/1867)) 78 | * Remove post format reference in template call ([#1904](https://github.com/roots/sage/pull/1904)) 79 | * Update inline documentation to reflect correct theme file locations ([#1890](https://github.com/roots/sage/pull/1890)) 80 | * Optimize CSS Assets safe = true ([#1901](https://github.com/roots/sage/pull/1901)) 81 | * Update Autoprefixer and standardize browserlist location ([#1899](https://github.com/roots/sage/pull/1899)) 82 | * Do not redirect for WP-CLI ([#1891](https://github.com/roots/sage/pull/1891)) 83 | * Illuminate: container make with parameters ([#1888](https://github.com/roots/sage/pull/1888)) 84 | * Add Stylelint for linting stylesheets ([#1885](https://github.com/roots/sage/pull/1885)) 85 | 86 | ### 9.0.0-beta.3: April 21st, 2017 87 | * Move required theme files to `sage/resources` ([#1877](https://github.com/roots/sage/pull/1877)) 88 | * Move `src/` to `app/` ([#1868](https://github.com/roots/sage/pull/1868)) 89 | * Move `templates/` to `resources/views/`, move `assets/` to `resources/assets/`, rename `base.blade.php` to `app.blade.php` ([#1864](https://github.com/roots/sage/pull/1864)) 90 | * Add option to configure build settings ([#1822](https://github.com/roots/sage/pull/1822)) 91 | * Add support for HTML injection ([#1817](https://github.com/roots/sage/pull/1817)) 92 | * Add Tachyons as a CSS framework option ([#1867](https://github.com/roots/sage/pull/1867)) 93 | 94 | ### 9.0.0-beta.2: January 19th, 2017 95 | * Fix Browersync ([#1815](https://github.com/roots/sage/pull/1815)) 96 | * Add option to select CSS framework, add Foundation as an option ([#1813](https://github.com/roots/sage/pull/1813)) 97 | * Add option to add Font Awesome ([#1812](https://github.com/roots/sage/pull/1812)) 98 | * Add option to change theme file headers ([#1811](https://github.com/roots/sage/pull/1811)) 99 | * Add option to remove Bootstrap ([#1810](https://github.com/roots/sage/pull/1810)) 100 | * Remove Font Awesome ([#1809](https://github.com/roots/sage/pull/1809)) 101 | * Remove grid defaults ([#1808](https://github.com/roots/sage/pull/1808)) 102 | * Fix for `publicPath` ([#1806](https://github.com/roots/sage/pull/1806)) 103 | * Update clean task name ([#1800](https://github.com/roots/sage/pull/1800)) 104 | * Allow browser versions to be configured in `config.json` ([#1798](https://github.com/roots/sage/pull/1798)) 105 | * Use stock ESLint ([#1796](https://github.com/roots/sage/pull/1796)) 106 | 107 | ### 9.0.0-beta.1: January 10th, 2017 108 | * Update to Bootstrap 4 Alpha 6 ([#1792](https://github.com/roots/sage/pull/1792)) 109 | * Add Blade ([#1765](https://github.com/roots/sage/pull/1765) and [#1777](https://github.com/roots/sage/pull/1777)) 110 | * Remove sidebar defaults ([#1760](https://github.com/roots/sage/pull/1760)) 111 | * Remove post formats ([#1759](https://github.com/roots/sage/pull/1759)) 112 | 113 | ### 9.0.0-alpha.4: November 16th, 2016 114 | * Use new webpack api schema ([8ac5f15](https://github.com/roots/sage/commit/e6e60aa)) 115 | * Update dependencies ([70ebba7](https://github.com/roots/sage/commit/70ebba7)) 116 | * Variables organization ([8ac5f15](https://github.com/roots/sage/commit/8ac5f15)) 117 | * Use `$.fn.ready()` (reverts [724d550](https://github.com/roots/sage/commit/724d550)) ([e7fccbe](https://github.com/roots/sage/commit/e7fccbe)) 118 | * Theme activation updates 'stylesheet' option instead of 'template' ([fb19145](https://github.com/roots/sage/commit/fb19145)) 119 | * Reorganize and refactor build routine ([8c9ba05](https://github.com/roots/sage/commit/8c9ba05)) 120 | * Switch assets manifest plugin ([c1bb2b3](https://github.com/roots/sage/commit/c1bb2b3)) 121 | * Add images to assets manifest ([c49793c](https://github.com/roots/sage/commit/c49793c)) 122 | * Switch from babel to buble ([0d38ab8](https://github.com/roots/sage/commit/0d38ab8)) 123 | * Update dependencies & webpack compatibility ([eae52fd](https://github.com/roots/sage/commit/eae52fd)) 124 | * Use http by default (not https) to be consistent with Trellis ([e6f2f49](https://github.com/roots/sage/commit/e6f2f49)) 125 | 126 | ### 9.0.0-alpha.3: September 11th, 2016 127 | * Fix webpack HMR ([#1713](https://github.com/roots/sage/issues/1713)) 128 | * Remove minor edits from CHANGELOG.md ([3516629](https://github.com/roots/sage/commit/3516629)) 129 | 130 | ### 9.0.0-alpha.2: September 4th, 2016 131 | * Refactor build routine ([#1703](https://github.com/roots/sage/pull/1703)) 132 | * Update `_grid.scss` to use `@include make-col-ready()` mixin ([#1706](https://github.com/roots/sage/pull/1706)) 133 | 134 | ### 9.0.0-alpha.1: August 30th, 2016 135 | * Move assets found in `node_modules/` to `dist/vendor`, simpler `assets/config.json` ([#1697](https://github.com/roots/sage/pull/1697)) 136 | * Set dynamically absolute public path ([#1696](https://github.com/roots/sage/pull/1696)) 137 | * Load Tether ([#1686](https://github.com/roots/sage/pull/1686)) 138 | * Squash asset pipeline bugs ([4d58f88](https://github.com/roots/sage/commit/4d58f88)) 139 | * Update dependencies, incl Bootstrap 4 alpha 3 ([447c24d](https://github.com/roots/sage/commit/447c24d)) 140 | * Fix path to stylesheet in `add_editor_style` ([#1684](https://github.com/roots/sage/pull/1684)) 141 | * Update required Node.js version ([72b2d89](https://github.com/roots/sage/commit/72b2d89)) 142 | * Router doesn't require jQuery, use default params ([339cc8e](https://github.com/roots/sage/commit/339cc8e)) 143 | * Fix display of theme name in Customizer ([3425386](https://github.com/roots/sage/commit/3425386)) 144 | * Convert scripts to ES6 ([f34af48](https://github.com/roots/sage/commit/f34af48)) 145 | * Refactor functions.php ([eae36be](https://github.com/roots/sage/commit/eae36be)) 146 | * Rework template wrapper, bring back template_part() ([#1678](https://github.com/roots/sage/pull/1678)) 147 | * Remove unused static variable in Wrapper ([9bfdd5a](https://github.com/roots/sage/commit/9bfdd5a)) 148 | * Remove `path.extname()` check ([#1673](https://github.com/roots/sage/pull/1673)) 149 | * Updated to align with the Bootstrap 4 docs ([#1667](https://github.com/roots/sage/pull/1667)) 150 | * Add `npm prune` to Travis CI ([#1663](https://github.com/roots/sage/pull/1663)) 151 | * Bootstrap NPM ^4.0.0-alpha.2 ([#1650](https://github.com/roots/sage/pull/1650)) 152 | * Fix Bootstrap 4 styles ([#1642](https://github.com/roots/sage/pull/1642)) 153 | * Fix autoloader load order issue when including Sage 9 via composer.json in Bedrock ([#1628](https://github.com/roots/sage/pull/1628)) 154 | * `is_page_template()` requires the name of the subfolder ([#1626](https://github.com/roots/sage/pull/1626)) 155 | * Webpack config improvements ([#1629](https://github.com/roots/sage/pull/1629)) 156 | * Webpack implementation improvements ([#1627](https://github.com/roots/sage/pull/1627)) 157 | * Webpack implementation ([#1625](https://github.com/roots/sage/pull/1625)) 158 | * Fix BS4 grid after their grid updates ([5551dde](https://github.com/roots/sage/commit/5551dde)) 159 | * Pass the correct template ([856a482](https://github.com/roots/sage/commit/856a482)) 160 | * Optimize travis a bit ([b42c425](https://github.com/roots/sage/commit/b42c425)) 161 | * Move single-post loop to single.php, closes #1582 ([6efa099](https://github.com/roots/sage/commit/6efa099)) 162 | * All function braces need to be on new line ([b491f76](https://github.com/roots/sage/commit/b491f76)) 163 | * Fix issue with WP loading wrong index.php ([9e2917e](https://github.com/roots/sage/commit/9e2917e)) 164 | * Use 4 spaces for `src/*.php` ([fe659f4](https://github.com/roots/sage/commit/fe659f4)) 165 | * Use phpcs.xml for all rules ([246955c](https://github.com/roots/sage/commit/246955c)) 166 | * Conform to new rules ([6a4d3bd](https://github.com/roots/sage/commit/6a4d3bd)) 167 | * Create new phpcs rules ([2d02544](https://github.com/roots/sage/commit/2d02544)) 168 | * Remove Template class ([1df3fee](https://github.com/roots/sage/commit/1df3fee)) 169 | * Remove closure from sidebar registration ([12d6ac3](https://github.com/roots/sage/commit/12d6ac3)) 170 | * Remove sage.pot ([d4461fa](https://github.com/roots/sage/commit/d4461fa)) 171 | * Remove template_part, template_sidebar, temp sidebar fix ([abeea0f](https://github.com/roots/sage/commit/abeea0f)) 172 | * Update asset handles ([fa0e51f](https://github.com/roots/sage/commit/fa0e51f)) 173 | * Remove comment-reply JS ([d217ba6](https://github.com/roots/sage/commit/d217ba6)) 174 | * Update node in travis, remove unsupported php ([8712dc8](https://github.com/roots/sage/commit/8712dc8)) 175 | * Update dependencies, switch to eslint ([e51e41e](https://github.com/roots/sage/commit/e51e41e)) 176 | * Bootstrap 4 ([c9ef232](https://github.com/roots/sage/commit/c9ef232)) 177 | * Fix: page title not displaying ([9283bbb](https://github.com/roots/sage/commit/9283bbb)) 178 | * Rename interfaces, unset after unwrapping ([97906e9](https://github.com/roots/sage/commit/97906e9)) 179 | * Restructure theme, use autoloader ([9eaffa3](https://github.com/roots/sage/commit/9eaffa3a2d4df462dd8020a10551334208bd32a3)) 180 | 181 | ### 8.5.0: September 20th, 2016 182 | * Update installation instructions 183 | * Update dependencies 184 | * Update to Bootstrap 4.0.0-alpha.4 ([5eb01fd](https://github.com/roots/sage/commit/5eb01fd0319a7b6576e31579dc50e16b023abb74)) 185 | 186 | ### 8.4.2: February 19th, 2016 187 | * Add Composer vendor directory to gitignore ([#1618](https://github.com/roots/sage/issues/1618)) 188 | * Fix build test by removing trailing space ([#1617](https://github.com/roots/sage/issues/1617)) 189 | * Replace deprecated gulp-minify-css with gulp-cssnano ([#1610](https://github.com/roots/sage/issues/1610)) 190 | 191 | ### 8.4.1: January 27th, 2016 192 | * Add `composer.json` and update installation instructions ([#1583](https://github.com/roots/sage/issues/1583)) 193 | 194 | ### 8.4.0: December 1st, 2015 195 | * Update to Bootstrap 3.3.6 ([#1578](https://github.com/roots/sage/pull/1578)) 196 | * Remove unnecessary underscore ([#1577](https://github.com/roots/sage/pull/1577)) 197 | * Drop support for older browsers ([#1571](https://github.com/roots/sage/pull/1571)) 198 | * Add support for theme customizer ([#1573](https://github.com/roots/sage/pull/1573)) 199 | * Remove extraneous no-js ([#1562](https://github.com/roots/sage/pull/1562)) 200 | * Simplify/speed up editor style process ([#1560](https://github.com/roots/sage/pull/1560)) 201 | 202 | ### 8.3.0: October 13th, 2015 203 | * Setup organization ([#1558](https://github.com/roots/sage/pull/1558)) 204 | * Remove redundancy with WAI-ARIA in HTML ([#1557](https://github.com/roots/sage/pull/1557)) 205 | * Rename config.php to setup.php ([#1556](https://github.com/roots/sage/pull/1556)) 206 | * Move init.php to config.php ([#1555](https://github.com/roots/sage/pull/1555)) 207 | * Use Sass to style search form, remove search template ([#1545](https://github.com/roots/sage/pull/1545)) 208 | * Remove Modernizr ([#1541](https://github.com/roots/sage/pull/1541)) 209 | * Remove references to WP_ENV ([#1554](https://github.com/roots/sage/pull/1554)) 210 | * Use WP core's HTML5 gallery markup ([#1546](https://github.com/roots/sage/pull/1546)) 211 | * Use slash in handle names for theme CSS and JS ([#1537](https://github.com/roots/sage/pull/1537)) 212 | * Add compatibility with WooCommerce Multilingual plugin ([#1530](https://github.com/roots/sage/pull/1530)) 213 | * Remove ConditionalTagCheck class ([#1494](https://github.com/roots/sage/pull/1494)) 214 | * Add search templates ([#1459](https://github.com/roots/sage/issues/1459)) 215 | * Allow `debugger` statements in development JavaScript ([#1487](https://github.com/roots/sage/issues/1487)) 216 | 217 | ### 8.2.1: May 7th, 2015 218 | * Update BrowserSync ([#1457](https://github.com/roots/sage/issues/1457)) 219 | * Bump dependencies ([#1448](https://github.com/roots/sage/issues/1448)) 220 | * Allow revved files to resolve in development if they exist ([#1456](https://github.com/roots/sage/issues/1456)) 221 | * Disable advanced minification features to fix incorrect file path in compiled CSS ([#1452](https://github.com/roots/sage/issues/1452)) 222 | * Fix Glyphicon font path ([#1455](https://github.com/roots/sage/issues/1455)) 223 | 224 | ### 8.2.0: April 29th, 2015 225 | * Use Sass Bootstrap by default ([#1437](https://github.com/roots/sage/issues/1437)) 226 | * Remove nav walker and Bootstrap navbar ([#1427](https://github.com/roots/sage/issues/1427)) 227 | * Remove Bootstrap gallery ([#1421](https://github.com/roots/sage/issues/1421)) 228 | * Remove hardcoded feed link ([#1426](https://github.com/roots/sage/issues/1426)) 229 | * Move jQuery CDN feature to Soil ([#1422](https://github.com/roots/sage/issues/1422)) 230 | * Bump `gulp-load-plugins` to 0.10.0 ([#1419](https://github.com/roots/sage/issues/1419)) 231 | * Switch from [yargs](https://github.com/bcoe/yargs) to [minimist](https://github.com/substack/minimist) ([#1418](https://github.com/roots/sage/issues/1418)) 232 | * Remove `$content_width` ([#1417](https://github.com/roots/sage/issues/1417)) 233 | * Lowercase `X-UA-Compatible` ([#1409](https://github.com/roots/sage/issues/1409)) 234 | * Remove mention of Google Analytics from the config ([#1384](https://github.com/roots/sage/issues/1384)) 235 | 236 | ### 8.1.1: March 31st, 2015 237 | * Remove pleeease dependency in favor of vanilla gulp-autoprefixer and gulp-minify-css ([#1402](https://github.com/roots/sage/issues/1402)) 238 | * Fix `gulp --production` race condition ([#1398](https://github.com/roots/sage/issues/1398)) 239 | * Update to Bootstrap 3.3.4 ([#1387](https://github.com/roots/sage/issues/1387)) 240 | 241 | ### 8.1.0: March 13th, 2015 242 | * Move HTML5 Boilerplate's Google Analytics snippet to Soil ([#1382](https://github.com/roots/sage/issues/1382)) 243 | * Run `gulp build` if `bower.json` is changed ([#1378](https://github.com/roots/sage/issues/1378)) 244 | * Remove namespace from base.php ([#1372](https://github.com/roots/sage/issues/1372)) 245 | * Allow build directory to be customized ([#1352](https://github.com/roots/sage/issues/1352), [#1366](https://github.com/roots/sage/issues/1366)) 246 | * Update ConditionalTagCheck and usage docs ([#1365](https://github.com/roots/sage/issues/1365)) 247 | * Change default gallery columns to 3 ([#1364](https://github.com/roots/sage/issues/1364)) 248 | * Apply `script_loader_src` filter to jQuery fallback ([#1363](https://github.com/roots/sage/issues/1363)) 249 | 250 | ### 8.0.1: February 26th, 2015 251 | * Update asset-builder version to fix Windows compatibility ([#1351](https://github.com/roots/sage/issues/1351)) 252 | * Fix broken wiredep imports with main.scss.example ([Discussion](https://discourse.roots.io/t/issue-with-sage-sass-version/2962)) 253 | 254 | ### 8.0.0: February 25th, 2015 255 | * Change theme name from Roots to Sage 256 | * Bump required PHP version to >=5.4 257 | * Add coding standards based on PSR-2 258 | * Add Travis CI 259 | * Add namespace 260 | * Use short array syntax 261 | * Use short echo syntax 262 | * Switch from Grunt to gulp, new front-end development workflow 263 | * Switch from Livereload to [BrowserSync](http://www.browsersync.io/) 264 | * Use wiredep for Sass and Less injection 265 | * Implement JSON file based asset pipeline with [asset-builder](https://github.com/austinpray/asset-builder) 266 | * Re-organize asset file structure 267 | * Re-organize stylesheet file structure 268 | * Add main.scss.example and instructions for using Sass 269 | * Use the primary theme stylesheet for the editor stylesheet 270 | * Remove theme activation, move to [wp-cli-theme-activation](https://github.com/roots/wp-cli-theme-activation) 271 | * Simplify 404 page 272 | * Convert Sidebar to ConditionalTagCheck 273 | * Update to jQuery 1.11.2 274 | * Use new core navigation template tag 275 | * Update sidebar to fix default template check 276 | * Update nav walker to correctly assign `active` classes for custom post types 277 | * Better support for CPT templates 278 | 279 | ### 7.0.3: December 18th, 2014 280 | * Use `get_the_archive_title` 281 | * Remove `wp_title`, add title-tag theme support 282 | * Remove `Roots_Nav_Walker` as default for all menus 283 | * Update to Bootstrap 3.3.1 284 | * Add some base comment styling 285 | * Make search term `required` in search form 286 | 287 | ### 7.0.2: October 24th, 2014 288 | * Simplify comments, use core comment form and list 289 | * Remove HTML5 shiv from Modernizr build 290 | * Move JavaScript to footer 291 | * Update hEntry schema to use `updated` instead of `published` 292 | * Move variables into `main.less` 293 | * Add `roots_body_class` function that checks for page slug in `body_class` 294 | * Move `wp_footer` from footer template into `base.php` 295 | 296 | ### 7.0.1: August 15th, 2014 297 | * Move `
` and `.sidebar` markup out of PHP and into LESS 298 | * Define `WP_ENV` if it is not already defined 299 | * Only load Google Analytics in production environment 300 | 301 | ### 7.0.0: July 3rd, 2014 302 | * Updated Grunt workflow 303 | * Use grunt-modernizr to make a lean Modernizr build 304 | * Use Bower for front-end package management 305 | * Update to Bootstrap 3.2.0 306 | * Update to Modernizr 2.8.2 307 | * Update to jQuery 1.11.1 308 | * Move clean up, relative URLs, and nice search to [Soil](https://github.com/roots/soil) 309 | * Update LESS organization 310 | * Move [community translations](https://github.com/roots/roots-translations) to separate repository 311 | 312 | ### 6.5.2: February 4th, 2014 313 | * Update to Bootstrap 3.1.0 314 | * Move DOM routing into an anonymous function to support jQuery noConflict 315 | * Update to jQuery 1.11.0 316 | * Add notice to theme activation, tidy activation table markup 317 | * Remove changing media folder from theme activation (use [Bedrock](https://github.com/roots/bedrock) for clean URLs out of the box) 318 | * Switch `div.main` to `main` element now that Modernizr uses the latest HTML5 Shiv 319 | * Update to Modernizr 2.7.0 320 | * Don't run JSHint on plugins (`assets/js/plugins/`) 321 | * Disable warnings about undefined variables (JSHint) 322 | * Merge in updates from HTML5 Boilerplate 323 | * Add JS source map (disabled by default) 324 | * Replace `grunt-recess` with `grunt-contrib-less`, add LESS source map support 325 | 326 | ### 6.5.1: November 5th, 2013 327 | * Move clean URLs to a [plugin](https://github.com/roots/roots-rewrites) 328 | * Update to Bootstrap 3.0.1 329 | 330 | ### 6.5.0: August 23rd, 2013 331 | * Reference new site, [http://roots.io/](http://roots.io/) 332 | * Remove bundled docs, reference [http://roots.io/docs/](http://roots.io/docs/) 333 | * Use Bootstrap variables for media queries 334 | * Update to Bootstrap 3.0.0 335 | * Update to jQuery 1.10.2 336 | * Change media directory from `/assets/` to `/media/` 337 | * Update to Google Universal Analytics 338 | * Show author display name for author archives 339 | * Add Serbian translation 340 | * Remove post tags from templates 341 | * Remove TinyMCE valid elements tweaks (no longer necessary) 342 | * Remove additional widget classes 343 | * Move `/assets/css/less/` to `/assets/less/` 344 | * Add wrapper templates filter 345 | * Fix relative external URLs issue 346 | 347 | ### 6.4.0: May 1st, 2013 348 | * Fix Theme Activation page issues 349 | * Fix issues with root relative URLs and rewrites on non-standard setups 350 | * Make sure rewrites are added to `.htaccess` immediately after activation 351 | * Move HTML5 Boilerplate's `.htaccess` to a [plugin](https://github.com/roots/wp-h5bp-htaccess) 352 | * Rename `page-custom.php` to `template-custom.php` 353 | * Don't warn about unwritable htaccess if that option is disabled 354 | * Add missing collapse class for top navbar 355 | * Add comment template 356 | * Update is_dropdown evaluation in nav walker 357 | * Re-organize archives template 358 | * Add missing comment ID 359 | * hNews consistency with entry-title class 360 | * Add `wp_title()` filter 361 | * Fix missing closing div in comments 362 | * Fix for navbar dropdowns 363 | * Add option for using jQuery on Google CDN 364 | * Correct logic in `roots_enable_root_relative_urls` 365 | * Add Greek translation, update Brazilian Portuguese translation 366 | * Update to Bootstrap 2.3.1 367 | * Simplify alerts 368 | * Remove disabled post nav links 369 | * Use Bootstrap media object for listing comments 370 | * Move Google Analytics to `lib/scripts.php` 371 | * Static top navbar instead of fixed 372 | 373 | ### 6.3.0: February 8th, 2013 374 | * Update to Bootstrap 2.3.0 375 | * Update to jQuery 1.9.1 376 | * Output author title with `get_the_author()` 377 | * Add EditorConfig 378 | * Update 404 template based on H5BP 379 | * Update H5BP's included .htaccess 380 | * Don't show comments on passworded posts 381 | * Add `do_action('get_header')` for WooSidebars compatibility 382 | * Simplify entry meta 383 | * Allow `get_search_form()` to be called more than once per request 384 | * Move plugins.js and main.js to footer 385 | * JavaScript clean up (everything is now enqueued) 386 | * Remove conditional feed 387 | * Introduce `add_theme_support('bootstrap-gallery')` 388 | * Rewrites organization (introduce `lib/rewrites.php`) 389 | * Fix `add_editor_style` path 390 | * Updated translations: French, Bulgarian, Turkish, Korean 391 | * Enable `add_theme_support` for Nice Search 392 | * Replace ID's with classes 393 | * Add support for dynamic sidebar templates 394 | * Fix PHP notice on search with no results 395 | * Update to jQuery 1.9.0 396 | 397 | ### 6.2.0: January 13th, 2013 398 | * Implement latest Nice Search 399 | * Update [gallery] shortcode 400 | * Add Simplified Chinese, Indonesian, Korean translations 401 | * Move template title to `lib/utils.php` 402 | * Update to Bootstrap 2.2.2 403 | * Update to jQuery 1.8.3 404 | * Use `entry-summary` class for excerpts per Readability's Article Publishing Guidelines 405 | * Cleanup/refactor `lib/activation.php` 406 | * Remove `lib/post-types.php` and `lib/metaboxes.php` 407 | * Make sure Primary Navigation menu always gets created and has the location set upon activation, update activation permalink method 408 | * Update to Bootstrap 2.2.1 409 | * Update conditional feed method 410 | * Update to Bootstrap 2.2.0 411 | * Return instead of echo class names in `roots_main_class` and `roots_sidebar_class` 412 | * Move nav customizations into `lib/nav.php` 413 | 414 | ### 6.1.0: October 2nd, 2012 415 | * Change roots_sidebar into a more explicit configuration array 416 | * Re-organize configuration/setup files 417 | * Update to jQuery 1.8.2 418 | * Refactor/simplify Roots vCard Widget 419 | * Move custom entry_meta code into template 420 | * Move Google Analytics code into footer template 421 | * Add CONTRIBUTING.md to assist with the new GitHub UI 422 | * Add nav walker support for CSS dividers and nav-header 423 | 424 | ### 6.0.0: September 16th, 2012 425 | * Simplify nav walker and support 3rd level dropdowns 426 | * Update to Bootstrap 2.1.1, jQuery 1.8.1, Modernizr 2.6.2 427 | * Add bundled docs 428 | * Update all templates to use [PHP Alternative Syntax](http://php.net/manual/en/control-structures.alternative-syntax.php) 429 | * Add MIT License 430 | * Implement scribu's [Theme Wrapper](http://scribu.net/wordpress/theme-wrappers.html) (see `base.php`) 431 | * Move `css/`, `img/`, and `js/` folders within a new `assets/` folder 432 | * Move templates, `comments.php`, and `searchform.php` to `templates/` folder 433 | * Rename `inc/` to `lib/` 434 | * Add placeholder `lib/post-types.php` and `lib/metaboxes.php` files 435 | * Rename `loop-` files to `content-` 436 | * Remove all hooks 437 | * Use `templates/page-header.php` for page titles 438 | * Use `head.php` for everything in `` 439 | 440 | ### 5.2.0: August 18th, 2012 441 | * Update to jQuery 1.8.0 and Modernizr 2.6.1 442 | * Fix duplicate active class in `wp_nav_menu` items 443 | * Merge `Roots_Navbar_Nav_Walker` into `Roots_Nav_Walker` 444 | * Add and update code documentation 445 | * Use `wp_get_theme()` to get the theme name on activation 446 | * Use `
` & `
` for captions 447 | * Wrap embedded media as suggested by Readability 448 | * Remove unnecessary `remove_action`'s on `wp_head` as of WordPress 3.2.1 449 | * Add updates from HTML5 Boilerplate 450 | * Remove well class from sidebar 451 | * Flush permalinks on activation to avoid 404s with clean URLs 452 | * Show proper classes on additional `wp_nav_menu()`'s 453 | * Clean up `inc/cleanup.php` 454 | * Remove old admin notice for tagline 455 | * Remove default tagline admin notice, hide from feed 456 | * Fix for duplicated classes in widget markup 457 | * Show title on custom post type archive template 458 | * Fix for theme preview in WordPress 3.3.2 459 | * Introduce `inc/config.php` with options for clean URLs, H5BP's `.htaccess`, root relative URLs, and Bootstrap features 460 | * Allow custom CSS classes in menus, walker cleanup 461 | * Remove WordPress version numbers from stylesheets 462 | * Don't include HTML5 Boilerplate's `style.css` by default 463 | * Allow `inc/htaccess.php` to work with Litespeed 464 | * Update to Bootstrap 2.0.4 465 | * Update Bulgarian translation 466 | * Don't use clean URLs with default permalink structure 467 | * Add translations for Catalan, Polish, Hungarian, Norwegian, Russian 468 | 469 | ### 5.1.0: April 14th, 2012 470 | * Various bugfixes for scripts, stylesheets, root relative URLs, clean URLs, and htaccess issues 471 | * Add a conditional feed link 472 | * Temporarily remove Gravity Forms customizations 473 | * Update to Bootstrap 2.0.2 474 | * Update `roots.pot` for translations 475 | * Add/update languages: Vietnamese, Swedish, Bulgarian, Turkish, Norwegian, Brazilian Portugese 476 | * Change widgets to use `
` instead of `
` 477 | * Add comment-reply.js 478 | * Remove optimized robots.txt 479 | * HTML5 Boilerplate, Modernizr, and jQuery updates 480 | 481 | ### 5.0.0: February 5th, 2012 482 | * Remove all frameworks except Bootstrap 483 | * Update to Bootstrap 2.0 484 | * Remove `roots-options.php` and replaced with a more simple `roots-config.php` 485 | * Now using Bootstrap markup on forms, page titles, image galleries, alerts and errors, post and comment navigation 486 | * Remove Roots styles from `style.css` and introduced `app.css` for site-specific CSS 487 | * Remove almost all previous default Roots styling 488 | * Latest updates from HTML5 Boilerplate 489 | 490 | ### 4.1.0: February 1st, 2012 491 | * Update translations 492 | * HTML5 Boilerplate updates 493 | * Fix for Server 500 errors 494 | * Add `roots-scripts.php`, now using `wp_enqueue_script` 495 | * Re-organize `roots-actions.php` 496 | * Allow `