Skip to content

Commit

Permalink
perf: cache regular expresions for string formatters
Browse files Browse the repository at this point in the history
  • Loading branch information
juanjoDiaz committed Jan 19, 2024
1 parent ab22f53 commit dcaadcf
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 46 deletions.
3 changes: 2 additions & 1 deletion dist/cdn/formatters/string.js
Expand Up @@ -5,9 +5,10 @@ function stringFormatter(opts = {}) {
if (!quote || quote === escapedQuote) {
return (value) => value;
}
const quoteRegExp = new RegExp(quote, "g");
return (value) => {
if (value.includes(quote)) {
value = value.replace(new RegExp(quote, "g"), escapedQuote);
value = value.replace(quoteRegExp, escapedQuote);
}
return `${quote}${value}${quote}`;
};
Expand Down
3 changes: 2 additions & 1 deletion dist/cdn/formatters/stringExcel.js
@@ -1,8 +1,9 @@
// packages/formatters/src/stringExcel.ts
var quote = '"';
var escapedQuote = '""""';
var quoteRegExp = new RegExp(quote, "g");
function stringExcel(value) {
return `"=""${value.replace(new RegExp(quote, "g"), escapedQuote)}"""`;
return `"=""${value.replace(quoteRegExp, escapedQuote)}"""`;
}
export {
stringExcel as default
Expand Down
4 changes: 3 additions & 1 deletion dist/cdn/whatwg/index.js
@@ -1,6 +1,8 @@
// packages/whatwg/src/index.ts
import { default as default2 } from "./AsyncParser.js";
import { default as default3 } from "./TransformStream.js";
import {
default as default3
} from "./TransformStream.js";
export {
default2 as AsyncParser,
default3 as TransformStream
Expand Down
3 changes: 2 additions & 1 deletion packages/formatters/src/string.ts
Expand Up @@ -18,9 +18,10 @@ export default function stringFormatter(
return (value) => value;
}

const quoteRegExp = new RegExp(quote, 'g');
return (value) => {
if (value.includes(quote)) {
value = value.replace(new RegExp(quote, 'g'), escapedQuote);
value = value.replace(quoteRegExp, escapedQuote);
}

return `${quote}${value}${quote}`;
Expand Down
3 changes: 2 additions & 1 deletion packages/formatters/src/stringExcel.ts
@@ -1,6 +1,7 @@
const quote = '"';
const escapedQuote = '""""';

const quoteRegExp = new RegExp(quote, 'g');
export default function stringExcel(value: string) {
return `"=""${value.replace(new RegExp(quote, 'g'), escapedQuote)}"""`;
return `"=""${value.replace(quoteRegExp, escapedQuote)}"""`;
}
36 changes: 18 additions & 18 deletions packages/plainjs/src/utils.ts
@@ -1,14 +1,14 @@
type GetIndexedField<T, K> = K extends keyof T
? T[K]
: K extends `${number}`
? 'length' extends keyof T
? number extends T['length']
? number extends keyof T
? T[number]
? 'length' extends keyof T
? number extends T['length']
? number extends keyof T
? T[number]
: undefined
: undefined
: undefined
: undefined
: undefined;
: undefined;

type FieldWithPossiblyUndefined<T, Key> =
| GetFieldType<Exclude<T, undefined>, Key>
Expand All @@ -24,20 +24,20 @@ type GetFieldType<T, P> = P extends `${infer Left}.${infer Right}`
| FieldWithPossiblyUndefined<Exclude<T, undefined>[Left], Right>
| Extract<T, undefined>
: Left extends `${infer FieldKey}[${infer IndexKey}]`
? FieldKey extends keyof T
? FieldWithPossiblyUndefined<
IndexedFieldWithPossiblyUndefined<T[FieldKey], IndexKey>,
Right
>
? FieldKey extends keyof T
? FieldWithPossiblyUndefined<
IndexedFieldWithPossiblyUndefined<T[FieldKey], IndexKey>,
Right
>
: undefined
: undefined
: undefined
: P extends keyof T
? T[P]
: P extends `${infer FieldKey}[${infer IndexKey}]`
? FieldKey extends keyof T
? IndexedFieldWithPossiblyUndefined<T[FieldKey], IndexKey>
: undefined
: IndexedFieldWithPossiblyUndefined<T, P>;
? T[P]
: P extends `${infer FieldKey}[${infer IndexKey}]`
? FieldKey extends keyof T
? IndexedFieldWithPossiblyUndefined<T[FieldKey], IndexKey>
: undefined
: IndexedFieldWithPossiblyUndefined<T, P>;

type PropertyName = string | number | symbol;

Expand Down
7 changes: 4 additions & 3 deletions packages/test-helpers/utils.ts
@@ -1,9 +1,10 @@
const lfRegExp = new RegExp('(?<!\r)\n', 'g');
export function forceCrlfEol(content: string): string {
// eslint-disable-next-line no-control-regex
return content.replace(new RegExp('(?<!\r)\n', 'g'), '\r\n');
return content.replace(lfRegExp, '\r\n');
}

const crlfRegExp = new RegExp('\r\n', 'g');
export function forceLfEol(content: string): string {
// eslint-disable-next-line no-control-regex
return content.replace(new RegExp('\r\n', 'g'), '\n');
return content.replace(crlfRegExp, '\n');
}
4 changes: 2 additions & 2 deletions packages/transforms/src/unwind.ts
Expand Up @@ -80,8 +80,8 @@ export default function unwind<
const paths = Array.isArray(opts.paths)
? opts.paths
: opts.paths
? [opts.paths]
: undefined;
? [opts.paths]
: undefined;
return (dataRow: I) =>
(paths || getUnwindablePaths(dataRow)).reduce(unwindReducer, [
dataRow,
Expand Down
36 changes: 18 additions & 18 deletions packages/transforms/src/utils.ts
@@ -1,14 +1,14 @@
type GetIndexedField<T, K> = K extends keyof T
? T[K]
: K extends `${number}`
? 'length' extends keyof T
? number extends T['length']
? number extends keyof T
? T[number]
? 'length' extends keyof T
? number extends T['length']
? number extends keyof T
? T[number]
: undefined
: undefined
: undefined
: undefined
: undefined;
: undefined;

type FieldWithPossiblyUndefined<T, Key> =
| GetFieldType<Exclude<T, undefined>, Key>
Expand All @@ -24,20 +24,20 @@ type GetFieldType<T, P> = P extends `${infer Left}.${infer Right}`
| FieldWithPossiblyUndefined<Exclude<T, undefined>[Left], Right>
| Extract<T, undefined>
: Left extends `${infer FieldKey}[${infer IndexKey}]`
? FieldKey extends keyof T
? FieldWithPossiblyUndefined<
IndexedFieldWithPossiblyUndefined<T[FieldKey], IndexKey>,
Right
>
? FieldKey extends keyof T
? FieldWithPossiblyUndefined<
IndexedFieldWithPossiblyUndefined<T[FieldKey], IndexKey>,
Right
>
: undefined
: undefined
: undefined
: P extends keyof T
? T[P]
: P extends `${infer FieldKey}[${infer IndexKey}]`
? FieldKey extends keyof T
? IndexedFieldWithPossiblyUndefined<T[FieldKey], IndexKey>
: undefined
: IndexedFieldWithPossiblyUndefined<T, P>;
? T[P]
: P extends `${infer FieldKey}[${infer IndexKey}]`
? FieldKey extends keyof T
? IndexedFieldWithPossiblyUndefined<T[FieldKey], IndexKey>
: undefined
: IndexedFieldWithPossiblyUndefined<T, P>;

type PropertyName = string | number | symbol;

Expand Down

0 comments on commit dcaadcf

Please sign in to comment.