diff --git a/eslint-config.yaml b/eslint-config.yaml index 6021c3b721..80e4361d48 100644 --- a/eslint-config.yaml +++ b/eslint-config.yaml @@ -8,6 +8,7 @@ plugins: - '@typescript-eslint' - import - prettier + - unicorn parser: '@typescript-eslint/parser' parserOptions: @@ -43,6 +44,9 @@ rules: 'prettier/prettier': - error + 'unicorn/prefer-node-protocol': + - error + '@typescript-eslint/array-type': - error - default: array-simple @@ -152,7 +156,9 @@ rules: 'import/no-extraneous-dependencies': - error - - devDependencies: ['**/test/**'] # Only allow importing devDependencies from tests + - devDependencies: # Only allow importing devDependencies from tests + - '**/test/**' + - '**/*.test.ts' optionalDependencies: false # Disallow importing optional dependencies (those shouldn't be used here) peerDependencies: false # Disallow importing peer dependencies (those shouldn't be used here) diff --git a/package.json b/package.json index 28c8101847..d42ed6b62f 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "eslint-import-resolver-typescript": "^2.7.1", "eslint-plugin-import": "^2.26.0", "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-unicorn": "^43.0.0", "jest": "^28.1.1", "jest-circus": "^28.1.1", "jest-config": "^28.1.1", diff --git a/packages/@jsii/benchmarks/bin/benchmark.ts b/packages/@jsii/benchmarks/bin/benchmark.ts index 4ac2d98043..4e72ece7c5 100644 --- a/packages/@jsii/benchmarks/bin/benchmark.ts +++ b/packages/@jsii/benchmarks/bin/benchmark.ts @@ -1,5 +1,5 @@ import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; import * as yargs from 'yargs'; import { benchmarks } from '../lib'; diff --git a/packages/@jsii/benchmarks/lib/benchmark.ts b/packages/@jsii/benchmarks/lib/benchmark.ts index a996b8fc39..c06b8b86b9 100644 --- a/packages/@jsii/benchmarks/lib/benchmark.ts +++ b/packages/@jsii/benchmarks/lib/benchmark.ts @@ -1,5 +1,9 @@ -import { Profiler, Session } from 'inspector'; -import { performance, PerformanceObserver, PerformanceEntry } from 'perf_hooks'; +import { Profiler, Session } from 'node:inspector'; +import { + performance, + PerformanceObserver, + PerformanceEntry, +} from 'node:perf_hooks'; /** * Result of a single run of the subject diff --git a/packages/@jsii/benchmarks/lib/constants.ts b/packages/@jsii/benchmarks/lib/constants.ts index 9e9eaf87ea..cac27be8b1 100644 --- a/packages/@jsii/benchmarks/lib/constants.ts +++ b/packages/@jsii/benchmarks/lib/constants.ts @@ -1,4 +1,4 @@ -import * as path from 'path'; +import * as path from 'node:path'; export const fixturesDir = path.resolve(__dirname, '..', 'fixtures'); diff --git a/packages/@jsii/benchmarks/scripts/snapshot-package.ts b/packages/@jsii/benchmarks/scripts/snapshot-package.ts index 08dd881bee..58d9e2c3d3 100644 --- a/packages/@jsii/benchmarks/scripts/snapshot-package.ts +++ b/packages/@jsii/benchmarks/scripts/snapshot-package.ts @@ -1,8 +1,8 @@ -import * as cp from 'child_process'; import * as fs from 'fs-extra'; import * as glob from 'glob'; -import * as os from 'os'; -import * as path from 'path'; +import * as cp from 'node:child_process'; +import * as os from 'node:os'; +import * as path from 'node:path'; import * as tar from 'tar'; import * as ts from 'typescript'; diff --git a/packages/@jsii/check-node/src/constants.ts b/packages/@jsii/check-node/src/constants.ts index f224ba93e7..87aff1dee1 100644 --- a/packages/@jsii/check-node/src/constants.ts +++ b/packages/@jsii/check-node/src/constants.ts @@ -1,4 +1,4 @@ -import * as process from 'process'; +import * as process from 'node:process'; import { Range, SemVer } from 'semver'; const ONE_DAY_IN_MILLISECONDS = 86_400_000; diff --git a/packages/@jsii/check-node/src/index.ts b/packages/@jsii/check-node/src/index.ts index 51c3f0f368..dd16771860 100644 --- a/packages/@jsii/check-node/src/index.ts +++ b/packages/@jsii/check-node/src/index.ts @@ -1,6 +1,6 @@ import { Chalk, bgYellow, bgYellowBright, bgRed } from 'chalk'; -import { error } from 'console'; -import { version } from 'process'; +import { error } from 'node:console'; +import { version } from 'node:process'; import { NodeRelease } from './constants'; diff --git a/packages/@jsii/integ-test/test/build-cdk.test.ts b/packages/@jsii/integ-test/test/build-cdk.test.ts index dc4a8ddd87..25c5095e7b 100644 --- a/packages/@jsii/integ-test/test/build-cdk.test.ts +++ b/packages/@jsii/integ-test/test/build-cdk.test.ts @@ -1,8 +1,8 @@ import { Octokit } from '@octokit/rest'; import * as dotenv from 'dotenv'; import { mkdtemp, readdir, remove } from 'fs-extra'; -import { tmpdir } from 'os'; -import * as path from 'path'; +import { tmpdir } from 'node:os'; +import * as path from 'node:path'; import { downloadReleaseAsset, diff --git a/packages/@jsii/integ-test/utils/index.ts b/packages/@jsii/integ-test/utils/index.ts index b009b0a092..0eff6b6a92 100644 --- a/packages/@jsii/integ-test/utils/index.ts +++ b/packages/@jsii/integ-test/utils/index.ts @@ -1,7 +1,7 @@ -import * as cp from 'child_process'; -import { IncomingMessage } from 'http'; -import * as https from 'https'; -import { Readable } from 'stream'; +import * as cp from 'node:child_process'; +import { IncomingMessage } from 'node:http'; +import * as https from 'node:https'; +import { Readable } from 'node:stream'; import { extract } from 'tar'; /** diff --git a/packages/@jsii/kernel/src/kernel.test.ts b/packages/@jsii/kernel/src/kernel.test.ts index 835235c311..9e0e2c2aeb 100644 --- a/packages/@jsii/kernel/src/kernel.test.ts +++ b/packages/@jsii/kernel/src/kernel.test.ts @@ -1,9 +1,9 @@ -import * as childProcess from 'child_process'; import * as fs from 'fs-extra'; -import * as os from 'os'; -import { join } from 'path'; -import * as path from 'path'; -import * as vm from 'vm'; +import * as childProcess from 'node:child_process'; +import * as os from 'node:os'; +import { join } from 'node:path'; +import * as path from 'node:path'; +import * as vm from 'node:vm'; import * as api from './api'; import { diff --git a/packages/@jsii/kernel/src/kernel.ts b/packages/@jsii/kernel/src/kernel.ts index 8503247d0e..0d6c80fbcf 100644 --- a/packages/@jsii/kernel/src/kernel.ts +++ b/packages/@jsii/kernel/src/kernel.ts @@ -1,11 +1,11 @@ import * as spec from '@jsii/spec'; import { loadAssemblyFromPath } from '@jsii/spec'; -import * as cp from 'child_process'; import * as fs from 'fs-extra'; -import * as os from 'os'; -import * as path from 'path'; +import * as cp from 'node:child_process'; +import * as os from 'node:os'; +import * as path from 'node:path'; +import * as vm from 'node:vm'; import * as tar from 'tar'; -import * as vm from 'vm'; import * as api from './api'; import { TOKEN_REF } from './api'; @@ -49,7 +49,7 @@ export class Kernel { // I wonder if webpack has some pragma that allows opting-out at certain points // in the code. // eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires - const moduleLoad = require('module').Module._load; + const moduleLoad = require('node:module').Module._load; const nodeRequire = (p: string) => moduleLoad(p, module, false); this.sandbox = vm.createContext({ diff --git a/packages/@jsii/kernel/src/on-exit.ts b/packages/@jsii/kernel/src/on-exit.ts index 1a6fbdfb46..98bf3ac0c6 100644 --- a/packages/@jsii/kernel/src/on-exit.ts +++ b/packages/@jsii/kernel/src/on-exit.ts @@ -1,5 +1,5 @@ import * as fs from 'fs-extra'; -import * as process from 'process'; +import * as process from 'node:process'; const removeSyncPaths = new Array(); diff --git a/packages/@jsii/runtime/bin/jsii-runtime.ts b/packages/@jsii/runtime/bin/jsii-runtime.ts index 90a5f5377d..8a75e23e01 100644 --- a/packages/@jsii/runtime/bin/jsii-runtime.ts +++ b/packages/@jsii/runtime/bin/jsii-runtime.ts @@ -1,10 +1,10 @@ import '@jsii/check-node/run'; -import { spawn } from 'child_process'; -import { error } from 'console'; -import { constants as os } from 'os'; -import { resolve } from 'path'; -import { Duplex } from 'stream'; +import { spawn } from 'node:child_process'; +import { error } from 'node:console'; +import { constants as os } from 'node:os'; +import { resolve } from 'node:path'; +import { Duplex } from 'node:stream'; // Spawn another node process, with the following file descriptor setup: // - No STDIN will be provided diff --git a/packages/@jsii/runtime/lib/host.ts b/packages/@jsii/runtime/lib/host.ts index 9522d22e01..c6d36429a4 100644 --- a/packages/@jsii/runtime/lib/host.ts +++ b/packages/@jsii/runtime/lib/host.ts @@ -1,5 +1,5 @@ import { api, Kernel } from '@jsii/kernel'; -import { EventEmitter } from 'events'; +import { EventEmitter } from 'node:events'; import { Input, IInputOutput } from './in-out'; diff --git a/packages/@jsii/runtime/lib/sync-stdio.ts b/packages/@jsii/runtime/lib/sync-stdio.ts index 9f6851124a..a413a20f7f 100644 --- a/packages/@jsii/runtime/lib/sync-stdio.ts +++ b/packages/@jsii/runtime/lib/sync-stdio.ts @@ -1,4 +1,4 @@ -import * as fs from 'fs'; +import * as fs from 'node:fs'; const INPUT_BUFFER_SIZE = 1_048_576; // 1MiB (aka: 1024 * 1024), not related to max line length diff --git a/packages/@jsii/runtime/test/kernel-host.test.ts b/packages/@jsii/runtime/test/kernel-host.test.ts index 1c9087b623..ca517693c0 100644 --- a/packages/@jsii/runtime/test/kernel-host.test.ts +++ b/packages/@jsii/runtime/test/kernel-host.test.ts @@ -1,9 +1,9 @@ import { api } from '@jsii/kernel'; import * as spec from '@jsii/spec'; import { loadAssemblyFromPath } from '@jsii/spec'; -import * as child from 'child_process'; -import * as fs from 'fs'; -import * as path from 'path'; +import * as child from 'node:child_process'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; import { KernelHost, IInputOutput, Input, Output } from '../lib'; diff --git a/packages/@jsii/runtime/test/playback.test.ts b/packages/@jsii/runtime/test/playback.test.ts index f10e82d723..fe3d12e6a0 100644 --- a/packages/@jsii/runtime/test/playback.test.ts +++ b/packages/@jsii/runtime/test/playback.test.ts @@ -1,7 +1,7 @@ -import * as child from 'child_process'; -import * as fs from 'fs'; -import * as os from 'os'; -import * as path from 'path'; +import * as child from 'node:child_process'; +import * as fs from 'node:fs'; +import * as os from 'node:os'; +import * as path from 'node:path'; import { IInputOutput, Input, KernelHost, Output } from '../lib'; diff --git a/packages/@jsii/spec/build-tools/generate-json-schema.sh b/packages/@jsii/spec/build-tools/generate-json-schema.sh index 3b64e81a8a..31c10eea5e 100755 --- a/packages/@jsii/spec/build-tools/generate-json-schema.sh +++ b/packages/@jsii/spec/build-tools/generate-json-schema.sh @@ -1,20 +1,42 @@ #!/bin/bash set -euo pipefail -# Input -INPUT_FILE='lib/assembly.d.ts' - -# Output -OUTPUT_DIR='schema' -OUTPUT_FILE="${OUTPUT_DIR}/jsii-spec.schema.json" - -mkdir -p ${OUTPUT_DIR} - -echo "Generating JSON schema into ${OUTPUT_FILE}" -typescript-json-schema \ - ${INPUT_FILE} 'Assembly' \ - --out ${OUTPUT_FILE} \ - --refs true \ - --required true \ - --strictNullChecks true \ - --topRef true +{ + # Input + INPUT_FILE='lib/assembly.d.ts' + + # Output + OUTPUT_DIR='schema' + OUTPUT_FILE="${OUTPUT_DIR}/jsii-spec.schema.json" + + mkdir -p ${OUTPUT_DIR} + + echo "Generating JSON schema into ${OUTPUT_FILE}" + typescript-json-schema \ + ${INPUT_FILE} 'Assembly' \ + --out ${OUTPUT_FILE} \ + --refs true \ + --required true \ + --strictNullChecks true \ + --topRef true +} + +{ + # Input + INPUT_FILE='lib/redirect.d.ts' + + # Output + OUTPUT_DIR='schema' + OUTPUT_FILE="${OUTPUT_DIR}/assembly-redirect.schema.json" + + mkdir -p ${OUTPUT_DIR} + + echo "Generating JSON schema into ${OUTPUT_FILE}" + typescript-json-schema \ + ${INPUT_FILE} 'AssemblyRedirect'\ + --out ${OUTPUT_FILE} \ + --refs true \ + --required true \ + --strictNullChecks true \ + --topRef true +} diff --git a/packages/@jsii/spec/package.json b/packages/@jsii/spec/package.json index 8641234a7a..562d28347c 100644 --- a/packages/@jsii/spec/package.json +++ b/packages/@jsii/spec/package.json @@ -31,10 +31,10 @@ "package": "package-js" }, "dependencies": { - "ajv": "^8.11.0", - "fs-extra": "^10.1.0" + "ajv": "^8.11.0" }, "devDependencies": { + "fs-extra": "^10.1.0", "jsii-build-tools": "^0.0.0", "typescript-json-schema": "^0.53.1" } diff --git a/packages/@jsii/spec/src/assembly-utils.test.ts b/packages/@jsii/spec/src/assembly-utils.test.ts index 338b52d503..1c667a9d42 100644 --- a/packages/@jsii/spec/src/assembly-utils.test.ts +++ b/packages/@jsii/spec/src/assembly-utils.test.ts @@ -1,6 +1,7 @@ import * as fs from 'fs-extra'; -import * as os from 'os'; -import * as path from 'path'; +import * as os from 'node:os'; +import * as path from 'node:path'; +import * as zlib from 'node:zlib'; import { SPEC_FILE_NAME, @@ -10,9 +11,11 @@ import { } from './assembly'; import { loadAssemblyFromPath, - getAssemblyFile, + findAssemblyFile, writeAssembly, + loadAssemblyFromBuffer, } from './assembly-utils'; +import { AssemblyRedirect } from './redirect'; const TEST_ASSEMBLY: Assembly = { schema: SchemaVersion.LATEST, @@ -35,9 +38,17 @@ const TEST_ASSEMBLY: Assembly = { jsiiVersion: '1.0.0', }; -describe('writeAssembly', () => { +let tmpdir: string; +beforeEach(() => { + tmpdir = makeTempDir(); +}); + +afterEach(() => { + fs.removeSync(tmpdir); +}); + +describe(writeAssembly, () => { test('can write compressed assembly', () => { - const tmpdir = makeTempDir(); writeAssembly(tmpdir, TEST_ASSEMBLY, { compress: true }); expect( @@ -56,47 +67,40 @@ describe('writeAssembly', () => { }); test('can write uncompressed assembly', () => { - const tmpdir = makeTempDir(); writeAssembly(tmpdir, TEST_ASSEMBLY, { compress: false }); expect(fs.existsSync(path.join(tmpdir, SPEC_FILE_NAME))).toBeTruthy(); }); }); -describe('getAssemblyFile', () => { +describe(findAssemblyFile, () => { test('finds SPEC_FILE_NAME file when there is no compression', () => { - const tmpdir = makeTempDir(); writeAssembly(tmpdir, TEST_ASSEMBLY, { compress: false }); - expect(getAssemblyFile(tmpdir)).toEqual(path.join(tmpdir, SPEC_FILE_NAME)); + expect(findAssemblyFile(tmpdir)).toEqual(path.join(tmpdir, SPEC_FILE_NAME)); }); test('finds SPEC_FILE_NAME file even when there is compression', () => { - const tmpdir = makeTempDir(); writeAssembly(tmpdir, TEST_ASSEMBLY, { compress: true }); - expect(getAssemblyFile(tmpdir)).toEqual(path.join(tmpdir, SPEC_FILE_NAME)); + expect(findAssemblyFile(tmpdir)).toEqual(path.join(tmpdir, SPEC_FILE_NAME)); }); test('throws if SPEC_FILE_NAME file does not exist', () => { - const tmpdir = makeTempDir(); - - expect(() => getAssemblyFile(tmpdir)).toThrow( + expect(() => findAssemblyFile(tmpdir)).toThrow( `Expected to find ${SPEC_FILE_NAME} file in ${tmpdir}, but no such file found`, ); }); }); -describe('loadAssemblyFromPath', () => { +describe(loadAssemblyFromPath, () => { test('loads compressed assembly', () => { - const tmpdir = makeTempDir(); writeAssembly(tmpdir, TEST_ASSEMBLY, { compress: true }); expect(loadAssemblyFromPath(tmpdir)).toEqual(TEST_ASSEMBLY); }); test('loads uncompressed assembly', () => { - const tmpdir = makeTempDir(); writeAssembly(tmpdir, TEST_ASSEMBLY, { compress: false }); expect(loadAssemblyFromPath(tmpdir)).toEqual(TEST_ASSEMBLY); @@ -112,26 +116,38 @@ describe('loadAssemblyFromPath', () => { expect(loadAssemblyFromPath(compressedTmpDir)).toEqual( loadAssemblyFromPath(uncompressedTmpDir), ); + + fs.removeSync(compressedTmpDir); + fs.removeSync(uncompressedTmpDir); }); - test('throws if redirect schema is invalid', () => { - const tmpdir = makeTempDir(); + test('throws if redirect object has unsupported compression', () => { fs.writeJsonSync(path.join(tmpdir, SPEC_FILE_NAME), { schema: 'jsii/file-redirect', compression: '7zip', + filename: '.jsii.7z', }); - expect(() => loadAssemblyFromPath(tmpdir)).toThrow( - [ - 'Invalid redirect schema:', - " compression must be 'gzip' but received '7zip'", - " schema must include property 'filename'", - ].join('\n'), - ); + expect(() => loadAssemblyFromPath(tmpdir)) + .toThrowErrorMatchingInlineSnapshot(` + "Invalid assembly redirect: + * must be equal to one of the allowed values" + `); + }); + + test('throws if redirect object is missing filename', () => { + fs.writeJsonSync(path.join(tmpdir, SPEC_FILE_NAME), { + schema: 'jsii/file-redirect', + }); + + expect(() => loadAssemblyFromPath(tmpdir)) + .toThrowErrorMatchingInlineSnapshot(` + "Invalid assembly redirect: + * must have required property 'filename'" + `); }); test('throws if assembly is invalid', () => { - const tmpdir = makeTempDir(); fs.writeJsonSync( path.join(tmpdir, SPEC_FILE_NAME), { @@ -147,6 +163,78 @@ describe('loadAssemblyFromPath', () => { }); }); -function makeTempDir() { +describe(loadAssemblyFromBuffer, () => { + test('loads uncompressed assembly buffer', () => { + writeAssembly(tmpdir, TEST_ASSEMBLY, { compress: false }); + const assemblyFile = path.join(tmpdir, SPEC_FILE_NAME); + const buf = fs.readFileSync(assemblyFile); + expect(loadAssemblyFromBuffer(buf)).toEqual(TEST_ASSEMBLY); + }); + + test('loads compressed assembly buffer', () => { + writeAssembly(tmpdir, TEST_ASSEMBLY, { compress: true }); + const assemblyBuf = fs.readFileSync(path.join(tmpdir, SPEC_FILE_NAME)); + const compressedFile = path.join(tmpdir, SPEC_FILE_NAME_COMPRESSED); + const compAssemblyBuf = fs.readFileSync(compressedFile); + + expect( + loadAssemblyFromBuffer(assemblyBuf, (filename: string) => { + if (filename !== SPEC_FILE_NAME_COMPRESSED) { + throw new Error( + `Assembly file redirects to nonexistant ${filename}.`, + ); + } + return compAssemblyBuf; + }), + ).toEqual(TEST_ASSEMBLY); + }); + + test('throws when redirect filename mismatches', () => { + writeAssembly(tmpdir, TEST_ASSEMBLY, { compress: true }); + const assemblyBuf = fs.readFileSync(path.join(tmpdir, SPEC_FILE_NAME)); + const compressedFile = path.join(tmpdir, SPEC_FILE_NAME_COMPRESSED); + const compAssemblyBuf = fs.readFileSync(compressedFile); + + expect(() => { + loadAssemblyFromBuffer(assemblyBuf, (filename: string) => { + if (filename !== 'blah.gz') { + throw new Error( + `Assembly file redirects to nonexistent file: ${filename}.`, + ); + } + return compAssemblyBuf; + }); + }).toThrow(/Assembly file redirects to nonexistent file:/); + }); + + test('follows multiple redirects', () => { + const firstRedirect: AssemblyRedirect = { + schema: 'jsii/file-redirect', + filename: 'second.json.gz', + compression: 'gzip', + }; + const secondRedirect: AssemblyRedirect = { + schema: 'jsii/file-redirect', + filename: 'assembly.json', + }; + + expect( + loadAssemblyFromBuffer( + Buffer.from(JSON.stringify(firstRedirect)), + (filename) => { + if (filename === firstRedirect.filename) { + return zlib.gzipSync(JSON.stringify(secondRedirect), { level: 9 }); + } else if (filename === secondRedirect.filename) { + return Buffer.from(JSON.stringify(TEST_ASSEMBLY)); + } + throw new Error(`Reference to unexpected file: ${filename}`); + }, + false, + ), + ).toEqual(TEST_ASSEMBLY); + }); +}); + +export function makeTempDir() { return fs.mkdtempSync(path.join(os.tmpdir(), path.basename(__filename))); } diff --git a/packages/@jsii/spec/src/assembly-utils.ts b/packages/@jsii/spec/src/assembly-utils.ts index c27c755420..841683bef4 100644 --- a/packages/@jsii/spec/src/assembly-utils.ts +++ b/packages/@jsii/spec/src/assembly-utils.ts @@ -1,12 +1,17 @@ -import * as fs from 'fs-extra'; -import * as path from 'path'; -import * as zlib from 'zlib'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; +import * as zlib from 'node:zlib'; import { Assembly, SPEC_FILE_NAME, SPEC_FILE_NAME_COMPRESSED, } from './assembly'; +import { + AssemblyRedirect, + isAssemblyRedirect, + validateAssemblyRedirect, +} from './redirect'; import { validateAssembly } from './validate-assembly'; /** @@ -16,7 +21,7 @@ import { validateAssembly } from './validate-assembly'; * @param directory path to a directory with an assembly file * @returns path to the SPEC_FILE_NAME file */ -export function getAssemblyFile(directory: string) { +export function findAssemblyFile(directory: string) { const dotJsiiFile = path.join(directory, SPEC_FILE_NAME); if (!fs.existsSync(dotJsiiFile)) { @@ -43,11 +48,15 @@ export function writeAssembly( ) { if (compress) { // write .jsii file with instructions on opening the compressed file - fs.writeJsonSync(path.join(directory, SPEC_FILE_NAME), { - schema: 'jsii/file-redirect', - compression: 'gzip', - filename: SPEC_FILE_NAME_COMPRESSED, - }); + fs.writeFileSync( + path.join(directory, SPEC_FILE_NAME), + JSON.stringify({ + schema: 'jsii/file-redirect', + compression: 'gzip', + filename: SPEC_FILE_NAME_COMPRESSED, + }), + 'utf-8', + ); // write actual assembly contents in .jsii.gz fs.writeFileSync( @@ -55,28 +64,60 @@ export function writeAssembly( zlib.gzipSync(JSON.stringify(assembly)), ); } else { - fs.writeJsonSync(path.join(directory, SPEC_FILE_NAME), assembly, { - encoding: 'utf8', - spaces: 2, - }); + fs.writeFileSync( + path.join(directory, SPEC_FILE_NAME), + JSON.stringify(assembly, null, 2), + 'utf-8', + ); } return compress; } +const failNoReadfileProvided = (filename: string) => { + throw new Error( + `Unable to load assembly support file ${JSON.stringify( + filename, + )}: no readFile callback provided!`, + ); +}; + +/** + * Parses the assembly buffer and, if instructed to, redirects to the + * compressed assembly buffer. + * + * @param assemblyBuffer buffer containing SPEC_FILE_NAME contents + * @param readFile a callback to use for reading additional support files + * @param validate whether or not to validate the assembly + */ +export function loadAssemblyFromBuffer( + assemblyBuffer: Buffer, + readFile: (filename: string) => Buffer = failNoReadfileProvided, + validate = true, +): Assembly { + let contents = JSON.parse(assemblyBuffer.toString('utf-8')); + + // check if the file holds instructions to the actual assembly file + while (isAssemblyRedirect(contents)) { + contents = followRedirect(contents, readFile); + } + + return validate ? validateAssembly(contents) : contents; +} + /** * Loads the assembly file and, if present, follows instructions * found in the file to unzip compressed assemblies. * * @param directory the directory of the assembly file * @param validate whether to validate the contents of the file - * @returns the assembly file as json + * @returns the assembly file as an Assembly object */ export function loadAssemblyFromPath( directory: string, validate = true, ): Assembly { - const assemblyFile = getAssemblyFile(directory); + const assemblyFile = findAssemblyFile(directory); return loadAssemblyFromFile(assemblyFile, validate); } @@ -86,54 +127,41 @@ export function loadAssemblyFromPath( * * @param pathToFile the path to the SPEC_FILE_NAME file * @param validate whether to validate the contents of the file - * @returns the assembly file as json + * @returns the assembly file as an Assembly object */ export function loadAssemblyFromFile( pathToFile: string, validate = true, ): Assembly { - let contents = readAssembly(pathToFile); - - // check if the file holds instructions to the actual assembly file - if (contents.schema === 'jsii/file-redirect') { - contents = findRedirectAssembly(pathToFile, contents); - } - - return validate ? validateAssembly(contents) : (contents as Assembly); -} - -function readAssembly(pathToFile: string) { - return fs.readJsonSync(pathToFile, { - encoding: 'utf-8', - }); -} - -function findRedirectAssembly( - pathToFile: string, - contents: Record, -) { - validateRedirectSchema(contents); - const redirectAssemblyFile = path.join( - path.dirname(pathToFile), - contents.filename, - ); - return JSON.parse( - zlib.gunzipSync(fs.readFileSync(redirectAssemblyFile)).toString(), + const data = fs.readFileSync(pathToFile); + return loadAssemblyFromBuffer( + data, + (filename) => fs.readFileSync(path.resolve(pathToFile, '..', filename)), + validate, ); } -function validateRedirectSchema(contents: Record) { - const errors = []; - if (contents.compression !== 'gzip') { - errors.push( - `compression must be 'gzip' but received '${contents.compression}'`, - ); - } - if (contents.filename === undefined) { - errors.push("schema must include property 'filename'"); - } +function followRedirect( + assemblyRedirect: AssemblyRedirect, + readFile: (filename: string) => Buffer, +) { + // Validating the schema, this is cheap (the schema is small). + validateAssemblyRedirect(assemblyRedirect); - if (errors.length !== 0) { - throw new Error(`Invalid redirect schema:\n ${errors.join('\n ')}`); + let data = readFile(assemblyRedirect.filename); + switch (assemblyRedirect.compression) { + case 'gzip': + data = zlib.gunzipSync(data); + break; + case undefined: + break; + default: + throw new Error( + `Unsupported compression algorithm: ${JSON.stringify( + assemblyRedirect.compression, + )}`, + ); } + const json = data.toString('utf-8'); + return JSON.parse(json); } diff --git a/packages/@jsii/spec/src/index.ts b/packages/@jsii/spec/src/index.ts index c299db2127..ec971e95cc 100644 --- a/packages/@jsii/spec/src/index.ts +++ b/packages/@jsii/spec/src/index.ts @@ -2,4 +2,5 @@ export * from './assembly'; export * from './assembly-utils'; export * from './configuration'; export * from './name-tree'; +export * from './redirect'; export * from './validate-assembly'; diff --git a/packages/@jsii/spec/src/redirect.ts b/packages/@jsii/spec/src/redirect.ts new file mode 100644 index 0000000000..a5d3ee95e3 --- /dev/null +++ b/packages/@jsii/spec/src/redirect.ts @@ -0,0 +1,60 @@ +import Ajv from 'ajv'; + +// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires +export const assemblyRedirectSchema = require('../schema/assembly-redirect.schema.json'); + +const SCHEMA = 'jsii/file-redirect'; + +export interface AssemblyRedirect { + readonly schema: typeof SCHEMA; + + /** + * The compression applied to the target file, if any. + */ + readonly compression?: 'gzip'; + + /** + * The name of the file the assembly is redirected to. + */ + readonly filename: string; +} + +/** + * Checks whether the provided value is an assembly redirect. This only checks + * for presence of the correct value in the `schema` attribute. For full + * validation, `validateAssemblyRedirect` should be used instead. + * + * @param obj the value to be tested. + * + * @returns `true` if the value is indeed an AssemblyRedirect. + */ +export function isAssemblyRedirect(obj: unknown): obj is AssemblyRedirect { + if (typeof obj !== 'object' || obj == null) { + return false; + } + return (obj as any).schema === SCHEMA; +} + +/** + * Validates the provided value as an assembly redirect. + * + * @param obj the value to be tested. + * + * @returns the validated value. + */ +export function validateAssemblyRedirect(obj: unknown): AssemblyRedirect { + const ajv = new Ajv(); + const validate = ajv.compile(assemblyRedirectSchema); + validate(obj); + + if (validate.errors) { + throw new Error( + `Invalid assembly redirect:\n${validate.errors + .map((e) => ` * ${e.message}`) + .join('\n') + .toString()}`, + ); + } + + return obj as AssemblyRedirect; +} diff --git a/packages/@jsii/spec/src/validate-assembly.test.ts b/packages/@jsii/spec/src/validate-assembly.test.ts index 86393ffaf6..64159290d4 100644 --- a/packages/@jsii/spec/src/validate-assembly.test.ts +++ b/packages/@jsii/spec/src/validate-assembly.test.ts @@ -1,5 +1,5 @@ -import { readFileSync, readdirSync } from 'fs'; -import { resolve } from 'path'; +import { readFileSync, readdirSync } from 'node:fs'; +import { resolve } from 'node:path'; import { validateAssembly } from './validate-assembly'; diff --git a/packages/@scope/jsii-calc-base-of-base/test/assembly.jsii b/packages/@scope/jsii-calc-base-of-base/test/assembly.jsii index fe77b83324..7de163e9f4 100644 --- a/packages/@scope/jsii-calc-base-of-base/test/assembly.jsii +++ b/packages/@scope/jsii-calc-base-of-base/test/assembly.jsii @@ -167,4 +167,4 @@ }, "version": "2.1.1", "fingerprint": "BYVFW3VSnno85aN3BfEZ3Px9cEKhgfteosHUXjQW0rw=" -} +} \ No newline at end of file diff --git a/packages/@scope/jsii-calc-base/test/assembly.jsii b/packages/@scope/jsii-calc-base/test/assembly.jsii index 0e6123d8ad..342d94bd6f 100644 --- a/packages/@scope/jsii-calc-base/test/assembly.jsii +++ b/packages/@scope/jsii-calc-base/test/assembly.jsii @@ -207,4 +207,4 @@ }, "version": "0.0.0", "fingerprint": "DVCANvLLzJEu5VNOJVmldbT5wTXhmHlZzk3E6muTR5I=" -} +} \ No newline at end of file diff --git a/packages/@scope/jsii-calc-lib/test/assembly.jsii b/packages/@scope/jsii-calc-lib/test/assembly.jsii index 6ee1fc1ebd..021f3e7e23 100644 --- a/packages/@scope/jsii-calc-lib/test/assembly.jsii +++ b/packages/@scope/jsii-calc-lib/test/assembly.jsii @@ -954,4 +954,4 @@ }, "version": "0.0.0", "fingerprint": "wtswDMhtuMcC4+ami5KddQIznqdpVjt8qc7Ba2QnnHk=" -} +} \ No newline at end of file diff --git a/packages/codemaker/src/codemaker.test.ts b/packages/codemaker/src/codemaker.test.ts index ecf2001104..3b3ce137c4 100644 --- a/packages/codemaker/src/codemaker.test.ts +++ b/packages/codemaker/src/codemaker.test.ts @@ -1,6 +1,6 @@ import * as fs from 'fs-extra'; -import * as os from 'os'; -import * as path from 'path'; +import * as os from 'node:os'; +import * as path from 'node:path'; import { CodeMaker } from './codemaker'; diff --git a/packages/codemaker/src/codemaker.ts b/packages/codemaker/src/codemaker.ts index 8d0bd703fe..ed2817ed39 100644 --- a/packages/codemaker/src/codemaker.ts +++ b/packages/codemaker/src/codemaker.ts @@ -1,4 +1,4 @@ -import * as util from 'util'; +import * as util from 'node:util'; import * as caseutils from './case-utils'; import FileBuffer from './filebuff'; diff --git a/packages/codemaker/src/filebuff.test.ts b/packages/codemaker/src/filebuff.test.ts index 37036419eb..f363e812e2 100644 --- a/packages/codemaker/src/filebuff.test.ts +++ b/packages/codemaker/src/filebuff.test.ts @@ -1,6 +1,6 @@ import * as fs from 'fs-extra'; -import * as os from 'os'; -import * as path from 'path'; +import * as os from 'node:os'; +import * as path from 'node:path'; import FileBuffer from './filebuff'; diff --git a/packages/codemaker/src/filebuff.ts b/packages/codemaker/src/filebuff.ts index ba0a406a7d..c1431bf5c7 100644 --- a/packages/codemaker/src/filebuff.ts +++ b/packages/codemaker/src/filebuff.ts @@ -1,4 +1,4 @@ -import * as path from 'path'; +import * as path from 'node:path'; /** * Buffers the text of a file for later saving. diff --git a/packages/jsii-calc/lib/cdk16625/index.ts b/packages/jsii-calc/lib/cdk16625/index.ts index ffe62c0911..c4ba91ad76 100644 --- a/packages/jsii-calc/lib/cdk16625/index.ts +++ b/packages/jsii-calc/lib/cdk16625/index.ts @@ -1,4 +1,4 @@ -import * as assert from 'assert'; +import * as assert from 'node:assert'; import { IRandomNumberGenerator } from '../calculator'; import { UnimportedSubmoduleType } from './donotimport'; diff --git a/packages/jsii-calc/lib/compliance.ts b/packages/jsii-calc/lib/compliance.ts index 69ac7daa09..d84b99ce05 100644 --- a/packages/jsii-calc/lib/compliance.ts +++ b/packages/jsii-calc/lib/compliance.ts @@ -8,11 +8,11 @@ import { StructWithOnlyOptionals, NumericValue, } from '@scope/jsii-calc-lib'; -import * as crypto from 'crypto'; -import * as fs from 'fs'; -import * as os from 'os'; -import * as path from 'path'; -import { promisify } from 'util'; +import * as crypto from 'node:crypto'; +import * as fs from 'node:fs'; +import * as os from 'node:os'; +import * as path from 'node:path'; +import { promisify } from 'node:util'; import { IFriendlyRandomGenerator, diff --git a/packages/jsii-calc/test/assembly.jsii b/packages/jsii-calc/test/assembly.jsii index cfe8f39d46..625c500bcc 100644 --- a/packages/jsii-calc/test/assembly.jsii +++ b/packages/jsii-calc/test/assembly.jsii @@ -17526,4 +17526,4 @@ }, "version": "3.20.120", "fingerprint": "V1EIg5zjHYsZARPmK+3FUV/k1Jp/oN+y3WOnwLEkNJ8=" -} +} \ No newline at end of file diff --git a/packages/jsii-calc/test/test.calc.ts b/packages/jsii-calc/test/test.calc.ts index 0558997897..876301fcb7 100644 --- a/packages/jsii-calc/test/test.calc.ts +++ b/packages/jsii-calc/test/test.calc.ts @@ -1,5 +1,5 @@ import * as calcLib from '@scope/jsii-calc-lib'; -import * as assert from 'assert'; +import * as assert from 'node:assert'; import { Add, diff --git a/packages/jsii-calc/test/test.transitive.ts b/packages/jsii-calc/test/test.transitive.ts index 5718bbe327..5e0777928c 100644 --- a/packages/jsii-calc/test/test.transitive.ts +++ b/packages/jsii-calc/test/test.transitive.ts @@ -2,9 +2,9 @@ // take a direct dependency on @scope/jsii-calc-base-of-base, which is intended // to only be used as a transitive dependency through @scope/jsii-calc-base. -import * as assert from 'assert'; -import { readFileSync } from 'fs'; -import { join } from 'path'; +import * as assert from 'node:assert'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; const pkgjsonPath = join(__dirname, '..', 'package.json'); const pkgjson = JSON.parse(readFileSync(pkgjsonPath, 'utf-8')); diff --git a/packages/jsii-config/bin/jsii-config.ts b/packages/jsii-config/bin/jsii-config.ts index 230eb141cc..9174fa4f06 100644 --- a/packages/jsii-config/bin/jsii-config.ts +++ b/packages/jsii-config/bin/jsii-config.ts @@ -1,7 +1,7 @@ import '@jsii/check-node/run'; -import { writeFile } from 'fs'; -import { promisify } from 'util'; +import { writeFile } from 'node:fs'; +import { promisify } from 'node:util'; import * as yargs from 'yargs'; import jsiiConfig from '../lib'; diff --git a/packages/jsii-config/lib/util.ts b/packages/jsii-config/lib/util.ts index d41e262a20..46c78d2830 100644 --- a/packages/jsii-config/lib/util.ts +++ b/packages/jsii-config/lib/util.ts @@ -1,4 +1,4 @@ -import { readFile } from 'fs'; +import { readFile } from 'node:fs'; /* * Look for existing nested values in config, return undefined if not found diff --git a/packages/jsii-config/test/index.test.ts b/packages/jsii-config/test/index.test.ts index d740462562..f949924569 100644 --- a/packages/jsii-config/test/index.test.ts +++ b/packages/jsii-config/test/index.test.ts @@ -1,5 +1,5 @@ -import * as fs from 'fs'; import * as inquirer from 'inquirer'; +import * as fs from 'node:fs'; import jsiiConfig from '../lib'; import { packageJsonObject, findQuestions, findQuestion } from './util'; diff --git a/packages/jsii-diff/lib/util.ts b/packages/jsii-diff/lib/util.ts index 0a83553f83..1346411622 100644 --- a/packages/jsii-diff/lib/util.ts +++ b/packages/jsii-diff/lib/util.ts @@ -1,9 +1,9 @@ -import * as childProcess from 'child_process'; import * as fs from 'fs-extra'; import * as log4js from 'log4js'; -import * as os from 'os'; -import * as path from 'path'; -import * as util from 'util'; +import * as childProcess from 'node:child_process'; +import * as os from 'node:os'; +import * as path from 'node:path'; +import * as util from 'node:util'; const LOG = log4js.getLogger('jsii-diff'); diff --git a/packages/jsii-pacmak/lib/builder.ts b/packages/jsii-pacmak/lib/builder.ts index d6cd623eba..f8dfbb233a 100644 --- a/packages/jsii-pacmak/lib/builder.ts +++ b/packages/jsii-pacmak/lib/builder.ts @@ -1,5 +1,5 @@ import { Rosetta } from 'jsii-rosetta'; -import * as path from 'path'; +import * as path from 'node:path'; import * as logging from './logging'; import { JsiiModule } from './packaging'; diff --git a/packages/jsii-pacmak/lib/dependency-graph.ts b/packages/jsii-pacmak/lib/dependency-graph.ts index 2661bdb8d9..b59f28810f 100644 --- a/packages/jsii-pacmak/lib/dependency-graph.ts +++ b/packages/jsii-pacmak/lib/dependency-graph.ts @@ -1,5 +1,5 @@ import * as fs from 'fs-extra'; -import { join } from 'path'; +import { join } from 'node:path'; import * as util from './util'; diff --git a/packages/jsii-pacmak/lib/generator.ts b/packages/jsii-pacmak/lib/generator.ts index 0e7be32f55..4b748777b7 100644 --- a/packages/jsii-pacmak/lib/generator.ts +++ b/packages/jsii-pacmak/lib/generator.ts @@ -1,10 +1,10 @@ import * as spec from '@jsii/spec'; import * as clone from 'clone'; import { CodeMaker } from 'codemaker'; -import * as crypto from 'crypto'; import * as fs from 'fs-extra'; import * as reflect from 'jsii-reflect'; -import * as path from 'path'; +import * as crypto from 'node:crypto'; +import * as path from 'node:path'; import { VERSION_DESC } from './version'; diff --git a/packages/jsii-pacmak/lib/index.ts b/packages/jsii-pacmak/lib/index.ts index b4b34d571b..79b140fe28 100644 --- a/packages/jsii-pacmak/lib/index.ts +++ b/packages/jsii-pacmak/lib/index.ts @@ -1,7 +1,7 @@ import { TypeSystem } from 'jsii-reflect'; import { Rosetta, UnknownSnippetMode } from 'jsii-rosetta'; -import { resolve } from 'path'; -import { cwd } from 'process'; +import { resolve } from 'node:path'; +import { cwd } from 'node:process'; import * as logging from './logging'; import { findJsiiModules, updateAllNpmIgnores } from './npm-modules'; diff --git a/packages/jsii-pacmak/lib/npm-modules.ts b/packages/jsii-pacmak/lib/npm-modules.ts index 81f2820c83..241fbf169d 100644 --- a/packages/jsii-pacmak/lib/npm-modules.ts +++ b/packages/jsii-pacmak/lib/npm-modules.ts @@ -1,6 +1,6 @@ import * as spec from '@jsii/spec'; import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; import * as logging from '../lib/logging'; import { JsiiModule } from './packaging'; diff --git a/packages/jsii-pacmak/lib/packaging.ts b/packages/jsii-pacmak/lib/packaging.ts index d8d5fa2b9d..a53e3558ad 100644 --- a/packages/jsii-pacmak/lib/packaging.ts +++ b/packages/jsii-pacmak/lib/packaging.ts @@ -1,6 +1,6 @@ import type { Assembly, TypeSystem } from 'jsii-reflect'; -import * as os from 'os'; -import * as path from 'path'; +import * as os from 'node:os'; +import * as path from 'node:path'; import * as logging from '../lib/logging'; import { Scratch, shell } from './util'; diff --git a/packages/jsii-pacmak/lib/target.ts b/packages/jsii-pacmak/lib/target.ts index a4006af8c3..2bdc726dc4 100644 --- a/packages/jsii-pacmak/lib/target.ts +++ b/packages/jsii-pacmak/lib/target.ts @@ -2,7 +2,7 @@ import * as spec from '@jsii/spec'; import * as fs from 'fs-extra'; import * as reflect from 'jsii-reflect'; import { Rosetta } from 'jsii-rosetta'; -import * as path from 'path'; +import * as path from 'node:path'; import * as spdx from 'spdx-license-list/full'; import { traverseDependencyGraph } from './dependency-graph'; diff --git a/packages/jsii-pacmak/lib/targets/dotnet.ts b/packages/jsii-pacmak/lib/targets/dotnet.ts index 6bf03fc524..1989aa65d7 100644 --- a/packages/jsii-pacmak/lib/targets/dotnet.ts +++ b/packages/jsii-pacmak/lib/targets/dotnet.ts @@ -1,6 +1,6 @@ import * as spec from '@jsii/spec'; import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; import * as xmlbuilder from 'xmlbuilder'; import { TargetBuilder, BuildOptions } from '../builder'; diff --git a/packages/jsii-pacmak/lib/targets/dotnet/dotnetgenerator.ts b/packages/jsii-pacmak/lib/targets/dotnet/dotnetgenerator.ts index 45af4500e2..917fcc9a17 100644 --- a/packages/jsii-pacmak/lib/targets/dotnet/dotnetgenerator.ts +++ b/packages/jsii-pacmak/lib/targets/dotnet/dotnetgenerator.ts @@ -3,7 +3,7 @@ import * as clone from 'clone'; import * as fs from 'fs-extra'; import * as reflect from 'jsii-reflect'; import { Rosetta } from 'jsii-rosetta'; -import * as path from 'path'; +import * as path from 'node:path'; import { Generator, Legalese } from '../../generator'; import { MethodDefinition, PropertyDefinition } from '../_utils'; diff --git a/packages/jsii-pacmak/lib/targets/dotnet/filegenerator.ts b/packages/jsii-pacmak/lib/targets/dotnet/filegenerator.ts index e1d44251b5..993941d033 100644 --- a/packages/jsii-pacmak/lib/targets/dotnet/filegenerator.ts +++ b/packages/jsii-pacmak/lib/targets/dotnet/filegenerator.ts @@ -1,6 +1,6 @@ import { Assembly } from '@jsii/spec'; import { CodeMaker } from 'codemaker'; -import * as path from 'path'; +import * as path from 'node:path'; import * as xmlbuilder from 'xmlbuilder'; import { TargetName } from '..'; diff --git a/packages/jsii-pacmak/lib/targets/go.ts b/packages/jsii-pacmak/lib/targets/go.ts index 4b69472b52..29c78bb29e 100644 --- a/packages/jsii-pacmak/lib/targets/go.ts +++ b/packages/jsii-pacmak/lib/targets/go.ts @@ -2,7 +2,7 @@ import { CodeMaker } from 'codemaker'; import * as fs from 'fs-extra'; import { Assembly } from 'jsii-reflect'; import { Rosetta } from 'jsii-rosetta'; -import * as path from 'path'; +import * as path from 'node:path'; import { IGenerator, Legalese } from '../generator'; import * as logging from '../logging'; diff --git a/packages/jsii-pacmak/lib/targets/go/package.ts b/packages/jsii-pacmak/lib/targets/go/package.ts index 36c86198b3..38c5771b1c 100644 --- a/packages/jsii-pacmak/lib/targets/go/package.ts +++ b/packages/jsii-pacmak/lib/targets/go/package.ts @@ -5,7 +5,7 @@ import { Type, Submodule as JsiiSubmodule, } from 'jsii-reflect'; -import { basename, dirname, join } from 'path'; +import { basename, dirname, join } from 'node:path'; import * as semver from 'semver'; import { VERSION } from '../../version'; diff --git a/packages/jsii-pacmak/lib/targets/go/types/struct.ts b/packages/jsii-pacmak/lib/targets/go/types/struct.ts index f64c6567fb..2a40140149 100644 --- a/packages/jsii-pacmak/lib/targets/go/types/struct.ts +++ b/packages/jsii-pacmak/lib/targets/go/types/struct.ts @@ -1,6 +1,6 @@ -import * as assert from 'assert'; import { CodeMaker } from 'codemaker'; import { InterfaceType } from 'jsii-reflect'; +import * as assert from 'node:assert'; import { SpecialDependencies } from '../dependencies'; import { EmitContext } from '../emit-context'; diff --git a/packages/jsii-pacmak/lib/targets/java.ts b/packages/jsii-pacmak/lib/targets/java.ts index daea91e5f6..7f7b063f5e 100644 --- a/packages/jsii-pacmak/lib/targets/java.ts +++ b/packages/jsii-pacmak/lib/targets/java.ts @@ -10,7 +10,7 @@ import { markDownToJavaDoc, ApiLocation, } from 'jsii-rosetta'; -import * as path from 'path'; +import * as path from 'node:path'; import * as xmlbuilder from 'xmlbuilder'; import { TargetBuilder, BuildOptions } from '../builder'; diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 5efbc0dad6..6634bb6924 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -1,5 +1,4 @@ import * as spec from '@jsii/spec'; -import * as assert from 'assert'; import { CodeMaker, toSnakeCase } from 'codemaker'; import * as escapeStringRegexp from 'escape-string-regexp'; import * as fs from 'fs-extra'; @@ -10,7 +9,8 @@ import { enforcesStrictMode, ApiLocation, } from 'jsii-rosetta'; -import * as path from 'path'; +import * as assert from 'node:assert'; +import * as path from 'node:path'; import { Generator, GeneratorOptions } from '../generator'; import { warn } from '../logging'; diff --git a/packages/jsii-pacmak/lib/targets/python/type-name.ts b/packages/jsii-pacmak/lib/targets/python/type-name.ts index f9410ef746..3b25662fff 100644 --- a/packages/jsii-pacmak/lib/targets/python/type-name.ts +++ b/packages/jsii-pacmak/lib/targets/python/type-name.ts @@ -12,7 +12,7 @@ import { Type, } from '@jsii/spec'; import { toSnakeCase } from 'codemaker'; -import { createHash } from 'crypto'; +import { createHash } from 'node:crypto'; import { die, toPythonIdentifier } from './util'; diff --git a/packages/jsii-pacmak/lib/targets/version-utils.ts b/packages/jsii-pacmak/lib/targets/version-utils.ts index af33cc7df2..be13f1914c 100644 --- a/packages/jsii-pacmak/lib/targets/version-utils.ts +++ b/packages/jsii-pacmak/lib/targets/version-utils.ts @@ -1,5 +1,5 @@ +import { inspect } from 'node:util'; import { Comparator, Range, parse } from 'semver'; -import { inspect } from 'util'; import { TargetName } from '.'; diff --git a/packages/jsii-pacmak/lib/util.ts b/packages/jsii-pacmak/lib/util.ts index 219dae1eff..8609fadc89 100644 --- a/packages/jsii-pacmak/lib/util.ts +++ b/packages/jsii-pacmak/lib/util.ts @@ -1,7 +1,7 @@ -import { spawn, SpawnOptions } from 'child_process'; import * as fs from 'fs-extra'; -import * as os from 'os'; -import * as path from 'path'; +import { spawn, SpawnOptions } from 'node:child_process'; +import * as os from 'node:os'; +import * as path from 'node:path'; import * as logging from './logging'; @@ -45,7 +45,7 @@ export async function findDependencyDirectory( */ export function isBuiltinModule(depName: string) { // eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires - const { builtinModules } = require('module'); + const { builtinModules } = require('node:module'); return (builtinModules ?? []).includes(depName); } diff --git a/packages/jsii-pacmak/test/dependency-graph.test.ts b/packages/jsii-pacmak/test/dependency-graph.test.ts index cf0eac3a97..69b9e8c528 100644 --- a/packages/jsii-pacmak/test/dependency-graph.test.ts +++ b/packages/jsii-pacmak/test/dependency-graph.test.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/require-await */ -import { tmpdir } from 'os'; -import { join } from 'path'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; import { Callback, traverseDependencyGraph } from '../lib/dependency-graph'; diff --git a/packages/jsii-pacmak/test/generated-code/all-targets-tested.test.ts b/packages/jsii-pacmak/test/generated-code/all-targets-tested.test.ts index 2cc9732828..d8caeb4bd6 100644 --- a/packages/jsii-pacmak/test/generated-code/all-targets-tested.test.ts +++ b/packages/jsii-pacmak/test/generated-code/all-targets-tested.test.ts @@ -1,5 +1,5 @@ import { pathExists, readFile } from 'fs-extra'; -import { join, relative, resolve } from 'path'; +import { join, relative, resolve } from 'node:path'; import { TargetName } from '../../lib/targets'; diff --git a/packages/jsii-pacmak/test/generated-code/examples.test.ts b/packages/jsii-pacmak/test/generated-code/examples.test.ts index 9d478942e2..bc63fa2c1e 100644 --- a/packages/jsii-pacmak/test/generated-code/examples.test.ts +++ b/packages/jsii-pacmak/test/generated-code/examples.test.ts @@ -1,8 +1,8 @@ import { AssemblyTargets, SPEC_FILE_NAME } from '@jsii/spec'; import * as fs from 'fs-extra'; import * as jsii from 'jsii'; -import * as os from 'os'; -import * as path from 'path'; +import * as os from 'node:os'; +import * as path from 'node:path'; import * as pacmak from '../../lib'; import { checkTree, TREE } from './harness'; diff --git a/packages/jsii-pacmak/test/generated-code/harness.ts b/packages/jsii-pacmak/test/generated-code/harness.ts index 4026f9e1ac..757df65fea 100644 --- a/packages/jsii-pacmak/test/generated-code/harness.ts +++ b/packages/jsii-pacmak/test/generated-code/harness.ts @@ -1,7 +1,7 @@ import * as fs from 'fs-extra'; -import * as os from 'os'; -import * as path from 'path'; -import * as process from 'process'; +import * as os from 'node:os'; +import * as path from 'node:path'; +import * as process from 'node:process'; import { pacmak, TargetName } from '../../lib'; import { shell } from '../../lib/util'; diff --git a/packages/jsii-pacmak/test/generated-code/prerelease-identifiers.test.ts b/packages/jsii-pacmak/test/generated-code/prerelease-identifiers.test.ts index 4005cf5c0a..93f9daa972 100644 --- a/packages/jsii-pacmak/test/generated-code/prerelease-identifiers.test.ts +++ b/packages/jsii-pacmak/test/generated-code/prerelease-identifiers.test.ts @@ -1,8 +1,8 @@ import { Assembly, SchemaVersion, SPEC_FILE_NAME } from '@jsii/spec'; import { toPascalCase } from 'codemaker'; import * as fs from 'fs-extra'; -import { tmpdir } from 'os'; -import { join } from 'path'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; import { pacmak } from '../../lib'; import { checkTree, TREE } from './harness'; diff --git a/packages/jsii-pacmak/test/npm-modules.test.ts b/packages/jsii-pacmak/test/npm-modules.test.ts index 1e5bb92bdc..f86d89b990 100644 --- a/packages/jsii-pacmak/test/npm-modules.test.ts +++ b/packages/jsii-pacmak/test/npm-modules.test.ts @@ -1,6 +1,6 @@ import { mkdirp, mkdtemp, remove, writeJson } from 'fs-extra'; -import { tmpdir } from 'os'; -import { join } from 'path'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; import { findJsiiModules } from '../lib/npm-modules'; import { flatten } from '../lib/util'; diff --git a/packages/jsii-reflect/lib/type-system.ts b/packages/jsii-reflect/lib/type-system.ts index 65286e0d0a..9edb1918ca 100644 --- a/packages/jsii-reflect/lib/type-system.ts +++ b/packages/jsii-reflect/lib/type-system.ts @@ -1,6 +1,6 @@ -import { getAssemblyFile, loadAssemblyFromFile } from '@jsii/spec'; +import { findAssemblyFile, loadAssemblyFromFile } from '@jsii/spec'; import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; import { Assembly } from './assembly'; import { ClassType } from './class'; @@ -109,7 +109,7 @@ export class TypeSystem { // Load the assembly, but don't recurse if we already have an assembly with the same name. // Validation is not an insignificant time sink, and loading IS insignificant, so do a // load without validation first. This saves about 2/3rds of processing time. - const asm = this.loadAssembly(getAssemblyFile(moduleDirectory), false); + const asm = this.loadAssembly(findAssemblyFile(moduleDirectory), false); if (this.includesAssembly(asm.name)) { const existing = this.findAssembly(asm.name); if (existing.version !== asm.version) { diff --git a/packages/jsii-reflect/lib/util.ts b/packages/jsii-reflect/lib/util.ts index 285f08c1c5..c29b461403 100644 --- a/packages/jsii-reflect/lib/util.ts +++ b/packages/jsii-reflect/lib/util.ts @@ -1,5 +1,5 @@ import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; export function indexBy(xs: T[], f: (x: T) => string): { [key: string]: T } { const ret: { [key: string]: T } = {}; @@ -49,7 +49,7 @@ export async function findDependencyDirectory( */ export function isBuiltinModule(depName: string) { // eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires - const { builtinModules } = require('module'); + const { builtinModules } = require('node:module'); return (builtinModules ?? []).includes(depName); } diff --git a/packages/jsii-reflect/test/jsii-tree.test.ts b/packages/jsii-reflect/test/jsii-tree.test.ts index f5ff07412a..d316f18cd1 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.ts +++ b/packages/jsii-reflect/test/jsii-tree.test.ts @@ -1,6 +1,6 @@ -import * as childProcess from 'child_process'; -import * as path from 'path'; -import { promisify } from 'util'; +import * as childProcess from 'node:child_process'; +import * as path from 'node:path'; +import { promisify } from 'node:util'; const exec = promisify(childProcess.exec); diff --git a/packages/jsii-reflect/test/tree.test.ts b/packages/jsii-reflect/test/tree.test.ts index 6c28171755..e8be9b2343 100644 --- a/packages/jsii-reflect/test/tree.test.ts +++ b/packages/jsii-reflect/test/tree.test.ts @@ -1,5 +1,5 @@ +import { dirname } from 'node:path'; import { Printer } from 'oo-ascii-tree'; -import { dirname } from 'path'; import { TypeSystemTree } from '../lib/tree'; import { TypeSystem } from '../lib/type-system'; diff --git a/packages/jsii-reflect/test/type-system.test.ts b/packages/jsii-reflect/test/type-system.test.ts index 0207c81b1f..56c1a8d318 100644 --- a/packages/jsii-reflect/test/type-system.test.ts +++ b/packages/jsii-reflect/test/type-system.test.ts @@ -1,6 +1,6 @@ import * as spec from '@jsii/spec'; import { Stability } from '@jsii/spec'; -import * as path from 'path'; +import * as path from 'node:path'; import { TypeSystem } from '../lib'; import { typeSystemFromSource, assemblyFromSource } from './util'; diff --git a/packages/jsii-rosetta/bin/jsii-rosetta.ts b/packages/jsii-rosetta/bin/jsii-rosetta.ts index 0d2948ac0e..c2027c4d5c 100644 --- a/packages/jsii-rosetta/bin/jsii-rosetta.ts +++ b/packages/jsii-rosetta/bin/jsii-rosetta.ts @@ -1,7 +1,7 @@ import '@jsii/check-node/run'; import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; import * as yargs from 'yargs'; import { TranslateResult, translateTypeScript, RosettaDiagnostic } from '../lib'; diff --git a/packages/jsii-rosetta/lib/commands/extract.ts b/packages/jsii-rosetta/lib/commands/extract.ts index 81ffc3749a..b0ec4d03aa 100644 --- a/packages/jsii-rosetta/lib/commands/extract.ts +++ b/packages/jsii-rosetta/lib/commands/extract.ts @@ -1,4 +1,4 @@ -import * as path from 'path'; +import * as path from 'node:path'; import { loadAssemblies, allTypeScriptSnippets, loadAllDefaultTablets } from '../jsii/assemblies'; import * as logging from '../logging'; diff --git a/packages/jsii-rosetta/lib/commands/infuse.ts b/packages/jsii-rosetta/lib/commands/infuse.ts index 3fb1e86434..2eeab82699 100644 --- a/packages/jsii-rosetta/lib/commands/infuse.ts +++ b/packages/jsii-rosetta/lib/commands/infuse.ts @@ -1,6 +1,6 @@ import * as spec from '@jsii/spec'; import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; import { loadAssemblies, diff --git a/packages/jsii-rosetta/lib/commands/transliterate.ts b/packages/jsii-rosetta/lib/commands/transliterate.ts index f6538840b1..3247e05384 100644 --- a/packages/jsii-rosetta/lib/commands/transliterate.ts +++ b/packages/jsii-rosetta/lib/commands/transliterate.ts @@ -1,6 +1,6 @@ import { Assembly, Docs, SPEC_FILE_NAME, Type, TypeKind, loadAssemblyFromPath } from '@jsii/spec'; import { writeJson } from 'fs-extra'; -import { resolve } from 'path'; +import { resolve } from 'node:path'; import { TargetLanguage } from '../languages'; import { targetName } from '../languages/target-language'; diff --git a/packages/jsii-rosetta/lib/find-utils.ts b/packages/jsii-rosetta/lib/find-utils.ts index 77c29907cd..3258a9a790 100644 --- a/packages/jsii-rosetta/lib/find-utils.ts +++ b/packages/jsii-rosetta/lib/find-utils.ts @@ -1,5 +1,5 @@ import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; /** * Find the directory that contains a given dependency, identified by its 'package.json', from a starting search directory @@ -77,6 +77,6 @@ export function findUp( */ export function isBuiltinModule(depName: string) { // eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires - const { builtinModules } = require('module'); + const { builtinModules } = require('node:module'); return (builtinModules ?? []).includes(depName); } diff --git a/packages/jsii-rosetta/lib/fixtures.ts b/packages/jsii-rosetta/lib/fixtures.ts index affa4283b7..f089479680 100644 --- a/packages/jsii-rosetta/lib/fixtures.ts +++ b/packages/jsii-rosetta/lib/fixtures.ts @@ -1,5 +1,5 @@ import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; import { createSourceFile, ScriptKind, ScriptTarget, SyntaxKind } from 'typescript'; import { TypeScriptSnippet, SnippetParameters, ApiLocation } from './snippet'; diff --git a/packages/jsii-rosetta/lib/jsii/assemblies.ts b/packages/jsii-rosetta/lib/jsii/assemblies.ts index a488f8e111..a6895d7de0 100644 --- a/packages/jsii-rosetta/lib/jsii/assemblies.ts +++ b/packages/jsii-rosetta/lib/jsii/assemblies.ts @@ -1,8 +1,8 @@ import * as spec from '@jsii/spec'; -import { loadAssemblyFromFile, loadAssemblyFromPath, getAssemblyFile, writeAssembly } from '@jsii/spec'; -import * as crypto from 'crypto'; +import { loadAssemblyFromFile, loadAssemblyFromPath, findAssemblyFile, writeAssembly } from '@jsii/spec'; import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as crypto from 'node:crypto'; +import * as path from 'node:path'; import { findDependencyDirectory, isBuiltinModule } from '../find-utils'; import { fixturize } from '../fixtures'; @@ -65,7 +65,7 @@ export function loadAssemblies( function loadAssembly(location: string): LoadedAssembly { const stat = fs.statSync(location); if (stat.isDirectory()) { - return loadAssembly(getAssemblyFile(location)); + return loadAssembly(findAssemblyFile(location)); } const directory = path.dirname(location); diff --git a/packages/jsii-rosetta/lib/jsii/fingerprinting.ts b/packages/jsii-rosetta/lib/jsii/fingerprinting.ts index 36215782c3..878cf77947 100644 --- a/packages/jsii-rosetta/lib/jsii/fingerprinting.ts +++ b/packages/jsii-rosetta/lib/jsii/fingerprinting.ts @@ -1,5 +1,5 @@ import * as spec from '@jsii/spec'; -import * as crypto from 'crypto'; +import * as crypto from 'node:crypto'; /** * Return a fingerprint for a type. diff --git a/packages/jsii-rosetta/lib/languages/go.ts b/packages/jsii-rosetta/lib/languages/go.ts index 9fcb50632d..788e138908 100644 --- a/packages/jsii-rosetta/lib/languages/go.ts +++ b/packages/jsii-rosetta/lib/languages/go.ts @@ -1,6 +1,6 @@ // import { JsiiSymbol, simpleName, namespaceName } from '../jsii/jsii-utils'; // import { jsiiTargetParameter } from '../jsii/packages'; -import { AssertionError } from 'assert'; +import { AssertionError } from 'node:assert'; import * as ts from 'typescript'; import { analyzeObjectLiteral, determineJsiiType, JsiiType, ObjectLiteralStruct } from '../jsii/jsii-types'; diff --git a/packages/jsii-rosetta/lib/languages/target-language.ts b/packages/jsii-rosetta/lib/languages/target-language.ts index d39b09e290..d0a0fd8b27 100644 --- a/packages/jsii-rosetta/lib/languages/target-language.ts +++ b/packages/jsii-rosetta/lib/languages/target-language.ts @@ -1,4 +1,4 @@ -import * as assert from 'assert'; +import * as assert from 'node:assert'; export enum TargetLanguage { PYTHON = 'python', diff --git a/packages/jsii-rosetta/lib/logging.ts b/packages/jsii-rosetta/lib/logging.ts index cf712bc1d4..0f8cdf3d78 100644 --- a/packages/jsii-rosetta/lib/logging.ts +++ b/packages/jsii-rosetta/lib/logging.ts @@ -1,4 +1,4 @@ -import * as util from 'util'; +import * as util from 'node:util'; export enum Level { ERROR = -2, diff --git a/packages/jsii-rosetta/lib/rosetta-reader.ts b/packages/jsii-rosetta/lib/rosetta-reader.ts index b2e4457462..f2ed3f8883 100644 --- a/packages/jsii-rosetta/lib/rosetta-reader.ts +++ b/packages/jsii-rosetta/lib/rosetta-reader.ts @@ -1,6 +1,6 @@ import * as spec from '@jsii/spec'; import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; import { allTypeScriptSnippets } from './jsii/assemblies'; import { TargetLanguage } from './languages'; diff --git a/packages/jsii-rosetta/lib/snippet-dependencies.ts b/packages/jsii-rosetta/lib/snippet-dependencies.ts index a21ace6710..046836b8db 100644 --- a/packages/jsii-rosetta/lib/snippet-dependencies.ts +++ b/packages/jsii-rosetta/lib/snippet-dependencies.ts @@ -1,8 +1,8 @@ -import * as cp from 'child_process'; import * as fastGlob from 'fast-glob'; import * as fs from 'fs-extra'; -import * as os from 'os'; -import * as path from 'path'; +import * as cp from 'node:child_process'; +import * as os from 'node:os'; +import * as path from 'node:path'; import * as semver from 'semver'; import { intersect } from 'semver-intersect'; diff --git a/packages/jsii-rosetta/lib/tablets/key.ts b/packages/jsii-rosetta/lib/tablets/key.ts index d46a10adf7..6eaf736c87 100644 --- a/packages/jsii-rosetta/lib/tablets/key.ts +++ b/packages/jsii-rosetta/lib/tablets/key.ts @@ -1,4 +1,4 @@ -import * as crypto from 'crypto'; +import * as crypto from 'node:crypto'; import { RecordReferencesVisitor } from '../languages/record-references'; import { TypeScriptSnippet, renderApiLocation } from '../snippet'; diff --git a/packages/jsii-rosetta/lib/tablets/tablets.ts b/packages/jsii-rosetta/lib/tablets/tablets.ts index ac01a2a7b0..556e099edf 100644 --- a/packages/jsii-rosetta/lib/tablets/tablets.ts +++ b/packages/jsii-rosetta/lib/tablets/tablets.ts @@ -1,5 +1,5 @@ import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; import { TargetLanguage } from '../languages'; import * as logging from '../logging'; diff --git a/packages/jsii-rosetta/lib/translate.ts b/packages/jsii-rosetta/lib/translate.ts index 74dfe27b16..1916e122c3 100644 --- a/packages/jsii-rosetta/lib/translate.ts +++ b/packages/jsii-rosetta/lib/translate.ts @@ -1,5 +1,5 @@ +import { inspect } from 'node:util'; import * as ts from 'typescript'; -import { inspect } from 'util'; import { TARGET_LANGUAGES, TargetLanguage } from './languages'; import { RecordReferencesVisitor } from './languages/record-references'; diff --git a/packages/jsii-rosetta/lib/translate_all.ts b/packages/jsii-rosetta/lib/translate_all.ts index 84081689e6..f91a70912e 100644 --- a/packages/jsii-rosetta/lib/translate_all.ts +++ b/packages/jsii-rosetta/lib/translate_all.ts @@ -1,5 +1,5 @@ -import * as os from 'os'; -import * as path from 'path'; +import * as os from 'node:os'; +import * as path from 'node:path'; import * as workerpool from 'workerpool'; import * as logging from './logging'; diff --git a/packages/jsii-rosetta/test/commands/extract.test.ts b/packages/jsii-rosetta/test/commands/extract.test.ts index 1c2b5db23a..a18140b385 100644 --- a/packages/jsii-rosetta/test/commands/extract.test.ts +++ b/packages/jsii-rosetta/test/commands/extract.test.ts @@ -1,7 +1,7 @@ import { SPEC_FILE_NAME_COMPRESSED } from '@jsii/spec'; import * as fs from 'fs-extra'; import { compileJsiiForTest } from 'jsii'; -import * as path from 'path'; +import * as path from 'node:path'; import { LanguageTablet, diff --git a/packages/jsii-rosetta/test/commands/infuse.test.ts b/packages/jsii-rosetta/test/commands/infuse.test.ts index 28cfffb5c7..6e2faf6555 100644 --- a/packages/jsii-rosetta/test/commands/infuse.test.ts +++ b/packages/jsii-rosetta/test/commands/infuse.test.ts @@ -1,6 +1,6 @@ import { loadAssemblyFromPath } from '@jsii/spec'; import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; import { LanguageTablet, DEFAULT_TABLET_NAME } from '../../lib'; import { extractSnippets } from '../../lib/commands/extract'; diff --git a/packages/jsii-rosetta/test/commands/transliterate.test.ts b/packages/jsii-rosetta/test/commands/transliterate.test.ts index 585fe66c47..48f9991f76 100644 --- a/packages/jsii-rosetta/test/commands/transliterate.test.ts +++ b/packages/jsii-rosetta/test/commands/transliterate.test.ts @@ -1,7 +1,7 @@ import { Assembly, SPEC_FILE_NAME, writeAssembly } from '@jsii/spec'; import * as fs from 'fs-extra'; import * as jsii from 'jsii'; -import * as path from 'path'; +import * as path from 'node:path'; import { extractSnippets } from '../../lib/commands/extract'; import { transliterateAssembly } from '../../lib/commands/transliterate'; diff --git a/packages/jsii-rosetta/test/commands/trim-cache.test.ts b/packages/jsii-rosetta/test/commands/trim-cache.test.ts index 27046cc301..1833f6e30e 100644 --- a/packages/jsii-rosetta/test/commands/trim-cache.test.ts +++ b/packages/jsii-rosetta/test/commands/trim-cache.test.ts @@ -1,4 +1,4 @@ -import * as path from 'path'; +import * as path from 'node:path'; import { TranslatedSnippet, typeScriptSnippetFromVisibleSource, LanguageTablet, DEFAULT_TABLET_NAME } from '../../lib'; import { extractSnippets } from '../../lib/commands/extract'; diff --git a/packages/jsii-rosetta/test/jsii/assemblies.test.ts b/packages/jsii-rosetta/test/jsii/assemblies.test.ts index 0cc73b8597..b7182e527d 100644 --- a/packages/jsii-rosetta/test/jsii/assemblies.test.ts +++ b/packages/jsii-rosetta/test/jsii/assemblies.test.ts @@ -1,7 +1,7 @@ import * as spec from '@jsii/spec'; import * as fs from 'fs-extra'; import * as mockfs from 'mock-fs'; -import * as path from 'path'; +import * as path from 'node:path'; import { allTypeScriptSnippets } from '../../lib/jsii/assemblies'; import { SnippetParameters } from '../../lib/snippet'; diff --git a/packages/jsii-rosetta/test/testutil.ts b/packages/jsii-rosetta/test/testutil.ts index a54efa47ba..0e7962be27 100644 --- a/packages/jsii-rosetta/test/testutil.ts +++ b/packages/jsii-rosetta/test/testutil.ts @@ -1,8 +1,8 @@ import { Assembly, writeAssembly } from '@jsii/spec'; import * as fs from 'fs-extra'; import { PackageInfo, compileJsiiForTest, TestWorkspace } from 'jsii'; -import * as os from 'os'; -import * as path from 'path'; +import * as os from 'node:os'; +import * as path from 'node:path'; import { SnippetTranslator, diff --git a/packages/jsii-rosetta/test/translations.test.ts b/packages/jsii-rosetta/test/translations.test.ts index 29ff2ba1c8..45282ed517 100644 --- a/packages/jsii-rosetta/test/translations.test.ts +++ b/packages/jsii-rosetta/test/translations.test.ts @@ -1,5 +1,5 @@ import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; import { SnippetTranslator } from '../lib'; import { TARGET_LANGUAGES, TargetLanguage, VisitorFactory } from '../lib/languages'; diff --git a/packages/jsii/bin/jsii.ts b/packages/jsii/bin/jsii.ts index 838f523fb4..443fd0cbd0 100644 --- a/packages/jsii/bin/jsii.ts +++ b/packages/jsii/bin/jsii.ts @@ -1,9 +1,9 @@ import '@jsii/check-node/run'; import * as log4js from 'log4js'; -import * as path from 'path'; +import * as path from 'node:path'; +import * as util from 'node:util'; import { version as tsVersion } from 'typescript/package.json'; -import * as util from 'util'; import * as yargs from 'yargs'; import { Compiler } from '../lib/compiler'; diff --git a/packages/jsii/lib/assembler.ts b/packages/jsii/lib/assembler.ts index 46816f1a36..258e81a652 100644 --- a/packages/jsii/lib/assembler.ts +++ b/packages/jsii/lib/assembler.ts @@ -1,11 +1,11 @@ import * as spec from '@jsii/spec'; import { writeAssembly, SPEC_FILE_NAME, PackageJson } from '@jsii/spec'; import * as chalk from 'chalk'; -import * as crypto from 'crypto'; import * as deepEqual from 'fast-deep-equal/es6'; import * as fs from 'fs-extra'; import * as log4js from 'log4js'; -import * as path from 'path'; +import * as crypto from 'node:crypto'; +import * as path from 'node:path'; import * as ts from 'typescript'; import * as Case from './case'; diff --git a/packages/jsii/lib/compiler.ts b/packages/jsii/lib/compiler.ts index 3a150248e5..4938efc53c 100644 --- a/packages/jsii/lib/compiler.ts +++ b/packages/jsii/lib/compiler.ts @@ -1,7 +1,7 @@ import * as chalk from 'chalk'; import * as fs from 'fs-extra'; import * as log4js from 'log4js'; -import * as path from 'path'; +import * as path from 'node:path'; import * as ts from 'typescript'; import { Assembler } from './assembler'; @@ -553,7 +553,7 @@ export class Compiler implements Emitter { */ private findMonorepoPeerTsconfig(depName: string): string | undefined { // eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires - const { builtinModules } = require('module'); + const { builtinModules } = require('node:module'); if ((builtinModules ?? []).includes(depName)) { // Can happen for modules like 'punycode' which are declared as dependency for polyfill purposes return undefined; diff --git a/packages/jsii/lib/helpers.ts b/packages/jsii/lib/helpers.ts index 35c7fcf515..ceaab0bba2 100644 --- a/packages/jsii/lib/helpers.ts +++ b/packages/jsii/lib/helpers.ts @@ -9,8 +9,8 @@ import * as spec from '@jsii/spec'; import { PackageJson, loadAssemblyFromPath, writeAssembly } from '@jsii/spec'; import * as fs from 'fs-extra'; -import * as os from 'os'; -import * as path from 'path'; +import * as os from 'node:os'; +import * as path from 'node:path'; import { DiagnosticCategory } from 'typescript'; import { Compiler, CompilerOptions } from './compiler'; diff --git a/packages/jsii/lib/literate.ts b/packages/jsii/lib/literate.ts index c4edde4717..a3e5f9896b 100644 --- a/packages/jsii/lib/literate.ts +++ b/packages/jsii/lib/literate.ts @@ -57,7 +57,7 @@ * ``` */ import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; /** * Convert an annotated TypeScript source file to MarkDown diff --git a/packages/jsii/lib/project-info.ts b/packages/jsii/lib/project-info.ts index d7ce655843..898e9ffa2d 100644 --- a/packages/jsii/lib/project-info.ts +++ b/packages/jsii/lib/project-info.ts @@ -1,8 +1,8 @@ import * as spec from '@jsii/spec'; -import { getAssemblyFile, loadAssemblyFromFile } from '@jsii/spec'; +import { findAssemblyFile, loadAssemblyFromFile } from '@jsii/spec'; import * as fs from 'fs-extra'; import * as log4js from 'log4js'; -import * as path from 'path'; +import * as path from 'node:path'; import * as semver from 'semver'; import * as ts from 'typescript'; @@ -435,7 +435,7 @@ function _tryResolveAssembly( searchPath: string, ): string { if (localPackage) { - const result = getAssemblyFile(localPackage); + const result = findAssemblyFile(localPackage); if (!fs.existsSync(result)) { throw new Error(`Assembly does not exist: ${result}`); } @@ -443,7 +443,7 @@ function _tryResolveAssembly( } try { const dependencyDir = findDependencyDirectory(mod, searchPath); - return getAssemblyFile(dependencyDir); + return findAssemblyFile(dependencyDir); } catch (e: any) { throw new Error( `Unable to locate jsii assembly for "${mod}". If this module is not jsii-enabled, it must also be declared under bundledDependencies: ${e}`, diff --git a/packages/jsii/lib/symbol-id.ts b/packages/jsii/lib/symbol-id.ts index cc7f796a76..798c51de14 100644 --- a/packages/jsii/lib/symbol-id.ts +++ b/packages/jsii/lib/symbol-id.ts @@ -1,6 +1,6 @@ import { Assembly } from '@jsii/spec'; import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; import * as ts from 'typescript'; import { findUp } from './utils'; diff --git a/packages/jsii/lib/transforms/deprecated-remover.ts b/packages/jsii/lib/transforms/deprecated-remover.ts index 9422bad4a2..f021e466eb 100644 --- a/packages/jsii/lib/transforms/deprecated-remover.ts +++ b/packages/jsii/lib/transforms/deprecated-remover.ts @@ -17,7 +17,7 @@ import { Stability, TypeReference, } from '@jsii/spec'; -import { basename, dirname, relative } from 'path'; +import { basename, dirname, relative } from 'node:path'; import * as ts from 'typescript'; import { JsiiDiagnostic } from '../jsii-diagnostic'; diff --git a/packages/jsii/lib/transforms/deprecation-warnings.ts b/packages/jsii/lib/transforms/deprecation-warnings.ts index a0a7b2f36a..b7dcd10b3e 100644 --- a/packages/jsii/lib/transforms/deprecation-warnings.ts +++ b/packages/jsii/lib/transforms/deprecation-warnings.ts @@ -1,7 +1,7 @@ import * as spec from '@jsii/spec'; import { Assembly } from '@jsii/spec'; -import * as fs from 'fs'; -import * as path from 'path'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; import * as ts from 'typescript'; import { ProjectInfo } from '../project-info'; diff --git a/packages/jsii/lib/utils.ts b/packages/jsii/lib/utils.ts index 0b35d099ce..80bef580d8 100644 --- a/packages/jsii/lib/utils.ts +++ b/packages/jsii/lib/utils.ts @@ -1,6 +1,6 @@ import * as fs from 'fs-extra'; import * as log4js from 'log4js'; -import * as path from 'path'; +import * as path from 'node:path'; import * as ts from 'typescript'; import { JsiiDiagnostic } from './jsii-diagnostic'; diff --git a/packages/jsii/lib/validator.ts b/packages/jsii/lib/validator.ts index 86039f4360..ed2d742074 100644 --- a/packages/jsii/lib/validator.ts +++ b/packages/jsii/lib/validator.ts @@ -1,6 +1,6 @@ import * as spec from '@jsii/spec'; -import * as assert from 'assert'; import * as deepEqual from 'fast-deep-equal'; +import * as assert from 'node:assert'; import * as ts from 'typescript'; import * as Case from './case'; diff --git a/packages/jsii/test/compiler.test.ts b/packages/jsii/test/compiler.test.ts index 162c6bf79a..d09a68ee9e 100644 --- a/packages/jsii/test/compiler.test.ts +++ b/packages/jsii/test/compiler.test.ts @@ -12,8 +12,8 @@ import { readFileSync, readJsonSync, } from 'fs-extra'; -import { tmpdir } from 'os'; -import { join } from 'path'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; import { Compiler } from '../lib/compiler'; import { ProjectInfo } from '../lib/project-info'; diff --git a/packages/jsii/test/deprecated-remover.test.ts b/packages/jsii/test/deprecated-remover.test.ts index 920d228384..60c77a57e6 100644 --- a/packages/jsii/test/deprecated-remover.test.ts +++ b/packages/jsii/test/deprecated-remover.test.ts @@ -1,6 +1,6 @@ import * as fs from 'fs-extra'; -import * as os from 'os'; -import * as path from 'path'; +import * as os from 'node:os'; +import * as path from 'node:path'; import { compileJsiiForTest, HelperCompilationResult } from '../lib'; diff --git a/packages/jsii/test/deprecation-warnings.test.ts b/packages/jsii/test/deprecation-warnings.test.ts index c5a9d6222b..6bb70d8650 100644 --- a/packages/jsii/test/deprecation-warnings.test.ts +++ b/packages/jsii/test/deprecation-warnings.test.ts @@ -1,7 +1,7 @@ // eslint-disable-next-line import/no-extraneous-dependencies -import * as fs from 'fs'; -import * as path from 'path'; -import * as vm from 'vm'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; +import * as vm from 'node:vm'; import { compileJsiiForTest, HelperCompilationResult } from '../lib'; import { Compiler } from '../lib/compiler'; diff --git a/packages/jsii/test/negatives.test.ts b/packages/jsii/test/negatives.test.ts index 8979555f93..7d9716afff 100644 --- a/packages/jsii/test/negatives.test.ts +++ b/packages/jsii/test/negatives.test.ts @@ -1,5 +1,5 @@ import * as fs from 'fs-extra'; -import * as path from 'path'; +import * as path from 'node:path'; import * as ts from 'typescript'; import { Compiler } from '../lib/compiler'; diff --git a/packages/jsii/test/project-info.test.ts b/packages/jsii/test/project-info.test.ts index a3b7e16d00..e4be0c33e4 100644 --- a/packages/jsii/test/project-info.test.ts +++ b/packages/jsii/test/project-info.test.ts @@ -2,8 +2,8 @@ import * as spec from '@jsii/spec'; import { writeAssembly } from '@jsii/spec'; import * as clone from 'clone'; import * as fs from 'fs-extra'; -import * as os from 'os'; -import * as path from 'path'; +import * as os from 'node:os'; +import * as path from 'node:path'; import * as ts from 'typescript'; import { loadProjectInfo } from '../lib/project-info'; diff --git a/packages/oo-ascii-tree/src/tree.test.ts b/packages/oo-ascii-tree/src/tree.test.ts index 7612ed9177..e41201009b 100644 --- a/packages/oo-ascii-tree/src/tree.test.ts +++ b/packages/oo-ascii-tree/src/tree.test.ts @@ -1,5 +1,5 @@ -import { promises as fs } from 'fs'; -import * as path from 'path'; +import { promises as fs } from 'node:fs'; +import * as path from 'node:path'; import { AsciiTree } from './ascii-tree'; diff --git a/tools/jsii-compliance/report.ts b/tools/jsii-compliance/report.ts index bd1653fb93..f9dafda70f 100755 --- a/tools/jsii-compliance/report.ts +++ b/tools/jsii-compliance/report.ts @@ -1,7 +1,7 @@ #!/usr/bin/env npx ts-node -import * as fs from 'fs'; -import * as path from 'path'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; import * as schema from './schema'; import { suite } from './suite'; diff --git a/yarn.lock b/yarn.lock index 75ae2f26cf..786e81f1d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -127,6 +127,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@babel/helper-validator-identifier@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + "@babel/helper-validator-option@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" @@ -2568,6 +2573,11 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +builtin-modules@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -2722,7 +2732,7 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.2.0: +ci-info@^3.2.0, ci-info@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== @@ -2739,6 +2749,13 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== +clean-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + integrity sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw== + dependencies: + escape-string-regexp "^1.0.5" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -3542,6 +3559,26 @@ eslint-plugin-prettier@^4.0.0: dependencies: prettier-linter-helpers "^1.0.0" +eslint-plugin-unicorn@^43.0.0: + version "43.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-43.0.0.tgz#c26fdfd146036b3f7951fa0f8c9af2b81bd87096" + integrity sha512-Z/6HX8yry+zAjo4jHHTAbe1rfniox7qgmCReGBfTc/CVgotfScaMCc4dtSSTHlJ+7Yix5o6LPXzwwpuGGFricg== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + ci-info "^3.3.2" + clean-regexp "^1.0.0" + eslint-utils "^3.0.0" + esquery "^1.4.0" + indent-string "^4.0.0" + is-builtin-module "^3.1.0" + lodash "^4.17.21" + pluralize "^8.0.0" + read-pkg-up "^7.0.1" + regexp-tree "^0.1.24" + safe-regex "^2.1.1" + semver "^7.3.7" + strip-indent "^3.0.0" + eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -4386,6 +4423,13 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-builtin-module@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.1.0.tgz#6fdb24313b1c03b75f8b9711c0feb8c30b903b00" + integrity sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg== + dependencies: + builtin-modules "^3.0.0" + is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" @@ -5363,7 +5407,7 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.11.2, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: +lodash@^4.11.2, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6403,6 +6447,11 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -6709,6 +6758,11 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regexp-tree@^0.1.24, regexp-tree@~0.1.1: + version "0.1.24" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d" + integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw== + regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" @@ -6835,6 +6889,13 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-regex@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== + dependencies: + regexp-tree "~0.1.1" + safe-stable-stringify@^2.2.0: version "2.3.1" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz#ab67cbe1fe7d40603ca641c5e765cb942d04fc73"