Skip to content
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

Fix wrangler module import under npm monorepos #7130

Merged
merged 2 commits into from
Nov 29, 2024

Conversation

nickbabcock
Copy link
Contributor

@nickbabcock nickbabcock commented Oct 30, 2024

This PR updates import resolution for files and package exports

In an npm workspace environment, wrangler will now be able to successfully resolve package exports.

Previously, wrangler would only be able to resolve modules in a relative node_modules directory and not workspace root node_modules directory.

Installing locally fixes #7129


Soft ping to @Cherry who originally implemented this feature, some extra eyes would be appreciated 👀


  • Tests
    • TODO (before merge)
    • Tests included
    • Tests not necessary because:
  • E2E Tests CI Job required? (Use "e2e" label or ask maintainer to run separately)
  • Public documentation
    • TODO (before merge)
    • Cloudflare docs PR(s):
    • Documentation not necessary because: as this implements the behavior implied by documentation.

@nickbabcock nickbabcock requested a review from a team as a code owner October 30, 2024 12:07
Copy link

changeset-bot bot commented Oct 30, 2024

🦋 Changeset detected

Latest commit: 1d89a0c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
Name Type
wrangler Minor
@cloudflare/vitest-pool-workers Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@Cherry
Copy link
Contributor

Cherry commented Oct 30, 2024

Thanks for the ping!

Do the tests added for #4135 and #4748, with those use-cases, still work as expected here? I had issues getting require.resolve to play nicely unfortunately.

@nickbabcock
Copy link
Contributor Author

That was my concern too, but (unless I'm missing something) they pass locally when I execute:

pnpm run --filter import-wasm-example test:watch

Copy link
Contributor

github-actions bot commented Oct 30, 2024

A wrangler prerelease is available for testing. You can install this latest build in your project with:

npm install --save-dev https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/12058466768/npm-package-wrangler-7130

You can reference the automatically updated head of this PR with:

npm install --save-dev https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/prs/7130/npm-package-wrangler-7130

Or you can use npx with this latest build directly:

npx https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/12058466768/npm-package-wrangler-7130 dev path/to/script.js
Additional artifacts:
npx https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/12058466768/npm-package-create-cloudflare-7130 --no-auto-update
npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/12058466768/npm-package-cloudflare-kv-asset-handler-7130
npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/12058466768/npm-package-miniflare-7130
npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/12058466768/npm-package-cloudflare-pages-shared-7130
npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/12058466768/npm-package-cloudflare-vitest-pool-workers-7130
npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/12058466768/npm-package-cloudflare-workers-editor-shared-7130
npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/12058466768/npm-package-cloudflare-workers-shared-7130
npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/12058466768/npm-package-cloudflare-workflows-shared-7130

Note that these links will no longer work once the GitHub Actions artifact expires.


wrangler@3.91.0 includes the following runtime dependencies:

Package Constraint Resolved
miniflare workspace:* 3.20241106.1
workerd 1.20241106.1 1.20241106.1
workerd --version 1.20241106.1 2024-11-06

Please ensure constraints are pinned, and miniflare/workerd minor versions match.

@nickbabcock
Copy link
Contributor Author

Ah, I should have been executing the following to know if I introduced regressions:

pnpm run test:ci --concurrency 1 --filter=./fixtures/import-wasm-example

Turns out I did, and reintroducing resolve for non-exported members fixed the issue.

I still need to add a test before this PR is good to go.

@nickbabcock
Copy link
Contributor Author

Alright, added npm workspace fixture which demonstrates the PR fixing the bundling issue.

✅ PR now ready for further review.

@nickbabcock nickbabcock force-pushed the package-resolve branch 2 times, most recently from 1b91e24 to 48de0f7 Compare November 25, 2024 22:47
In an npm workspace environment, wrangler will now be able to
successfully resolve package exports.

Previously, wrangler would only be able to resolve modules in a relative
`node_modules` directory and not workspace root `node_modules`
directory.
Comment on lines 267 to 269
filePath = require.resolve(args.path, {
paths: [args.resolveDir],
});
Copy link
Contributor

Choose a reason for hiding this comment

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

I think this might be better using esbuild's resolution algorithm rather than require.resolve()? Something along the lines of:

const resolved = await build.resolve(args.path, {
  kind: "import-statement",
  resolveDir: args.resolveDir,
  pluginData: {
	  skip: true,
  },
  });
  if (resolved.path) {
  filePath = resolved.path;
  }

with a check for pluginData.skip at the top of the onResolve() callback to prevent infinite loops.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Updated to use esbuild's plugin. All the tests seem to pass. Is there a particular reason why you prefer the esbuild plugin vs require.resolve?

@emily-shen
Copy link
Contributor

thanks so much for the contribution!

@emily-shen emily-shen merged commit 11338d0 into cloudflare:main Nov 29, 2024
27 checks passed
@workers-devprod workers-devprod added the contribution [Holopin] Recognizes an open-source contribution, big or small label Nov 29, 2024
Copy link

holopin-bot bot commented Nov 29, 2024

Congratulations @nickbabcock, the maintainer of this repository has issued you a holobyte! Here it is: https://holopin.io/holobyte/cm42xhoim138330cmhekqf8p5w

This badge can only be claimed by you, so make sure that your GitHub account is linked to your Holopin account. You can manage those preferences here: https://holopin.io/account.
Or if you're new to Holopin, you can simply sign up with GitHub, which will do the trick!

@lrapoport-cf lrapoport-cf mentioned this pull request Dec 3, 2024
9 tasks
emily-shen added a commit that referenced this pull request Dec 4, 2024
* add telemetry commands

* changeset

* fix and test dates

* update changeset

* add global/project status

* default true

* remove changeset

* update wrangler telemetry status

feat: add `wrangler metrics` as an alias for `wrangler telemetry` (#7284)

* add metrics alias

* tests

* use each to test alias

feat: send metrics for command start/complete/error (#7267)

* stop collecting userId in telemetry

Co-authored-by: emily-shen <emily-shen@users.noreply.github.com>

* implement telemetry collection

* infer errorType based on the constructor name

* implement common event properties

* log common event properties

Co-authored-by: Edmund Hung <me@edmund.dev>

* respect metric enabled/disabled

* remove dispatcher.identify

* include SPARROW_SOURCE_KEY in PR pre-release build

* fix tests

* ensure debug log covers the request failed message

* replace SPARROW_SOURCE_KEY regardless whethe env exists

---------

Co-authored-by: Edmund Hung <edmund@cloudflare.com>
Co-authored-by: emily-shen <emily-shen@users.noreply.github.com>
Co-authored-by: Edmund Hung <me@edmund.dev>

fix nested properties (#7300)

feat: add banner to indicate when telemetry is on (#7302)

* add banner

* abort if telemetry disable

* basic sendNewEvent tests

* banner tests

* settle promises before exiting

* remove unnecessary banner logic

* just check if version is different

feat: add some more properties to telemetry events (#7320)

* isCI and isNonInteractive

* add argsUsed and argsCombination

* don't include args if value is false

* redact arg values if string

* lint

* isNonInteractive -> isInteractive

cleanup defineCommand

test duration

log metrics request failure

add draft telemetry.md

add node and os versions

don't send wrangler metrics from c3 if disabled

don't send c3 metrics from wrangler init

add config type

add more comments to send-event

move types out of send-event.ts

add comment about applyBeforeValidation

normalize into camelcase

refactor telemetry command

update tests and some comments

normalise all args

pr feedback

update telemetry.md

use useragent to get package manager

make sendEvent/sendNewEvent sync

rename sendEvent and sendNewEvent

fix lock file

remove flushPromises

changeset

fail silently

feat(wrangler): make resources identifier optional if x-provision flag is enabled (#7377)

Fix wrangler module import under npm monorepos (#7130)

* Update import resolution for files and package exports

In an npm workspace environment, wrangler will now be able to
successfully resolve package exports.

Previously, wrangler would only be able to resolve modules in a relative
`node_modules` directory and not workspace root `node_modules`
directory.

* Use esbuild plugin

chore(wrangler): fix type errors with experimental flags (#7391)

refactor(wrangler): Explicitely pick node compat plugins for each mode (#7387)

* refactor: cleanup & simplify

* refactor(wrangler): Explicitely pick node compat plugins for each mode

* Update packages/wrangler/src/deployment-bundle/esbuild-plugins/hybrid-nodejs-compat.ts

Co-authored-by: Pete Bacon Darwin <pete@bacondarwin.com>

* fixup! renamed vars (review feedback)

* fixup! format

---------

Co-authored-by: Pete Bacon Darwin <pete@bacondarwin.com>

fix: error in angular c3 template (#7342)

* fixed: related to issues-7341
AngularAppEngine class does not have .render, instead it should be
.handle method

* added: changeset

* Tidy up changeset

* fix Angular template

- add a preview script so that it gets included in CI test
- remove unnecessary --`experimnental-local` CLI arg
- add missing `xhr2` dependency

---------

Co-authored-by: Peter Bacon Darwin <pbacondarwin@cloudflare.com>

[C3] Bump create-qwik from 1.10.0 to 1.11.0 in /packages/create-cloudflare/src/frameworks (#7359)

* [C3] Bump create-qwik in /packages/create-cloudflare/src/frameworks

Bumps [create-qwik](https://github.com/QwikDev/qwik/tree/HEAD/packages/create-qwik) from 1.10.0 to 1.11.0.
- [Release notes](https://github.com/QwikDev/qwik/releases)
- [Changelog](https://github.com/QwikDev/qwik/blob/create-qwik@1.11.0/packages/create-qwik/CHANGELOG.md)
- [Commits](https://github.com/QwikDev/qwik/commits/create-qwik@1.11.0/packages/create-qwik)

---
updated-dependencies:
- dependency-name: create-qwik
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: update dependencies of "create-cloudflare" package

The following dependency versions have been updated:

| Dependency  | From   | To     |
| ----------- | ------ | ------ |
| create-qwik | 1.10.0 | 1.11.0 |

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Wrangler automated PR updater <wrangler@cloudflare.com>

Remove await from user Worker fetch in router-worker (#7410)

fix: update Angular experimental Workers + Assets template (#7409)

* fix: update Angular experimental Workers + Assets template

* ci: enable tests on experimental Workers + Assets C3 templates

fix: update queues max_batch_timeout in miniflare (#7399)

* update timeout limit

* changeset

* test

* remove only

Co-authored-by: Carmen Popoviciu <cpopoviciu@cloudflare.com>

---------

Co-authored-by: Carmen Popoviciu <cpopoviciu@cloudflare.com>

refactor: move projectRoot computation to config validation (#7415)

move telemetry.md out of src

fixups

tiody up readRawConfig

Rename serve_directly to experimental_serve_directly (#7429)

chore(deps): bump the workerd-and-workers-types group across 1 directory with 2 updates (#7418)

Updates `workerd` from 1.20241106.1 to 1.20241202.2

Version Packages (#7358)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

ci: don't watch for changes on the workers-shared test:ci job (#7420)

refactor: remove missed redundant computation of `projectRoot` (#7421)

* refactor: remove missed redundant computation of `projectRoot`

* test: do not watch test files in workflow fixture test jobs

feat(wrangler): add inherit bindings support (#7385)

* feat(wrangler): add inherit bindings support

* add test

* add changeset

* rename file to bindings

Relax type on `observability.enabled` (#7436)

fix: C3 experimental template for Solid now uses correct preset (#7343)

fix: allow the asset directory to be omitted in Wrangler config for commands that don't need it (#7426)

fix: C3 experimental template for Nuxt now uses correct preset (#7332)

* fix: C3 experimental template for Nuxt now uses correct preset

* test: remove quarantine from Nuxt experimental template

using the github browser merge is always a bad idea

fix e2e
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
contribution [Holopin] Recognizes an open-source contribution, big or small
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

🐛 BUG: wrangler fails to resolve wasm module in npm monorepo
5 participants