Skip to content

perf: up to 3x initial load time improvements across plugins and s3 storage#16518

Open
paulpopus wants to merge 3 commits intomainfrom
perf/init-time-bundle-stage-1
Open

perf: up to 3x initial load time improvements across plugins and s3 storage#16518
paulpopus wants to merge 3 commits intomainfrom
perf/init-time-bundle-stage-1

Conversation

@paulpopus
Copy link
Copy Markdown
Contributor

@paulpopus paulpopus commented May 6, 2026

Summary

Change File Verified impact
1. Drop dead upload-adapter loop packages/payload/src/config/sanitize.ts Within noise (housekeeping; loop built a Set that was never read)
2. Map-indexed collection/global lookups in endpoint handlers packages/plugin-seo/src/index.ts 10–76× faster lookup at K=1000 requests, scales with collection count
3. Collapse double translation merge into single scoped pass packages/plugin-ecommerce/src/index.ts 1.4–1.8× plugin call
4. Filter-first translation merge packages/plugin-import-export/src/index.ts 1.2–1.6× plugin call
5. Set.has + single-pass label/hook attachment packages/plugin-search/src/index.ts 1.7–3.0× plugin call end-to-end
6. Dynamic-import @aws-sdk/client-s3 (only when needed) packages/storage-s3/src/{index,adapter,generateSignedURL}.ts −67 ms / −6.7 MB at process import; AWS SDK no longer loaded at boot

Details

1. sanitize.ts — remove dead upload-adapter dedup loop

packages/payload/src/config/sanitize.ts had two consecutive blocks computing upload-adapter dedup. The first built a local Set<string> and never read from it; the second rebuilt the same data inline. Removed the unused block.

2. plugin-seo — Map-indexed endpoint lookups

The four /plugin-seo/generate-* endpoint handlers each performed two Array.find(c => c.slug === ...) calls per request — once for the collection, once for the global. Each call is O(N) over config.collections / config.globals.

Built a Map<slug, config> once per plugin init and replaced the four .find() pairs with Map.get(slug) lookups. Per-request cost goes from O(N + G) to O(1).

3. plugin-ecommerce — collapse double translation merge

The plugin previously did deepMergeSimple(translations, incomingConfig.i18n.translations) followed by an Object.entries(translations).forEach(...) loop that re-set the plugin-ecommerce namespace per-locale. Two full passes over the language table.

Collapsed into one pass that walks supportedLanguages and writes the plugin-ecommerce namespace directly. Same observable behavior (plugin's plugin-ecommerce strings still win over user-provided ones).

4. plugin-import-export — filter-first translation merge

Was building an intermediate simplifiedTranslations via Object.entries(translations).reduce(...) over all 31 language entries before merging. Now iterates only supportedLanguages and skips the unused tables.

5. plugin-search — Set.has + single-pass label collection

Two improvements:

  • enabledCollections.indexOf(collection.slug) > -1 (O(M) per collection) → enabledSlugSet.has(collection.slug) (O(1)).
  • Single for (const collection of collections) pass collects labels for the search-enabled subset; was a separate filter().map().Object.fromEntries(...) pass.

6. storage-s3 — lazy-load @aws-sdk/client-s3

The package's entry file did import * as AWS from '@aws-sdk/client-s3' at module top, plus the helper files (generateSignedURL.ts, getFile.ts, uploadFile.ts) eagerly imported their AWS pieces. As a result, the SDK (~5–7 MB unpacked) was loaded into the module graph at process boot regardless of whether enabled: false or whether any upload route was ever hit.

After this PR:

  • All @aws-sdk/* imports in index.ts and generateSignedURL.ts are import type only.
  • index.ts lazy-imports the S3 constructor inside the plugin function only when enabled !== false.
  • adapter.ts dynamic-imports the deleteFile / uploadFile / getFile helpers (which still eagerly use AWS internally) on first invocation of handleDelete / handleUpload / staticHandler.
  • generateSignedURL.ts's handler dynamic-imports PutObjectCommand and getSignedUrl on first request.

Net effect: AWS SDK never loads at boot. For users who disable the plugin or never hit upload paths, it doesn't load at all. The s3Storage plugin function is now async, which is supported by the Plugin type.

Tests

Added two regression tests pinning the new translation-scoping behavior:

  • test/plugin-ecommerce/int.spec.ts — asserts plugin-ecommerce keys present only in supportedLanguages buckets.
  • test/plugin-import-export/int.spec.ts — same shape.

The full int suite for plugin-seo, plugin-import-export, plugin-ecommerce, plugin-redirects, plugin-search, storage-s3, _community, and access-control passes (312 tests). All packages typecheck clean.

Benchmark results

Methodology: bench scripts in test/_perf-benchmarks/ (untracked). Each bench was run on main (before) and on this branch (after). 50–200 iterations + warmup. process.hrtime.bigint()-based timing.

plugin translation merges (mean ms per plugin call)

Plugin supportedLanguages before after speedup
plugin-import-export en 0.0126 0.0105 1.20×
plugin-import-export 5 langs 0.0167 0.0114 1.46×
plugin-import-export 31 langs 0.0122 0.0143 0.85×
plugin-ecommerce en 0.0196 0.0109 1.80×
plugin-ecommerce 5 langs 0.0186 0.0132 1.41×
plugin-ecommerce 31 langs 0.0192 0.0115 1.67×

plugin-search end-to-end (mean ms per plugin call)

N collections / M enabled before after speedup
N=50 / M=25 0.0388 0.0216 1.80×
N=100 / M=50 0.1352 0.0450 3.00×
N=200 / M=100 0.1379 0.0807 1.71×

plugin-seo endpoint lookup (K=1000 requests, mean ms)

N collections array.find (before shape) Map.get (after shape) speedup
50 0.252 0.024 10×
100 0.345 0.023 15×
200 0.421 0.025 17×
500 0.850 0.011 76×

storage-s3 cold-boot (mean over 8 fresh child processes)

before after delta
enabled: false import time 505.83 ms 438.83 ms −67 ms
enabled: false import heap delta 33,987 KB 27,231 KB −6,756 KB
enabled: false aws-sdk loaded after import 100% 0%
enabled: true import time 480.13 ms 425.85 ms −54 ms
enabled: true aws-sdk loaded after import 100% 0%
enabled: true plugin call (first invocation) 0.18 ms 0.87 ms +0.69 ms

For enabled S3 the AWS load cost is shifted from boot to the first invocation that needs it (one-time per process). Net positive for serverless cold-start; identical steady-state.

sanitize dead-loop removal

Within measurement noise across N=50/100/200 (1.01–1.04×). Kept because the loop was confirmed dead and the change is a small simplification.

@paulpopus paulpopus requested a review from denolfe as a code owner May 6, 2026 20:40
@paulpopus paulpopus changed the title perf: initial load time improvements across plugins and s3 storage perf: up to 3x initial load time improvements across plugins and s3 storage May 6, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 6, 2026

📦 esbuild Bundle Analysis for payload

This analysis was generated by esbuild-bundle-analyzer. 🤖

Meta File Out File Size (raw) Note
packages/next/meta_index.json esbuild/index.js 989.29 KB ✅ No change
packages/payload/meta_index.json esbuild/index.js 1.40 MB ⚠️ +404 B (+0.0%)
packages/payload/meta_shared.json esbuild/exports/shared.js 190.50 KB ✅ No change
packages/richtext-lexical/meta_client.json esbuild/exports/client_optimized/index.js 287.28 KB ✅ No change
packages/ui/meta_client.json esbuild/exports/client_optimized/index.js 1.24 MB ⚠️ +3.05 KB (+0.2%)
packages/ui/meta_shared.json esbuild/exports/shared_optimized/index.js 16.32 KB ✅ No change
Largest paths These visualization shows top 20 largest paths in the bundle.

Meta file: packages/next/meta_index.json, Out file: esbuild/index.js

Path Size
../../node_modules ${{\color{Goldenrod}{ ████████████████████▌ }}}$ 82.0%, 807.63 KB
dist/views/Version ${{\color{Goldenrod}{ █▎ }}}$ 5.2%, 51.49 KB
dist/views/Dashboard ${{\color{Goldenrod}{ ▌ }}}$ 2.2%, 21.38 KB
dist/views/Document ${{\color{Goldenrod}{ ▍ }}}$ 1.7%, 16.66 KB
dist/views/List ${{\color{Goldenrod}{ ▍ }}}$ 1.5%, 15.24 KB
dist/elements/Nav ${{\color{Goldenrod}{ ▎ }}}$ 1.1%, 10.87 KB
dist/views/Root ${{\color{Goldenrod}{ ▎ }}}$ 1.0%, 9.90 KB
dist/views/Versions ${{\color{Goldenrod}{ ▏ }}}$ 0.6%, 6.17 KB
dist/views/API ${{\color{Goldenrod}{ ▏ }}}$ 0.6%, 6.13 KB
dist/views/Account ${{\color{Goldenrod}{ ▏ }}}$ 0.6%, 5.55 KB
dist/elements/DocumentHeader ${{\color{Goldenrod}{ ▏ }}}$ 0.5%, 4.71 KB
dist/views/Login ${{\color{Goldenrod}{ }}}$ 0.4%, 4.40 KB
dist/layouts/Root ${{\color{Goldenrod}{ }}}$ 0.3%, 3.41 KB
dist/views/ForgotPassword ${{\color{Goldenrod}{ }}}$ 0.3%, 3.13 KB
dist/views/CreateFirstUser ${{\color{Goldenrod}{ }}}$ 0.3%, 2.81 KB
dist/templates/Default ${{\color{Goldenrod}{ }}}$ 0.3%, 2.64 KB
dist/views/ResetPassword ${{\color{Goldenrod}{ }}}$ 0.2%, 2.40 KB
dist/views/Logout ${{\color{Goldenrod}{ }}}$ 0.2%, 1.94 KB
dist/views/Verify ${{\color{Goldenrod}{ }}}$ 0.1%, 1.29 KB
dist/views/NotFound ${{\color{Goldenrod}{ }}}$ 0.1%, 1.21 KB
(other) ${{\color{Goldenrod}{ ████▌ }}}$ 18.0%, 176.99 KB

Meta file: packages/payload/meta_index.json, Out file: esbuild/index.js

Path Size
../../node_modules ${{\color{Goldenrod}{ █████████████████ }}}$ 68.1%, 952.00 KB
dist/fields/hooks ${{\color{Goldenrod}{ ▊ }}}$ 3.2%, 44.07 KB
dist/collections/operations ${{\color{Goldenrod}{ ▋ }}}$ 2.9%, 40.23 KB
dist/versions/migrations ${{\color{Goldenrod}{ ▎ }}}$ 1.3%, 18.50 KB
dist/auth/operations ${{\color{Goldenrod}{ ▎ }}}$ 1.1%, 15.63 KB
dist/fields/config ${{\color{Goldenrod}{ ▎ }}}$ 1.0%, 14.18 KB
dist/globals/operations ${{\color{Goldenrod}{ ▎ }}}$ 1.0%, 13.40 KB
dist/utilities/configToJSONSchema.js ${{\color{Goldenrod}{ ▏ }}}$ 0.9%, 13.13 KB
dist/queues/operations ${{\color{Goldenrod}{ ▏ }}}$ 0.9%, 12.65 KB
dist/fields/validations.js ${{\color{Goldenrod}{ ▏ }}}$ 0.8%, 10.57 KB
dist/collections/config ${{\color{Goldenrod}{ ▏ }}}$ 0.7%, 9.51 KB
dist/bin/generateImportMap ${{\color{Goldenrod}{ ▏ }}}$ 0.7%, 9.44 KB
dist/config/orderable ${{\color{Goldenrod}{ ▏ }}}$ 0.6%, 8.00 KB
dist/uploads/fetchAPI-multipart ${{\color{Goldenrod}{ ▏ }}}$ 0.6%, 7.80 KB
dist/index.js ${{\color{Goldenrod}{ ▏ }}}$ 0.6%, 7.79 KB
dist/hierarchy/utils ${{\color{Goldenrod}{ ▏ }}}$ 0.5%, 7.65 KB
dist/database/migrations ${{\color{Goldenrod}{ ▏ }}}$ 0.5%, 7.54 KB
dist/collections/endpoints ${{\color{Goldenrod}{ }}}$ 0.4%, 6.23 KB
dist/auth/strategies ${{\color{Goldenrod}{ }}}$ 0.4%, 5.50 KB
dist/config/sanitize.js ${{\color{Goldenrod}{ }}}$ 0.4%, 5.46 KB
(other) ${{\color{Goldenrod}{ ███████▉ }}}$ 31.9%, 445.33 KB

Meta file: packages/payload/meta_shared.json, Out file: esbuild/exports/shared.js

Path Size
../../node_modules ${{\color{Goldenrod}{ ███████████████████▉ }}}$ 79.7%, 148.89 KB
dist/fields/validations.js ${{\color{Goldenrod}{ █▍ }}}$ 5.7%, 10.57 KB
dist/config/orderable ${{\color{Goldenrod}{ ▍ }}}$ 1.7%, 3.13 KB
dist/fields/baseFields ${{\color{Goldenrod}{ ▍ }}}$ 1.5%, 2.79 KB
dist/utilities/deepCopyObject.js ${{\color{Goldenrod}{ ▎ }}}$ 1.4%, 2.54 KB
dist/auth/cookies.js ${{\color{Goldenrod}{ ▏ }}}$ 0.8%, 1.55 KB
dist/utilities/flattenTopLevelFields.js ${{\color{Goldenrod}{ ▏ }}}$ 0.8%, 1.42 KB
dist/fields/config ${{\color{Goldenrod}{ ▏ }}}$ 0.7%, 1.28 KB
dist/utilities/getVersionsConfig.js ${{\color{Goldenrod}{ ▏ }}}$ 0.6%, 1.04 KB
dist/utilities/flattenAllFields.js ${{\color{Goldenrod}{ ▏ }}}$ 0.5%, 943 B
dist/utilities/unflatten.js ${{\color{Goldenrod}{ }}}$ 0.4%, 779 B
dist/utilities/sanitizeUserDataForEmail.js ${{\color{Goldenrod}{ }}}$ 0.4%, 713 B
dist/utilities/getFieldPermissions.js ${{\color{Goldenrod}{ }}}$ 0.3%, 651 B
dist/collections/config ${{\color{Goldenrod}{ }}}$ 0.3%, 570 B
dist/bin/generateImportMap ${{\color{Goldenrod}{ }}}$ 0.3%, 561 B
dist/auth/sessions.js ${{\color{Goldenrod}{ }}}$ 0.3%, 525 B
dist/fields/getFieldPaths.js ${{\color{Goldenrod}{ }}}$ 0.3%, 485 B
dist/utilities/getSafeRedirect.js ${{\color{Goldenrod}{ }}}$ 0.2%, 423 B
dist/utilities/deepMerge.js ${{\color{Goldenrod}{ }}}$ 0.2%, 413 B
dist/errors/APIError.js ${{\color{Goldenrod}{ }}}$ 0.2%, 399 B
(other) ${{\color{Goldenrod}{ █████ }}}$ 20.3%, 37.91 KB

Meta file: packages/richtext-lexical/meta_client.json, Out file: esbuild/exports/client_optimized/index.js

Path Size
dist/features/blocks ${{\color{Goldenrod}{ ███▏ }}}$ 12.8%, 36.44 KB
dist/lexical/plugins ${{\color{Goldenrod}{ ██▉ }}}$ 11.5%, 32.65 KB
dist/lexical/ui ${{\color{Goldenrod}{ ██▏ }}}$ 8.6%, 24.36 KB
dist/features/experimental_table ${{\color{Goldenrod}{ ██ }}}$ 8.3%, 23.70 KB
dist/packages/@lexical ${{\color{Goldenrod}{ █▋ }}}$ 6.7%, 18.99 KB
dist/features/link ${{\color{Goldenrod}{ █▋ }}}$ 6.5%, 18.53 KB
dist/features/toolbars ${{\color{Goldenrod}{ █▍ }}}$ 5.7%, 16.08 KB
dist/features/upload ${{\color{Goldenrod}{ █▏ }}}$ 4.8%, 13.77 KB
dist/features/textState ${{\color{Goldenrod}{ ▉ }}}$ 3.9%, 11.08 KB
dist/features/relationship ${{\color{Goldenrod}{ ▊ }}}$ 3.2%, 9.03 KB
dist/lexical/utils ${{\color{Goldenrod}{ ▊ }}}$ 3.1%, 8.79 KB
dist/features/converters ${{\color{Goldenrod}{ ▋ }}}$ 2.9%, 8.36 KB
dist/features/debug ${{\color{Goldenrod}{ ▋ }}}$ 2.6%, 7.40 KB
dist/utilities/fieldsDrawer ${{\color{Goldenrod}{ ▋ }}}$ 2.5%, 7.15 KB
dist/lexical/config ${{\color{Goldenrod}{ ▍ }}}$ 1.8%, 5.08 KB
dist/features/lists ${{\color{Goldenrod}{ ▍ }}}$ 1.8%, 5.00 KB
dist/features/format ${{\color{Goldenrod}{ ▎ }}}$ 1.2%, 3.46 KB
dist/lexical/LexicalEditor.js ${{\color{Goldenrod}{ ▎ }}}$ 1.1%, 3.23 KB
dist/field/Field.js ${{\color{Goldenrod}{ ▎ }}}$ 1.0%, 2.81 KB
dist/lexical/nodes ${{\color{Goldenrod}{ ▏ }}}$ 0.9%, 2.66 KB
(other) ${{\color{Goldenrod}{ █████████████████████▊ }}}$ 87.2%, 247.61 KB

Meta file: packages/ui/meta_client.json, Out file: esbuild/exports/client_optimized/index.js

Path Size
../../node_modules ${{\color{Goldenrod}{ ███████████▊ }}}$ 47.3%, 579.53 KB
dist/elements/Hierarchy ${{\color{Goldenrod}{ ▉ }}}$ 3.6%, 44.30 KB
dist/elements/BulkUpload ${{\color{Goldenrod}{ ▌ }}}$ 2.3%, 28.33 KB
dist/views/HierarchyList ${{\color{Goldenrod}{ ▍ }}}$ 1.5%, 18.86 KB
dist/elements/Table ${{\color{Goldenrod}{ ▍ }}}$ 1.5%, 18.25 KB
dist/views/Edit ${{\color{Goldenrod}{ ▎ }}}$ 1.4%, 17.38 KB
dist/elements/WhereBuilder ${{\color{Goldenrod}{ ▎ }}}$ 1.4%, 17.36 KB
dist/forms/Form ${{\color{Goldenrod}{ ▎ }}}$ 1.3%, 15.92 KB
dist/fields/Relationship ${{\color{Goldenrod}{ ▎ }}}$ 1.3%, 15.83 KB
dist/fields/Blocks ${{\color{Goldenrod}{ ▎ }}}$ 1.2%, 15.13 KB
dist/fields/Upload ${{\color{Goldenrod}{ ▎ }}}$ 1.2%, 14.44 KB
dist/elements/QueryPresets ${{\color{Goldenrod}{ ▏ }}}$ 0.8%, 10.36 KB
dist/elements/PublishButton ${{\color{Goldenrod}{ ▏ }}}$ 0.7%, 9.09 KB
dist/elements/HTMLDiff ${{\color{Goldenrod}{ ▏ }}}$ 0.7%, 8.38 KB
dist/views/List ${{\color{Goldenrod}{ ▏ }}}$ 0.7%, 8.10 KB
dist/fields/Array ${{\color{Goldenrod}{ ▏ }}}$ 0.6%, 7.77 KB
dist/elements/ReactSelect ${{\color{Goldenrod}{ ▏ }}}$ 0.6%, 7.74 KB
dist/elements/LivePreview ${{\color{Goldenrod}{ ▏ }}}$ 0.6%, 7.04 KB
dist/elements/Upload ${{\color{Goldenrod}{ ▏ }}}$ 0.5%, 6.67 KB
dist/elements/RelationshipTable ${{\color{Goldenrod}{ ▏ }}}$ 0.5%, 6.28 KB
(other) ${{\color{Goldenrod}{ █████████████▏ }}}$ 52.7%, 646.43 KB

Meta file: packages/ui/meta_shared.json, Out file: esbuild/exports/shared_optimized/index.js

Path Size
dist/graphics/Logo ${{\color{Goldenrod}{ █████ }}}$ 20.0%, 3.12 KB
../../node_modules ${{\color{Goldenrod}{ ████▎ }}}$ 17.0%, 2.65 KB
dist/graphics/Icon ${{\color{Goldenrod}{ ██▍ }}}$ 9.8%, 1.52 KB
dist/utilities/formatDocTitle ${{\color{Goldenrod}{ ██▏ }}}$ 8.5%, 1.32 KB
dist/providers/TableColumns ${{\color{Goldenrod}{ █▍ }}}$ 5.5%, 862 B
dist/utilities/groupNavItems.js ${{\color{Goldenrod}{ █▎ }}}$ 5.2%, 814 B
dist/utilities/getGlobalData.js ${{\color{Goldenrod}{ █▏ }}}$ 4.9%, 762 B
dist/utilities/api.js ${{\color{Goldenrod}{ █▏ }}}$ 4.8%, 756 B
dist/elements/Translation ${{\color{Goldenrod}{ ▊ }}}$ 3.2%, 493 B
dist/utilities/handleTakeOver.js ${{\color{Goldenrod}{ ▋ }}}$ 2.8%, 440 B
dist/utilities/traverseForLocalizedFields.js ${{\color{Goldenrod}{ ▋ }}}$ 2.6%, 399 B
dist/elements/withMergedProps ${{\color{Goldenrod}{ ▌ }}}$ 2.2%, 339 B
dist/utilities/getVisibleEntities.js ${{\color{Goldenrod}{ ▌ }}}$ 2.1%, 329 B
dist/utilities/getNavGroups.js ${{\color{Goldenrod}{ ▍ }}}$ 1.9%, 301 B
dist/elements/WithServerSideProps ${{\color{Goldenrod}{ ▍ }}}$ 1.5%, 232 B
dist/utilities/handleGoBack.js ${{\color{Goldenrod}{ ▎ }}}$ 1.2%, 180 B
dist/fields/mergeFieldStyles.js ${{\color{Goldenrod}{ ▎ }}}$ 1.0%, 159 B
dist/utilities/handleBackToDashboard.js ${{\color{Goldenrod}{ ▎ }}}$ 1.0%, 152 B
dist/forms/Form ${{\color{Goldenrod}{ ▏ }}}$ 0.9%, 147 B
dist/utilities/abortAndIgnore.js ${{\color{Goldenrod}{ ▏ }}}$ 0.9%, 146 B
(other) ${{\color{Goldenrod}{ ████████████████████ }}}$ 80.0%, 12.51 KB
Details

Next to the size is how much the size has increased or decreased compared with the base branch of this PR.

  • ‼️: Size increased by 20% or more. Special attention should be given to this.
  • ⚠️: Size increased in acceptable range (lower than 20%).
  • ✅: No change or even downsized.
  • 🗑️: The out file is deleted: not found in base branch.
  • 🆕: The out file is newly found: will be added to base branch.

@paulpopus paulpopus enabled auto-merge (squash) May 7, 2026 17:14
Comment thread packages/storage-s3/src/index.ts Outdated

// The AWS SDK is ~5MB. Skip loading it entirely when the plugin is disabled
// so users with `enabled: false` (e.g. dev/test toggles) don't pay the cost.
let S3Constructor: typeof import('@aws-sdk/client-s3').S3 | undefined
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

type-only imports should be stripped during tsc, so for simplicity I think we can leave this


// Lazy-load aws-sdk and presigner only when actually generating a signed URL —
// keeps the ~5MB SDK out of the cold-boot module graph for users who don't trigger this route.
const [{ PutObjectCommand }, { getSignedUrl }] = await Promise.all([
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Can you test if this even has any effect after Next.js builds and bundles the app? Would be pointless to do if this improvement is during development only

Comment thread packages/plugin-seo/src/index.ts Outdated
}
const getCollectionConfig = (slug: string | undefined) =>
slug ? collectionConfigBySlug.get(slug) : undefined
const getGlobalConfig = (slug: string | undefined) =>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unnecessary code / function call overhead, Map.get returns undefined if not found already.

Comment thread packages/plugin-seo/src/index.ts Outdated
Comment thread packages/plugin-seo/src/index.ts Outdated
Parameters<GenerateTitle>[0],
'collectionConfig' | 'globalConfig' | 'req'
> = await req.json?.()
endpoints: (() => {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if it's just gonna be creating the 2 maps, can we move that in the plugin function body instead of creating and calling this inline function?

paulpopus and others added 2 commits May 7, 2026 12:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants