Skip to content

Commit

Permalink
fix: node compat v2 handle $ in inject preset (#6048)
Browse files Browse the repository at this point in the history
* fix(node_compat): support $ characters in unenv inject preset

Follow up on  #6025 that makes
the code a bit more resilient.

* fixup! fix(node_compat): support $ characters in unenv inject preset

* fixup! fix(node_compat): support $ characters in unenv inject preset

* fixup! fix(node_compat): support $ characters in unenv inject preset

---------

Co-authored-by: Peter Bacon Darwin <[email protected]>
  • Loading branch information
IgorMinar and petebacondarwin authored Jun 17, 2024
1 parent 5d3d12f commit 6a5979c
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 7 deletions.
47 changes: 47 additions & 0 deletions packages/wrangler/src/__tests__/hybrid-nodejs-compat.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import {
decodeFromLowerCase,
encodeToLowerCase,
} from "../deployment-bundle/esbuild-plugins/hybrid-nodejs-compat";

describe("hybrid nodejs compat", () => {
describe("toLowerCase encoding and decoding", () => {
describe("encodeToLowerCase", () => {
it("should encode uppercase characters to lowercase prefixed with $", () => {
expect(encodeToLowerCase("Performance")).toBe("$performance");
expect(encodeToLowerCase("PerformanceMark")).toBe("$performance$mark");
});

it("should encode $ as $$", () => {
expect(encodeToLowerCase("$initial-and-final$")).toBe(
"$$initial-and-final$$"
);
expect(encodeToLowerCase("$FollowedByCapital")).toBe(
"$$$followed$by$capital"
);
expect(encodeToLowerCase("In$the$middle")).toBe("$in$$the$$middle");
});
});

describe("decodeFromLowerCase", () => {
it("should decode uppercase characters from lowercase prefixed with $", () => {
expect(decodeFromLowerCase("$foo$bar")).toBe("FooBar");
});

it("should decode $ from $$", () => {
expect(decodeFromLowerCase("$$foo$bar")).toBe("$fooBar");
expect(decodeFromLowerCase("$$$query$$")).toBe("$Query$");
expect(decodeFromLowerCase("$$$$query")).toBe("$$query");
expect(decodeFromLowerCase("$$$$$query")).toBe("$$Query");
});
});

it("by symmetrical", () => {
expect(decodeFromLowerCase(encodeToLowerCase("Performance"))).toBe(
"Performance"
);
expect(decodeFromLowerCase(encodeToLowerCase("$foo$BarBaz"))).toBe(
"$foo$BarBaz"
);
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -193,16 +193,29 @@ function handleNodeJSGlobals(
* This is important to support `inject` config for `performance` and `Performance` introduced
* in https://github.com/unjs/unenv/pull/257
*/
function encodeToLowerCase(str: string): string {
return str.replaceAll(/[A-Z]/g, (letter) => `$${letter.toLowerCase()}`);
export function encodeToLowerCase(str: string): string {
return str
.replaceAll(/\$/g, () => "$$")
.replaceAll(/[A-Z]/g, (letter) => `$${letter.toLowerCase()}`);
}

/**
* Decodes a string lowercased using `encodeToLowerCase` to the original strings
*/
function decodeFromLowerCase(str: string): string {
return str.replaceAll(
/\$([a-z])/g,
(match, letter) => `${letter.toUpperCase()}`
);
export function decodeFromLowerCase(str: string): string {
let out = "";
let i = 0;
while (i < str.length - 1) {
if (str[i] === "$") {
i++;
out += str[i].toUpperCase();
} else {
out += str[i];
}
i++;
}
if (i < str.length) {
out += str[i];
}
return out;
}

0 comments on commit 6a5979c

Please sign in to comment.