How to make ts. file keeping the right path after compiled to js file? - node.js

My folder structure
Node (root directory)
-data
-123.mp4
-src
-test.ts
-build
-test.js
My ts. file in src folder,
import { createReadStream, createWriteStream } from 'fs';
const readStram = createReadStream('../data/123.mp4')
const writeStream = createWriteStream('../data/copy.mp4')
compiled to build folder,
import { createReadStream, createWriteStream } from 'fs';
const readStram = createReadStream('../data/123.mp4');
const writeStream = createWriteStream('../data/copy.mp4');
I got an error, that said no such file or directory, what should I do to keep js file has the right path to load 123.mp4?
trying to use the path module, but there is another error mentioned __dirname can't use in ES module.
my ts.config
{
"include": ["src/**"],
"exclude": ["node_modules"],
"compilerOptions": {
"target": "ES2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
"module": "Node16" /* Specify what module code is generated. */,
"rootDir": "./src" /* Specify the root folder within your source files. */,
"moduleResolution": "Node16" /* Specify how TypeScript looks up a file from a given module specifier. */,
"outDir": "./build" /* Specify an output folder for all emitted files. */,
"forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
"strict": true /* Enable all strict type-checking options. */,
"skipLibCheck": true /* Skip type checking all .d.ts files. */
}
}

Try adding your assets to file
https://www.typescriptlang.org/tsconfig#files

Related

Mongoose Schema pagination typing using mongoose-paginate-ts

EDIT FIXED :
What I onited say in my initial post is that I was exporting the mongoose-pagination-ts function & interface from a global file, and then importing it in my schema files to use it. However, it appears that I need to import the module directly in each schema file in order for it to work, Interface cannot be export in a file and import in another, comming from a node_module in CommonJS (Apparently, not sure if it's the correct reason)
I'm facing the following issue :
The module mongoose-pagination-ts explains as follow :
import { mongoosePagination, Pagination } from "mongoose-paginate-ts";
type User = mongoose.Document & {
username: String,
accounts: [mongoose.Types.ObjectId]
};
const userSchema = new Schema({
username: String,
accounts: [{ type: ObjectId, ref: "Account" }]
});
userSchema.plugin(mongoosePagination);
const User: Pagination<User> = mongoose.model<User, Pagination<User>>("User", userSchema);
//User.paginate()
The build passes with no issue, but when I execute the server in development mode using the following command I have the bellow issue :
nodemon --ext 'ts,js,cjs,json' --ignore 'tests/' --exec 'ts-node-esm src/index.ts'
import { mongoosePagination, Pagination } from "mongoose-paginate-ts";
^^^^^^^^^^
SyntaxError: Named export 'Pagination' not found. The requested module 'mongoose-paginate-ts' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:
import pkg from 'mongoose-paginate-ts';
const { mongoosePagination, Pagination } = pkg;
at ModuleJob._instantiate (node:internal/modules/esm/module_job:124:21)
at async ModuleJob.run (node:internal/modules/esm/module_job:190:5)
tsconfig.js
{
"compilerOptions": {
"experimentalDecorators": true,
"target": "ESNext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
"module": "ESNext" /* Specify what module code is generated. */,
"rootDir": "./src" /* Specify the root folder within your source files. */,
"moduleResolution": "NodeNext" /* Specify how TypeScript looks up a file from a given module specifier. */,
"baseUrl": "./src" /* Specify the base directory to resolve non-relative module names. */,
"outDir": "build",
"types": ["node", "mocha"] /* Specify type package names to be included without being referenced in a source file. */,
"allowJs": true /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */,
"checkJs": false /* Enable error reporting in type-checked JavaScript files. */,
"esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */,
"forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
"strict": false /* Enable all strict type-checking options. */,
"skipLibCheck": true /* Skip type checking all .d.ts files. */,
"resolveJsonModule": true
},
"ts-node": {
"swc": true
},
"exclude": ["tests", "node_modules"]
}
Any solution is welcomed, thanks !
The error is clear : the module is exported as a CommonJS module and the proposed solution should work, however, the Pagination interface cannot be destructured as explained :
import pkg from 'mongoose-paginate-ts';
const { mongoosePagination, Pagination } = pkg; // Pagination is not found

Configure typescript to output imports with extensions, ex: `from './file.js``

Using node 14.x I would like to switch my project to full ES Modules, as it's now supported.
So I enabled on package.json "type": "module"
and my tsconfig.json looks like that:
{
"compilerOptions": {
"outDir": "dist", /* Redirect output structure to the directory. */
"strict": true, /* Enable all strict type-checking options. */
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
"skipLibCheck": true, /* Skip type checking of declaration files. */
"forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */
"allowSyntheticDefaultImports": true,
"lib": ["ES2020"],
"module": "ESNext",
"moduleResolution": "node",
"target": "ES2020"
}
}
But the output files have unspecified extension in imports, it's instead REQUIRED for node 14.x to specify full file ext
For example:
import { ENV, redisConfig } from './config';
should instead be:
import { ENV, redisConfig } from './config.js';
TS won't handle that for you, but you can run Node with the node --experimental-specifier-resolution=node parameter.
Source
Unfortunately it seems that TS isn't going to support adding extension to the end of the import, since apparently it's not as simple as adding .js to the end of the import.

error TS1259: Module '"./node_modules/#types/express/index"' can only be default-imported using the 'esModuleInterop' flag

I'm trying to import express into the project and in the middle of the development, it just stopped working, i've reseted configurations, etc. Can't make it work, can't import any modules.
npx tsc src/server.ts
src/server.ts:1:8 - error TS1259: Module '"/home/fpc-ubut/Git/nlw2/server/node_modules/#types/express/index"' can only be default-imported using the 'esModuleInterop' flag
1 import express from 'express';
src/database/migrations/00_create_users.ts:1:8 - error TS1259: Module '"/home/fpc-ubut/Git/nlw2/server/node_modules/knex/types/index"' can only be default-imported using the 'esModuleInterop' flag
1 import Knex from 'knex'
src/server.ts:1:8 - error TS1259: Module '"path"' can only be default-imported using the 'esModuleInterop' flag
1 import path from 'path'
Enviroment
OS: Ubuntu 20.04.1 LTS
node: v12.18.1
packages:
"#types/express": "^4.17.6",
"#types/node": "^14.0.27",
"ts-node": "^8.10.2",
"ts-node-dev": "^1.0.0-pre.44",
"typescript": "^3.9.3"
"express": "^4.17.1",
"knex": "^0.21.1",
"pg": "^8.2.1"
EDIT1:
as asked, here is my tsconfig.json. But the configuration ("esModuleInterop": true), is already as aspected
<tsconfig.json>
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig.json to read more about this file */
/* Basic Options */
// "incremental": true, /* Enable incremental compilation */
"target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
// "lib": [], /* Specify library files to be included in the compilation. */
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
// "outDir": "./", /* Redirect output structure to the directory. */
// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
// "composite": true, /* Enable project compilation */
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
// "removeComments": true, /* Do not emit comments to output. */
// "noEmit": true, /* Do not emit outputs. */
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
/* 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. */
// "strictNullChecks": true, /* Enable strict null checks. */
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
/* Additional Checks */
// "noUnusedLocals": true, /* Report errors on unused locals. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
/* Module Resolution Options */
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
/* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
/* Advanced Options */
"skipLibCheck": true, /* Skip type checking of declaration files. */
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
}
}
EDIT 2:
Changed tsconfig.json
"allowSyntheticDefaultImports": true
Still showing the same error
EDIT 3:
Github link: [REMOVED]
the problem is on ./server
./server2 is working just fine. Same configs.
EDIT4: RESOLVED
According to your GitHub repo, ./server does NOT have a tsconfig file while .server2 does have one.. If I need to be more clear: they do not have the same config, because server does not even have a config. You should move ./server/src/tsconfig.json to ./server/tsconfig.json, just like your tsconfig file is in ./server2 (notice I said MOVE not COPY the tsconfig).. – Matt Oestreich
In my case, I was facing this error for react. I fixed it by changing my import style from
import React from 'react';
to
import * as React from 'react';
As the error states, you need the set
"esModuleInterop": true,
in your tsconfig.json file. This allows default imports from modules with no default export.
According to your GitHub repo, you have the following structure (some files/directories have been omitted):
Bad:
server
src
tsconfig.json
server2
src
tsconfig.json
You will need to move /server/src/tsconfig.json to /server/tsconfig.json - please note that you will need to MOVE, not COPY the tsconfig file.
Good:
server
src
tsconfig.json
server2
src
tsconfig.json
tsconfig.json
{
"compilerOptions": {
"esModuleInterop": true,
}
}
import express = require("express")
This resolved my problem after reading the error log which stated (that this module is declared using 'export =', and can only be used with a default import when using the 'esModuleInterop' flag.)
From there, I checked the declaration files at node_modules/#types/express/index.d.ts:133:1 and its usage is within the comments section shown here:
You can add "allowSyntheticDefaultImports": true to the compilerOptions block in the tsconfig.node.json file to fix this error.
For example,
{
"compilerOptions": {
"allowSyntheticDefaultImports": true
}
}

Typescript non-relative import with node js and ES modules does not work

I am trying to create a simple Typescript script that uses ES modules, execute it with node and have sourcemaps for debugging.
The script executed with node test.ts:
import foo from './foo'
//import bar from './../src/util/bar' //works
//import bar from 'src/util/bar' // does not work. Linter nor tsc show any warning, but when trying to execute, error says bar can't be found
import bar from '#util/bar' // same as above
console.log('test 0')
console.log(foo + bar)
export {}
foo.ts:
export default "foo_module"
bar.ts is very similar.
Here is tsconfig.json:
{
"compilerOptions": {
"target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
"module": "ESNext", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"allowJs": true, /* Allow javascript files to be compiled. */
"jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
"sourceMap": true, /* Generates corresponding '.map' file. */
"outDir": "lib", /* Redirect output structure to the directory. */
"moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
"baseUrl": ".", /* Base directory to resolve non-absolute module names. */
"paths": {
"*":[ "./../*" ],
"#util/*":[ "./../src/util/*" ],
}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
"allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
},
}
When all imports are relative, everything works fine.
When bar.ts is imported using non-relative import (src/util/bar), tsc and linter do not complain, but when trying to execute it with node the following error appears:
internal/modules/esm/default_resolve.js:100
let url = moduleWrapResolve(specifier, parentURL);
^
Error: Cannot find package '#util/bar' imported from <...omitted>\scripts\lib\scripts\test.js
at Loader.resolve [as _resolve] (internal/modules/esm/default_resolve.js:100:13)
at Loader.resolve (internal/modules/esm/loader.js:72:33)
at Loader.getModuleJob (internal/modules/esm/loader.js:156:40)
at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:42:40)
at link (internal/modules/esm/module_job.js:41:36) {
code: 'ERR_MODULE_NOT_FOUND'
}
Minimal example for reproduction is here
Looks like Typescript does not support converting paths back to relative.
this feels like a Typescript missing feature.

TS2585: 'Promise' only refers to a type, but is being used as a value here

I'm getting the following error
node_modules/rxjs/internal/Observable.d.ts:82:59 - error TS2585: 'Promise' only refers to a type, but is being used as a value here. Do you need to change your target library? Try changing the lib compiler option to es2015 or later.
Formatted it looks like this,
node_modules/rxjs/internal/Observable.d.ts:82:59 - error TS2585: 'Promise' only refers to a type, but is being used as a value here. Do you need to change your target library? Try changing the `lib` compiler option to es2015 or later.
82 toPromise<T>(this: Observable<T>, PromiseCtor: typeof Promise): Promise<T>;
~~~~~~~
Found 1 error.
But the code I'm trying to run is right from the examples,
import { range } from 'rxjs';
import { map, filter } from 'rxjs/operators';
range(1, 200).pipe(
filter(x => x % 2 === 1),
map(x => x + x)
).subscribe(x => console.log(x));
I have in my tsconfig.json
"target": "ES2018",
"module": "es2015",
"lib": ["es2015"],
I'm running Rx.js 6.3.3, TypeScript 3.2.2 under Node v11.6.0. I've tried
npm i --save-dev #types/es6-promise
and just about every combination of changing lib and module
My ts config is exactly this,
{
"compilerOptions": {
/* Basic Options */
"target": "ES2016", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
"module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"lib": ["es2016"], /* Specify library files to be included in the compilation. */
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
// "outDir": "./", /* Redirect output structure to the directory. */
// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
// "composite": true, /* Enable project compilation */
// "removeComments": true, /* Do not emit comments to output. */
// "noEmit": true, /* Do not emit outputs. */
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
/* 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. */
// "strictNullChecks": true, /* Enable strict null checks. */
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
/* Additional Checks */
// "noUnusedLocals": true, /* Report errors on unused locals. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
/* Module Resolution Options */
"moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
/* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
}
}
Problem
TypeScript has two modes.
A project-builder mode (when tsc is invoked with no arguments)
A compile-mode (when tsc is invoked with any arguments) which does not read from the configuration file tsconfig.json
If that sounds confusing, it's even more confusing when you account for
the flag for the compiler-mode to accept a configuration file is called --project
inside the project-builder's configuration file there the pragma is called "compilerOptions"
the compiler-mode and the project-builder mode accept the same configuration file
Anyway, the problem here was that TypeScript was simply ignoring the configuration file in the current working directory that I was running it in.
If you want to see this changed vote here,
https://twitter.com/TheEvanCarroll/status/1080899909522477061
This is further reported here,
https://github.com/Microsoft/TypeScript/issues/29241
Just install #types/node from npm. This should solve the problem.
npm install #types/node
In my case I simply added a tsconfig.json file with the following contents where the significant part relating to the above error is "target": "es2015":
{
"compilerOptions": {
"noImplicitAny": false,
"noEmitOnError": true,
"removeComments": false,
"sourceMap": true,
"target": "es2015"
},
"include": [
"file.ts"
],
"exclude": [
"node_modules",
"wwwroot"
]
}
I've found this solution that worked for me:
Check if the tsconfig.json file has build in Properties set to "Content" rather than "None", if not right click on the tsconfig file and set the build action to Content. After this reload the project, the error should go away
Use this while compiling.
tsc async_await.ts --lib es2015

Resources