{"_id":"@advdominion/sass-importer","_rev":"2-efd7985b2b8dbe90b533c5d60ede1790","name":"@advdominion/sass-importer","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@advdominion/sass-importer","version":"1.0.0","license":"MIT","_id":"@advdominion/sass-importer@1.0.0","maintainers":[{"name":"valentinsilyutin","email":"valentinsilyutin@icloud.com"}],"dist":{"shasum":"57001209e3edc10b2c2b2620fa66ae023a6e790b","tarball":"https://registry.npmjs.org/@advdominion/sass-importer/-/sass-importer-1.0.0.tgz","fileCount":3,"integrity":"sha512-bkv2Nq9YonglQ57/IZgq+wLW6XRhTEcD/x0ZYTaokgCG8y7YF2nR1SLqk2P+8goxFUPm00bsns+Jx2N2T828Aw==","signatures":[{"sig":"MEUCIQDEPEha4BfkYXMNIa1Edqos2u1HiFS6H5CgJtle6TDn0QIga14scnydIZIucHKxnjGcLo7y1vMu5g9j/KpHdFQw1dc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13851},"main":"index.js","type":"module","gitHead":"12c14e8eb51a4ca211f7f5a0ffc303790365c682","_npmUser":{"name":"valentinsilyutin","email":"valentinsilyutin@icloud.com"},"repository":{"url":"https://gitea.optiweb.ru/public/frontend.git","type":"git"},"_npmVersion":"10.9.3","description":"Кастомный импортёр для [sass-embedded](https://github.com/sass/dart-sass-embedded), который берёт резолв `@use`/`@forward`-импортов на себя и читает файлы через `node:fs`.","directories":{},"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sass-importer_1.0.0_1788859387596_0.5021997096866642","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@advdominion/sass-importer","version":"1.0.1","type":"module","main":"index.js","repository":{"type":"git","url":"https://gitea.optiweb.ru/public/frontend.git"},"license":"MIT","publishConfig":{"access":"public"},"gitHead":"7a39d520dd93e0c855d84726fa24bb68cb2823f3","_id":"@advdominion/sass-importer@1.0.1","description":"Кастомный импортёр для [sass-embedded](https://github.com/sass/dart-sass-embedded), который берёт резолв `@use`/`@forward`-импортов на себя и читает файлы через `node:fs`.","_nodeVersion":"22.20.0","_npmVersion":"lerna/10.0.0/node@v22.20.0+x64 (darwin)","dist":{"integrity":"sha512-3DDEbqpc8Qyxm7Z0pD/0w79NBryKXlayNSlEoYWiikO1K6Q2fEmLEiV9MeIvNqAgSPknFq7HZRhrrikkyswx6g==","shasum":"5bb87a744c9e7f7e2ae3bbf878d730308ec0bb74","tarball":"https://registry.npmjs.org/@advdominion/sass-importer/-/sass-importer-1.0.1.tgz","fileCount":3,"unpackedSize":13953,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCXbwUn4M5SUa+IFrK1bxyKpu7gZCEmrWu+RjwvJXrIngIgG51kcBraeA8VbNlQdJZruXzCtClT994PriIJ4fYnYGQ="}]},"_npmUser":{"name":"valentinsilyutin","email":"valentinsilyutin@icloud.com"},"directories":{},"maintainers":[{"name":"valentinsilyutin","email":"valentinsilyutin@icloud.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sass-importer_1.0.1_1788895704484_0.38643404871961695"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-08T09:23:07.323Z","modified":"2026-09-08T19:28:24.866Z","1.0.0":"2026-09-08T09:23:07.708Z","1.0.1":"2026-09-08T19:28:24.628Z"},"license":"MIT","repository":{"type":"git","url":"https://gitea.optiweb.ru/public/frontend.git"},"description":"Кастомный импортёр для [sass-embedded](https://github.com/sass/dart-sass-embedded), который берёт резолв `@use`/`@forward`-импортов на себя и читает файлы через `node:fs`.","maintainers":[{"name":"valentinsilyutin","email":"valentinsilyutin@icloud.com"}],"readme":"# @advdominion/sass-importer\n\nКастомный импортёр для [sass-embedded](https://github.com/sass/dart-sass-embedded), который берёт резолв `@use`/`@forward`-импортов на себя и читает файлы через `node:fs`.\n\n## Зачем\n\nВ проектах на **Yarn PnP** пакеты лежат не в `node_modules`, а внутри `.zip` по виртуальным путям:\n\n```\n.yarn/__virtual__/@example-example-virtual-.../cache/@example-example-....zip/node_modules/@example/example/...\n```\n\n`.zip`-путь может открыть только код, читающий файлы через `node:fs` (в нём есть PnP-хуки). А `sass-embedded` читает файлы своим отдельным кодом, `node:fs` не использует, поэтому импорты внутри пакетов не резолвятся. Этот импортёр обходит проблему: он сам превращает импорт в существующий файл (`canonicalize`) и отдаёт его содержимое через `readFileSync` (`load`).\n\nРаботает и в `node-modules`-проектах — там `require` без PnP-хуков, но тот же резолв остаётся корректным.\n\n## Установка\n\n```bash\nyarn add -D @advdominion/sass-importer\n```\n\n## Использование\n\n```js\nimport { createRequire } from 'node:module';\nimport { createImporter } from '@advdominion/sass-importer';\n\nconst require = createRequire(import.meta.url);\nconst importer = createImporter(require);\n\nconst { css } = compiler.compileString(source, {\n    importers: [importer],\n    loadPaths: ['src/styles'],\n});\n```\n\nИмпортёр принимает `require` из `createRequire(import.meta.url)`: в PnP он несёт PnP-хуки, в `node-modules` — обычный `require`. Это позволяет резолвить и пакеты, и их внутренние относительные импорты одинаково надёжно.\n\n## API\n\n### `createImporter(require): Importer`\n\n- `require` — функция резолва (обычно `createRequire(import.meta.url)`), используется для ветки `pkg:`.\n- Возвращает объект из двух колбэков для `sass-embedded`: `canonicalize` и `load`.\n\n`canonicalize(url, ctx)` превращает импорт в канонический `file://` URL или возвращает `null` («я не знаю такой файл» — тогда Sass перебирает следующие импортёры/`loadPaths`).\n\n`load(canonicalUrl)` отдаёт содержимое файла и его синтаксис (`syntax: 'scss'`). Если файла нет — бросает `Error: Stylesheet not found: <путь>`.\n\n## Правила резолва\n\n| Приоритет | Вариант            | Пример                                  |\n| --------- | ------------------ | --------------------------------------- |\n| 1         | Точное совпадение  | `@use 'variables'` → `variables` (файл) |\n| 2         | Файл с расширением | `@use 'variables'` → `variables.scss`   |\n| 3         | Каталог с `_index` | `@use './lib'` → `./lib/_index.scss`    |\n| 4         | Каталог с `index`  | `@use './lib'` → `./lib/index.scss`     |\n\nДля каталогов берутся `_index` и `index` как с `.scss`, так и с `.css`. Порядок проверок соответствует порядку перебора Sass, поэтому первая найденная запись — приоритетная.\n\n## Виды импортов\n\n- `pkg:@scope/pkg/path/to/file` → `require.resolve` + резолв кандидата.\n- `file:///abs/path` → кандидат по файловому пути.\n- относительные (`../../variables`) → склейка с каталогом содержащего файла (берётся из `ctx.containingUrl`), затем резолв кандидата.\n- абсолютные (`/...`) и незнакомые схемы (`http:`, `data:`) → отдаёт `null`, резолв остаётся на Sass.\n\n## Лицензия\n\nMIT\n","readmeFilename":"README.md"}