Tari Ibaba is a software developer with years of experience building websites and apps. He has written extensively on a wide range of programming topics and has created dozens of apps and open-source libraries.
By Tari Ibaba
/ Last updated on September 29, 2022
To get the name of a file without the extension in Node.js, use the parse() method from the path module to get an object representing the path. The name property of this object will contain the file name without the extension.
The parse() method returns an object with properties that represent the major parts of the given path. The object it returns has the following properties:
dir – the directory of the path.
root – the topmost directory in the operating system.
base – the last portion of the path.
ext – the extension of the file.
name – the name of the file without the extension.
If the path is not a string, parse() throws a TypeError.
// β TypeError: Received type of number instead of string
path.parse(123).name;
// β TypeError: Received type of boolean instead of string
path.parse(false).name;
// β TypeError: Received type of URL instead of string
path.parse(new URL('https://example.com/file.txt')).name;
// β Received correct type of string
path.parse('index.html').name; // index
The extname() method returns the extension of the given path from the last occurrence of the . (period) character to the end of the string in the last part of the path.
If there is no . in the last part of the path, or if the path starts with . and it is the only . character in the path, extname() returns an empty string.
If the path is not a string, extname() throws a TypeError.
const path = require('path');
// β TypeError: Received type number instead of string
path.extname(123);
// β TypeError: Received type boolean instead of string
path.extname(false);
// β TypeError: Received URL instance instead of string
path.extname(new URL('https://example.com/file.txt'));
// β Received type of string
path.extname('package.json'); // .json
By Tari Ibaba
/ Last updated on September 29, 2022
1. Date setDate() and getDate() methods
To subtract 30 days from the current date in JavaScript:
Use the Date() constructor to create a new Date object with the current date.
Call the getDate() method on this object to get the days.
Subtract 30 from the return value of getDate().
Pass the result of the subtraction to the setDate() method.
// Current date: September 29, 2022
const date = new Date();
date.setDate(date.getDate() - 30);
// New date: August 30, 2022
console.log(date);
The Date getDate() method returns a number between 1 and 31 that represents the day of the month of the particular Date.
The Date setDate() method changes the day of the month of the Date object to the number passed as an argument.
If the days you specify would change the month or year of the Date, setDate() automatically updates the Date information to reflect this.
// April 25, 2022
const date = new Date('2022-04-25T00:00:00.000Z');
date.setDate(40);
// May 10, 2022
console.log(date); // 2022-05-10T00:00:00.000Z
console.log(date.getDate()); // 10
April has only 30 days, so passing 40 to setDate() here increments the month by one and sets the day of the month to 10.
2. date-fns subDays() function
Alternatively, we can use the subDays() function from the date-fns NPM package to subtract 30 days from the current date. subDays() takes a Date object and the number of days to subtract as arguments. It returns a new Date object with the days subtracted.
import { subDays } from 'date-fns';
// Current date: September 29, 2022
const date = new Date();
const newDate = subDays(date, 30);
// New date: August 30, 2022
console.log(newDate);
Note that subDays() returns a new Date object without mutating the one passed to it.
Call the getDate() method on the Date to get the days.
Subtract the days.
Pass the result of the subtraction to the setDate() method.
For example:
function subtractDays(date, days) {
date.setDate(date.getDate() - days);
return date;
}
// May 15, 2022
const date = new Date('2022-05-15T00:00:00.000Z');
const newDate = subtractDays(date, 5);
// May 10, 2022
console.log(newDate); // 2022-05-10T00:00:00.000Z
Our subtractDays() function takes a Date object and the number of days to subtract as arguments. It returns the same Date object with the days subtracted.
The Date getDate() method returns a number between 1 and 31 that represents the day of the month of the particular Date.
The Date setDate() method changes the day of the month of the Date object to the number passed as an argument.
If the days you specify would change the month or year of the Date, setDate() automatically updates the Date information to reflect this.
// April 25, 2022
const date = new Date('2022-04-25T00:00:00.000Z');
date.setDate(40);
// May 10, 2022
console.log(date); // 2022-05-10T00:00:00.000Z
console.log(date.getDate()); // 10
April has only 30 days, so passing 40 to setDate() here increments the month by one and sets the day of the month to 10.
Avoiding Side Effects
The setDate() method mutates the Date object it is called on. This introduces a side effect into our subtractDays() function. To avoid modifying the passed Date and create a pure function, make a copy of the Date and call setDate() on this copy, instead of the original.
function subtractDays(date, days) {
// π Make copy with "Date" constructor
const dateCopy = new Date(date);
dateCopy.setDate(dateCopy.getDate() - days);
return dateCopy;
}
const date = new Date('2022-05-15T00:00:00.000Z');
const newDate = subtractDays(date, 5);
console.log(newDate); // 2022-05-10T00:00:00.000Z
// π Original not modified
console.log(date); // 2022-05-15T00:00:00.000Z
Tip: Functions that donβt modify external state (i.e., pure functions) tend to be more predictable and easier to reason about, as they always give the same output for a particular input. This makes it a good practice to limit the number of side effects in your code.
2. date-fns subDays() function
Alternatively, we can use the subDays() function from the date-fns NPM package to quickly subtract days from a Date. It works like our pure subtractDays() function.
import { subDays } from 'date-fns';
const date = new Date('2022-05-15T00:00:00.000Z');
const newDate = subDays(date, 5);
console.log(newDate); // 2022-05-10T00:00:00.000Z
// Original not modified
console.log(date); // 2022-05-15T00:00:00.000Z
With the useState() hook we create a state variable (message) to store the current value of the input field. We also create another state variable (updated) that will be updated with the input field value when the Enter key is pressed.
We set an onChange event handler on the input field to make this handler get called whenever the input value changes. In the handler we use the target property of the event object to access the object that represents the input element. The value property of this object contains the input value, so we pass it to setMessage() to update message, and this reflects on the page.
After setting up the controlled input, we can now use message outside the handleChange handler to access the current value of the input field.
We use the event.key property to get the key pressed in the onKeyDown event handler. After ensuring that this key is Enter, we use setUpdated(message) to update the updated variable with the current input field value.
Get input value on Enter with event.target
We can also get the value of the input when the Enter key is pressed using the target.value property of the Event object. This is useful in cases where we are not tracking the input value with a state variable, i.e., an uncontrolled input.
While the data in a controlled input is handled by React state, the data in an uncontrolled input is handled by the DOM itself. This is why the input in the example above doesnβt have a value prop or onChange event handler set. Instead, we access the input field value with a React ref. The DOM updates this value when the text in the input is changed.
We create a ref object with the useRef() hook and set it to the ref prop of the input. Doing this sets the current property of the ref object to the DOM object that represents the input element.
useRef() returns a mutable ref object that does not change value when a component is updated. Also, modifying the value of this objectβs current property does not cause a re-render. This is in contrast to the setState update function returned from useState().
Although the React documentation recommends using controlled components, uncontrolled components offer some advantages. You might prefer them if the form is very simple and doesnβt need instant validation, and values only need to be accessed when the form is submitted.
With the useState() hook we create a state variable (message) to store the current value of the input field. We also create another state variable (updated) that will be updated with the input field value when the button is clicked.
We set an onChange event handler on the input field to make this handler get called whenever the input value changes. In the handler, we use the event.target property to access the object representing the input element. The value property of this object contains the input value, so we pass it to setMessage() to update message, and this reflects on the page.
After setting up the controlled input, we can now use message outside the handleChange handler to access the current value of the input field.
So in the onClick event handler we set on the button, we use setUpdated(message) to update the updated variable with the current input field value.
Get value of uncontrolled input on button click
To get the value of an uncontrolled input on button click in React:
Create a ref for the input field
Set an onClick event handler on the button.
Use the ref object to access the current input value in the event handler.
While the data in a controlled input is handled by React state, the data in an uncontrolled input is handled by the DOM itself. This is why the input in the example above doesn’t have a value prop or onChange event handler set. Instead, we access the input field value with a React ref. The DOM updates this value when the text in the input is changed.
We create a ref object with the useRef() hook and set it to the ref prop of the input. Doing this sets the current property of the ref object to the DOM object that represents the input element.
useRef() returns a mutable ref object that does not change value when a component is updated. Also, modifying the value of this object’s current property does not cause a re-render. This is in contrast to the setState update function returned from useState().
Although the React documentation recommends using controlled components, uncontrolled components offer some advantages. You might prefer them if the form is very simple and doesn’t need instant validation, and values only need to be accessed when the form is submitted.
To fix the “cannot find name ‘describe'” error, install the type definitions for your testing framework, and then add the definitions to the types array in your tsconfig.json file.
This error happens if you try to use the describe() function in a TypeScript file, but type definitions for the package are missing.
index.tsCopied!
/* Cannot find name 'it'. Do you need to install type
definitions for a test runner? Try
`npm i --save-dev @types/jest` or
`npm i --save-dev @types/mocha`. ts(2582) */
describe('example', () => {
it('adds two numbers together', () => {
expect(2 + 2).toBe(4);
});
});
ο»Ώ
Install the type definitions for the testing framework you’re using by running one of the following commands at the root of your project directory.
ShellCopied!
# π Jest
npm i -D @types/jest jest
# π Mocha
npm i -D @types/mocha mocha
# Yarn
# π Jest
yarn add --dev @types/jest jest
# π Mocha
yarn add --dev @types/mocha mocha
Add typings to types array in tsconfig.json
In some cases, this is all you need to fix the error. But if it persists, you might need to add the newly installed typings to the types array of your tsconfig.json file.
So if you’re using Jest, you’ll add a jest string to the types array, and then your tsconfig.json file will look something like this:
If the error still doesn’t go away after doing this, make sure that TypeScript is not ignoring the directory containing your test files.
If you’ve set the include array in your tsconfig.json file, make sure the patterns specified in this array match the directory where your test files are located.
For example, if your test files are located in a src directory, TypeScript will detect them with a configuration like this:
If you’ve set the exclude array in your tsconfig.json file, make sure that none of the patterns in the array match the directory containing the test files, as this will prevent TypeScript from detecting them.
For example, in the tsconfig.json file below, files ending with .spec.ts have been excluded, so TypeScript will ignore them and the error will occur when you attempt to use describe() in them.
We used the addEventListener() method to add a handler for the click event to the #box element. This event handler will be called whenever the user clicks the box.
In the handler function, we called the remove() method on the element to remove it from the DOM.
We could also have used the target property on the event object passed to the handler to remove the element.
We can use the event object to access useful information and perform certain actions related to the event. For the click event, the target property lets us access the DOM element that was clicked.
Removing the element with the target property is useful when we want to dynamically remove many elements onclick. For example:
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>Coding Beauty Tutorial</title>
<link rel="stylesheet" href="index.css" />
</head>
<body>
Click on a box to remove it.
<div class="container">
<div class="box" id="box-1"></div>
<div class="box" id="box-2"></div>
<div class="box" id="box-3"></div>
</div>
<script src="index.js"></script>
</body>
</html>
This is because the target property returns the innermost element in the DOM that was clicked. This is in contrast to the event.currentTarget property, which returns the element that the event listener was added to.
To link a local image in React, import the image at the top of the file and assign it to the src prop of an img element.
For example:
App.js
// π import image from file
import myImage from './my-image.jpg';
export default function App() {
return (
<div>
{/* π show image */}
<img src={myImage} alt="Trees" height="200" />
<br />
<span
style={{
color: 'green',
fontSize: '1.2em',
fontWeight: 'bold',
}}
>
Trees
</span>
</div>
);
}
Linking and displaying an image on the webpage.
This approach works when using a Webpack-based tool like Create React App.
Note that the image file must be within the project directory to be imported successfully. An error will occur if the file is outside the project directory.
Link image in React with require() function
Alternatively, we can use the require() function to link an image in React.
The following code example will produce precisely the same result on the page as the first example.
The advantage require() has here is that it doesn’t need to be at the top of the page. We can simply assign the result of require() to the src prop without having to store it in a variable.
Link image in public folder
Another way to link an image in React is to place it in the public folder and reference it with its relative path.
For example, if we placed the my-image.png file in the public folder, we’ll be able to display it in the page like this:
Using the public folder is advantageous when we have many images that we want to display dynamically.
In the following examples, we dynamically display 100 images placed in a grid subfolder under public, and named with a certain pattern (image-1.jpg, image-2.jpg, …, image-100.png) in a grid.
Call the getFullYear() method on the Date to get the year.
Subtract the years.
Pass the result of the subtraction to the setFullYear() method.
For example:
function subtractYears(date, years) {
date.setFullYear(date.getFullYear() - years);
return date;
}
// Feb 20, 2022
const date = new Date('2022-02-20T00:00:00.000Z');
const newDate = subtractYears(date, 3);
// Feb 20, 2019
console.log(newDate); // 2019-02-20T00:00:00.000Z
Our subtractYears() function takes a Date object and the number of years to subtract as arguments. It returns the same Date object with the years subtracted.
The Date getFullYear() method returns a number that represents the year of a particular Date.
The Date setFullYear() method sets the year of a Date to a specified number.
Avoid side effects
The setFullYear() method mutates the Date object it is called on. This introduces a side effect into our subtractYears() function. To avoid modifying the passed Date and create a pure function, make a copy of the Date and call setFullYear() on this copy, instead of the original.
function subtractYears(date, years) {
// π make copy with "Date" constructor
const dateCopy = new Date(date);
dateCopy.setFullYear(date.getFullYear() - years);
return dateCopy;
}
const date = new Date('2022-02-20T00:00:00.000Z');
const newDate = subtractYears(date, 3);
// Feb 20, 2019
console.log(newDate); // 2019-02-20T00:00:00.000Z
// π Original not modified
console.log(date); // 2022-02-20T00:00:00.000Z
Tip: Functions that donβt modify external state (i.e., pure functions) tend to be more predictable and easier to reason about, as they always give the same output for a particular input. This makes it a good practice to limit the number of side effects in your code.
2. date-fns subYears() function
Alternatively, we can use the subYears() function from the date-fns NPM package to quickly subtract years from a Date. It works like our pure subtractYears() function.
import { subYears } from 'date-fns';
const date = new Date('2022-02-20T00:00:00.000Z');
const newDate = subYears(date, 3);
// Feb 20, 2019
console.log(newDate); // 2019-02-20T00:00:00.000Z
// π Original not modified
console.log(date); // 2022-02-20T00:00:00.000Z