Compare commits

..

28 Commits

Author SHA1 Message Date
f8d793195c Publish
- @advdominion/babel-plugin-nunjucks@3.1.0
2026-01-23 00:15:03 +04:00
a655e7b5e4 Move Nunjucks to peerDependencies 2026-01-23 00:14:36 +04:00
fc11cdfa48 Publish
- @advdominion/babel-plugin-nunjucks@3.0.3
 - @advdominion/eslint-config@1.1.3
 - @advdominion/lightningcss-loader@1.0.2
2026-01-23 00:08:50 +04:00
650008ad76 Revert "Publish"
This reverts commit 96ae522a8f.
2026-01-23 00:08:19 +04:00
96ae522a8f Publish
- @advdominion/babel-plugin-nunjucks@3.0.3
 - @advdominion/eslint-config@null
 - @advdominion/lightningcss-loader@null
2026-01-23 00:03:52 +04:00
9dc95dd47a Fix 2026-01-22 23:57:47 +04:00
bce960599a Обновлены зависимости 2026-01-21 15:36:32 +04:00
6f24952680 Remove @advdominion/is 2026-01-21 15:25:45 +04:00
e1756bd60f Publish
- @advdominion/babel-plugin-nunjucks@3.0.2
2026-01-21 15:20:43 +04:00
ea33198344 Publish
- @advdominion/babel-plugin-nunjucks@3.0.1
 - @advdominion/lightningcss-loader@1.0.1
2026-01-21 15:14:18 +04:00
ca88f622d1 @advdominion/lightningcss-loader 2026-01-21 15:13:48 +04:00
9131e220d2 Fix 2026-01-21 15:13:22 +04:00
4012b982a6 Fix README.md 2026-01-21 14:58:22 +04:00
d6aec9ed14 Publish
- @advdominion/babel-plugin-nunjucks@3.0.1
 - @advdominion/eslint-config@1.1.2
2026-01-21 14:57:22 +04:00
e8a3ea043f @advdominion/babel-plugin-nunjucks 2026-01-21 14:56:24 +04:00
cc8d0b7ab3 Fix yarn.lock 2026-01-21 14:55:04 +04:00
dfb04760f1 Исправлено название папки eslint-config 2025-12-26 11:55:33 +04:00
db9022c00b Настройка prettier.config.js 2025-12-26 11:54:25 +04:00
00c079c029 Publish
- @advdominion/eslint-config@1.1.1
 - @advdominion/get-scrollbar-width@2.0.1
 - @advdominion/is@1.0.2
 - @advdominion/pluralize@1.0.2
2025-12-26 11:39:46 +04:00
53dc2d3092 Репозитоий переименован во frontend, обновлены зависимости, добавлен eslint-config 2025-12-26 11:39:12 +04:00
Valentin Silytuin
9ac5f6bd28 Publish
- @advdominion/pluralize@1.0.1
2024-05-03 19:43:45 +04:00
Valentin Silytuin
09f069b727 Fix README.md in @advdominion/pluralize 2024-05-03 19:43:22 +04:00
Valentin Silytuin
f9dc305aae Update README.md 2024-05-03 19:39:02 +04:00
Valentin Silytuin
7d56c06702 Publish
- @advdominion/pluralize@1.0.0
2024-05-03 19:34:44 +04:00
Valentin Silytuin
0bb60a0e0a @advdominion/pluralize 2024-05-03 19:34:19 +04:00
Valentin Silytuin
205ea19086 Add README.md 2024-05-03 19:25:40 +04:00
Valentin Silytuin
1eff119186 Publish
- @advdominion/is@1.0.1
2024-05-03 19:24:09 +04:00
Valentin Silytuin
78e4fa36c0 Обновлён README.md в @advdominion/is 2024-05-03 19:23:51 +04:00
43 changed files with 4754 additions and 2747 deletions

5
.gitignore vendored
View File

@@ -22,9 +22,10 @@ node_modules
.stylelintcache .stylelintcache
# Composer # https://github.com/github/gitignore/blob/main/Composer.gitignore
vendor composer.phar
/vendor/
# https://github.com/github/gitignore/blob/master/Global/Linux.gitignore # https://github.com/github/gitignore/blob/master/Global/Linux.gitignore

2
.nvmrc
View File

@@ -1 +1 @@
20.12 22.20

View File

@@ -1,6 +1,9 @@
{ {
"recommendations": [ "recommendations": [
"arcanis.vscode-zipfs", "arcanis.vscode-zipfs",
"esbenp.prettier-vscode" "dbaeumer.vscode-eslint",
"EditorConfig.EditorConfig",
"esbenp.prettier-vscode",
"stylelint.vscode-stylelint"
] ]
} }

View File

@@ -3,5 +3,6 @@
"**/.yarn": true, "**/.yarn": true,
"**/.pnp.*": true "**/.pnp.*": true
}, },
"prettier.prettierPath": ".yarn/sdks/prettier/index.cjs" "prettier.prettierPath": ".yarn/sdks/prettier/index.cjs",
"eslint.nodePath": ".yarn/sdks"
} }

File diff suppressed because one or more lines are too long

942
.yarn/releases/yarn-4.12.0.cjs vendored Executable file

File diff suppressed because one or more lines are too long

32
.yarn/sdks/eslint/bin/eslint.js vendored Executable file
View File

@@ -0,0 +1,32 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absUserWrapperPath = resolve(__dirname, `./sdk.user.cjs`);
const absRequire = createRequire(absPnpApiPath);
const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require eslint/bin/eslint.js
require(absPnpApiPath).setup();
if (isPnpLoaderEnabled && register) {
register(pathToFileURL(absPnpLoaderPath));
}
}
}
const wrapWithUserWrapper = existsSync(absUserWrapperPath)
? exports => absRequire(absUserWrapperPath)(exports)
: exports => exports;
// Defer to the real eslint/bin/eslint.js your application uses
module.exports = wrapWithUserWrapper(absRequire(`eslint/bin/eslint.js`));

32
.yarn/sdks/eslint/lib/api.js vendored Normal file
View File

@@ -0,0 +1,32 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absUserWrapperPath = resolve(__dirname, `./sdk.user.cjs`);
const absRequire = createRequire(absPnpApiPath);
const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require eslint
require(absPnpApiPath).setup();
if (isPnpLoaderEnabled && register) {
register(pathToFileURL(absPnpLoaderPath));
}
}
}
const wrapWithUserWrapper = existsSync(absUserWrapperPath)
? exports => absRequire(absUserWrapperPath)(exports)
: exports => exports;
// Defer to the real eslint your application uses
module.exports = wrapWithUserWrapper(absRequire(`eslint`));

32
.yarn/sdks/eslint/lib/config-api.js vendored Normal file
View File

@@ -0,0 +1,32 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absUserWrapperPath = resolve(__dirname, `./sdk.user.cjs`);
const absRequire = createRequire(absPnpApiPath);
const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require eslint/config
require(absPnpApiPath).setup();
if (isPnpLoaderEnabled && register) {
register(pathToFileURL(absPnpLoaderPath));
}
}
}
const wrapWithUserWrapper = existsSync(absUserWrapperPath)
? exports => absRequire(absUserWrapperPath)(exports)
: exports => exports;
// Defer to the real eslint/config your application uses
module.exports = wrapWithUserWrapper(absRequire(`eslint/config`));

View File

@@ -0,0 +1,32 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);
const relPnpApiPath = "../../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absUserWrapperPath = resolve(__dirname, `./sdk.user.cjs`);
const absRequire = createRequire(absPnpApiPath);
const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require eslint/config
require(absPnpApiPath).setup();
if (isPnpLoaderEnabled && register) {
register(pathToFileURL(absPnpLoaderPath));
}
}
}
const wrapWithUserWrapper = existsSync(absUserWrapperPath)
? exports => absRequire(absUserWrapperPath)(exports)
: exports => exports;
// Defer to the real eslint/config your application uses
module.exports = wrapWithUserWrapper(absRequire(`eslint/config`));

32
.yarn/sdks/eslint/lib/types/index.d.ts vendored Normal file
View File

@@ -0,0 +1,32 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);
const relPnpApiPath = "../../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absUserWrapperPath = resolve(__dirname, `./sdk.user.cjs`);
const absRequire = createRequire(absPnpApiPath);
const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require eslint
require(absPnpApiPath).setup();
if (isPnpLoaderEnabled && register) {
register(pathToFileURL(absPnpLoaderPath));
}
}
}
const wrapWithUserWrapper = existsSync(absUserWrapperPath)
? exports => absRequire(absUserWrapperPath)(exports)
: exports => exports;
// Defer to the real eslint your application uses
module.exports = wrapWithUserWrapper(absRequire(`eslint`));

32
.yarn/sdks/eslint/lib/types/rules.d.ts vendored Normal file
View File

@@ -0,0 +1,32 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);
const relPnpApiPath = "../../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absUserWrapperPath = resolve(__dirname, `./sdk.user.cjs`);
const absRequire = createRequire(absPnpApiPath);
const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require eslint/rules
require(absPnpApiPath).setup();
if (isPnpLoaderEnabled && register) {
register(pathToFileURL(absPnpLoaderPath));
}
}
}
const wrapWithUserWrapper = existsSync(absUserWrapperPath)
? exports => absRequire(absUserWrapperPath)(exports)
: exports => exports;
// Defer to the real eslint/rules your application uses
module.exports = wrapWithUserWrapper(absRequire(`eslint/rules`));

View File

@@ -0,0 +1,32 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);
const relPnpApiPath = "../../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absUserWrapperPath = resolve(__dirname, `./sdk.user.cjs`);
const absRequire = createRequire(absPnpApiPath);
const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require eslint/universal
require(absPnpApiPath).setup();
if (isPnpLoaderEnabled && register) {
register(pathToFileURL(absPnpLoaderPath));
}
}
}
const wrapWithUserWrapper = existsSync(absUserWrapperPath)
? exports => absRequire(absUserWrapperPath)(exports)
: exports => exports;
// Defer to the real eslint/universal your application uses
module.exports = wrapWithUserWrapper(absRequire(`eslint/universal`));

View File

@@ -0,0 +1,32 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);
const relPnpApiPath = "../../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absUserWrapperPath = resolve(__dirname, `./sdk.user.cjs`);
const absRequire = createRequire(absPnpApiPath);
const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require eslint/use-at-your-own-risk
require(absPnpApiPath).setup();
if (isPnpLoaderEnabled && register) {
register(pathToFileURL(absPnpLoaderPath));
}
}
}
const wrapWithUserWrapper = existsSync(absUserWrapperPath)
? exports => absRequire(absUserWrapperPath)(exports)
: exports => exports;
// Defer to the real eslint/use-at-your-own-risk your application uses
module.exports = wrapWithUserWrapper(absRequire(`eslint/use-at-your-own-risk`));

32
.yarn/sdks/eslint/lib/universal.js vendored Normal file
View File

@@ -0,0 +1,32 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absUserWrapperPath = resolve(__dirname, `./sdk.user.cjs`);
const absRequire = createRequire(absPnpApiPath);
const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require eslint/universal
require(absPnpApiPath).setup();
if (isPnpLoaderEnabled && register) {
register(pathToFileURL(absPnpLoaderPath));
}
}
}
const wrapWithUserWrapper = existsSync(absUserWrapperPath)
? exports => absRequire(absUserWrapperPath)(exports)
: exports => exports;
// Defer to the real eslint/universal your application uses
module.exports = wrapWithUserWrapper(absRequire(`eslint/universal`));

View File

@@ -0,0 +1,32 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absUserWrapperPath = resolve(__dirname, `./sdk.user.cjs`);
const absRequire = createRequire(absPnpApiPath);
const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require eslint/use-at-your-own-risk
require(absPnpApiPath).setup();
if (isPnpLoaderEnabled && register) {
register(pathToFileURL(absPnpLoaderPath));
}
}
}
const wrapWithUserWrapper = existsSync(absUserWrapperPath)
? exports => absRequire(absUserWrapperPath)(exports)
: exports => exports;
// Defer to the real eslint/use-at-your-own-risk your application uses
module.exports = wrapWithUserWrapper(absRequire(`eslint/use-at-your-own-risk`));

31
.yarn/sdks/eslint/package.json vendored Normal file
View File

@@ -0,0 +1,31 @@
{
"name": "eslint",
"version": "9.39.2-sdk",
"main": "./lib/api.js",
"type": "commonjs",
"bin": {
"eslint": "./bin/eslint.js"
},
"exports": {
".": {
"types": "./lib/types/index.d.ts",
"default": "./lib/api.js"
},
"./config": {
"types": "./lib/types/config-api.d.ts",
"default": "./lib/config-api.js"
},
"./package.json": "./package.json",
"./use-at-your-own-risk": {
"types": "./lib/types/use-at-your-own-risk.d.ts",
"default": "./lib/unsupported-api.js"
},
"./rules": {
"types": "./lib/types/rules.d.ts"
},
"./universal": {
"types": "./lib/types/universal.d.ts",
"default": "./lib/universal.js"
}
}
}

View File

@@ -1,20 +1,32 @@
#!/usr/bin/env node #!/usr/bin/env node
const {existsSync} = require(`fs`); const {existsSync} = require(`fs`);
const {createRequire} = require(`module`); const {createRequire, register} = require(`module`);
const {resolve} = require(`path`); const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);
const relPnpApiPath = "../../../../.pnp.cjs"; const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath); const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absUserWrapperPath = resolve(__dirname, `./sdk.user.cjs`);
const absRequire = createRequire(absPnpApiPath); const absRequire = createRequire(absPnpApiPath);
const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);
if (existsSync(absPnpApiPath)) { if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) { if (!process.versions.pnp) {
// Setup the environment to be able to require prettier/bin/prettier.cjs // Setup the environment to be able to require prettier/bin/prettier.cjs
require(absPnpApiPath).setup(); require(absPnpApiPath).setup();
if (isPnpLoaderEnabled && register) {
register(pathToFileURL(absPnpLoaderPath));
}
} }
} }
const wrapWithUserWrapper = existsSync(absUserWrapperPath)
? exports => absRequire(absUserWrapperPath)(exports)
: exports => exports;
// Defer to the real prettier/bin/prettier.cjs your application uses // Defer to the real prettier/bin/prettier.cjs your application uses
module.exports = absRequire(`prettier/bin/prettier.cjs`); module.exports = wrapWithUserWrapper(absRequire(`prettier/bin/prettier.cjs`));

View File

@@ -1,20 +1,32 @@
#!/usr/bin/env node #!/usr/bin/env node
const {existsSync} = require(`fs`); const {existsSync} = require(`fs`);
const {createRequire} = require(`module`); const {createRequire, register} = require(`module`);
const {resolve} = require(`path`); const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);
const relPnpApiPath = "../../../.pnp.cjs"; const relPnpApiPath = "../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath); const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absUserWrapperPath = resolve(__dirname, `./sdk.user.cjs`);
const absRequire = createRequire(absPnpApiPath); const absRequire = createRequire(absPnpApiPath);
const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);
if (existsSync(absPnpApiPath)) { if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) { if (!process.versions.pnp) {
// Setup the environment to be able to require prettier // Setup the environment to be able to require prettier
require(absPnpApiPath).setup(); require(absPnpApiPath).setup();
if (isPnpLoaderEnabled && register) {
register(pathToFileURL(absPnpLoaderPath));
}
} }
} }
const wrapWithUserWrapper = existsSync(absUserWrapperPath)
? exports => absRequire(absUserWrapperPath)(exports)
: exports => exports;
// Defer to the real prettier your application uses // Defer to the real prettier your application uses
module.exports = absRequire(`prettier`); module.exports = wrapWithUserWrapper(absRequire(`prettier`));

View File

@@ -1,6 +1,6 @@
{ {
"name": "prettier", "name": "prettier",
"version": "3.2.5-sdk", "version": "3.8.0-sdk",
"main": "./index.cjs", "main": "./index.cjs",
"type": "commonjs", "type": "commonjs",
"bin": "./bin/prettier.cjs" "bin": "./bin/prettier.cjs"

View File

@@ -1 +1,8 @@
yarnPath: .yarn/releases/yarn-4.1.1.cjs enableGlobalCache: false
packageExtensions:
'lerna@*':
dependencies:
ci-info: '*'
yarnPath: .yarn/releases/yarn-4.12.0.cjs

25
README.md Normal file
View File

@@ -0,0 +1,25 @@
# frontend
## Добавление нового пакета
1. Скопировать один из существующих пакетов в папке `packages`
2. На его основе подготовить новый пакет
3. Запустить `yarn`
## Публикация новых версий
```bash
yarn lerna publish
```
## Обновление зависимостей
```bash
yarn set version stable
yarn install
yarn upgrade-interactive
yarn dlx @yarnpkg/sdks
```

9
eslint.config.js Normal file
View File

@@ -0,0 +1,9 @@
import config from '@advdominion/eslint-config';
import { defineConfig } from 'eslint/config';
export default defineConfig([
...config,
{
ignores: ['.yarn', '.pnp.*'],
},
]);

View File

@@ -1,5 +1,4 @@
{ {
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"version": "independent", "version": "independent",
"npmClient": "yarn" "npmClient": "yarn"
} }

View File

@@ -1,13 +1,14 @@
{ {
"name": "root",
"private": true, "private": true,
"type": "module", "type": "module",
"packageManager": "yarn@4.12.0",
"workspaces": [ "workspaces": [
"packages/*" "packages/*"
], ],
"devDependencies": { "devDependencies": {
"lerna": "^8.1.2", "@advdominion/eslint-config": "workspace:*",
"prettier": "^3.2.5" "eslint": "^9.39.2",
}, "lerna": "^9.0.3",
"packageManager": "yarn@4.1.1" "prettier": "^3.8.0"
}
} }

View File

@@ -0,0 +1,70 @@
# babel-plugin-nunjucks
Плагин для [babel-loader](https://github.com/babel/babel-loader), позволяющий использовать шаблонизатор [Nunjucks](https://mozilla.github.io/nunjucks/) внутри JS-файлов.
## Установка
```bash
yarn add -D @advdominion/babel-plugin-nunjucks
```
## Использование
Используются [Tagged templates](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates) с тегом `njk`:
```js
njk`
{% from "./item.njk" import item as item %}
<div class="items">
{% for n in range(0, 10) %}
{{item()}}
{% endfor %}
</div>
`;
```
Пример конфигурации Webpack:
```js
[
{
test: /\.js$/,
exclude: [/mocks\.js$/],
use: [
{
loader: 'babel-loader',
options: {
cacheDirectory: true,
},
},
],
},
{
test: /mocks\.js$/,
use: [
{
loader: 'babel-loader',
options: {
compact: false,
plugins: [
[
'@advdominion/babel-plugin-nunjucks',
{
templatesFolder: 'src/templates/',
},
],
],
},
},
],
},
];
```
## Опции
- `templatesFolder` - строка, обязательный параметр. Путь до папки с файлами шаблонов
- `globals` - массив, необязательный параметр. Глобальные переменные для Nunjucks (например, `[{name: "message", value: "Hello, world!"}]`)
**Важно:** Параметр `cacheDirectory` в опциях babel-loader должен быть отключён.

View File

@@ -0,0 +1,25 @@
import nunjucks from 'nunjucks';
const babelPluginNunjucks = ({types: t}) => {
return {
pre(state) {
const options = state.opts.plugins[0].options;
this.njkenv = new nunjucks.Environment(new nunjucks.FileSystemLoader(options.templatesFolder));
if (options.globals) {
for (const {name, value} of options.globals) {
this.njkenv.addGlobal(name, value);
}
}
},
visitor: {
TaggedTemplateExpression(path) {
if (path.get('tag').isIdentifier({name: 'njk'})) {
const render = this.njkenv.renderString(path.node.quasi.quasis[0].value.raw);
path.replaceWith(t.stringLiteral(render));
}
},
},
};
};
export default babelPluginNunjucks;

View File

@@ -0,0 +1,18 @@
{
"name": "@advdominion/babel-plugin-nunjucks",
"version": "3.1.0",
"type": "module",
"main": "index.js",
"repository": {
"type": "git",
"url": "https://gitea.optiweb.ru/public/frontend.git"
},
"license": "MIT",
"publishConfig": {
"access": "public"
},
"peerDependencies": {
"@babel/core": "^7.0.0",
"nunjucks": "^3.0.0"
}
}

View File

@@ -0,0 +1,28 @@
# Конфигурация для ESLint
Включает в себя:
- [js/recommended](https://eslint.org/docs/latest/use/configure/configuration-files#using-predefined-configurations) из ESLint
- [eslint-config-prettier](https://github.com/prettier/eslint-config-prettier)
- [eslint-plugin-simple-import-sort](https://github.com/lydell/eslint-plugin-simple-import-sort)
- [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn)
- [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue)
- [globals](https://github.com/sindresorhus/globals) (`browser` и `nodeBuiltin`)
## Использование
### Требования
- [ESLint](https://eslint.org/)
### Подключание
```js
import config from '@advdominion/eslint-config';
import { defineConfig } from 'eslint/config';
export default defineConfig([
...config,
// Дополнительная конфигурация проекта
]);
```

View File

@@ -0,0 +1,129 @@
/* eslint-disable unicorn/no-useless-spread */
import js from '@eslint/js';
import eslintConfigPrettier from 'eslint-config-prettier';
import simpleImportSort from 'eslint-plugin-simple-import-sort';
import eslintPluginUnicorn from 'eslint-plugin-unicorn';
import pluginVue from 'eslint-plugin-vue';
import globals from 'globals';
const config = [
{
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
globals: {
...globals.browser,
...globals.nodeBuiltin,
},
},
},
js.configs.recommended,
{
rules: {
...{
'array-callback-return': 'error',
'no-await-in-loop': 'warn',
'no-duplicate-imports': 'warn',
'no-promise-executor-return': 'error',
'no-self-compare': 'error',
'no-template-curly-in-string': 'warn',
'no-unassigned-vars': 'warn',
'no-unmodified-loop-condition': 'error',
'no-unreachable-loop': 'error',
'no-use-before-define': 'error',
'no-useless-assignment': 'warn',
},
...{
'dot-notation': 'warn',
'eqeqeq': 'error',
'no-implicit-coercion': 'warn',
'no-negated-condition': 'warn',
'no-useless-concat': 'warn',
'object-shorthand': 'warn',
'func-style': 'error',
'no-console': ['warn', { allow: ['warn', 'error'] }],
'no-param-reassign': 'error',
'no-var': 'error',
'one-var': ['warn', 'never'],
'prefer-const': 'warn',
'prefer-template': 'warn',
},
},
},
{
plugins: {
'simple-import-sort': simpleImportSort,
},
rules: {
'simple-import-sort/imports': 'warn',
},
},
{
plugins: {
unicorn: eslintPluginUnicorn,
},
rules: {
...Object.fromEntries(
Object.entries(eslintPluginUnicorn.configs.recommended.rules).map(([rule, level]) => [
rule,
level === 'off' ? 'off' : 'warn',
]),
),
'unicorn/better-regex': 'warn',
'unicorn/filename-case': ['warn', { cases: { kebabCase: true, pascalCase: true } }],
'unicorn/prefer-global-this': 'off',
'unicorn/prefer-import-meta-properties': 'warn',
'unicorn/prefer-top-level-await': 'off',
'unicorn/prevent-abbreviations': 'off',
},
},
...pluginVue.configs['flat/recommended'],
{
rules: {
...{
'vue/no-v-html': 'off',
'vue/one-component-per-file': 'off',
},
...{
'vue/component-name-in-template-casing': 'warn',
'vue/component-options-name-casing': 'warn',
'vue/custom-event-name-casing': 'warn',
'vue/match-component-file-name': ['warn', { extensions: ['vue'], shouldMatchCase: true }],
'vue/match-component-import-name': 'warn',
'vue/no-boolean-default': 'warn',
'vue/no-potential-component-option-typo': 'warn',
'vue/no-useless-mustaches': 'warn',
'vue/no-useless-v-bind': 'warn',
'vue/require-direct-export': 'warn',
'vue/require-name-property': 'warn',
'vue/v-for-delimiter-style': 'warn',
'vue/v-on-handler-style': ['warn', 'inline'],
},
...{
'vue/dot-notation': 'warn',
'vue/eqeqeq': 'error',
'vue/no-console': ['warn', { allow: ['warn', 'error'] }],
'vue/no-constant-condition': 'error',
'vue/no-empty-pattern': 'error',
'vue/no-implicit-coercion': 'warn',
'vue/no-irregular-whitespace': 'error',
'vue/no-loss-of-precision': 'error',
'vue/no-negated-condition': 'warn',
'vue/no-sparse-arrays': 'error',
'vue/no-useless-concat': 'warn',
'vue/object-shorthand': 'warn',
'vue/prefer-template': 'warn',
},
},
},
{
files: ['**/*.vue'],
rules: {
'no-useless-assignment': 'off', // ESLint не умеет работать с этим правилом внутри <template>
},
},
eslintConfigPrettier,
];
export default config;

View File

@@ -0,0 +1,26 @@
{
"name": "@advdominion/eslint-config",
"version": "1.1.3",
"type": "module",
"main": "index.js",
"repository": {
"type": "git",
"url": "https://gitea.optiweb.ru/public/frontend.git"
},
"license": "MIT",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@eslint/js": "^9.39.2",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-simple-import-sort": "^12.1.1",
"eslint-plugin-unicorn": "^62.0.0",
"eslint-plugin-vue": "^10.7.0",
"globals": "^17.0.0",
"vue-eslint-parser": "^10.2.0"
},
"peerDependencies": {
"eslint": "^9.39.0"
}
}

View File

@@ -1,14 +1,14 @@
{ {
"name": "@advdominion/get-scrollbar-width", "name": "@advdominion/get-scrollbar-width",
"version": "2.0.0", "version": "2.0.1",
"type": "module", "type": "module",
"main": "index.js", "main": "index.js",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://gitea.optiweb.ru/public/helpers.git" "url": "https://gitea.optiweb.ru/public/frontend.git"
}, },
"license": "MIT", "license": "MIT",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
} }
} }

View File

@@ -1,9 +0,0 @@
# is
Usage:
```js
import { is } from '@advdominion/is';
console.log(is('Hello, world!', 'String'));
```

View File

@@ -1,3 +0,0 @@
export const is = (obj, type) => {
return Object.prototype.toString.call(obj).slice(8, -1) === type && obj !== undefined && obj !== null;
};

View File

@@ -1,14 +0,0 @@
{
"name": "@advdominion/is",
"version": "1.0.0",
"type": "module",
"main": "index.js",
"repository": {
"type": "git",
"url": "https://gitea.optiweb.ru/public/helpers.git"
},
"license": "MIT",
"publishConfig": {
"access": "public"
}
}

View File

@@ -0,0 +1,53 @@
# lightningcss-loader
[Lightning CSS](https://lightningcss.dev) loader for [Webpack](https://webpack.js.org)
## Usage
```js
import { transform } from 'lightningcss';
return {
...,
rules: [
{
test: /\.css$/,
use: [
{
loader: '@advdominion/lightningcss-loader',
options: {
implementation: transform,
},
},
],
},
],
};
```
### Passing options to Lightning CSS
```js
import { transform } from 'lightningcss';
return {
...,
rules: [
{
test: /\.css$/,
use: [
{
loader: '@advdominion/lightningcss-loader',
options: {
implementation: transform,
drafts: {
customMedia: true,
},
minify: false,
},
},
],
},
],
};
```

View File

@@ -0,0 +1,22 @@
const lightningcssLoader = function (source, sourceMap) {
const { implementation, ...options } = this.getOptions();
const callback = this.async();
if (typeof implementation !== 'function') {
throw new TypeError(
`[lightningcss-loader]: The "implementation" option is required and must provide "transform" function of the LightningCSS`,
);
}
const { code, map } = implementation({
filename: this.resourcePath,
code: Buffer.from(source),
sourceMap: this.sourceMap,
inputSourceMap: this.sourceMap && sourceMap ? JSON.stringify(sourceMap) : undefined,
...options,
});
callback(undefined, code.toString(), map && JSON.parse(map.toString()));
};
export default lightningcssLoader;

View File

@@ -0,0 +1,14 @@
{
"name": "@advdominion/lightningcss-loader",
"version": "1.0.2",
"type": "module",
"main": "index.js",
"repository": {
"type": "git",
"url": "https://gitea.optiweb.ru/public/frontend.git"
},
"license": "MIT",
"publishConfig": {
"access": "public"
}
}

View File

@@ -0,0 +1,11 @@
# pluralize
Склонение существительных в зависимости от числа
## Использование
```js
import { pluralize } from '@advdominion/pluralize';
console.log(pluralize(1, ['яблоко', 'яблока', 'яблок']));
```

View File

@@ -0,0 +1,14 @@
export const pluralize = (count, words) => {
const normalizedCount = Math.abs(count) % 100;
const count10 = normalizedCount % 10;
if (normalizedCount > 10 && normalizedCount < 20) {
return words[2];
}
if (count10 > 1 && count10 < 5) {
return words[1];
}
if (count10 === 1) {
return words[0];
}
return words[2];
};

View File

@@ -0,0 +1,14 @@
{
"name": "@advdominion/pluralize",
"version": "1.0.2",
"type": "module",
"main": "index.js",
"repository": {
"type": "git",
"url": "https://gitea.optiweb.ru/public/frontend.git"
},
"license": "MIT",
"publishConfig": {
"access": "public"
}
}

View File

@@ -1,5 +1,13 @@
export default { export default {
printWidth: 120, printWidth: 120,
tabWidth: 4,
singleQuote: true, singleQuote: true,
quoteProps: 'consistent',
overrides: [
{
files: 'packages/*/package.json',
options: {
tabWidth: 2,
},
},
],
}; };

4727
yarn.lock

File diff suppressed because it is too large Load Diff