Merge pull request #34 from filamentphp/3.x-wip

Chore: merge in wip branch to sync changes
This commit is contained in:
Adam Weston
2023-07-16 11:43:42 -04:00
committed by GitHub
34 changed files with 480 additions and 344 deletions

36
.gitattributes vendored
View File

@@ -2,18 +2,26 @@
# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html # https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
# Ignore all test and documentation with "export-ignore". # Ignore all test and documentation with "export-ignore".
/.github export-ignore /.github export-ignore
/.gitattributes export-ignore /.gitattributes export-ignore
/.gitignore export-ignore /.gitignore export-ignore
/phpunit.xml.dist export-ignore /.idea export-ignore
/art export-ignore /.prettierrc export-ignore
/docs export-ignore /.package-lock.json export-ignore
/tests export-ignore /.editorconfig export-ignore
/.editorconfig export-ignore /.php_cs.dist.php export-ignore
/.php_cs.dist.php export-ignore /.vscode export-ignore
/psalm.xml export-ignore /art export-ignore
/psalm.xml.dist export-ignore /docs export-ignore
/testbench.yaml export-ignore /images export-ignore
/UPGRADING.md export-ignore /tests export-ignore
/phpstan.neon.dist export-ignore /package.json export-ignore
/phpstan-baseline.neon export-ignore /phpstan-baseline.neon export-ignore
/phpstan.neon.dist export-ignore
/postcss.config.js export-ignore
/phpunit.xml.dist export-ignore
/psalm.xml export-ignore
/psalm.xml.dist export-ignore
/tailwind.config.js export-ignore
/testbench.yaml export-ignore
/UPGRADING.md export-ignore

View File

@@ -14,7 +14,7 @@ Please be considerate towards maintainers when raising issues or presenting pull
world that developers are civilized and selfless people. world that developers are civilized and selfless people.
It's the duty of the maintainer to ensure that all submissions to the project are of sufficient It's the duty of the maintainer to ensure that all submissions to the project are of sufficient
quality to benefit the project. Many developers have different skillsets, strengths, and weaknesses. Respect the maintainer's decision, and do not be upset or abusive if your submission is not used. quality to benefit the project. Many developers have different skills, strengths, and weaknesses. Respect the maintainer's decision, and do not be upset or abusive if your submission is not used.
## Viability ## Viability

66
.github/ISSUE_TEMPLATE/bug.yml vendored Normal file
View File

@@ -0,0 +1,66 @@
name: Bug Report
description: Report an Issue or Bug with the Package
title: "[Bug]: "
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
We're sorry to hear you have a problem. Can you help us solve it by providing the following details.
- type: textarea
id: what-happened
attributes:
label: What happened?
description: What did you expect to happen?
placeholder: I cannot currently do X thing because when I do, it breaks X thing.
validations:
required: true
- type: textarea
id: how-to-reproduce
attributes:
label: How to reproduce the bug
description: How did this occur, please add any config values used and provide a set of reliable steps if possible.
placeholder: When I do X I see Y.
validations:
required: true
- type: input
id: package-version
attributes:
label: Package Version
description: What version of our Package are you running? Please be as specific as possible
placeholder: 2.0.0
validations:
required: true
- type: input
id: php-version
attributes:
label: PHP Version
description: What version of PHP are you running? Please be as specific as possible
placeholder: 8.2.0
validations:
required: true
- type: input
id: laravel-version
attributes:
label: Laravel Version
description: What version of Laravel are you running? Please be as specific as possible
placeholder: 9.0.0
validations:
required: true
- type: dropdown
id: operating-systems
attributes:
label: Which operating systems does with happen with?
description: You may select more than one.
multiple: true
options:
- macOS
- Windows
- Linux
- type: textarea
id: notes
attributes:
label: Notes
description: Use this field to provide any other notes that you feel might be relevant to the issue.
validations:
required: false

View File

@@ -9,6 +9,3 @@ contact_links:
- name: Report a security issue - name: Report a security issue
url: https://github.com/:vendor_name/:package_name/security/policy url: https://github.com/:vendor_name/:package_name/security/policy
about: Learn how to notify us for sensitive bugs about: Learn how to notify us for sensitive bugs
- name: Report a bug
url: https://github.com/:vendor_name/:package_name/issues/new
about: Report a reproducible bug

View File

@@ -1,4 +1,4 @@
name: Dependabot Auto Merge name: "Dependabot Auto-Merge"
on: pull_request_target on: pull_request_target
@@ -14,7 +14,7 @@ jobs:
- name: Dependabot metadata - name: Dependabot metadata
id: metadata id: metadata
uses: dependabot/fetch-metadata@v1.4.0 uses: dependabot/fetch-metadata@v1.6.0
with: with:
github-token: "${{ secrets.GITHUB_TOKEN }}" github-token: "${{ secrets.GITHUB_TOKEN }}"

View File

@@ -1,6 +1,12 @@
name: Fix PHP Code Styling name: "Fix PHP Code Styling"
on: [push] on:
push:
paths:
- '**.php'
permissions:
contents: write
jobs: jobs:
php-code-styling: php-code-styling:

View File

@@ -23,4 +23,4 @@ jobs:
uses: ramsey/composer-install@v2 uses: ramsey/composer-install@v2
- name: Run PHPStan - name: Run PHPStan
run: ./vendor/bin/phpstan --error-format=github run: ./vendor/bin/phpstan --error-format=github

View File

@@ -1,4 +1,4 @@
name: Run Tests name: run-tests
on: on:
push: push:
@@ -13,12 +13,13 @@ jobs:
fail-fast: true fail-fast: true
matrix: matrix:
os: [ubuntu-latest, windows-latest] os: [ubuntu-latest, windows-latest]
php: [8.1] php: [8.2, 8.1]
laravel: [9.*] laravel: [10.*]
stability: [prefer-lowest, prefer-stable] stability: [prefer-lowest, prefer-stable]
include: include:
- laravel: 9.* - laravel: 10.*
testbench: 7.* testbench: 8.*
carbon: ^2.63
name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.stability }} - ${{ matrix.os }} name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.stability }} - ${{ matrix.os }}
@@ -40,8 +41,11 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: | run: |
composer require "laravel/framework:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" --no-interaction --no-update composer require "laravel/framework:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" "nesbot/carbon:${{ matrix.carbon }}" --no-interaction --no-update
composer update --${{ matrix.stability }} --prefer-dist --no-interaction composer update --${{ matrix.stability }} --prefer-dist --no-interaction
- name: List Installed Dependencies
run: composer show -D
- name: Execute tests - name: Execute tests
run: vendor/bin/pest run: vendor/bin/pest --ci

View File

@@ -1,9 +1,12 @@
name: Update Changelog name: "Update Changelog"
on: on:
release: release:
types: [released] types: [released]
permissions:
contents: write
jobs: jobs:
update: update:
runs-on: ubuntu-latest runs-on: ubuntu-latest

4
.gitignore vendored
View File

@@ -1,11 +1,13 @@
.DS_Store
.idea .idea
.phpunit.result.cache .phpunit.result.cache
.vscode
build build
composer.lock composer.lock
coverage coverage
docs docs
node_modules
phpunit.xml phpunit.xml
phpstan.neon phpstan.neon
testbench.yaml testbench.yaml
vendor vendor
node_modules

View File

@@ -1,8 +1,8 @@
# :package_description # :package_description
[![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) [![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)
[![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) [![GitHub Tests Action Status](https://img.shields.io/github/actions/workflow/status/:vendor_slug/:package_slug/run-tests.yml?branch=main&label=tests&style=flat-square)](https://github.com/:vendor_slug/:package_slug/actions?query=workflow%3Arun-tests+branch%3Amain)
[![GitHub Code Style Action Status](https://img.shields.io/github/workflow/status/:vendor_slug/:package_slug/Check%20&%20fix%20styling?label=code%20style)](https://github.com/:vendor_slug/:package_slug/actions?query=workflow%3A"Check+%26+fix+styling"+branch%3Amain) [![GitHub Code Style Action Status](https://img.shields.io/github/actions/workflow/status/:vendor_slug/:package_slug/fix-php-code-style-issues.yml?branch=main&label=code%20style&style=flat-square)](https://github.com/:vendor_slug/:package_slug/actions?query=workflow%3A"Fix+PHP+code+style+issues"+branch%3Amain)
[![Total Downloads](https://img.shields.io/packagist/dt/:vendor_slug/:package_slug.svg?style=flat-square)](https://packagist.org/packages/:vendor_slug/:package_slug) [![Total Downloads](https://img.shields.io/packagist/dt/:vendor_slug/:package_slug.svg?style=flat-square)](https://packagist.org/packages/:vendor_slug/:package_slug)
<!--delete--> <!--delete-->
@@ -54,8 +54,8 @@ return [
## Usage ## Usage
```php ```php
$skeleton = new VendorName\Skeleton(); $variable = new VendorName\Skeleton();
echo $skeleton->echoPhrase('Hello, VendorName!'); echo $variable->echoPhrase('Hello, VendorName!');
``` ```
## Testing ## Testing

50
bin/build.js Normal file
View File

@@ -0,0 +1,50 @@
import * as esbuild from 'esbuild'
const isDev = process.argv.includes('--dev')
async function compile(options) {
const context = await esbuild.context(options)
if (isDev) {
await context.watch()
} else {
await context.rebuild()
await context.dispose()
}
}
const defaultOptions = {
define: {
'process.env.NODE_ENV': isDev ? `'development'` : `'production'`,
},
bundle: true,
mainFields: ['module', 'main'],
platform: 'neutral',
sourcemap: isDev ? 'inline' : false,
sourcesContent: isDev,
treeShaking: true,
target: ['es2020'],
minify: !isDev,
plugins: [{
name: 'watchPlugin',
setup: function (build) {
build.onStart(() => {
console.log(`Build started at ${new Date(Date.now()).toLocaleTimeString()}: ${build.initialOptions.outfile}`)
})
build.onEnd((result) => {
if (result.errors.length > 0) {
console.log(`Build failed at ${new Date(Date.now()).toLocaleTimeString()}: ${build.initialOptions.outfile}`, result.errors)
} else {
console.log(`Build finished at ${new Date(Date.now()).toLocaleTimeString()}: ${build.initialOptions.outfile}`)
}
})
}
}],
}
compile({
...defaultOptions,
entryPoints: ['./resources/js/index.js'],
outfile: './resources/dist/skeleton.js',
})

View File

@@ -20,52 +20,47 @@
} }
], ],
"require": { "require": {
"php": "^8.0", "php": "^8.1",
"filament/filament": "^3.0", "filament/filament": "^3.0",
"filament/forms": "^3.0", "filament/forms": "^3.0",
"filament/tables": "^3.0", "filament/tables": "^3.0",
"spatie/laravel-package-tools": "^1.13.5", "spatie/laravel-package-tools": "^1.15.0",
"illuminate/contracts": "^9.0|^10.0" "illuminate/contracts": "^10.0"
}, },
"require-dev": { "require-dev": {
"laravel/pint": "^1.0", "laravel/pint": "^1.0",
"nunomaduro/collision": "^6.0", "nunomaduro/collision": "^7.9",
"nunomaduro/larastan": "^2.0.1", "nunomaduro/larastan": "^2.0.1",
"orchestra/testbench": "^7.0", "orchestra/testbench": "^8.0",
"pestphp/pest": "^1.21", "pestphp/pest": "^2.0",
"pestphp/pest-plugin-laravel": "^1.1", "pestphp/pest-plugin-arch": "^2.0",
"pestphp/pest-plugin-livewire": "^1.0", "pestphp/pest-plugin-laravel": "^2.0",
"pestphp/pest-plugin-parallel": "^0.3",
"phpstan/extension-installer": "^1.1", "phpstan/extension-installer": "^1.1",
"phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-deprecation-rules": "^1.0",
"phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-phpunit": "^1.0",
"phpunit/phpunit": "^9.5",
"spatie/laravel-ray": "^1.26" "spatie/laravel-ray": "^1.26"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"VendorName\\Skeleton\\": "src", "VendorName\\Skeleton\\": "src/",
"VendorName\\Skeleton\\Database\\Factories\\": "database/factories" "VendorName\\Skeleton\\Database\\Factories\\": "database/factories/"
} }
}, },
"autoload-dev": { "autoload-dev": {
"psr-4": { "psr-4": {
"VendorName\\Skeleton\\Tests\\": "tests" "VendorName\\Skeleton\\Tests\\": "tests/"
} }
}, },
"scripts": { "scripts": {
"pint": "vendor/bin/pint", "post-autoload-dump": "@php ./vendor/bin/testbench package:discover --ansi",
"test:pest": "vendor/bin/pest --parallel", "analyse": "vendor/bin/phpstan analyse",
"test:phpstan": "vendor/bin/phpstan analyse", "test": "vendor/bin/pest",
"test": [ "test-coverage": "vendor/bin/pest --coverage",
"@test:pest", "format": "vendor/bin/pint"
"@test:phpstan"
]
}, },
"config": { "config": {
"sort-packages": true, "sort-packages": true,
"allow-plugins": { "allow-plugins": {
"composer/package-versions-deprecated": true,
"pestphp/pest-plugin": true, "pestphp/pest-plugin": true,
"phpstan/extension-installer": true "phpstan/extension-installer": true
} }

View File

@@ -1,23 +0,0 @@
{
"private": true,
"scripts": {
"dev:styles": "npx tailwindcss -i resources/css/plugin.css -o resources/dist/skeleton.css --postcss --watch",
"dev:scripts": "esbuild resources/js/plugin.js --bundle --sourcemap=inline --outfile=resources/dist/skeleton.js --watch",
"build:styles": "npx tailwindcss -i resources/css/plugin.css -o resources/dist/skeleton.css --postcss --minify && npm run purge",
"build:scripts": "esbuild resources/js/plugin.js --bundle --minify --outfile=resources/dist/skeleton.js",
"purge": "filament-purge -i resources/dist/skeleton.css -o resources/dist/skeleton.css",
"dev": "npm-run-all --parallel dev:*",
"build": "npm-run-all build:*"
},
"devDependencies": {
"@awcodes/filament-plugin-purge": "^1.0.2",
"autoprefixer": "^10.4.7",
"esbuild": "^0.8.57",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.14",
"postcss-import": "^15.0.0",
"prettier": "^2.7.1",
"prettier-plugin-tailwindcss": "^0.1.13",
"tailwindcss": "^3.2"
}
}

View File

@@ -1 +0,0 @@
@tailwind utilities;

View File

@@ -1,9 +0,0 @@
const preset = require('./vendor/filament/filament/tailwind.config.preset')
module.exports = {
presets: [preset],
content: ['./resources/**/*.{blade.php,js}'],
corePlugins: {
preflight: false,
},
}

View File

@@ -1,15 +0,0 @@
{
"private": true,
"scripts": {
"dev": "npx tailwindcss -i resources/css/plugin.css -o resources/dist/skeleton.css --postcss --watch",
"build": "npx tailwindcss -i resources/css/plugin.css -o resources/dist/skeleton.css --postcss --minify"
},
"devDependencies": {
"autoprefixer": "^10.4.7",
"postcss": "^8.4.14",
"postcss-import": "^15.0.0",
"prettier": "^2.7.1",
"prettier-plugin-tailwindcss": "^0.1.13",
"tailwindcss": "^3.2"
}
}

View File

@@ -1 +0,0 @@
@import "../../vendor/filament/filament/resources/css/index.css";

View File

@@ -16,23 +16,25 @@ $authorUsername = ask('Author username', $usernameGuess);
$vendorName = ask('Vendor name', $authorUsername); $vendorName = ask('Vendor name', $authorUsername);
$vendorSlug = slugify($vendorName); $vendorSlug = slugify($vendorName);
$vendorNamespace = ucwords($vendorName); $vendorNamespace = str_replace('-', '', ucwords($vendorName));
$vendorNamespace = ask('Vendor namespace', $vendorNamespace); $vendorNamespace = ask('Vendor namespace', $vendorNamespace);
$folderName = basename(getcwd()); $currentDirectory = getcwd();
$folderName = basename($currentDirectory);
$packageName = ask('Package name', $folderName); $packageName = ask('Package name', $folderName);
$packageSlug = slugify($packageName); $packageSlug = slugify($packageName);
$packageSlugWithoutPrefix = remove_prefix('filament-', $packageSlug); $packageSlugWithoutPrefix = removePrefix('filament-', $packageSlug);
$className = title_case($packageName); $className = titleCase($packageName);
$className = ask('Class name', $className); $className = ask('Class name', $className);
$description = ask('Package description'); $variableName = lcfirst($className);
$description = ask('Package description', "This is my package $packageSlug");
$usePhpStan = confirm('Enable PhpStan?', true); $usePhpStan = confirm('Enable PhpStan?', true);
$usePint = confirm('Enable Pint?', true); $usePint = confirm('Enable Pint?', true);
$useDependabot = confirm('Enable Dependabot?', true); $useDependabot = confirm('Enable Dependabot?', true);
$useLaravelRay = confirm('Use Ray for debugging?', true); $useLaravelRay = confirm('Enable Ray?', true);
$useUpdateChangelogWorkflow = confirm('Use automatic changelog updater workflow?', true); $useUpdateChangelogWorkflow = confirm('Use automatic changelog updater workflow?', true);
$isTheme = confirm('Is this a custom theme?'); $isTheme = confirm('Is this a custom theme?');
@@ -41,18 +43,18 @@ $tablesOnly = ! ($isTheme || $formsOnly) && confirm('Is this for Tables only?');
writeln("\r"); writeln("\r");
writeln('------'); writeln('------');
writeln("Author : \e[0;36m{$authorName} ({$authorUsername}, {$authorEmail})\e[0m"); writeln("Author : \e[0;36m$authorName ($authorUsername, $authorEmail)\e[0m");
writeln("Vendor : \e[0;36m{$vendorName} ({$vendorSlug})\e[0m"); writeln("Vendor : \e[0;36m$vendorName ($vendorSlug)\e[0m");
writeln('Package : '."\e[0;36m".$packageSlug.($description ? ' <{$description}>' : '')."\e[0m"); writeln('Package : ' . "\e[0;36m" . $packageSlug . ($description ? ' <{$description}>' : '') . "\e[0m");
writeln("Namespace : \e[0;36m{$vendorNamespace}\\{$className}\e[0m"); writeln("Namespace : \e[0;36m$vendorNamespace\\$className\e[0m");
writeln("Class name : \e[0;36m{$className}\e[0m"); writeln("Class name : \e[0;36m$className\e[0m");
writeln('---'); writeln('---');
writeln("\e[1;37mPackages & Utilities\e[0m"); writeln("\e[1;37mPackages & Utilities\e[0m");
writeln('Larastan/PhpStan : '.($usePhpStan ? "\e[0;32mYes" : "\e[0;31mNo")."\e[0m"); writeln('Larastan/PhpStan : ' . ($usePhpStan ? "\e[0;32mYes" : "\e[0;31mNo") . "\e[0m");
writeln('Pint : '.($usePint ? "\e[0;32mYes" : "\e[0;31mNo")."\e[0m"); writeln('Pint : ' . ($usePint ? "\e[0;32mYes" : "\e[0;31mNo") . "\e[0m");
writeln('Use Dependabot : '.($useDependabot ? "\e[0;32mYes" : "\e[0;31mNo")."\e[0m"); writeln('Use Dependabot : ' . ($useDependabot ? "\e[0;32mYes" : "\e[0;31mNo") . "\e[0m");
writeln('Use Ray App : '.($useLaravelRay ? "\e[0;32mYes" : "\e[0;31mNo")."\e[0m"); writeln('Use Ray : ' . ($useLaravelRay ? "\e[0;32mYes" : "\e[0;31mNo") . "\e[0m");
writeln('Auto-Changelog : '.($useUpdateChangelogWorkflow ? "\e[0;32mYes" : "\e[0;31mNo")."\e[0m"); writeln('Auto-Changelog : ' . ($useUpdateChangelogWorkflow ? "\e[0;32mYes" : "\e[0;31mNo") . "\e[0m");
if ($formsOnly) { if ($formsOnly) {
writeln("Filament/Forms : \e[0;32mYes\e[0m"); writeln("Filament/Forms : \e[0;32mYes\e[0m");
} elseif ($tablesOnly) { } elseif ($tablesOnly) {
@@ -70,56 +72,53 @@ if (! confirm('Modify files?', true)) {
} }
if ($formsOnly) { if ($formsOnly) {
safeUnlink(__DIR__.'/src/SkeletonTheme.php'); safeUnlink(__DIR__ . '/src/SkeletonTheme.php');
safeUnlink(__DIR__ . '/src/SkeletonPlugin.php');
remove_composer_filament_deps([ removeComposerDeps([
'filament/filament', 'filament/filament',
'filament/tables', 'filament/tables',
]); ], 'require');
} elseif ($tablesOnly) { } elseif ($tablesOnly) {
safeUnlink(__DIR__.'/src/SkeletonTheme.php'); safeUnlink(__DIR__ . '/src/SkeletonTheme.php');
safeUnlink(__DIR__ . '/src/SkeletonPlugin.php');
remove_composer_filament_deps([ removeComposerDeps([
'filament/filament', 'filament/filament',
'filament/forms', 'filament/forms',
]); ], 'require');
} else { } else {
if ($isTheme) { if ($isTheme) {
safeUnlink(__DIR__.'/src/SkeletonServiceProvider.php'); safeUnlink(__DIR__ . '/src/SkeletonServiceProvider.php');
safeUnlink(__DIR__.'/src/Skeleton.php'); safeUnlink(__DIR__ . '/src/SkeletonPlugin.php');
removeDirectory(__DIR__.'/config'); safeUnlink(__DIR__ . '/src/Skeleton.php');
removeDirectory(__DIR__.'/database'); removeDirectory(__DIR__ . '/bin');
removeDirectory(__DIR__.'/stubs'); removeDirectory(__DIR__ . '/config');
removeDirectory(__DIR__.'/resources/js'); removeDirectory(__DIR__ . '/database');
removeDirectory(__DIR__.'/resources/lang'); removeDirectory(__DIR__ . '/stubs');
removeDirectory(__DIR__.'/resources/views'); removeDirectory(__DIR__ . '/resources/js');
removeDirectory(__DIR__.'/src/Commands'); removeDirectory(__DIR__ . '/resources/lang');
removeDirectory(__DIR__.'/src/Facades'); removeDirectory(__DIR__ . '/resources/views');
removeDirectory(__DIR__.'/src/Testing'); removeDirectory(__DIR__ . '/src/Commands');
removeDirectory(__DIR__ . '/src/Facades');
removeDirectory(__DIR__ . '/src/Testing');
setupPackageJsonForTheme();
} else { } else {
safeUnlink(__DIR__.'/src/SkeletonTheme.php'); safeUnlink(__DIR__ . '/src/SkeletonTheme.php');
} }
remove_composer_filament_deps([ removeComposerDeps([
'filament/forms', 'filament/forms',
'filament/tables', 'filament/tables',
]); ], 'require');
}
if ($isTheme) {
copy(__DIR__.'/configure-stubs/theme/package.json', __DIR__.'/package.json');
copy(__DIR__.'/configure-stubs/theme/plugin.css', __DIR__.'/resources/css/plugin.css');
copy(__DIR__.'/configure-stubs/theme/tailwind.config.js', __DIR__.'/tailwind.config.js');
} else {
copy(__DIR__.'/configure-stubs/package/package.json', __DIR__.'/package.json');
copy(__DIR__.'/configure-stubs/package/plugin.css', __DIR__.'/resources/css/plugin.css');
copy(__DIR__.'/configure-stubs/package/tailwind.config.js', __DIR__.'/tailwind.config.js');
} }
$files = (str_starts_with(strtoupper(PHP_OS), 'WIN') ? replaceForWindows() : replaceForAllOtherOSes()); $files = (str_starts_with(strtoupper(PHP_OS), 'WIN') ? replaceForWindows() : replaceForAllOtherOSes());
foreach ($files as $file) { foreach ($files as $file) {
replace_in_file($file, [ replaceInFile($file, [
':author_name' => $authorName, ':author_name' => $authorName,
':author_username' => $authorUsername, ':author_username' => $authorUsername,
'author@domain.com' => $authorEmail, 'author@domain.com' => $authorEmail,
@@ -131,75 +130,76 @@ foreach ($files as $file) {
':package_slug_without_prefix' => $packageSlugWithoutPrefix, ':package_slug_without_prefix' => $packageSlugWithoutPrefix,
'Skeleton' => $className, 'Skeleton' => $className,
'skeleton' => $packageSlug, 'skeleton' => $packageSlug,
'migration_table_name' => titleSnake($packageSlug),
'variable' => $variableName,
':package_description' => $description, ':package_description' => $description,
]); ]);
match (true) { match (true) {
str_contains($file, determineSeparator('src/Skeleton.php')) => rename($file, determineSeparator('./src/'.$className.'.php')), str_contains($file, determineSeparator('src/Skeleton.php')) => rename($file, determineSeparator('./src/' . $className . '.php')),
str_contains($file, determineSeparator('src/SkeletonServiceProvider.php')) => rename($file, determineSeparator('./src/'.$className.'ServiceProvider.php')), str_contains($file, determineSeparator('src/SkeletonServiceProvider.php')) => rename($file, determineSeparator('./src/' . $className . 'ServiceProvider.php')),
str_contains($file, determineSeparator('src/SkeletonTheme.php')) => rename($file, determineSeparator('./src/'.$className.'Theme.php')), str_contains($file, determineSeparator('src/SkeletonTheme.php')) => rename($file, determineSeparator('./src/' . $className . 'Theme.php')),
str_contains($file, determineSeparator('src/Facades/Skeleton.php')) => rename($file, determineSeparator('./src/Facades/'.$className.'.php')), str_contains($file, determineSeparator('src/SkeletonPlugin.php')) => rename($file, determineSeparator('./src/' . $className . 'Plugin.php')),
str_contains($file, determineSeparator('src/Commands/SkeletonCommand.php')) => rename($file, determineSeparator('./src/Commands/'.$className.'Command.php')), str_contains($file, determineSeparator('src/Facades/Skeleton.php')) => rename($file, determineSeparator('./src/Facades/' . $className . '.php')),
str_contains($file, determineSeparator('src/Testing/TestsSkeleton.php')) => rename($file, determineSeparator('./src/Testing/Tests'.$className.'.php')), str_contains($file, determineSeparator('src/Commands/SkeletonCommand.php')) => rename($file, determineSeparator('./src/Commands/' . $className . 'Command.php')),
str_contains($file, determineSeparator('database/migrations/create_skeleton_table.php.stub')) => rename($file, determineSeparator('./database/migrations/create_'.$packageSlugWithoutPrefix.'_table.php.stub')), str_contains($file, determineSeparator('src/Testing/TestsSkeleton.php')) => rename($file, determineSeparator('./src/Testing/Tests' . $className . '.php')),
str_contains($file, determineSeparator('config/skeleton.php')) => rename($file, determineSeparator('./config/'.$packageSlugWithoutPrefix.'.php')), str_contains($file, determineSeparator('database/migrations/create_skeleton_table.php.stub')) => rename($file, determineSeparator('./database/migrations/create_' . titleSnake($packageSlugWithoutPrefix) . '_table.php.stub')),
str_contains($file, 'README.md') => remove_tag($file, 'delete'), str_contains($file, determineSeparator('config/skeleton.php')) => rename($file, determineSeparator('./config/' . $packageSlugWithoutPrefix . '.php')),
str_contains($file, determineSeparator('resources/lang/en/skeleton.php')) => rename($file, determineSeparator('./resources/lang/en/' . $packageSlugWithoutPrefix . '.php')),
str_contains($file, 'README.md') => removeTag($file, 'delete'),
default => [], default => [],
}; };
} }
if (! $useDependabot) { if (! $useDependabot) {
safeUnlink(__DIR__.'/.github/dependabot.yml'); safeUnlink(__DIR__ . '/.github/dependabot.yml');
safeUnlink(__DIR__.'/.github/workflows/dependabot-auto-merge.yml'); safeUnlink(__DIR__ . '/.github/workflows/dependabot-auto-merge.yml');
} }
if (! $useLaravelRay) { if (! $useLaravelRay) {
remove_composer_deps(['spatie/laravel-ray']); removeComposerDeps(['spatie/laravel-ray'], 'require-dev');
} }
if (! $usePhpStan) { if (! $usePhpStan) {
safeUnlink(__DIR__.'/phpstan.neon.dist'); safeUnlink(__DIR__ . '/phpstan.neon.dist');
safeUnlink(__DIR__.'/phpstan-baseline.neon'); safeUnlink(__DIR__ . '/phpstan-baseline.neon');
safeUnlink(__DIR__.'/.github/workflows/phpstan.yml'); safeUnlink(__DIR__ . '/.github/workflows/phpstan.yml');
remove_composer_deps([ removeComposerDeps([
'phpstan/extension-installer', 'phpstan/extension-installer',
'phpstan/phpstan-deprecation-rules', 'phpstan/phpstan-deprecation-rules',
'phpstan/phpstan-phpunit', 'phpstan/phpstan-phpunit',
'nunomaduro/larastan', 'nunomaduro/larastan',
]); ], 'require-dev');
remove_composer_script([ removeComposerDeps(['analyse'], 'scripts');
'test:phpstan',
'@test:phpstan',
]);
} }
if (! $usePint) { if (! $usePint) {
safeUnlink(__DIR__.'/.github/workflows/fix-php-code-style-issues.yml'); safeUnlink(__DIR__ . '/.github/workflows/fix-php-code-style-issues.yml');
safeUnlink(__DIR__ . '/pint.json');
remove_composer_deps([ removeComposerDeps([
'laravel/pint', 'laravel/pint',
]); ], 'require-dev');
remove_composer_script(['pint']); removeComposerDeps(['format'], 'scripts');
} }
if (! $useUpdateChangelogWorkflow) { if (! $useUpdateChangelogWorkflow) {
safeUnlink(__DIR__.'/.github/workflows/update-changelog.yml'); safeUnlink(__DIR__ . '/.github/workflows/update-changelog.yml');
} }
confirm('Execute `composer install` and run tests?') && run('composer install && composer test'); confirm('Execute `composer install`?') && run('composer install');
if (confirm('Let this script delete itself?', true)) { if (confirm('Let this script delete itself?', true)) {
removeDirectory(__DIR__.'/configure-stubs');
unlink(__FILE__); unlink(__FILE__);
} }
function ask(string $question, string $default = ''): string function ask(string $question, string $default = ''): string
{ {
$def = $default ? "\e[0;33m ({$default})" : ''; $def = $default ? "\e[0;33m ($default)" : '';
$answer = readline("\e[0;32m".$question.$def.": \e[0m"); $answer = readline("\e[0;32m" . $question . $def . ": \e[0m");
if (! $answer) { if (! $answer) {
return $default; return $default;
@@ -221,12 +221,12 @@ function confirm(string $question, bool $default = false): bool
function writeln(string $line): void function writeln(string $line): void
{ {
echo $line.PHP_EOL; echo $line . PHP_EOL;
} }
function run(string $command): string function run(string $command): string
{ {
return trim(shell_exec($command)); return trim((string) shell_exec($command));
} }
function slugify(string $subject): string function slugify(string $subject): string
@@ -234,12 +234,17 @@ function slugify(string $subject): string
return strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $subject), '-')); return strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $subject), '-'));
} }
function title_case(string $subject): string function titleCase(string $subject): string
{ {
return str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $subject))); return str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $subject)));
} }
function replace_in_file(string $file, array $replacements): void function titleSnake(string $subject, string $replace = '_'): string
{
return str_replace(['-', '_'], $replace, $subject);
}
function replaceInFile(string $file, array $replacements): void
{ {
$contents = file_get_contents($file); $contents = file_get_contents($file);
@@ -253,7 +258,7 @@ function replace_in_file(string $file, array $replacements): void
); );
} }
function remove_prefix(string $prefix, string $content): string function removePrefix(string $prefix, string $content): string
{ {
if (str_starts_with($content, $prefix)) { if (str_starts_with($content, $prefix)) {
return substr($content, strlen($prefix)); return substr($content, strlen($prefix));
@@ -262,105 +267,67 @@ function remove_prefix(string $prefix, string $content): string
return $content; return $content;
} }
function remove_composer_deps(array $names): void function removeComposerDeps(array $names, string $location): void
{ {
$data = json_decode(file_get_contents(__DIR__.'/composer.json'), true); $data = json_decode(file_get_contents(__DIR__ . '/composer.json'), true);
foreach ($data['require-dev'] as $name => $version) { foreach ($data[$location] as $name => $version) {
if (in_array($name, $names, true)) { if (in_array($name, $names, true)) {
unset($data['require-dev'][$name]); unset($data[$location][$name]);
} }
} }
file_put_contents(__DIR__.'/composer.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); file_put_contents(__DIR__ . '/composer.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
} }
function remove_composer_filament_deps(array $names): void function removeNpmDeps(array $names, string $location): void
{ {
$data = json_decode(file_get_contents(__DIR__.'/composer.json'), true); $data = json_decode(file_get_contents(__DIR__ . '/package.json'), true);
foreach ($data['require'] as $name => $version) { foreach ($data[$location] as $name => $version) {
if (in_array($name, $names, true)) { if (in_array($name, $names, true)) {
unset($data['require'][$name]); unset($data[$location][$name]);
} }
} }
file_put_contents(__DIR__.'/composer.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); file_put_contents(__DIR__ . '/package.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES |
JSON_UNESCAPED_UNICODE));
} }
function remove_composer_script(array $scriptNames): void function removeTag(string $file, string $tag): void
{
$data = json_decode(file_get_contents(__DIR__.'/composer.json'), true);
foreach ($data['scripts'] as $name => $script) {
if (is_array($script)) {
foreach ($script as $k => $s) {
if (in_array($s, $scriptNames)) {
unset($data['scripts'][$name][$k]);
break;
}
}
} elseif (in_array($name, $scriptNames)) {
unset($data['scripts'][$name]);
break;
}
}
file_put_contents(__DIR__.'/composer.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
}
function remove_package_script(array $scriptNames): void
{
$data = json_decode(file_get_contents(__DIR__.'/package.json'), true);
foreach ($data['scripts'] as $name => $script) {
if (is_array($script)) {
foreach ($script as $k => $s) {
if (in_array($s, $scriptNames)) {
unset($data['scripts'][$name][$k]);
break;
}
}
} elseif (in_array($name, $scriptNames)) {
unset($data['scripts'][$name]);
break;
}
}
foreach ($data['devDependencies'] as $name => $script) {
if (is_array($script)) {
foreach ($script as $k => $s) {
if (in_array($s, $scriptNames)) {
unset($data['devDependencies'][$name][$k]);
break;
}
}
} elseif (in_array($name, $scriptNames)) {
unset($data['devDependencies'][$name]);
break;
}
}
file_put_contents(__DIR__.'/package.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES |
JSON_UNESCAPED_UNICODE));
}
function remove_tag(string $file, string $tag): void
{ {
$contents = file_get_contents($file); $contents = file_get_contents($file);
file_put_contents( file_put_contents(
$file, $file,
preg_replace('/<!--'.$tag.'-->.*<!--\/'.$tag.'-->/s', '', $contents) ?: $contents preg_replace('/<!--' . $tag . '-->.*<!--\/' . $tag . '-->/s', '', $contents) ?: $contents
); );
} }
function setupPackageJsonForTheme(): void
{
removeNpmDeps([
'purge',
'dev',
'dev:scripts',
'build',
'build:scripts',
], 'scripts');
removeNpmDeps([
'@awcodes/filament-plugin-purge',
'esbuild',
'npm-run-all',
'prettier',
'prettier-plugin-tailwindcss',
], 'devDependencies');
replaceInFile(__DIR__ . '/package.json', [
'dev:styles' => 'dev',
'build:styles' => 'build',
]);
}
function safeUnlink(string $filename): void function safeUnlink(string $filename): void
{ {
if (file_exists($filename) && is_file($filename)) { if (file_exists($filename) && is_file($filename)) {
@@ -375,12 +342,12 @@ function determineSeparator(string $path): string
function replaceForWindows(): array function replaceForWindows(): array
{ {
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 vendor_name vendor_slug author@domain.com"')); 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"'));
} }
function replaceForAllOtherOSes(): array function replaceForAllOtherOSes(): array
{ {
return explode(PHP_EOL, run('grep -E -r -l -i ":author|:vendor|:package|VendorName|skeleton|vendor_name|vendor_slug|author@domain.com" --exclude-dir=vendor ./* ./.github/* | grep -v '.basename(__FILE__))); 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__)));
} }
function removeDirectory($dir): void function removeDirectory($dir): void
@@ -389,10 +356,10 @@ function removeDirectory($dir): void
$objects = scandir($dir); $objects = scandir($dir);
foreach ($objects as $object) { foreach ($objects as $object) {
if ($object != '.' && $object != '..') { if ($object != '.' && $object != '..') {
if (filetype($dir.'/'.$object) == 'dir') { if (filetype($dir . '/' . $object) == 'dir') {
removeDirectory($dir.'/'.$object); removeDirectory($dir . '/' . $object);
} else { } else {
unlink($dir.'/'.$object); unlink($dir . '/' . $object);
} }
} }
} }

View File

@@ -8,7 +8,7 @@ return new class extends Migration
{ {
public function up() public function up()
{ {
Schema::create('skeleton_table', function (Blueprint $table) { Schema::create('migration_table_name_table', function (Blueprint $table) {
$table->id(); $table->id();
// add fields // add fields

25
package.json Normal file
View File

@@ -0,0 +1,25 @@
{
"private": true,
"scripts": {
"dev:styles": "npx tailwindcss -i resources/css/index.css -o resources/dist/skeleton.css --postcss --watch",
"dev:scripts": "node bin/build.js --dev",
"build:styles": "npx tailwindcss -i resources/css/index.css -o resources/dist/skeleton.css --postcss --minify && npm run purge",
"build:scripts": "node bin/build.js",
"purge": "filament-purge -i resources/dist/skeleton.css -o resources/dist/skeleton.css -v 3.x",
"dev": "npm-run-all --parallel dev:*",
"build": "npm-run-all build:*"
},
"devDependencies": {
"@awcodes/filament-plugin-purge": "^1.1.1",
"@tailwindcss/forms": "^0.5.4",
"@tailwindcss/typography": "^0.5.9",
"autoprefixer": "^10.4.14",
"esbuild": "^0.17.19",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.26",
"postcss-import": "^15.1.0",
"prettier": "^2.7.1",
"prettier-plugin-tailwindcss": "^0.1.13",
"tailwindcss": "^3.3.3"
}
}

View File

@@ -1,14 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<phpunit <phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.2/phpunit.xsd"
backupGlobals="false" backupGlobals="false"
backupStaticAttributes="false"
bootstrap="vendor/autoload.php" bootstrap="vendor/autoload.php"
colors="true" colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false" processIsolation="false"
stopOnFailure="false" stopOnFailure="false"
executionOrder="random" executionOrder="random"
@@ -16,7 +12,8 @@
failOnRisky="true" failOnRisky="true"
failOnEmptyTestSuite="true" failOnEmptyTestSuite="true"
beStrictAboutOutputDuringTests="true" beStrictAboutOutputDuringTests="true"
verbose="true" cacheDirectory=".phpunit.cache"
backupStaticProperties="false"
> >
<testsuites> <testsuites>
<testsuite name="VendorName Test Suite"> <testsuite name="VendorName Test Suite">
@@ -24,9 +21,6 @@
</testsuite> </testsuite>
</testsuites> </testsuites>
<coverage> <coverage>
<include>
<directory suffix=".php">./src</directory>
</include>
<report> <report>
<html outputDirectory="build/coverage"/> <html outputDirectory="build/coverage"/>
<text outputFile="build/coverage.txt"/> <text outputFile="build/coverage.txt"/>
@@ -36,4 +30,9 @@
<logging> <logging>
<junit outputFile="build/report.junit.xml"/> <junit outputFile="build/report.junit.xml"/>
</logging> </logging>
<source>
<include>
<directory suffix=".php">./src</directory>
</include>
</source>
</phpunit> </phpunit>

14
pint.json Normal file
View File

@@ -0,0 +1,14 @@
{
"preset": "laravel",
"rules": {
"blank_line_before_statement": true,
"concat_space": {
"spacing": "one"
},
"method_argument_space": true,
"single_trait_insert_per_statement": true,
"types_spaces": {
"space": "single"
}
}
}

1
resources/css/index.css Normal file
View File

@@ -0,0 +1 @@
@import '../../vendor/filament/filament/resources/css/theme.css';

View File

View File

@@ -0,0 +1,6 @@
<?php
// translations for VendorName/Skeleton
return [
//
];

34
src/SkeletonPlugin.php Normal file
View File

@@ -0,0 +1,34 @@
<?php
namespace VendorName\Skeleton;
use Filament\Contracts\Plugin;
use Filament\Panel;
class SkeletonPlugin implements Plugin
{
public function getId(): string
{
return 'skeleton';
}
public function register(Panel $panel): void
{
//
}
public function boot(Panel $panel): void
{
//
}
public static function make(): static
{
return app(static::class);
}
public static function get(): static
{
return filament(app(static::class)->getId());
}
}

View File

@@ -2,17 +2,13 @@
namespace VendorName\Skeleton; namespace VendorName\Skeleton;
use Filament\Context;
use Filament\Facades\Filament;
use Filament\Support\Assets\AlpineComponent; use Filament\Support\Assets\AlpineComponent;
use Filament\Support\Assets\Asset; use Filament\Support\Assets\Asset;
use Filament\Support\Assets\AssetManager;
use Filament\Support\Assets\Css; use Filament\Support\Assets\Css;
use Filament\Support\Assets\Js; use Filament\Support\Assets\Js;
use Filament\Support\Facades\FilamentAsset; use Filament\Support\Facades\FilamentAsset;
use Filament\Support\Facades\FilamentIcon; use Filament\Support\Facades\FilamentIcon;
use Filament\Support\Icons\Icon; use Filament\Support\Icons\Icon;
use Filament\Support\Icons\IconManager;
use Illuminate\Filesystem\Filesystem; use Illuminate\Filesystem\Filesystem;
use Livewire\Testing\TestableLivewire; use Livewire\Testing\TestableLivewire;
use Spatie\LaravelPackageTools\Commands\InstallCommand; use Spatie\LaravelPackageTools\Commands\InstallCommand;
@@ -29,6 +25,11 @@ class SkeletonServiceProvider extends PackageServiceProvider
public function configurePackage(Package $package): void public function configurePackage(Package $package): void
{ {
/*
* This class is a Package Service Provider
*
* More info: https://github.com/spatie/laravel-package-tools
*/
$package->name(static::$name) $package->name(static::$name)
->hasCommands($this->getCommands()) ->hasCommands($this->getCommands())
->hasInstallCommand(function (InstallCommand $command) { ->hasInstallCommand(function (InstallCommand $command) {
@@ -41,69 +42,59 @@ class SkeletonServiceProvider extends PackageServiceProvider
$configFileName = $package->shortName(); $configFileName = $package->shortName();
if (file_exists($this->package->basePath("/../config/{$configFileName}.php"))) { if (file_exists($package->basePath("/../config/{$configFileName}.php"))) {
$package->hasConfigFile(); $package->hasConfigFile();
} }
if (file_exists($this->package->basePath('/../database/migrations'))) { if (file_exists($package->basePath('/../database/migrations'))) {
$package->hasMigrations($this->getMigrations()); $package->hasMigrations($this->getMigrations());
} }
if (file_exists($this->package->basePath('/../resources/lang'))) { if (file_exists($package->basePath('/../resources/lang'))) {
$package->hasTranslations(); $package->hasTranslations();
} }
if (file_exists($this->package->basePath('/../resources/views'))) { if (file_exists($package->basePath('/../resources/views'))) {
$package->hasViews(static::$viewNamespace); $package->hasViews(static::$viewNamespace);
} }
} }
public function packageRegistered(): void public function packageRegistered(): void
{ {
// Facade Registration
$this->app->bind('skeleton', function (): Skeleton {
return new Skeleton();
});
// Context Registration
$this->app->resolving('skeleton', function () {
foreach ($this->getContexts() as $context) {
Filament::registerContext($context);
}
});
// Asset Registration
$this->app->resolving(AssetManager::class, function () {
FilamentAsset::register($this->getAssets(), $this->getAssetPackage());
FilamentAsset::registerScriptData($this->getScriptData(), $this->getAssetPackage());
});
// Icon Registration
$this->app->resolving(IconManager::class, function () {
FilamentIcon::register($this->getIcons());
});
} }
public function packageBooted(): void public function packageBooted(): void
{ {
$this->registerMacros(); // Asset Registration
FilamentAsset::register(
$this->getAssets(),
$this->getAssetPackageName()
);
// Handle Stubs FilamentAsset::registerScriptData(
if ($this->app->runningInConsole()) { $this->getScriptData(),
foreach (app(Filesystem::class)->files(__DIR__.'/../stubs/') as $file) { $this->getAssetPackageName()
);
// Icon Registration
FilamentIcon::register($this->getIcons());
// Handle Stubs
if (app()->runningInConsole()) {
foreach (app(Filesystem::class)->files(__DIR__ . '/../stubs/') as $file) {
$this->publishes([ $this->publishes([
$file->getRealPath() => base_path("stubs/skeleton/{$file->getFilename()}"), $file->getRealPath() => base_path("stubs/skeleton/{$file->getFilename()}"),
], 'forms-stubs'); ], 'skeleton-stubs');
} }
} }
// Testing // Testing
TestableLivewire::mixin(new TestsSkeleton()); TestableLivewire::mixin(new TestsSkeleton());
} }
protected function getAssetPackage(): ?string protected function getAssetPackageName(): ?string
{ {
return static::$name ?? null; return ':vendor_slug/:package_slug';
} }
/** /**
@@ -112,9 +103,9 @@ class SkeletonServiceProvider extends PackageServiceProvider
protected function getAssets(): array protected function getAssets(): array
{ {
return [ return [
// AlpineComponent::make('skeleton', __DIR__ . '/../resources/dist/components/skeleton.js'), // AlpineComponent::make('skeleton', __DIR__ . '/../resources/dist/components/skeleton.js'),
Css::make('skeleton-styles', __DIR__.'/../resources/dist/skeleton.js'), Css::make('skeleton-styles', __DIR__ . '/../resources/dist/skeleton.css'),
Js::make('skeleton-scripts', __DIR__.'/../resources/dist/skeleton.js'), Js::make('skeleton-scripts', __DIR__ . '/../resources/dist/skeleton.js'),
]; ];
} }
@@ -128,14 +119,6 @@ class SkeletonServiceProvider extends PackageServiceProvider
]; ];
} }
/**
* @return array<Context>
*/
protected function getContexts(): array
{
return [];
}
/** /**
* @return array<string, Icon> * @return array<string, Icon>
*/ */
@@ -169,8 +152,4 @@ class SkeletonServiceProvider extends PackageServiceProvider
'create_skeleton_table', 'create_skeleton_table',
]; ];
} }
protected function registerMacros(): void
{
}
} }

View File

@@ -1,9 +1,9 @@
<?php <?php
namespace VendorName; namespace VendorName\Skeleton;
use Filament\Context;
use Filament\Contracts\Plugin; use Filament\Contracts\Plugin;
use Filament\Panel;
use Filament\Support\Assets\Theme; use Filament\Support\Assets\Theme;
use Filament\Support\Color; use Filament\Support\Color;
use Filament\Support\Facades\FilamentAsset; use Filament\Support\Facades\FilamentAsset;
@@ -12,29 +12,27 @@ class Skeleton implements Plugin
{ {
public function getId(): string public function getId(): string
{ {
return 'skeleton-theme'; return 'skeleton';
} }
public function register(Context $context): void public function register(Panel $panel): void
{ {
FilamentAsset::register([ FilamentAsset::register([
Theme::make('skeleton', __DIR__.'/../resources/dist/skeleton.css'), Theme::make('skeleton', __DIR__ . '/../resources/dist/skeleton.css'),
]); ]);
$context $panel
->font('DM Sans') ->font('DM Sans')
->primaryColor(Color::Amber) ->primaryColor(Color::Amber)
->secondaryColor(Color::Gray) ->secondaryColor(Color::Gray)
->warningColor(Color::Amber) ->warningColor(Color::Amber)
->dangerColor(Color::Rose) ->dangerColor(Color::Rose)
->successColor(Color::Green) ->successColor(Color::Green)
->grayColor(Color::Slate) ->grayColor(Color::Gray)
->sidebarWidth('20rem')
->collapsedSidebarWidth('5.4rem')
->theme('skeleton'); ->theme('skeleton');
} }
public function boot(Context $context): void public function boot(Panel $panel): void
{ {
// //
} }

View File

@@ -3,6 +3,8 @@ const preset = require('./vendor/filament/filament/tailwind.config.preset')
module.exports = { module.exports = {
presets: [preset], presets: [preset],
content: [ content: [
'./vendor/filament/**/*.blade.php' './app/Filament/**/*.php',
'./resources/views/filament/**/*.blade.php',
'./vendor/filament/**/*.blade.php',
], ],
} }

5
tests/ArchTest.php Normal file
View File

@@ -0,0 +1,5 @@
<?php
it('will not use debugging functions')
->expect(['dd', 'dump', 'ray'])
->each->not->toBeUsed();

View File

@@ -2,10 +2,22 @@
namespace VendorName\Skeleton\Tests; namespace VendorName\Skeleton\Tests;
use BladeUI\Heroicons\BladeHeroiconsServiceProvider;
use BladeUI\Icons\BladeIconsServiceProvider;
use Filament\Actions\ActionsServiceProvider;
use Filament\FilamentServiceProvider; use Filament\FilamentServiceProvider;
use Filament\Forms\FormsServiceProvider;
use Filament\Infolists\InfolistsServiceProvider;
use Filament\Notifications\NotificationsServiceProvider;
use Filament\SpatieLaravelSettingsPluginServiceProvider;
use Filament\SpatieLaravelTranslatablePluginServiceProvider;
use Filament\Support\SupportServiceProvider;
use Filament\Tables\TablesServiceProvider;
use Filament\Widgets\WidgetsServiceProvider;
use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Database\Eloquent\Factories\Factory;
use Livewire\LivewireServiceProvider; use Livewire\LivewireServiceProvider;
use Orchestra\Testbench\TestCase as Orchestra; use Orchestra\Testbench\TestCase as Orchestra;
use RyanChandler\BladeCaptureDirective\BladeCaptureDirectiveServiceProvider;
use VendorName\Skeleton\SkeletonServiceProvider; use VendorName\Skeleton\SkeletonServiceProvider;
class TestCase extends Orchestra class TestCase extends Orchestra
@@ -15,15 +27,27 @@ class TestCase extends Orchestra
parent::setUp(); parent::setUp();
Factory::guessFactoryNamesUsing( Factory::guessFactoryNamesUsing(
fn (string $modelName) => 'VendorName\\Skeleton\\Database\\Factories\\'.class_basename($modelName).'Factory' fn (string $modelName) => 'VendorName\\Skeleton\\Database\\Factories\\' . class_basename($modelName) . 'Factory'
); );
} }
protected function getPackageProviders($app) protected function getPackageProviders($app)
{ {
return [ return [
LivewireServiceProvider::class, ActionsServiceProvider::class,
BladeCaptureDirectiveServiceProvider::class,
BladeHeroiconsServiceProvider::class,
BladeIconsServiceProvider::class,
FilamentServiceProvider::class, FilamentServiceProvider::class,
FormsServiceProvider::class,
InfolistsServiceProvider::class,
LivewireServiceProvider::class,
NotificationsServiceProvider::class,
SpatieLaravelSettingsPluginServiceProvider::class,
SpatieLaravelTranslatablePluginServiceProvider::class,
SupportServiceProvider::class,
TablesServiceProvider::class,
WidgetsServiceProvider::class,
SkeletonServiceProvider::class, SkeletonServiceProvider::class,
]; ];
} }