[eslint][node.js] eslint-disable not working - node.js

I'm trying to disable eslint for a line of code but to no effect.
I tried to tackle the problem as in eslint docs. One approach, used in C:...somepath...\index.js:
/* eslint-disable */
const fetch = (url, init) =>
import('node-fetch').then(({ default: fetch }) => fetch(url, init));
/* eslint-enable */
And another approach, used in C:\Users...somepath...\shared\index.js:
// eslint-disable-next-line
const fetch = (url, init) => import('node-fetch').then(({ default: fetch }) => fetch(url, init));
None of them seem to work as while running npx eslint "**/*.js" I keep on getting:
C:\...somepath...\index.js
6:32 error Parsing error: Unexpected token import
C:\Users\...somepath...\shared\index.js
11:7 error Parsing error: Unexpected token import
I'm using commonjs, and yes, I know that import is not designed to be used out of es modules but according to node-fetch documentation I can do so and the solution is working fine. Yet, eslint is still throwing errors. After failing to add some rules ignoring importing, I decided to just disable the problematic pieces of code.
I'm extending airbnb and my .eslintrc is as simple as that:
{
"extends": "airbnb"
}
Relevant dependencies/devDependencies in package.json:
"dependencies": {
"node": "^16.17.0",
"node-fetch": "^3.2.10",
"npm": "^8.19.1"
},
"devDependencies": {
"#typescript-eslint/eslint-plugin": "^5.36.2",
"#typescript-eslint/parser": "^5.36.2",
"eslint": "^8.2.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-jsx-a11y": "^6.5.1",
"eslint-plugin-react": "^7.28.0",
"eslint-plugin-react-hooks": "^4.3.0",
"prettier": "2.7.1"
}
I've tried applying /* eslint-disable */ to a whole file to check whether it works at all - no it doesn't. This led me to think whether airbnb doesn't have sth like "noInlineConfig": true set but I checked and it seems like not the case.
Can you please help me with the issue?

In order to use dynamic imports in your code, you need to set the language version to 2020 or higher. The preferred way to do so is to set a predefined environment in your .eslintrc file:
{
"extends": "airbnb",
"env": {
"es2020": true
}
}
to set the language version for a particular file only, use an override:
{
"extends": "airbnb",
"overrides": [{
"files": "./path/to/file.js",
"env": {
"es2020": true
}
}]
}

Related

Webpack resolve.fallback not working. Module not found: Error: Can't resolve 'crypto' in node_modules\aws4

I have a nodejs app created through the Vue CLI. I need to use the aws4 node module to sign my requests. However, when I use the aws4 module the app fails to serve due to the following error:
ERROR in ./node_modules/aws4/aws4.js 4:13-30
Module not found: Error: Can't resolve 'crypto' in 'C:\Users\henry\Repos\AWS4 TEST\aws4-test\node_modules\aws4'
BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.
This is no longer the case. Verify if you need this module and configure a polyfill for it.
If you want to include a polyfill, you need to:
- add a fallback 'resolve.fallback: { "crypto": require.resolve("crypto-browserify") }'
- install 'crypto-browserify'
If you don't want to include a polyfill, you can use an empty module like this:
resolve.fallback: { "crypto": false }
I got this error for the 3 imports in the aws module: crypto, url and querystring.
I read the error message and saw that the version of webpack the vue cli uses is 5+ so the core modules such as crypto are not included anymore.
(I've never really used webpack before, but the instructions seems simple.)
I created a new file in my project webpack.config.js and added the following:
module.exports = {
resolve: {
fallback: {
crypto: require.resolve('crypto-browserify'),
},
},
};
I then installed the crypto-browserify package.
I still get the error, it's make 0 difference.
I've looked online and have tried solutions suggested for the crypto not found issue. None of them seem to work either. I've tried:
Adding this to the package.json
"browser": {
"crypto": false
}
Adding the crypto object to the paths object in tsconfig.json
"compilerOptions": {
"baseUrl": "./",
"paths": {
"crypto": ["node_modules/crypto-browerify"],
}
I tried using the node module: node-polyfill-webpack-plugin. Which did resolve the issue for url and querystring (as soon as the module was imported). But the issue with crypto remains.
Here is my package.json
{
"name": "aws4-test",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"test:unit": "vue-cli-service test:unit",
"lint": "vue-cli-service lint"
},
"dependencies": {
"aws4": "^1.11.0",
"axios": "^0.27.2",
"core-js": "^3.8.3",
"crypto-browserify": "^3.12.0",
"crypto-js": "^4.1.1",
"node-polyfill-webpack-plugin": "^2.0.0",
"vue": "^2.6.14",
"vue-class-component": "^7.2.3",
"vue-property-decorator": "^9.1.2",
"vue-router": "^3.5.1",
"vuex": "^3.6.2"
},
"devDependencies": {
"#types/aws4": "^1.11.2",
"#types/jest": "^27.0.1",
"#typescript-eslint/eslint-plugin": "^5.4.0",
"#typescript-eslint/parser": "^5.4.0",
"#vue/cli-plugin-babel": "~5.0.0",
"#vue/cli-plugin-eslint": "~5.0.0",
"#vue/cli-plugin-router": "~5.0.0",
"#vue/cli-plugin-typescript": "~5.0.0",
"#vue/cli-plugin-unit-jest": "~5.0.0",
"#vue/cli-plugin-vuex": "~5.0.0",
"#vue/cli-service": "~5.0.0",
"#vue/eslint-config-airbnb": "^6.0.0",
"#vue/eslint-config-typescript": "^9.1.0",
"#vue/test-utils": "^1.1.3",
"#vue/vue2-jest": "^27.0.0-alpha.2",
"babel-jest": "^27.0.6",
"eslint": "^7.32.0",
"eslint-plugin-import": "^2.25.3",
"eslint-plugin-vue": "^8.0.3",
"eslint-plugin-vuejs-accessibility": "^1.1.0",
"jest": "^27.0.5",
"ts-jest": "^27.0.4",
"typescript": "~4.5.5",
"vue-template-compiler": "^2.6.14"
},
"browser": {
"crypto": false
}
}
To isolate the issue I created a new vue 2 app though the cli then just added the aws4 and axios modules. The fact that the node-polyfill-webpack-plugin works to resolve the errors for all but crypto error seems odd. Perhaps something else is overwritting that.
Thanks for your help.
The reason the webpack config wasn't working was because I am using the vue-cli-service. So to configure the webpack config I needed to edit the vue.config.js file and use the configureWebpack object. Docs here: https://cli.vuejs.org/guide/webpack.html

Import HTML as string and test with Jest

I'm using sveltekit and I can't use the files api to import html templates. So I decided to import by writing a module that imports the content of the document as a string (described here).
// src/global.d.ts
/// <reference types="#sveltejs/kit" />
declare module '*.html' {
const content: string
export default content
}
So far so good, but now I need to test the code and jest can't interpret the code.
● Test suite failed to run
Jest encountered an unexpected token
Jest failed to parse a file. This happens e.g. when your code or its dependencies use non-standard JavaScript syntax, or when Jest is not configured to support such syntax.
Out of the box Jest supports Babel, which will be used to transform your files into valid JS based on your Babel configuration.
By default "node_modules" folder is ignored by transformers.
Here's what you can do:
• If you are trying to use ECMAScript Modules, see https://jestjs.io/docs/ecmascript-modules for how to enable it.
• If you are trying to use TypeScript, see https://jestjs.io/docs/getting-started#using-typescript
• To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
• If you need a custom transformation specify a "transform" option in your config.
• If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.
You'll find more details and examples of these config options in the docs:
https://jestjs.io/docs/configuration
For information about custom transformations, see:
https://jestjs.io/docs/code-transformation
Details:
/home/developer/workspace/src/assets/html/confirm_email.html:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,jest){<!DOCTYPE html>
^
SyntaxError: Unexpected token '<'
I don't understand how jest understands the .d.ts files... How do I get to test the code?
Do you install #babel/plugin-transform-runtime"?
I share my config for jest/svelte-jester..
I have:
jsconfig.json
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"$lib": ["src/lib"],
"$lib/*": ["src/lib/*"]
}
},
"include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"],
}
svelte.config.js
import vercel from '#sveltejs/adapter-vercel'
/** #type {import('#sveltejs/kit').Config} */
const config = {
kit: {
adapter: vercel(),
vite: {
define: {
'process.env': process.env,
},
},
},
transform: {
"^.+\\.svelte$": ["svelte-jester", { "preprocess": true }]
}
};
export default config;
babel.config.json
{
"presets": [
["#babel/preset-env", { "modules": "auto" }]
],
"plugins": ["babel-plugin-transform-vite-meta-env","#babel/plugin-transform-runtime"]
}
jest.config.js
export default {
"transform": {
"^.+\\.js$": "babel-jest",
"^.+\\.svelte$": "svelte-jester",
},
"moduleFileExtensions": ["svelte", "js"],
"testEnvironment": "jsdom",
"setupFilesAfterEnv": ["#testing-library/jest-dom/extend-expect"]
}
and whole package.json
{
"name": "sveltekit",
"version": "0.0.1",
"scripts": {
"dev": "svelte-kit dev",
"build": "svelte-kit build",
"package": "svelte-kit package",
"preview": "svelte-kit preview",
"test": "jest src",
"test:watch": "npm run test -- --watch"
},
"devDependencies": {
"#babel/core": "^7.16.12",
"#babel/plugin-transform-modules-commonjs": "^7.16.8",
"#babel/plugin-transform-runtime": "^7.17.0",
"#babel/preset-env": "^7.16.11",
"#supabase/supabase-js": "^1.29.1",
"#sveltejs/adapter-auto": "^1.0.0-next.7",
"#sveltejs/kit": "^1.0.0-next.215",
"#sveltejs/svelte-virtual-list": "^3.0.1",
"#testing-library/svelte": "^3.0.3",
"autoprefixer": "^10.4.1",
"babel-jest": "^27.4.6",
"babel-plugin-transform-vite-meta-env": "^1.0.3",
"jest": "^27.4.7",
"postcss-load-config": "^3.1.1",
"prettier": "^2.5.1",
"prettier-plugin-svelte": "^2.5.1",
"svelte": "^3.44.0",
"svelte-jester": "^2.1.5",
"svelte-lazy": "^1.0.12",
"tailwindcss": "^3.0.8",
"ts-jest": "^27.1.3"
},
"type": "module",
"dependencies": {
"#fontsource/fira-mono": "^4.5.0",
"#lukeed/uuid": "^2.0.0",
"#testing-library/jest-dom": "^5.16.1",
"cookie": "^0.4.1",
"svelte-lazy-image": "^0.2.0",
"swiper": "^8.0.3"
},
"testEnvironment": "jsdom"
}
I hope it will help you.I had a lot of troubles too with setting up jest..
1.Import html as string
I solved the problem using another approach...
I'm using a resource of vite to import the html file as an asset, as can be seen here in the documentation
import confirm_email_template from '../../../assets/html/confirm_email.html?raw'
2.Test using Jest
For production it works perfectly, but for unit testing the code breaks because Jest can't import the asset as a module.
So the second part of the problem was fixed (I don't know if this is the best practice) using asset mocks.
// jest.config.cjs
{
⋮
moduleNameMapper: {
⋮
'([a-zA-Z_ ]+\\.html)\\?raw$': '<rootDir>/__mocks/$1.cjs'
}
⋮
}
To make it work, I created the following folder structure:
__mocks
|
confirm_email.html.cjs
another_asset_mocked.html.cjs
The confirm_email.html.cjs looks like this:
// __mocks/confirm_email.html.cjs
module.exports = '<html>content<html>'

How to resolve "Could not find a declaration file for module 'request-context'. "?

I am working on three files at the moment which are index.js , index.main.js and app.js. I'm using request-context to grab a variable from index.main.js and pass it to index.js.
In app.js (A file I created in my server folder) I have the following code
//full code in app.js
const contextService = require("request-context");
const app = express();
app.use(contextService.middleware("request"));
I have tried running these following commands
npm install --save typescript #types/node #types/react #types/react-dom #types/jest
npm install -D #types/request-context
and also tried using before import
// #ts-ignore
To no avail.
When I check my app.js I notice three dots on the word "require" which shows:
Could not find a declaration file for module 'request-context'. '/home/servertest/Desktop/folder/folder1/src/component_NodeJS/server/node_modules/request-context/lib/index.js' implicitly has an 'any' type.
Try npm install #types/request-context if it exists or add a new declaration (.d.ts) file containing declare module 'request-context';ts(7016)
In index.main.js I have the following
async function listFilesInDepth()
{
const {Storage} = require('#google-cloud/storage');
const storage = new Storage();
const bucketName = 'probizmy';
const [files] = await storage.bucket(bucketName).getFiles();
const contextService = require("request-context");
console.log('List Of Files Available:');
files.forEach(file =>
{
targetFiles = file.name;
console.log(`-----`+file.name);
});
contextService.set("request:targetFileKey", targetFiles);
return targetFiles;
}
and in index.js I have the following code
const contextService = require("request-context");
const targetFiles = contextService.get("request:targetFileKey");
console.log(targetFiles) //output shows undefined
I'm suspecting the request-context error is why I'm getting undefined as the output. My expected result is for the value of targetFiles to be output on the console log.
Hoping to get some insight on this. Any help would be greatly appreciated! Thank you :)
Edited:
As requested I have included package.json
{
"name": "server",
"version": "0.1.81",
"description": "Server NodeJS For Internel Process",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"#google-cloud/storage": "^2.4.2",
"#google-cloud/vision": "^0.25.0",
"#types/jest": "^24.0.15",
"#types/node": "^12.0.12",
"#types/react": "^16.8.23",
"#types/react-dom": "^16.8.4",
"alphabet-generator": "^1.0.1",
"body-parser": "^1.18.3",
"cheerio": "^1.0.0-rc.2",
"cors": "^2.8.5",
"express": "^4.16.4",
"format": "^0.2.2",
"grpc": "^1.19.0",
"multer": "^1.4.1",
"natural": "^0.6.3",
"path": "^0.12.7",
"request": "^2.88.0",
"request-context": "^2.0.0",
"require-all": "^3.0.0",
"require-dir": "^1.2.0",
"string-similarity": "^3.0.0",
"typescript": "^3.5.2"
},
"devDependencies": {
"babel-plugin-root-import": "^6.2.0"
}
}
I have had this issue before and there is a problem with how you are declaring your typings. There are a few ways to solve this I will include below with more links for information with a link to the typescript declaration documentation and several other StackOverflow resources. If you include your package.json it may help determine what you specifically still need to do. You likely need to add in a types folder/file with the following lines of code
"typeRoots": [
"./node_modules/#types",
"./types"
] /* List of folders to include type definitions from. */
And then create a second file of the form *.d.ts to list your needed modules that are erroring. So something like
declare module 'request-context';
The issue could also be in your package.js file. You may need to declare where your typings are like so
// package.json
{
"typings": "dist/src/*.d.ts"
}
Different resources
https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html
Could not find a declaration file for module 'module-name'. '/path/to/module-name.js' implicitly has an 'any' type
Typescript react - Could not find a declaration file for module ''react-materialize'. 'path/to/module-name.js' implicitly has an any type
Could not find a declaration file for module
TypeScript: Could not find a declaration file for module in unit tests, only
Maybe it is because the listFilesInDepth is asynchronous and you have to handle the promise or use async await on that method.
Is the method listFilesInDepth called before doing the context.get?

TypeScript: Could not find a declaration file for module in unit tests, only

I'm using TypeScript with Visual Studio Code on Windows 10 to develop an NPM module. I use mocha/chai combined with nyc (istanbul) for unit testing and code coverage.
For some of my tests I would like to use chai-bytes to compare buffers more easily. Unfortunately, there is no type definition file in the chai-bytes module and there is no definition at #types/chai-bytes available.
Therefore, I have written my own type definition file for the chai-bytes plugin (which is very simple), but during execution of npm test I get the following error:
TSError: ⨯ Unable to compile TypeScript:
test/utls/BitArray-test.ts(3,23): error TS7016: Could not find a declaration file for module 'chai-bytes'. 'C:/Users/<user>/Source/Repos/velux-api/node_modules/chai-bytes/index.js' implicitly has an 'any' type.
Try `npm install #types/chai-bytes` if it exists or add a new declaration (.d.ts) file containing `declare module 'chai-bytes';`
test/utls/BitArray-test.ts(48,38): error TS2339: Property 'equalBytes' does not exist on type 'Assertion'.
VS Code provides me with full Intellisense, so I think my type definition file works and is found at least by VS Code.
This is my directory structure:
dist\ <-- My compiled code goes here
utils\
BitArray.d.ts
BitArray.js
BitArray.js.map
index.d.ts
index.js
index.js.map
...
src\
utils\
BitArray.ts
index.ts
...
test\
utils\
BitArray-test.ts
... (other test files)
mocha.opts
types\
chai-bytes\
index.d.ts <-- Type definition file for 'chai-bytes'
I have tried to move the type definition file to the source tree (several places), but with no effect, besides, that sometimes it got even worse, so that even VS Code haven't found it anymore.
These are my config files:
package.json:
{
"name": "klf-200-api",
"version": "3.0.0",
"description": "This module provides a wrapper to the socket API of a Velux KLF-200 interface. You will need at least firmware 0.2.0.0.71 on your KLF interface for this library to work.",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"author": {
"name": "Michael Schroeder"
},
"dependencies": {
"#types/promise-timeout": "^1.3.0",
"promise-timeout": "^1.3.0"
},
"devDependencies": {
"#types/chai": "^4.1.6",
"#types/chai-as-promised": "^7.1.0",
"#types/mitm": "^1.3.2",
"#types/mocha": "^5.2.5",
"#types/node": "^10.11.7",
"#types/sinon": "^5.0.7",
"#types/sleep": "0.0.7",
"babel-eslint": "^8.0.0",
"chai": "^4.1.0",
"chai-as-promised": "^7.1.1",
"chai-bytes": "^0.1.1",
"chai-sinon": "^2.8.1",
"cross-env": "^5.2.0",
"eslint": "^4.7.1",
"eslint-config-defaults": "^9.0.0",
"eslint-plugin-react": "^7.3.0",
"gulp": "^4.0.0",
"gulp-release-it": "^2.0.14",
"gulp-typescript": "^5.0.0-alpha.3",
"gulp-uglify": "^3.0.1",
"istanbul": "^0.4.5",
"mitm": "^1.4.0",
"mocha": "^3.4.2",
"nock": "^9.0.14",
"nyc": "^13.1.0",
"sinon": "^7.1.1",
"sleep": "^5.2.3",
"source-map-support": "^0.5.9",
"ts-mocha": "^2.0.0",
"ts-node": "^7.0.1",
"typescript": "^3.1.2",
"uglify-es": "^3.3.9"
},
"scripts": {
"test": "cross-env TS_NODE_FILES=true nyc mocha",
"document": "jsdoc src -r -c ./.jsdoc.json -d docs"
},
"nyc": {
"include": [
"src/**/*.ts",
"src/**/*.tsx"
],
"extension": [
".ts",
".tsx"
],
"exclude": [
"**/*.d.ts"
],
"reporter": [
"text-summary",
"html"
],
"all": true
},
"repository": {
"type": "git",
"url": "https://github.com/MiSchroe/klf-200-api"
},
"keywords": [
"klf-200",
"IoT"
],
"license": "MIT",
"bugs": {
"url": "https://github.com/MiSchroe/klf-200-api/issues"
},
"homepage": "https://mischroe.github.io/klf-200-api/"
}
tsconfig.json:
{
"compilerOptions": {
/* Basic Options */
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"declaration": true, /* Generates corresponding '.d.ts' file. */
"sourceMap": true, /* Generates corresponding '.map' file. */
"outDir": "./dist", /* Redirect output structure to the directory. */
/* Strict Type-Checking Options */
"strict": true, /* Enable all strict type-checking options. */
"noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
/* Module Resolution Options */
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
},
"include": [
"./src/**/*"
]
}
mocha.opts:
--require ts-node/register
--require source-map-support/register
--recursive
--full-trace
--bail
test/**/*.ts
types\chai-bytes\index.d.ts:
/// <reference types="chai" />
declare module "chai-bytes" {
function chaiBytes(chai: any, utils: any): void;
export = chaiBytes;
}
declare namespace Chai {
// For BDD API
interface Assertion extends LanguageChains, NumericComparison, TypeComparison {
equalBytes(expected: string | Array<number> | ArrayLike<number>): void;
}
}
BitArray-test.ts (only the relevant test):
import { expect } from "chai";
import { bitArrayToArray, arrayToBitArray } from "../../src/utils/BitArray";
import chaibytes from "chai-bytes";
'use strict';
chai.use(chaibytes);
describe("...", function() {
it("should return an the correctly filled buffer", function() {
const nums: number[] = [0, 2, 4, 6, 8, 10, 12, 14];
const result = arrayToBitArray(nums, 2);
expect(result).to.be.an.instanceof(Buffer);
expect(result).to.be.equalBytes([0x55, 0x55]);
});
});
npm --version:
3.10.10
node --version:
v6.11.1
I could use Buffer.compare as work-around instead, but then I wouldn't see the buffers' content in the error message but only a -1, 0 or 1. (And it wouldn't solve the problem.)
Currently, I'm stuck at that point and any help is much appreciated.
At tsconfig.json add:
"typeRoots": [
"./node_modules/#types",
"./types"
] /* List of folders to include type definitions from. */
to the compilerOptions list.
Change the header of the BitArray-test.ts file:
import { bitArrayToArray, arrayToBitArray } from "../../src/utils/BitArray";
import chaibytes from "chai-bytes";
import { expect, use } from "chai";
'use strict';
use(chaibytes);

Eslint configuration is showing a `definition for rule 'filenames/match-regex' was not found` error

I'm getting started with Walmart's new React framework called Electrode.
I'm trying to configure eslint and have tried extending the walmart lint configuration like so:
https://github.com/walmartlabs/eslint-config-walmart
Here's the .eslintrc
{
"parser": "babel-eslint",
"ecmaFeatures": {
"jsx": true
},
"env": {
"es6": true
},
"extends": "walmart/configurations/es6-react-test",
"rules": {
"indent": ["error", 2]
}
}
and package.json
"devDependencies": {
"babel-eslint": "^7.1.1",
"electrode-archetype-react-app-dev": "^1.0.0",
"eslint": "^2.10.2",
"eslint-plugin-filenames": "^1.0.0",
"eslint-plugin-react": "^5.1.1",
"gulp": "^3.9.1"
},
but I get a definition for rule 'filenames/match-regex' was not found error. I installed eslint-plugin-filenames, was there something else I need to confgure as well?
file: 'file:///foo/client/components/home.jsx'
severity: 'Error'
message: 'Definition for rule 'filenames/match-regex' was not found (filenames/match-regex)'
at: '1,1'
source: 'eslint'
Try running ESLint from your node_modules instead of the one you have installed globally. Something like this:
node_modules/eslint/bin/eslint.js --fix .
Otherwise your ESLint plugins might not get picked up.
Try upgrading the packages, I don't see any such issues now with the new versions.
For configuring/overriding default eslint config refer the Electrode docs
For example to override default eslint config for client(react), I created a .eslintec file in client folder, with below snippet:
---
extends:
- "../../node_modules/electrode-archetype-react-app-dev/config/eslint/.eslintrc-react"
- "eslint:recommended"
parser:
"babel-eslint"
rules:
quotes:
- 2
- "single"

Resources