Skip to content

Commit 14f93f5

Browse files
committedSep 11, 2022
Initial commit
0 parents  commit 14f93f5

29 files changed

+886
-0
lines changed
 

‎.editorconfig

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
root = true
2+
3+
[*]
4+
charset = utf-8
5+
indent_size = 4
6+
indent_style = space
7+
end_of_line = lf
8+
insert_final_newline = true
9+
trim_trailing_whitespace = true
10+
11+
[*.md]
12+
trim_trailing_whitespace = false
13+
14+
[*.{yml,yaml}]
15+
indent_size = 2

‎.gitattributes

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Path-based git attributes
2+
# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
3+
4+
# Ignore all test and documentation with "export-ignore".
5+
/.github export-ignore
6+
/.gitattributes export-ignore
7+
/.gitignore export-ignore
8+
/phpunit.xml.dist export-ignore
9+
/art export-ignore
10+
/docs export-ignore
11+
/tests export-ignore
12+
/.editorconfig export-ignore
13+
/.php_cs.dist.php export-ignore
14+
/psalm.xml export-ignore
15+
/psalm.xml.dist export-ignore
16+
/testbench.yaml export-ignore
17+
/UPGRADING.md export-ignore
18+
/phpstan.neon.dist export-ignore
19+
/phpstan-baseline.neon export-ignore

‎.github/ISSUE_TEMPLATE/config.yml

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
blank_issues_enabled: false
2+
contact_links:
3+
- name: Ask a question
4+
url: https://github.com/:vendor_name/:package_name/discussions/new?category=q-a
5+
about: Ask the community for help
6+
- name: Request a feature
7+
url: https://github.com/:vendor_name/:package_name/discussions/new?category=ideas
8+
about: Share ideas for new features
9+
- name: Report a security issue
10+
url: https://github.com/:vendor_name/:package_name/security/policy
11+
about: Learn how to notify us for sensitive bugs
12+
- name: Report a bug
13+
url: https://github.com/:vendor_name/:package_name/issues/new
14+
about: Report a reproducible bug

‎.github/dependabot.yml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Please see the documentation for all configuration options:
2+
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
3+
4+
version: 2
5+
updates:
6+
7+
- package-ecosystem: "github-actions"
8+
directory: "/"
9+
schedule:
10+
interval: "weekly"
11+
labels:
12+
- "dependencies"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: dependabot-auto-merge
2+
on: pull_request_target
3+
4+
permissions:
5+
pull-requests: write
6+
contents: write
7+
8+
jobs:
9+
dependabot:
10+
runs-on: ubuntu-latest
11+
if: ${{ github.actor == 'dependabot[bot]' }}
12+
steps:
13+
14+
- name: Dependabot metadata
15+
id: metadata
16+
uses: dependabot/fetch-metadata@v1.3.3
17+
with:
18+
github-token: "${{ secrets.GITHUB_TOKEN }}"
19+
20+
- name: Auto-merge Dependabot PRs for semver-minor updates
21+
if: ${{steps.metadata.outputs.update-type == 'version-update:semver-minor'}}
22+
run: gh pr merge --auto --merge "$PR_URL"
23+
env:
24+
PR_URL: ${{github.event.pull_request.html_url}}
25+
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
26+
27+
- name: Auto-merge Dependabot PRs for semver-patch updates
28+
if: ${{steps.metadata.outputs.update-type == 'version-update:semver-patch'}}
29+
run: gh pr merge --auto --merge "$PR_URL"
30+
env:
31+
PR_URL: ${{github.event.pull_request.html_url}}
32+
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
name: Fix PHP code style issues
2+
3+
on: [push]
4+
5+
jobs:
6+
php-code-styling:
7+
runs-on: ubuntu-latest
8+
9+
steps:
10+
- name: Checkout code
11+
uses: actions/checkout@v3
12+
with:
13+
ref: ${{ github.head_ref }}
14+
15+
- name: Fix PHP code style issues
16+
uses: aglipanci/laravel-pint-action@1.0.0
17+
18+
- name: Commit changes
19+
uses: stefanzweifel/git-auto-commit-action@v4
20+
with:
21+
commit_message: Fix styling

‎.github/workflows/phpstan.yml

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
name: PHPStan
2+
3+
on:
4+
push:
5+
paths:
6+
- '**.php'
7+
- 'phpstan.neon.dist'
8+
9+
jobs:
10+
phpstan:
11+
name: phpstan
12+
runs-on: ubuntu-latest
13+
steps:
14+
- uses: actions/checkout@v3
15+
16+
- name: Setup PHP
17+
uses: shivammathur/setup-php@v2
18+
with:
19+
php-version: '8.1'
20+
coverage: none
21+
22+
- name: Install composer dependencies
23+
uses: ramsey/composer-install@v1
24+
25+
- name: Run PHPStan
26+
run: ./vendor/bin/phpstan --error-format=github

‎.github/workflows/run-tests.yml

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
name: run-tests
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
9+
jobs:
10+
test:
11+
runs-on: ${{ matrix.os }}
12+
strategy:
13+
fail-fast: true
14+
matrix:
15+
os: [ubuntu-latest, windows-latest]
16+
php: [8.1]
17+
laravel: [9.*]
18+
stability: [prefer-lowest, prefer-stable]
19+
include:
20+
- laravel: 9.*
21+
testbench: 7.*
22+
23+
name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.stability }} - ${{ matrix.os }}
24+
25+
steps:
26+
- name: Checkout code
27+
uses: actions/checkout@v3
28+
29+
- name: Setup PHP
30+
uses: shivammathur/setup-php@v2
31+
with:
32+
php-version: ${{ matrix.php }}
33+
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo
34+
coverage: none
35+
36+
- name: Setup problem matchers
37+
run: |
38+
echo "::add-matcher::${{ runner.tool_cache }}/php.json"
39+
echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
40+
41+
- name: Install dependencies
42+
run: |
43+
composer require "laravel/framework:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" --no-interaction --no-update
44+
composer update --${{ matrix.stability }} --prefer-dist --no-interaction
45+
46+
- name: Execute tests
47+
run: vendor/bin/pest
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
name: "Update Changelog"
2+
3+
on:
4+
release:
5+
types: [released]
6+
7+
jobs:
8+
update:
9+
runs-on: ubuntu-latest
10+
11+
steps:
12+
- name: Checkout code
13+
uses: actions/checkout@v3
14+
with:
15+
ref: main
16+
17+
- name: Update Changelog
18+
uses: stefanzweifel/changelog-updater-action@v1
19+
with:
20+
latest-version: ${{ github.event.release.name }}
21+
release-notes: ${{ github.event.release.body }}
22+
23+
- name: Commit updated CHANGELOG
24+
uses: stefanzweifel/git-auto-commit-action@v4
25+
with:
26+
branch: main
27+
commit_message: Update CHANGELOG
28+
file_pattern: CHANGELOG.md

‎.gitignore

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
.idea
2+
.phpunit.result.cache
3+
build
4+
composer.lock
5+
coverage
6+
docs
7+
phpunit.xml
8+
phpstan.neon
9+
testbench.yaml
10+
vendor
11+
node_modules

‎CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Changelog
2+
3+
All notable changes to `:package_name` will be documented in this file.

‎LICENSE.md

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
The MIT License (MIT)
2+
3+
Copyright (c) :vendor_name <author@domain.com>
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in
13+
all copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21+
THE SOFTWARE.

‎README.md

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
# :package_description
2+
3+
[![Latest Version on Packagist](https://img.shields.io/packagist/v/:vendor_slug/:package_slug.svg?style=flat-square)](https://packagist.org/packages/:vendor_slug/:package_slug)
4+
[![GitHub Tests Action Status](https://img.shields.io/github/workflow/status/:vendor_slug/:package_slug/run-tests?label=tests)](https://github.com/:vendor_slug/:package_slug/actions?query=workflow%3Arun-tests+branch%3Amain)
5+
[![GitHub Code Style Action Status](https://img.shields.io/github/workflow/status/:vendor_slug/:package_slug/Fix%20PHP%20code%20style%20issues?label=code%20style)](https://github.com/:vendor_slug/:package_slug/actions?query=workflow%3A"Fix+PHP+code+style+issues"+branch%3Amain)
6+
[![Total Downloads](https://img.shields.io/packagist/dt/:vendor_slug/:package_slug.svg?style=flat-square)](https://packagist.org/packages/:vendor_slug/:package_slug)
7+
<!--delete-->
8+
---
9+
This repo can be used to scaffold a Laravel package. Follow these steps to get started:
10+
11+
1. Press the "Use this template" button at the top of this repo to create a new repo with the contents of this skeleton.
12+
2. Run "php ./configure.php" to run a script that will replace all placeholders throughout all the files.
13+
3. Have fun creating your package.
14+
4. If you need help creating a package, consider picking up our <a href="https://laravelpackage.training">Laravel Package Training</a> video course.
15+
---
16+
<!--/delete-->
17+
This is where your description should go. Limit it to a paragraph or two. Consider adding a small example.
18+
19+
## Support us
20+
21+
[<img src="https://github-ads.s3.eu-central-1.amazonaws.com/:package_name.jpg?t=1" width="419px" />](https://spatie.be/github-ad-click/:package_name)
22+
23+
We invest a lot of resources into creating [best in class open source packages](https://spatie.be/open-source). You can support us by [buying one of our paid products](https://spatie.be/open-source/support-us).
24+
25+
We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on [our contact page](https://spatie.be/about-us). We publish all received postcards on [our virtual postcard wall](https://spatie.be/open-source/postcards).
26+
27+
## Installation
28+
29+
You can install the package via composer:
30+
31+
```bash
32+
composer require :vendor_slug/:package_slug
33+
```
34+
35+
You can publish and run the migrations with:
36+
37+
```bash
38+
php artisan vendor:publish --tag=":package_slug-migrations"
39+
php artisan migrate
40+
```
41+
42+
You can publish the config file with:
43+
44+
```bash
45+
php artisan vendor:publish --tag=":package_slug-config"
46+
```
47+
48+
This is the contents of the published config file:
49+
50+
```php
51+
return [
52+
];
53+
```
54+
55+
Optionally, you can publish the views using
56+
57+
```bash
58+
php artisan vendor:publish --tag=":package_slug-views"
59+
```
60+
61+
## Usage
62+
63+
```php
64+
$variable = new VendorName\Skeleton();
65+
echo $variable->echoPhrase('Hello, VendorName!');
66+
```
67+
68+
## Testing
69+
70+
```bash
71+
composer test
72+
```
73+
74+
## Changelog
75+
76+
Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.
77+
78+
## Contributing
79+
80+
Please see [CONTRIBUTING](CONTRIBUTING.md) for details.
81+
82+
## Security Vulnerabilities
83+
84+
Please review [our security policy](../../security/policy) on how to report security vulnerabilities.
85+
86+
## Credits
87+
88+
- [:author_name](https://github.com/:author_username)
89+
- [All Contributors](../../contributors)
90+
91+
## License
92+
93+
The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

‎composer.json

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
{
2+
"name": ":vendor_slug/:package_slug",
3+
"description": ":package_description",
4+
"keywords": [
5+
":vendor_name",
6+
"laravel",
7+
":package_slug"
8+
],
9+
"homepage": "https://github.com/:vendor_slug/:package_slug",
10+
"license": "MIT",
11+
"authors": [
12+
{
13+
"name": ":author_name",
14+
"email": "author@domain.com",
15+
"role": "Developer"
16+
}
17+
],
18+
"require": {
19+
"php": "^8.1",
20+
"spatie/laravel-package-tools": "^1.13.0",
21+
"illuminate/contracts": "^9.0"
22+
},
23+
"require-dev": {
24+
"laravel/pint": "^1.0",
25+
"nunomaduro/collision": "^6.0",
26+
"nunomaduro/larastan": "^2.0.1",
27+
"orchestra/testbench": "^7.0",
28+
"pestphp/pest": "^1.21",
29+
"pestphp/pest-plugin-laravel": "^1.1",
30+
"phpstan/extension-installer": "^1.1",
31+
"phpstan/phpstan-deprecation-rules": "^1.0",
32+
"phpstan/phpstan-phpunit": "^1.0",
33+
"phpunit/phpunit": "^9.5",
34+
"spatie/laravel-ray": "^1.26"
35+
},
36+
"autoload": {
37+
"psr-4": {
38+
"VendorName\\Skeleton\\": "src",
39+
"VendorName\\Skeleton\\Database\\Factories\\": "database/factories"
40+
}
41+
},
42+
"autoload-dev": {
43+
"psr-4": {
44+
"VendorName\\Skeleton\\Tests\\": "tests"
45+
}
46+
},
47+
"scripts": {
48+
"analyse": "vendor/bin/phpstan analyse",
49+
"test": "vendor/bin/pest",
50+
"test-coverage": "vendor/bin/pest --coverage",
51+
"format": "vendor/bin/pint"
52+
},
53+
"config": {
54+
"sort-packages": true
55+
},
56+
"extra": {
57+
"laravel": {
58+
"providers": [
59+
"VendorName\\Skeleton\\SkeletonServiceProvider"
60+
],
61+
"aliases": {
62+
"Skeleton": "VendorName\\Skeleton\\Facades\\Skeleton"
63+
}
64+
}
65+
},
66+
"minimum-stability": "dev",
67+
"prefer-stable": true
68+
}

‎config/skeleton.php

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?php
2+
3+
// config for VendorName/Skeleton
4+
return [
5+
6+
];

‎configure.php

+266
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,266 @@
1+
#!/usr/bin/env php
2+
<?php
3+
4+
function ask(string $question, string $default = ''): string
5+
{
6+
$answer = readline($question.($default ? " ({$default})" : null).': ');
7+
8+
if (! $answer) {
9+
return $default;
10+
}
11+
12+
return $answer;
13+
}
14+
15+
function confirm(string $question, bool $default = false): bool
16+
{
17+
$answer = ask($question.' ('.($default ? 'Y/n' : 'y/N').')');
18+
19+
if (! $answer) {
20+
return $default;
21+
}
22+
23+
return strtolower($answer) === 'y';
24+
}
25+
26+
function writeln(string $line): void
27+
{
28+
echo $line.PHP_EOL;
29+
}
30+
31+
function run(string $command): string
32+
{
33+
return trim((string) shell_exec($command));
34+
}
35+
36+
function str_after(string $subject, string $search): string
37+
{
38+
$pos = strrpos($subject, $search);
39+
40+
if ($pos === false) {
41+
return $subject;
42+
}
43+
44+
return substr($subject, $pos + strlen($search));
45+
}
46+
47+
function slugify(string $subject): string
48+
{
49+
return strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $subject), '-'));
50+
}
51+
52+
function title_case(string $subject): string
53+
{
54+
return str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $subject)));
55+
}
56+
57+
function title_snake(string $subject, string $replace = '_'): string
58+
{
59+
return str_replace(['-', '_'], $replace, $subject);
60+
}
61+
62+
function replace_in_file(string $file, array $replacements): void
63+
{
64+
$contents = file_get_contents($file);
65+
66+
file_put_contents(
67+
$file,
68+
str_replace(
69+
array_keys($replacements),
70+
array_values($replacements),
71+
$contents
72+
)
73+
);
74+
}
75+
76+
function remove_prefix(string $prefix, string $content): string
77+
{
78+
if (str_starts_with($content, $prefix)) {
79+
return substr($content, strlen($prefix));
80+
}
81+
82+
return $content;
83+
}
84+
85+
function remove_composer_deps(array $names)
86+
{
87+
$data = json_decode(file_get_contents(__DIR__.'/composer.json'), true);
88+
89+
foreach ($data['require-dev'] as $name => $version) {
90+
if (in_array($name, $names, true)) {
91+
unset($data['require-dev'][$name]);
92+
}
93+
}
94+
95+
file_put_contents(__DIR__.'/composer.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
96+
}
97+
98+
function remove_composer_script($scriptName)
99+
{
100+
$data = json_decode(file_get_contents(__DIR__.'/composer.json'), true);
101+
102+
foreach ($data['scripts'] as $name => $script) {
103+
if ($scriptName === $name) {
104+
unset($data['scripts'][$name]);
105+
break;
106+
}
107+
}
108+
109+
file_put_contents(__DIR__.'/composer.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
110+
}
111+
112+
function remove_readme_paragraphs(string $file): void
113+
{
114+
$contents = file_get_contents($file);
115+
116+
file_put_contents(
117+
$file,
118+
preg_replace('/<!--delete-->.*<!--\/delete-->/s', '', $contents) ?: $contents
119+
);
120+
}
121+
122+
function safeUnlink(string $filename)
123+
{
124+
if (file_exists($filename) && is_file($filename)) {
125+
unlink($filename);
126+
}
127+
}
128+
129+
function determineSeparator(string $path): string
130+
{
131+
return str_replace('/', DIRECTORY_SEPARATOR, $path);
132+
}
133+
134+
function replaceForWindows(): array
135+
{
136+
return preg_split('/\\r\\n|\\r|\\n/', run('dir /S /B * | findstr /v /i .git\ | findstr /v /i vendor | findstr /v /i '.basename(__FILE__).' | findstr /r /i /M /F:/ ":author :vendor :package VendorName skeleton migration_table_name vendor_name vendor_slug author@domain.com"'));
137+
}
138+
139+
function replaceForAllOtherOSes(): array
140+
{
141+
return explode(PHP_EOL, run('grep -E -r -l -i ":author|:vendor|:package|VendorName|skeleton|migration_table_name|vendor_name|vendor_slug|author@domain.com" --exclude-dir=vendor ./* ./.github/* | grep -v '.basename(__FILE__)));
142+
}
143+
144+
$gitName = run('git config user.name');
145+
$authorName = ask('Author name', $gitName);
146+
147+
$gitEmail = run('git config user.email');
148+
$authorEmail = ask('Author email', $gitEmail);
149+
150+
$usernameGuess = explode(':', run('git config remote.origin.url'))[1];
151+
$usernameGuess = dirname($usernameGuess);
152+
$usernameGuess = basename($usernameGuess);
153+
$authorUsername = ask('Author username', $usernameGuess);
154+
155+
$vendorName = ask('Vendor name', $authorUsername);
156+
$vendorSlug = slugify($vendorName);
157+
$vendorNamespace = ucwords($vendorName);
158+
$vendorNamespace = ask('Vendor namespace', $vendorNamespace);
159+
160+
$currentDirectory = getcwd();
161+
$folderName = basename($currentDirectory);
162+
163+
$packageName = ask('Package name', $folderName);
164+
$packageSlug = slugify($packageName);
165+
$packageSlugWithoutPrefix = remove_prefix('laravel-', $packageSlug);
166+
167+
$className = title_case($packageName);
168+
$className = ask('Class name', $className);
169+
$variableName = lcfirst($className);
170+
$description = ask('Package description', "This is my package {$packageSlug}");
171+
172+
$usePhpStan = confirm('Enable PhpStan?', true);
173+
$useLaravelPint = confirm('Enable Laravel Pint?', true);
174+
$useDependabot = confirm('Enable Dependabot?', true);
175+
$useLaravelRay = confirm('Use Ray for debugging?', true);
176+
$useUpdateChangelogWorkflow = confirm('Use automatic changelog updater workflow?', true);
177+
178+
writeln('------');
179+
writeln("Author : {$authorName} ({$authorUsername}, {$authorEmail})");
180+
writeln("Vendor : {$vendorName} ({$vendorSlug})");
181+
writeln("Package : {$packageSlug} <{$description}>");
182+
writeln("Namespace : {$vendorNamespace}\\{$className}");
183+
writeln("Class name : {$className}");
184+
writeln('---');
185+
writeln('Packages & Utilities');
186+
writeln('Use Laravel/Pint : '.($useLaravelPint ? 'yes' : 'no'));
187+
writeln('Use Larastan/PhpStan : '.($usePhpStan ? 'yes' : 'no'));
188+
writeln('Use Dependabot : '.($useDependabot ? 'yes' : 'no'));
189+
writeln('Use Ray App : '.($useLaravelRay ? 'yes' : 'no'));
190+
writeln('Use Auto-Changelog : '.($useUpdateChangelogWorkflow ? 'yes' : 'no'));
191+
writeln('------');
192+
193+
writeln('This script will replace the above values in all relevant files in the project directory.');
194+
195+
if (! confirm('Modify files?', true)) {
196+
exit(1);
197+
}
198+
199+
$files = (str_starts_with(strtoupper(PHP_OS), 'WIN') ? replaceForWindows() : replaceForAllOtherOSes());
200+
201+
foreach ($files as $file) {
202+
replace_in_file($file, [
203+
':author_name' => $authorName,
204+
':author_username' => $authorUsername,
205+
'author@domain.com' => $authorEmail,
206+
':vendor_name' => $vendorName,
207+
':vendor_slug' => $vendorSlug,
208+
'VendorName' => $vendorNamespace,
209+
':package_name' => $packageName,
210+
':package_slug' => $packageSlug,
211+
':package_slug_without_prefix' => $packageSlugWithoutPrefix,
212+
'Skeleton' => $className,
213+
'skeleton' => $packageSlug,
214+
'migration_table_name' => title_snake($packageSlug),
215+
'variable' => $variableName,
216+
':package_description' => $description,
217+
]);
218+
219+
match (true) {
220+
str_contains($file, determineSeparator('src/Skeleton.php')) => rename($file, determineSeparator('./src/'.$className.'.php')),
221+
str_contains($file, determineSeparator('src/SkeletonServiceProvider.php')) => rename($file, determineSeparator('./src/'.$className.'ServiceProvider.php')),
222+
str_contains($file, determineSeparator('src/Facades/Skeleton.php')) => rename($file, determineSeparator('./src/Facades/'.$className.'.php')),
223+
str_contains($file, determineSeparator('src/Commands/SkeletonCommand.php')) => rename($file, determineSeparator('./src/Commands/'.$className.'Command.php')),
224+
str_contains($file, determineSeparator('database/migrations/create_skeleton_table.php.stub')) => rename($file, determineSeparator('./database/migrations/create_'.title_snake($packageSlugWithoutPrefix).'_table.php.stub')),
225+
str_contains($file, determineSeparator('config/skeleton.php')) => rename($file, determineSeparator('./config/'.$packageSlugWithoutPrefix.'.php')),
226+
str_contains($file, 'README.md') => remove_readme_paragraphs($file),
227+
default => [],
228+
};
229+
}
230+
231+
if (! $useLaravelPint) {
232+
safeUnlink(__DIR__.'/.github/workflows/fix-php-code-style-issues.yml');
233+
safeUnlink(__DIR__.'/pint.json');
234+
}
235+
236+
if (! $usePhpStan) {
237+
safeUnlink(__DIR__.'/phpstan.neon.dist');
238+
safeUnlink(__DIR__.'/phpstan-baseline.neon');
239+
safeUnlink(__DIR__.'/.github/workflows/phpstan.yml');
240+
241+
remove_composer_deps([
242+
'phpstan/extension-installer',
243+
'phpstan/phpstan-deprecation-rules',
244+
'phpstan/phpstan-phpunit',
245+
'nunomaduro/larastan',
246+
]);
247+
248+
remove_composer_script('phpstan');
249+
}
250+
251+
if (! $useDependabot) {
252+
safeUnlink(__DIR__.'/.github/dependabot.yml');
253+
safeUnlink(__DIR__.'/.github/workflows/dependabot-auto-merge.yml');
254+
}
255+
256+
if (! $useLaravelRay) {
257+
remove_composer_deps(['spatie/laravel-ray']);
258+
}
259+
260+
if (! $useUpdateChangelogWorkflow) {
261+
safeUnlink(__DIR__.'/.github/workflows/update-changelog.yml');
262+
}
263+
264+
confirm('Execute `composer install` and run tests?') && run('composer install && composer test');
265+
266+
confirm('Let this script delete itself?', true) && unlink(__FILE__);

‎database/factories/ModelFactory.php

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace VendorName\Skeleton\Database\Factories;
4+
5+
use Illuminate\Database\Eloquent\Factories\Factory;
6+
7+
/*
8+
class ModelFactory extends Factory
9+
{
10+
protected $model = YourModel::class;
11+
12+
public function definition()
13+
{
14+
return [
15+
16+
];
17+
}
18+
}
19+
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
public function up()
10+
{
11+
Schema::create('migration_table_name_table', function (Blueprint $table) {
12+
$table->id();
13+
14+
// add fields
15+
16+
$table->timestamps();
17+
});
18+
}
19+
};

‎phpstan-baseline.neon

Whitespace-only changes.

‎phpstan.neon.dist

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
includes:
2+
- phpstan-baseline.neon
3+
4+
parameters:
5+
level: 4
6+
paths:
7+
- src
8+
- config
9+
- database
10+
tmpDir: build/phpstan
11+
checkOctaneCompatibility: true
12+
checkModelProperties: true
13+
checkMissingIterableValueType: false
14+

‎phpunit.xml.dist

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<phpunit
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
5+
backupGlobals="false"
6+
backupStaticAttributes="false"
7+
bootstrap="vendor/autoload.php"
8+
colors="true"
9+
convertErrorsToExceptions="true"
10+
convertNoticesToExceptions="true"
11+
convertWarningsToExceptions="true"
12+
processIsolation="false"
13+
stopOnFailure="false"
14+
executionOrder="random"
15+
failOnWarning="true"
16+
failOnRisky="true"
17+
failOnEmptyTestSuite="true"
18+
beStrictAboutOutputDuringTests="true"
19+
verbose="true"
20+
>
21+
<testsuites>
22+
<testsuite name="VendorName Test Suite">
23+
<directory>tests</directory>
24+
</testsuite>
25+
</testsuites>
26+
<coverage>
27+
<include>
28+
<directory suffix=".php">./src</directory>
29+
</include>
30+
<report>
31+
<html outputDirectory="build/coverage"/>
32+
<text outputFile="build/coverage.txt"/>
33+
<clover outputFile="build/logs/clover.xml"/>
34+
</report>
35+
</coverage>
36+
<logging>
37+
<junit outputFile="build/report.junit.xml"/>
38+
</logging>
39+
</phpunit>

‎resources/views/.gitkeep

Whitespace-only changes.

‎src/Commands/SkeletonCommand.php

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace VendorName\Skeleton\Commands;
4+
5+
use Illuminate\Console\Command;
6+
7+
class SkeletonCommand extends Command
8+
{
9+
public $signature = 'skeleton';
10+
11+
public $description = 'My command';
12+
13+
public function handle(): int
14+
{
15+
$this->comment('All done');
16+
17+
return self::SUCCESS;
18+
}
19+
}

‎src/Facades/Skeleton.php

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace VendorName\Skeleton\Facades;
4+
5+
use Illuminate\Support\Facades\Facade;
6+
7+
/**
8+
* @see \VendorName\Skeleton\Skeleton
9+
*/
10+
class Skeleton extends Facade
11+
{
12+
protected static function getFacadeAccessor()
13+
{
14+
return \VendorName\Skeleton\Skeleton::class;
15+
}
16+
}

‎src/Skeleton.php

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace VendorName\Skeleton;
4+
5+
class Skeleton
6+
{
7+
}

‎src/SkeletonServiceProvider.php

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace VendorName\Skeleton;
4+
5+
use Spatie\LaravelPackageTools\Package;
6+
use Spatie\LaravelPackageTools\PackageServiceProvider;
7+
use VendorName\Skeleton\Commands\SkeletonCommand;
8+
9+
class SkeletonServiceProvider extends PackageServiceProvider
10+
{
11+
public function configurePackage(Package $package): void
12+
{
13+
/*
14+
* This class is a Package Service Provider
15+
*
16+
* More info: https://github.com/spatie/laravel-package-tools
17+
*/
18+
$package
19+
->name('skeleton')
20+
->hasConfigFile()
21+
->hasViews()
22+
->hasMigration('create_skeleton_table')
23+
->hasCommand(SkeletonCommand::class);
24+
}
25+
}

‎tests/ExampleTest.php

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?php
2+
3+
it('can test', function () {
4+
expect(true)->toBeTrue();
5+
});

‎tests/Pest.php

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?php
2+
3+
use VendorName\Skeleton\Tests\TestCase;
4+
5+
uses(TestCase::class)->in(__DIR__);

‎tests/TestCase.php

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace VendorName\Skeleton\Tests;
4+
5+
use Illuminate\Database\Eloquent\Factories\Factory;
6+
use Orchestra\Testbench\TestCase as Orchestra;
7+
use VendorName\Skeleton\SkeletonServiceProvider;
8+
9+
class TestCase extends Orchestra
10+
{
11+
protected function setUp(): void
12+
{
13+
parent::setUp();
14+
15+
Factory::guessFactoryNamesUsing(
16+
fn (string $modelName) => 'VendorName\\Skeleton\\Database\\Factories\\'.class_basename($modelName).'Factory'
17+
);
18+
}
19+
20+
protected function getPackageProviders($app)
21+
{
22+
return [
23+
SkeletonServiceProvider::class,
24+
];
25+
}
26+
27+
public function getEnvironmentSetUp($app)
28+
{
29+
config()->set('database.default', 'testing');
30+
31+
/*
32+
$migration = include __DIR__.'/../database/migrations/create_skeleton_table.php.stub';
33+
$migration->up();
34+
*/
35+
}
36+
}

0 commit comments

Comments
 (0)
Please sign in to comment.