Skip to content

Commit 0ae4b74

Browse files
committed
Merge branch 'release/2.3.0'
2 parents 8ca4377 + 37469d3 commit 0ae4b74

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+2776
-159
lines changed

.github/workflows/build.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ jobs:
1212
fail-fast: false
1313
matrix:
1414
php: [8.1, 8.2, 8.3, 8.4]
15-
dependency-version: [prefer-stable]
16-
os: [ubuntu-latest]
15+
dependency-version: [prefer-lowest, prefer-stable]
16+
os: [ubuntu-latest, windows-latest, macos-latest]
1717

1818
name: PHP ${{ matrix.php }} - ${{ matrix.dependency-version }} - ${{ matrix.os }}
1919

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,19 @@ Updates should follow the [Keep a CHANGELOG](https://keepachangelog.com/) princi
2626
- Nothing
2727

2828

29+
## 2.3.0 - 2024-12-22
30+
31+
### Added
32+
- Enums discoverability
33+
- Console command to create an enum
34+
- Console command to annotate enums
35+
- Console command to turn PHP enums into TypeScript enums
36+
37+
### Changed
38+
- Improved static analysis
39+
- CasesCollection::groupBy() does not wrap the result into a collection
40+
41+
2942
## 2.2.1 - 2024-11-22
3043

3144
### Added

README.md

Lines changed: 191 additions & 52 deletions
Large diffs are not rendered by default.

bin/enum

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#!/usr/bin/env php
2+
3+
<?php
4+
5+
use function Cerbero\Enum\fail;
6+
use function Cerbero\Enum\path;
7+
use function Cerbero\Enum\setPathsByOptions;
8+
use function Cerbero\Enum\splitArgv;
9+
10+
is_file($autoload = dirname(__DIR__, 1) . '/vendor/autoload.php') && require $autoload;
11+
is_file($autoload = dirname(__DIR__, 4) . '/vendor/autoload.php') && require $autoload;
12+
is_file($autoload = dirname(__DIR__, 4) . '/enums.php') && require $autoload;
13+
14+
if (is_file($command = path(__DIR__ . '/../cli/' . ($argv[1] ?? null) . '.php'))) {
15+
try {
16+
[$arguments, $options] = splitArgv($argv);
17+
setPathsByOptions($options);
18+
19+
$outcome = require $command;
20+
} catch (Throwable $e) {
21+
$outcome = fail($e->getMessage());
22+
}
23+
24+
exit($outcome ? 0 : 1);
25+
}
26+
27+
require path(__DIR__ . '/../cli/help');

cli/annotate.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Cerbero\Enum\Enums;
6+
use Cerbero\Enum\Services\Annotator;
7+
8+
use function Cerbero\Enum\enumOutcome;
9+
use function Cerbero\Enum\normalizeEnums;
10+
use function Cerbero\Enum\succeed;
11+
12+
$enums = array_intersect(['--all', '-a'], $options) ? [...Enums::namespaces()] : normalizeEnums($arguments);
13+
14+
if (empty($enums)) {
15+
return succeed('No enums to annotate.');
16+
}
17+
18+
$succeeded = true;
19+
$force = !! array_intersect(['--force', '-f'], $options);
20+
21+
foreach ($enums as $enum) {
22+
$succeeded = enumOutcome($enum, fn() => (new Annotator($enum))->annotate($force)) && $succeeded;
23+
}
24+
25+
return $succeeded;

cli/help

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
Annotate enums to ease IDE autocompletion.
2+
3+
Usage: enum annotate enum1 [enum2 ...]
4+
5+
Available options:
6+
7+
-a, --all Whether all enums should be annotated
8+
-f, --force Whether existing annotations should be overwritten
9+
10+
Examples:
11+
enum annotate App/Enums/MyEnum
12+
enum annotate "App\Enums\MyEnum"
13+
enum annotate App/Enums/MyEnum1 App/Enums/MyEnum2
14+
enum annotate App/Enums/MyEnum --force
15+
enum annotate --all
16+
enum annotate --all --force
17+
18+
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
19+
20+
Create a new enum.
21+
22+
Usage: enum make enum case1 case2
23+
24+
Available options:
25+
26+
--backed=VALUE How cases should be backed. VALUE is either:
27+
snake|camel|kebab|upper|lower|int0|int1|bitwise
28+
-f, --force Whether the existing enum should be overwritten
29+
-t, --typescript Whether the enum should be synced in TypeScript
30+
31+
Examples:
32+
enum make App/Enums/MyEnum Case1 Case2
33+
enum make "App\Enums\MyEnum" Case1 Case2
34+
enum make App/Enums/MyEnum Case1=value1 Case2=value2
35+
enum make App/Enums/MyEnum Case1 Case2 --backed=int1
36+
enum make App/Enums/MyEnum Case1 Case2 --force
37+
enum make App/Enums/MyEnum Case1 Case2 --backed=bitwise --force
38+
enum make App/Enums/MyEnum Case1 Case2 --typescript
39+
40+
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
41+
42+
Synchronize enums in TypeScript.
43+
44+
Usage: enum ts enum1 [enum2 ...]
45+
46+
Available options:
47+
48+
-a, --all Whether all enums should be synchronized
49+
-f, --force Whether existing enums should be overwritten
50+
51+
Examples:
52+
enum ts App/Enums/MyEnum
53+
enum ts "App\Enums\MyEnum"
54+
enum ts App/Enums/MyEnum1 App/Enums/MyEnum2
55+
enum ts App/Enums/MyEnum --force
56+
enum ts --all
57+
enum ts --all --force

cli/make.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Cerbero\Enum\Enums\Backed;
6+
use Cerbero\Enum\Services\Generator;
7+
8+
use function Cerbero\Enum\enumOutcome;
9+
use function Cerbero\Enum\fail;
10+
use function Cerbero\Enum\option;
11+
use function Cerbero\Enum\runAnnotate;
12+
use function Cerbero\Enum\runTs;
13+
use function Cerbero\Enum\succeed;
14+
15+
if (! $enum = strtr($arguments[0] ?? '', '/', '\\')) {
16+
return fail('The name of the enum is missing.');
17+
}
18+
19+
$force = !! array_intersect(['--force', '-f'], $options);
20+
21+
if (enum_exists($enum) && ! $force) {
22+
return succeed("The enum {$enum} already exists.");
23+
}
24+
25+
if (! $cases = array_slice($arguments, 1)) {
26+
return fail('The cases of the enum are missing.');
27+
}
28+
29+
try {
30+
$generator = new Generator($enum, $cases, option('backed', $options));
31+
} catch (ValueError) {
32+
return fail('The option --backed supports only ' . implode(', ', Backed::names()));
33+
}
34+
35+
$typeScript = !! array_intersect(['--typescript', '-t'], $options);
36+
37+
return enumOutcome($enum, function () use ($generator, $enum, $force, $typeScript) {
38+
return $generator->generate($force)
39+
&& runAnnotate($enum, $force)
40+
&& ($typeScript ? runTs($enum, $force) : true);
41+
});

cli/ts.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Cerbero\Enum\Enums;
6+
use Cerbero\Enum\Services\TypeScript;
7+
8+
use function Cerbero\Enum\enumOutcome;
9+
use function Cerbero\Enum\normalizeEnums;
10+
use function Cerbero\Enum\succeed;
11+
12+
$enums = array_intersect(['--all', '-a'], $options) ? [...Enums::namespaces()] : normalizeEnums($arguments);
13+
14+
if (empty($enums)) {
15+
return succeed('No enums to synchronize.');
16+
}
17+
18+
$succeeded = true;
19+
$force = !! array_intersect(['--force', '-f'], $options);
20+
21+
foreach ($enums as $enum) {
22+
$succeeded = enumOutcome($enum, fn() => (new TypeScript($enum))->sync($force)) && $succeeded;
23+
}
24+
25+
return $succeeded;

composer.json

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,20 @@
2727
"autoload": {
2828
"psr-4": {
2929
"Cerbero\\Enum\\": "src"
30-
}
30+
},
31+
"files": [
32+
"helpers/core.php",
33+
"helpers/cli.php"
34+
]
3135
},
3236
"autoload-dev": {
3337
"psr-4": {
34-
"Cerbero\\Enum\\": "tests"
38+
"Cerbero\\Enum\\": "tests",
39+
"App\\": "tests/Skeleton/app",
40+
"Domain\\": "tests/Skeleton/domain"
3541
}
3642
},
43+
"bin": ["bin/enum"],
3744
"scripts": {
3845
"fix": "duster fix -u tlint,phpcodesniffer,pint",
3946
"lint": "duster lint -u tlint,phpcodesniffer,pint,phpstan",

0 commit comments

Comments
 (0)