Skip to content

Commit 7dbaff3

Browse files
Merge pull request #100 from sugarmaplemedia/main
Fix: EnumTransformer properly handling single-quotes in backed enum string values
2 parents 7339a4a + ab7fd2b commit 7dbaff3

File tree

3 files changed

+60
-2
lines changed

3 files changed

+60
-2
lines changed

src/Transformers/EnumTransformer.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,22 @@ protected function toEnumValue(ReflectionEnumBackedCase $case): string
7373
{
7474
$value = $case->getBackingValue();
7575

76-
return is_string($value) ? "'" . str_replace('\\', '\\\\', $value) . "'" : "{$value}";
76+
$newValue = "";
77+
78+
if (!is_string($value)) {
79+
return "{$value}";
80+
}
81+
82+
for ($i = 0; $i < strlen($value); $i++) {
83+
$char = $value[$i];
84+
85+
$newValue .= match ($char) {
86+
'\\' => '\\\\',
87+
'\'' => '\\\'',
88+
default => $char,
89+
};
90+
}
91+
92+
return "'" . $newValue . "'";
7793
}
7894
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace Spatie\TypeScriptTransformer\Tests\FakeClasses;
4+
5+
enum StringBackedEnumWithSingleQuotes: string
6+
{
7+
case NO_QUOTE = 'no quote';
8+
case HAS_QUOTE = 'has quote \'';
9+
}

tests/Transformers/EnumTransformerTest.php

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use ReflectionClass;
1212
use Spatie\TypeScriptTransformer\Tests\FakeClasses\IntBackedEnum;
1313
use Spatie\TypeScriptTransformer\Tests\FakeClasses\StringBackedEnum;
14+
use Spatie\TypeScriptTransformer\Tests\FakeClasses\StringBackedEnumWithSingleQuotes;
1415
use Spatie\TypeScriptTransformer\Transformers\EnumTransformer;
1516
use Spatie\TypeScriptTransformer\TypeScriptTransformerConfig;
1617
use UnitEnum;
@@ -82,7 +83,7 @@
8283
assertEquals('type', $type->keyword);
8384
});
8485

85-
it('can transform a backed enum with integers into an enm', function () {
86+
it('can transform a backed enum with integers into an enum', function () {
8687
$transformer = new EnumTransformer(
8788
TypeScriptTransformerConfig::create()->transformToNativeEnums(true)
8889
);
@@ -113,3 +114,35 @@
113114
assertFalse($type->isInline);
114115
assertEquals('type', $type->keyword);
115116
});
117+
118+
it('can transform a backed enum with strings with single-quotes into a enum', function () {
119+
$transformer = new EnumTransformer(
120+
TypeScriptTransformerConfig::create()->transformToNativeEnums(true)
121+
);
122+
123+
$type = $transformer->transform(
124+
new ReflectionClass(StringBackedEnumWithSingleQuotes::class),
125+
'Enum'
126+
);
127+
128+
assertEquals("'NO_QUOTE' = 'no quote', 'HAS_QUOTE' = 'has quote \''", $type->transformed);
129+
assertTrue($type->missingSymbols->isEmpty());
130+
assertFalse($type->isInline);
131+
assertEquals('enum', $type->keyword);
132+
});
133+
134+
it('can transform a backed enum with strings with single-quotes into a union', function () {
135+
$transformer = new EnumTransformer(
136+
TypeScriptTransformerConfig::create()->transformToNativeEnums(false)
137+
);
138+
139+
$type = $transformer->transform(
140+
new ReflectionClass(StringBackedEnumWithSingleQuotes::class),
141+
'Enum'
142+
);
143+
144+
assertEquals("'no quote' | 'has quote \''", $type->transformed);
145+
assertTrue($type->missingSymbols->isEmpty());
146+
assertFalse($type->isInline);
147+
assertEquals('type', $type->keyword);
148+
});

0 commit comments

Comments
 (0)