-
Notifications
You must be signed in to change notification settings - Fork 891
feat(premium-analytics): resolve internal packages for build and types #49189
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
chihsuan
merged 9 commits into
trunk
from
wooa7s-1320-configure-workspace-and-typescript-for-internal-packages
Jun 5, 2026
Merged
Changes from 3 commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
00fed2d
feat(premium-analytics): add tsconfig paths and typecheck for interna…
chihsuan 20e6241
Potential fix for pull request finding
chihsuan 662c887
Potential fix for pull request finding
chihsuan d4da9ca
docs(premium-analytics): clarify internal-package naming and rename init
chihsuan 528458b
Merge branch 'trunk' into wooa7s-1320-configure-workspace-and-typescr…
chihsuan feeb212
docs(premium-analytics): revert internal-packages README section
chihsuan 2beeaa9
fix(premium-analytics): align route name with internal-package conven…
chihsuan 952a10c
Merge remote-tracking branch 'origin/trunk' into wooa7s-1320-configur…
chihsuan d810267
docs(premium-analytics): fix stale README reference in tsconfig comment
chihsuan File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
4 changes: 4 additions & 0 deletions
4
projects/packages/premium-analytics/changelog/add-internal-package-resolution
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| Significance: patch | ||
| Type: added | ||
|
|
||
| Add a tsconfig paths alias and typecheck script so internal packages/* resolve for types/IDE, and document how to wire cross-package imports for the build. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,4 +1,13 @@ | ||
| { | ||
| "extends": "jetpack-js-tools/tsconfig.base.json", | ||
| "compilerOptions": { | ||
| // Resolve cross-package imports between internal `packages/*` modules | ||
| // (`@jetpack-premium-analytics/<dir>`) to their TypeScript source for | ||
| // type-checking + IDE. The build resolves the same specifier separately (see | ||
| // README → "Internal packages"); this keeps tsc/esbuild and `tsgo` in sync. | ||
|
chihsuan marked this conversation as resolved.
Outdated
|
||
| "paths": { | ||
| "@jetpack-premium-analytics/*": [ "./packages/*/src" ] | ||
|
manzoorwanijk marked this conversation as resolved.
|
||
| } | ||
| }, | ||
| "include": [ "routes/**/*", "packages/**/*" ] | ||
| } | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The advice here seems confused. The first paragraph says to name like
@jetpack-premium-analytics/<dir>, while the second says that won't work and to do like@automattic/jetpack-premium-analytics-<dir>.The latter seems more correct to me, as Automattic owns the
@automattic/prefix in npm. In theory someone else could claim@jetpack-premium-analytics/and put packages there, which confused tooling could theoretically try to use.1The code sample below and the tsconfig file in this PR do the former, however.
Footnotes
And, more pressingly, we'll get script kiddie "security researchers" pointing that out even if we have no such confused tooling. ↩
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I haven't reviewed this and may not get around to it, but it seems
premium-analyticswill be something used quite globally. Do we even want to prefix it withjetpack-?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the review! @anomiex
To clarify intent: these
packages/*aren't shareable. It scoped topremium-analyticsonly, no plan to publish or reuse across the monorepo. Thewp-buildpackages/*mechanism is just how this app does bundle splitting, not a package boundary. . I'll rewrite the README to lead with that.Fair, that section is confusing. The two names aren't a contradiction but the README doesn't say why:
namemust be@automattic/jetpack-premium-analytics-<dir>(pnpm rejects_@…, repo lint rejects bare@jetpack-premium-analytics/*).name— so"@jetpack-premium-analytics/<dir>": "link:packages/<dir>"symlinks at that key regardless.The
@jetpack-premium-analytics/*scope came from the existing code and original issue (WOOA7S-1320), but your point is fair. Combined with @tbradsha's question below, I'll collapse everything to@automattic/premium-analytics-<dir>(one identifier for name, dep key, symlink, specifier, tsconfig path).cc @retrofox
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just looked more into wp-build and found it doesn't structurally allow it. The internal-package specifier is built as
@${packageNamespace}/${dir}, andpackageNamespacedoubles as the externalization pattern^@<ns>/— so setting it toautomatticwould catch every@automattic/*import as a wp script module and break the build the moment any real@automattic/...dep is added.So the specifier scope has to be a single-segment, non-conflicting string, and the dual naming (package
namevs. specifier) is structural — not something the README can collapse, only explain.Real options for the specifier scope:
@jetpack-premium-analytics/*(current)@premium-analytics/*— drops the redundantjetpack-@jpa-internal/*I'm leaning option 1 so it match the existing package namespace unless we want to change it.
jetpack/projects/packages/premium-analytics/package.json
Line 2 in 00fed2d
Either way I'll rewrite the README to lead with the "internal-only, symlink-resolved" framing and explicitly explain the dual naming.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated d4da9ca.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yep, @retrofox just opened WordPress/gutenberg#78822, which targets exactly this:
wpPlugin.packageNamespacecarrying three roles and forcing the dual naming. The proposal usespackage.json#nameas the script-module ID source of truth, so the specifier keeps the real@automattic/…identity end-to-end.Related constraints already raised upstream: WordPress/gutenberg#77225 (package discovery locked to
./packages/*) and WordPress/gutenberg#75196 (classic scripts depending on script modules — the root of the boot-asset shim documented above).There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, Chi. We're researching the alternatives we have for addressing these issues upstream. I think it's the proper solution. Otherwise, we'll end up implementing kind of hacked-together ones.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Update on the upstream angle @tbradsha asked about, since it lands right on the security concern @anomiex raised here.
I've been working on that upstream fix, and it's validated end-to-end downstream in #48089 (real premium-analytics build):
WordPress/gutenberg#78822 makes the script-module ID come from
package.json#nameinstead of@<packageNamespace>/<dir>.The import specifier then is the real npm name (
@automattic/jetpack-premium-analytics-<dir>).A scope Automattic owns and can register, so the unregistered
@jetpack-premium-analytics/*specifier that triggers the bogus dependency-confusion / HackerOne reports simply goes away.One identifier end-to-end: npm name === import specifier === script-module ID === tsconfig path.
WordPress/gutenberg#77465 (companion) scopes the generated
wp_deregister_script_module()to@wordpress/*, so shared non-core modules get Core's deterministic first-wins instead of last-plugin-wins.On the "dual naming is structural" point (3315652267), that's exactly right under stock wp-build:
packageNamespacedoubles as the externalization pattern^@<ns>/, so you can't set it toautomatticwithout catching every real@automattic/*import.#78822 unbundles those roles; internal packages are externalized by exact name (a precise match set that runs before the namespace wildcard), not by
^@<ns>/, so the real@automattic/...name can be the specifier without ever swallowing genuine@automattic/*deps.That's what stops the dual naming from being structural.
What it means for this PR:
Once #78822 lands 🤞, the
@jetpack-premium-analytics/*tsconfig alias and the "dual naming is structural" README section collapse to a single@automattic/jetpack-premium-analytics-*identifier (theinitrename you already did is the same one #48089 needs).The
typecheckscript + devDep are orthogonal and stay. Since #48089 changes the identity model that the alias/README depends on, the cleanest approach is to land #48089 first and rebase this down to (typecheck + name-based alias + simplified README). Happy to coordinate the order with you.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks Damián, Totally agree WordPress/gutenberg#78822/#48089 is the right long-term fix, and I'll rebase onto it once it lands.
But to make it clear, none of my PRs actually wire a cross-package build import. The
@jetpack-premium-analytics/*specifier only appears in README examples + one tsconfig alias. If it (plus upstream) would take a while, could we review/merge the type-side to so we can continue working on next? I've reverted the README "dual naming" section, so it's now just the orthogonal bits:typecheck+ devDep + theinitrename.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added a comment here; cc @anomiex @tbradsha