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

[Bug]: Cannot require() ES Module ~ standalone.mjs in a cycle when Node >=v22.12.0 with Prettier >= 3.5.0 #311

Open
utqinadhif opened this issue Feb 17, 2025 · 22 comments
Assignees
Labels
bug Something isn't working

Comments

@utqinadhif
Copy link

Description

after update from 1.15.2 to 1.15.3, prettier not working with caption Cannot require() ES Module /media/hdd/local/project/php/l11-sim/node_modules/prettier/standalone.mjs in a cycle. (from /media/hdd/local/project/php/l11-sim/node_modules/@prettier/plugin-php/standalone.js)

Expected Behavior

i want to normal again

Actual Behavior

this plugin not work after update

Additional Context

version: 1.15.3
OS: linux debian 12

@utqinadhif utqinadhif added the bug Something isn't working label Feb 17, 2025
@rishabkapadia
Copy link

rishabkapadia commented Feb 17, 2025

currently downgraded to get going:
"@shufo/prettier-plugin-blade": "=1.14.1",

npm update @shufo/prettier-plugin-blade

@shufo
Copy link
Owner

shufo commented Feb 18, 2025

Sorry I could not reproduce the error with latest version with prettier 3.5.1

$ node -v
v22.11.0

$ npm list | grep prettier
├── @shufo/prettier-plugin-blade@1.15.3
└── prettier@3.5.1

$ cat package.json
{
  "devDependencies": {
    "@shufo/prettier-plugin-blade": "^1.15.3",
    "prettier": "^3.5.1"
  }
}

$ cat .prettierrc.json
{
  "plugins": ["@shufo/prettier-plugin-blade"],
  "overrides": [
    {
      "files": ["*.blade.php"],
      "options": {
        "parser": "blade",
        "tabWidth": 4
      }
    }
  ]
}
$ ./node_modules/.bin/prettier test.blade.php
@extends('frontend.layouts.app')
@section('title') foo
@endsection
@section('content')
    <section id="content">
        <div class="container mod-users-pd-h">
            <div class="pf-user-header">
                <div></div>
                <p>@lang('users.index')</p>
            </div>
            <div class="pf-users-branch">
                <ul class="pf-users-branch__list">
                    @foreach ($users as $user)
                        <li>
                            <img src="{{ asset('img/frontend/icon/branch-arrow.svg') }}" alt="branch_arrow">
                            {{ link_to_route('frontend.users.user.show', $users['name'], $users['_id']) }}
                        </li>
                    @endforeach
                </ul>
                <div class="pf-users-branch__btn">
                    @can('create', App\Models\User::class)
                        {!! link_to_route('frontend.users.user.create', __('users.create'), [1, 2, 3], ['class' => 'btn']) !!}
                    @endcan
                </div>
            </div>
        </div>
    </section>
@endsection
@section('footer')
@stop

@utqinadhif @rishabkapadia
Can you give how to reproduce the error?

@rishabkapadia
Copy link

rishabkapadia commented Feb 18, 2025

macOS 14.7.2
PHP 8.3.14

node -v
v23.6.1

npm -v
11.1.0

./node_modules/.bin/prettier resources/views/components/guest/nav.blade.php
[error] Cannot require() ES Module ../Sites/webapp/node_modules/prettier/standalone.mjs in a cycle. (from ../Sites/webapp/node_modules/@prettier/plugin-php/standalone.js)

cat .prettierrc
{
  "plugins": ["@shufo/prettier-plugin-blade"],
  "overrides": [
    {
      "files": ["*.blade.php"],
      "options": {
        "parser": "blade",
        "tabWidth": 4
      }
    }
  ]
}

cat package.json | grep prettier
    "@shufo/prettier-plugin-blade": "^1.15.3",
    "prettier": "^3.5.1",

cat package.json
{
  "private": true,
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "prepare": "husky"    
  },
  "devDependencies": {
    "@shufo/prettier-plugin-blade": "^1.15.3",
    "@tailwindcss/forms": "^0.5.7",
    "alpinejs": "^3.13.3",
    "autoprefixer": "^10.4.16",
    "axios": "^1.6",
    "husky": "^9.0.0",
    "laravel-vite-plugin": "^1.0.1",
    "postcss": "^8.4.33",
    "postcss-import": "^16.0.0",
    "prettier": "^3.5.1",
    "tailwindcss": "^3.4.1",
    "vite": "^6.1.0"
  }
}

also tried:

rm -rf node_modules package-lock.json 
npm install

@utqinadhif
Copy link
Author

macOS 14.7.2 PHP 8.3.14

node -v
v23.6.1

npm -v
11.1.0

./node_modules/.bin/prettier resources/views/components/guest/nav.blade.php
[error] Cannot require() ES Module ../Sites/webapp/node_modules/prettier/standalone.mjs in a cycle. (from ../Sites/webapp/node_modules/@prettier/plugin-php/standalone.js)

cat .prettierrc
{
  "plugins": ["@shufo/prettier-plugin-blade"],
  "overrides": [
    {
      "files": ["*.blade.php"],
      "options": {
        "parser": "blade",
        "tabWidth": 4
      }
    }
  ]
}

cat package.json | grep prettier
    "@shufo/prettier-plugin-blade": "^1.15.3",
    "prettier": "^3.5.1",

cat package.json
{
  "private": true,
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "prepare": "husky"    
  },
  "devDependencies": {
    "@shufo/prettier-plugin-blade": "^1.15.3",
    "@tailwindcss/forms": "^0.5.7",
    "alpinejs": "^3.13.3",
    "autoprefixer": "^10.4.16",
    "axios": "^1.6",
    "husky": "^9.0.0",
    "laravel-vite-plugin": "^1.0.1",
    "postcss": "^8.4.33",
    "postcss-import": "^16.0.0",
    "prettier": "^3.5.1",
    "tailwindcss": "^3.4.1",
    "vite": "^6.1.0"
  }
}

also tried:

rm -rf node_modules package-lock.json 
npm install

Thanks

@shufo
Copy link
Owner

shufo commented Feb 18, 2025

Uh I understand, it occurs when combination of node >=v23 with prettier-plugin-blade latest version.

$ node -v
v23.6.1

$ ./node_modules/.bin/prettier test.blade.php
[error] Cannot require() ES Module /home/shuhei/develop/prettier-plugin-blade-test6/node_modules/prettier/standalone.mjs in a cycle. (from /home/shuhei/develop/prettier-plugin-blade-test6/node_modules/@prettier/plugin-php/standalone.js)

Node v22 with latest version was ok.

@shufo shufo changed the title [Bug]: Cannot require() ES Module /media/hdd/local/project/php/l11-sim/node_modules/prettier/standalone.mjs in a cycle. (from /media/hdd/local/project/php/l11-sim/node_modules/@prettier/plugin-php/standalone.js) [Bug]: Cannot require() ES Module ~ standalone.mjs in a cycle with Node v23 on latest version Feb 18, 2025
@utqinadhif
Copy link
Author

node -v ─╯
v22.14.0

./node_modules/.bin/prettier /media/hdd/local/project/php/l11-sim/resources/views/pdf/display/apm/print/sep.blade.php ─╯
[error] Cannot require() ES Module /media/hdd/local/project/php/l11-sim/node_modules/prettier/standalone.mjs in a cycle. (from /media/hdd/local/project/php/l11-sim/node_modules/@prettier/plugin-php/standalone.js)

In my case, i use v22.14.0 but error,

@utqinadhif
Copy link
Author

Oh i know, before today, before i update my node, the prettier work well, may be error occurs on >=22.14.0

@rishabkapadia
Copy link

rishabkapadia commented Feb 18, 2025

Uh I understand, it occurs when combination of node >=v23 with prettier-plugin-blade latest version.

$ node -v
v23.6.1

$ ./node_modules/.bin/prettier test.blade.php
[error] Cannot require() ES Module /home/shuhei/develop/prettier-plugin-blade-test6/node_modules/prettier/standalone.mjs in a cycle. (from /home/shuhei/develop/prettier-plugin-blade-test6/node_modules/@prettier/plugin-php/standalone.js)
Node v22 with latest version was ok.

i just tried it with node 22 (& plugin 1.15.3), its not working. i'm on v23 for quite some time (its highly unlikely the cause). faced issues recently (went from 1.13.4 to 1.15.3).

Got it working by downgrading to 1.13.4 with node 23

@shufo
Copy link
Owner

shufo commented Feb 18, 2025

@utqinadhif @rishabkapadia Thanks.

#311 (comment) was not corret.
It seems above node >=v22.12.0 got error.

$ node -v
v22.12.0
$ ./node_modules/.bin/prettier test.blade.php
[error] Cannot require() ES Module /home/shuhei/develop/prettier-plugin-blade-test6/node_modules/prettier/standalone.mjs in a cycle. (from /home/shuhei/develop/prettier-plugin-blade-test6/node_modules/@prettier/plugin-php/standalone.js)

v22.11.0 is ok

$ node -v
v22.11.0

$ ./node_modules/.bin/prettier test.blade.php
@extends('frontend.layouts.app')
@section('title') foo
@endsection
@section('content')
    <section id="content">
        <div class="container mod-users-pd-h">
            <div class="pf-user-header">
                <div></div>
                <p>@lang('users.index')</p>
            </div>
            <div class="pf-users-branch">
                <ul class="pf-users-branch__list">
                    @foreach ($users as $user)
                        <li>
                            <img src="{{ asset('img/frontend/icon/branch-arrow.svg') }}" alt="branch_arrow">
                            {{ link_to_route('frontend.users.user.show', $users['name'], $users['_id']) }}
                        </li>
                    @endforeach
                </ul>
                <div class="pf-users-branch__btn">
                    @can('create', App\Models\User::class)
                        {!! link_to_route('frontend.users.user.create', __('users.create'), [1, 2, 3], ['class' => 'btn']) !!}
                    @endcan
                </div>
            </div>
        </div>
    </section>
@endsection
@section('footer')
@stop

@shufo shufo changed the title [Bug]: Cannot require() ES Module ~ standalone.mjs in a cycle with Node v23 on latest version [Bug]: Cannot require() ES Module ~ standalone.mjs in a cycle when Node >=v22.12.0 with latest version Feb 18, 2025
@rishabkapadia
Copy link

that worked. thank you.

note: if you are using brew, i was not able to install a specific version. instead it kept installing the latest patch (v22.13.1). hence had to install 22.11 via nvm

@shufo
Copy link
Owner

shufo commented Feb 18, 2025

Plus above, Downgrading prettier to 3.4.2 also works on node >=22.12.0 and latest prettier-plugin-blade.

$ node -v
v23.6.1

$ cat package.json
{
  "devDependencies": {
    "@shufo/prettier-plugin-blade": "^1.15.3",
    "prettier": "3.4.2"
  }
}

$ ./node_modules/.bin/prettier test.blade.php
@extends('frontend.layouts.app')
@section('title') foo
@endsection
@section('content')
    <section id="content">
        <div class="container mod-users-pd-h">
            <div class="pf-user-header">
                <div></div>
                <p>@lang('users.index')</p>
            </div>
            <div class="pf-users-branch">
                <ul class="pf-users-branch__list">
                    @foreach ($users as $user)
                        <li>
                            <img src="{{ asset('img/frontend/icon/branch-arrow.svg') }}" alt="branch_arrow">
                            {{ link_to_route('frontend.users.user.show', $users['name'], $users['_id']) }}
                        </li>
                    @endforeach
                </ul>
                <div class="pf-users-branch__btn">
                    @can('create', App\Models\User::class)
                        {!! link_to_route('frontend.users.user.create', __('users.create'), [1, 2, 3], ['class' => 'btn']) !!}
                    @endcan
                </div>
            </div>
        </div>
    </section>
@endsection
@section('footer')
@stop

@shufo shufo changed the title [Bug]: Cannot require() ES Module ~ standalone.mjs in a cycle when Node >=v22.12.0 with latest version [Bug]: Cannot require() ES Module ~ standalone.mjs in a cycle when Node >=v22.12.0 with Prettier >= 3.5.0 Feb 18, 2025
@rishabkapadia
Copy link

🙌 after downgrading prettier to 3.4.2, it works on node 22.11.0, 22.12.0, 22.14.0, 23.8.0

@shufo
Copy link
Owner

shufo commented Feb 19, 2025

It seems this prettier's change introduced in 3.5.0 affecting this issue.
https://prettier.io/blog/2025/02/09/3.5.0#use-esm-entrypoint-for-requireesm-16958-by-tats-u

related issue: prettier/plugin-php#2418

@utqinadhif
Copy link
Author

For now, i use 3.4.2 and wait for new fixing,

@fisker
Copy link
Collaborator

fisker commented Feb 19, 2025

Hello, I'm from Prettier core team, this should be a Prettier issue, and I'm considering reverting the change mentioned in #311 (comment)

@shufo Can you transfer the issue to Prettier (Not sure if it's possible), so we can continue the discussion there.

Before Prettier fixes this issue, I'll invgate if this is a different case than prettier/prettier#17139

@shufo
Copy link
Owner

shufo commented Feb 20, 2025

@fisker Thank you fisker! Transfering issue requires both repository write access so I added you to this repository's collabolators. You can transfer this issue if you needed.

I don't know what the root cause is now but also I'll investigate it.

@fisker

This comment has been minimized.

@fisker
Copy link
Collaborator

fisker commented Feb 20, 2025

Added reproduction https://github.com/fisker/prettier-plugin-blade-311, and remove module-sync condition from Prettier fixes the issue as expected.

@fisker
Copy link
Collaborator

fisker commented Feb 20, 2025

@joyeecheung I just want to let you know that your solution from prettier/prettier#17139 (comment) (replace Promise.all()) won't fix this case. You may want update error message for nodejs/node#57126.

@joyeecheung
Copy link

joyeecheung commented Feb 20, 2025

I think this may be a different one, the other one is a race when require and dynamic import happens at the same time, and the fix would be making the loading deterministic, which the Node.js is adding a new error message for (replacing "Cannot read properties of undefined"). This one is probably a real cycle, as the existing error message suggests. Either the cycle needs to be broken/made lazy, or there is another suggestion possible, but it is still a different path.

@fisker
Copy link
Collaborator

fisker commented Feb 22, 2025

Should fixed in Prettier v3.5.2 https://github.com/prettier/prettier/releases/tag/3.5.2

@joyeecheung
Copy link

FYI I think I figured out what is causing this - fix in nodejs/node#57187 which locally make https://github.com/fisker/prettier-plugin-blade-311 produce

[error] No parser could be inferred for file "/Users/joyee/projects/prettier-plugin-blade-311/fixture.blade.php".

Which is the same as what I see from older Node.js releases without require(esm) e.g. v21

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

5 participants