diff --git a/.nx-cache-buster b/.nx-cache-buster index 13adbbd1..692d5c67 100644 --- a/.nx-cache-buster +++ b/.nx-cache-buster @@ -1 +1 @@ -2024-03-23T18:18:45-07:00 +2024-06-01T20:52:18-07:00 diff --git a/jest.config.ts b/jest.config.ts index e994f1a5..7ef9f20a 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -25,6 +25,7 @@ const commonProjectConfig: Partial = { setupFilesAfterEnv: ['./jest.d/setup-files-after-env/faker.ts'], testEnvironment: 'node', testPathIgnorePatterns: ['/dist/', '/node_modules/'], + transformIgnorePatterns: ['.*\\.mjs'], }; const CI = !!process.env.CI; @@ -51,7 +52,7 @@ const config: Config.GlobalConfig = { (packagePath) => !packagePath.split(path.sep).includes('examples') ) .flatMap((packagePath) => [ - `/${packagePath}/**/?(*.)+(test).[tj]s?(x)`, + `/${packagePath}/**/?(*.)+(test).?(m)[tj]s?(x)`, ]), }, // @ts-expect-error - types seem wrong diff --git a/package.json b/package.json index 9f146bb4..3a3fae2c 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "lint:types": "bash -c \"tsc --build $TSC_OPTIONS\"", "postinstall": "patch-package", "prepare": "husky install", - "test": "TZ=UTC jest" + "test": "TZ=UTC node --experimental-vm-modules node_modules/jest/bin/jest.js" }, "devDependencies": { "@aws-sdk/client-cloudformation": "3.188.0", diff --git a/packages/@clc/nx/executors/package-json/executor.ts b/packages/@clc/nx/executors/package-json/executor.ts index 3c699d7d..12054766 100644 --- a/packages/@clc/nx/executors/package-json/executor.ts +++ b/packages/@clc/nx/executors/package-json/executor.ts @@ -11,7 +11,7 @@ import {extractProjectName, extractProjectRoot, writePackageJson} from '../..'; import type {PackageJsonExecutor} from './schema'; const runExecutor: Executor = async ( - {type = 'package'}, + {mjs = false, mts = false, type = 'package'}, context ) => { const root = extractProjectRoot(context); @@ -21,7 +21,7 @@ const runExecutor: Executor = async ( if (type === 'example') { await configExample(pkg, context); } else { - await config(pkg, type, context); + await config(pkg, mjs, mts, type, context); } await writePackageJson(packageJsonPath, pkg); @@ -43,7 +43,9 @@ async function configExample( async function config( pkg: JSONSchemaForNPMPackageJsonFiles, - type: 'cli' | 'package', + mjs: boolean, + mts: boolean, + type: 'cli' | 'package' | 'esm', context: ExecutorContext ) { const packageName = extractProjectName(context); @@ -63,12 +65,12 @@ async function config( // `types` should [always come first](https://nodejs.org/api/packages.html#community-conditions-definitions) import: { types: './dist/types/index.d.mts', - carpentry: './src/index.ts', - default: './dist/esm/index.mjs', + ...(mjs ? {} : {carpentry: mts ? './src/index.mts' : './src/index.ts'}), + default: mjs ? './src/index.mjs' : './dist/esm/index.mjs', }, require: { types: './dist/cjs-types/index.d.ts', - carpentry: './src/index.ts', + ...(mjs ? {} : {carpentry: mts ? './src/index.mts' : './src/index.ts'}), default: './dist/cjs/index.cjs', }, /* eslint-enable sort-keys */ diff --git a/packages/@clc/nx/executors/package-json/schema.d.ts b/packages/@clc/nx/executors/package-json/schema.d.ts index b05403fa..6998be3e 100644 --- a/packages/@clc/nx/executors/package-json/schema.d.ts +++ b/packages/@clc/nx/executors/package-json/schema.d.ts @@ -6,5 +6,7 @@ */ export interface PackageJsonExecutor { + mjs?: boolean; + mts?: boolean; type?: 'cli' | 'example' | 'package'; } diff --git a/packages/@clc/nx/executors/package-json/schema.json b/packages/@clc/nx/executors/package-json/schema.json index 10e88444..9c718a40 100644 --- a/packages/@clc/nx/executors/package-json/schema.json +++ b/packages/@clc/nx/executors/package-json/schema.json @@ -5,6 +5,14 @@ "description": "", "type": "object", "properties": { + "mjs": { + "type": "boolean", + "default": false + }, + "mts": { + "type": "boolean", + "default": false + }, "type": { "enum": ["cli", "example", "package"], "type": "string", diff --git a/packages/@clc/nx/src/create-nodes.ts b/packages/@clc/nx/src/create-nodes.ts index 85fc88fa..b73de6db 100644 --- a/packages/@clc/nx/src/create-nodes.ts +++ b/packages/@clc/nx/src/create-nodes.ts @@ -20,6 +20,9 @@ export const createNodes: CreateNodes = [ return {}; } + const mjs = existsSync(path.resolve(projectRoot, 'src/index.mjs')); + const mts = existsSync(path.resolve(projectRoot, 'src/index.mts')); + let targets: Record = {}; // Set up the basic phases of the build process @@ -88,25 +91,30 @@ export const createNodes: CreateNodes = [ dependsOn: ['codegen'], executor: '@clc/nx:esbuild', options: { - entryPoints: ['{projectRoot}/src/**/*.[jt]s?(x)', '!**/*.test.*'], + entryPoints: ['{projectRoot}/src/**/*.?(m)[jt]s?(x)', '!**/*.test.*'], format: 'cjs', outDir: '{projectRoot}/dist/cjs', }, outputs: ['{projectRoot}/dist/cjs'], }); - addTarget(targets, 'build', 'esm', { - cache: true, - dependsOn: ['codegen'], - executor: '@clc/nx:esbuild', - inputs: ['{projectRoot}/src/**/*'], - options: { - entryPoints: ['{projectRoot}/src/**/*.[jt]s?(x)', '!**/*.test.*'], - format: 'esm', - outDir: '{projectRoot}/dist/esm', - }, - outputs: ['{projectRoot}/dist/esm'], - }); + if (!mjs) { + addTarget(targets, 'build', 'esm', { + cache: true, + dependsOn: ['codegen'], + executor: '@clc/nx:esbuild', + inputs: ['{projectRoot}/src/**/*'], + options: { + entryPoints: [ + '{projectRoot}/src/**/*.?(m)[jt]s?(x)', + '!**/*.test.*', + ], + format: 'esm', + outDir: '{projectRoot}/dist/esm', + }, + outputs: ['{projectRoot}/dist/esm'], + }); + } addTarget(targets, 'build', 'types', { cache: true, @@ -144,7 +152,7 @@ export const createNodes: CreateNodes = [ cache: true, executor: '@clc/nx:package-json', inputs: ['{workspaceRoot}/package.json'], - options: {type}, + options: {mjs, mts, type}, outputs: ['{projectRoot}/package.json'], }); @@ -223,6 +231,7 @@ export const createNodes: CreateNodes = [ if (projectName.split('/').pop()?.startsWith('tool-')) { addTarget(targets, 'codegen', 'tool', { cache: true, + dependsOn: ['^build'], executor: '@code-like-a-carpenter/tool-tool:tool', inputs: ['{projectRoot}/tools/*.json'], options: { diff --git a/packages/@code-like-a-carpenter/assert/package.json b/packages/@code-like-a-carpenter/assert/package.json index 412ed0c5..089defe5 100644 --- a/packages/@code-like-a-carpenter/assert/package.json +++ b/packages/@code-like-a-carpenter/assert/package.json @@ -10,12 +10,10 @@ ".": { "import": { "types": "./dist/types/index.d.mts", - "carpentry": "./src/index.ts", - "default": "./dist/esm/index.mjs" + "default": "./src/index.mjs" }, "require": { "types": "./dist/cjs-types/index.d.ts", - "carpentry": "./src/index.ts", "default": "./dist/cjs/index.cjs" } }, diff --git a/packages/@code-like-a-carpenter/assert/src/assert.ts b/packages/@code-like-a-carpenter/assert/src/assert.mjs similarity index 82% rename from packages/@code-like-a-carpenter/assert/src/assert.ts rename to packages/@code-like-a-carpenter/assert/src/assert.mjs index fccf6395..f04ede91 100644 --- a/packages/@code-like-a-carpenter/assert/src/assert.ts +++ b/packages/@code-like-a-carpenter/assert/src/assert.mjs @@ -2,12 +2,17 @@ // eslint-disable-next-line no-restricted-imports import nodeAssert, {AssertionError} from 'assert'; -type Provider = () => string | Error; +/** + * @callback Provider + * @returns {string | Error} + */ -export function assert( - value: unknown, - message: string | Error | Provider -): asserts value { +/** + * @param value {unknown} + * @param message {string | Error | Provider} + * @returns {asserts value} + */ +export function assert(value, message) { if (typeof message === 'string' || message instanceof Error) { nodeAssert.ok(value, message); } else { diff --git a/packages/@code-like-a-carpenter/assert/src/assert.test.ts b/packages/@code-like-a-carpenter/assert/src/assert.test.mjs similarity index 80% rename from packages/@code-like-a-carpenter/assert/src/assert.test.ts rename to packages/@code-like-a-carpenter/assert/src/assert.test.mjs index aa3f6717..92d54c17 100644 --- a/packages/@code-like-a-carpenter/assert/src/assert.test.ts +++ b/packages/@code-like-a-carpenter/assert/src/assert.test.mjs @@ -1,11 +1,11 @@ import {AssertionError} from 'assert'; -import {assert} from './assert'; +import {assert} from './assert.mjs'; describe('assert', () => { it('throws a string error', () => { const fn = () => assert(false, 'error'); - expect(fn).toThrowError(AssertionError); + expect(fn).toThrow(AssertionError); expect(fn).toThrowErrorMatchingInlineSnapshot(`"error"`); }); @@ -13,19 +13,19 @@ describe('assert', () => { // say it does. it.skip('throws a custom error', () => { const fn = () => assert(false, new TypeError('error')); - expect(fn).toThrowError(TypeError); + expect(fn).toThrow(TypeError); expect(fn).toThrowErrorMatchingInlineSnapshot(); }); it('throws a provided string error', () => { const fn = () => assert(false, () => 'error'); - expect(fn).toThrowError(AssertionError); + expect(fn).toThrow(AssertionError); expect(fn).toThrowErrorMatchingInlineSnapshot(`"error"`); }); it('throws a provided custom error', () => { const fn = () => assert(false, () => new TypeError('error')); - expect(fn).toThrowError(TypeError); + expect(fn).toThrow(TypeError); expect(fn).toThrowErrorMatchingInlineSnapshot(`"error"`); }); }); diff --git a/packages/@code-like-a-carpenter/assert/src/index.mjs b/packages/@code-like-a-carpenter/assert/src/index.mjs new file mode 100644 index 00000000..d981f4c4 --- /dev/null +++ b/packages/@code-like-a-carpenter/assert/src/index.mjs @@ -0,0 +1 @@ +export * from './assert.mjs'; diff --git a/packages/@code-like-a-carpenter/assert/src/index.ts b/packages/@code-like-a-carpenter/assert/src/index.ts deleted file mode 100644 index 336b0ab1..00000000 --- a/packages/@code-like-a-carpenter/assert/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './assert'; diff --git a/packages/@code-like-a-carpenter/env/package.json b/packages/@code-like-a-carpenter/env/package.json index f05e6837..1b7606a4 100644 --- a/packages/@code-like-a-carpenter/env/package.json +++ b/packages/@code-like-a-carpenter/env/package.json @@ -6,12 +6,12 @@ ".": { "import": { "types": "./dist/types/index.d.mts", - "carpentry": "./src/index.ts", + "carpentry": "./src/index.mts", "default": "./dist/esm/index.mjs" }, "require": { "types": "./dist/cjs-types/index.d.ts", - "carpentry": "./src/index.ts", + "carpentry": "./src/index.mts", "default": "./dist/cjs/index.cjs" } }, diff --git a/packages/@code-like-a-carpenter/env/src/env.ts b/packages/@code-like-a-carpenter/env/src/env.mts similarity index 77% rename from packages/@code-like-a-carpenter/env/src/env.ts rename to packages/@code-like-a-carpenter/env/src/env.mts index c2bfd672..e1386c8d 100644 --- a/packages/@code-like-a-carpenter/env/src/env.ts +++ b/packages/@code-like-a-carpenter/env/src/env.mts @@ -1,5 +1,5 @@ -import {EnvironmentError} from './errors/environment-error'; -import {TypeNarrowingError} from './errors/type-narrowing-error'; +import {EnvironmentError} from './errors/environment-error.mts'; +import {TypeNarrowingError} from './errors/type-narrowing-error.mts'; /** * Returns the value of the environment variable with the given key, using diff --git a/packages/@code-like-a-carpenter/env/src/errors/environment-error.ts b/packages/@code-like-a-carpenter/env/src/errors/environment-error.mts similarity index 100% rename from packages/@code-like-a-carpenter/env/src/errors/environment-error.ts rename to packages/@code-like-a-carpenter/env/src/errors/environment-error.mts diff --git a/packages/@code-like-a-carpenter/env/src/errors/type-narrowing-error.ts b/packages/@code-like-a-carpenter/env/src/errors/type-narrowing-error.mts similarity index 100% rename from packages/@code-like-a-carpenter/env/src/errors/type-narrowing-error.ts rename to packages/@code-like-a-carpenter/env/src/errors/type-narrowing-error.mts diff --git a/packages/@code-like-a-carpenter/env/src/index.mts b/packages/@code-like-a-carpenter/env/src/index.mts new file mode 100644 index 00000000..ea70bef8 --- /dev/null +++ b/packages/@code-like-a-carpenter/env/src/index.mts @@ -0,0 +1,3 @@ +export * from './env.mts'; +export * from './errors/environment-error.mts'; +export * from './errors/type-narrowing-error.mts'; diff --git a/packages/@code-like-a-carpenter/env/src/index.ts b/packages/@code-like-a-carpenter/env/src/index.ts deleted file mode 100644 index 4d5e3945..00000000 --- a/packages/@code-like-a-carpenter/env/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './env'; -export * from './errors/environment-error'; -export * from './errors/type-narrowing-error'; diff --git a/packages/@code-like-a-carpenter/tool-deps/src/deps.ts b/packages/@code-like-a-carpenter/tool-deps/src/deps.ts index 2fbb6b15..d005a6f7 100644 --- a/packages/@code-like-a-carpenter/tool-deps/src/deps.ts +++ b/packages/@code-like-a-carpenter/tool-deps/src/deps.ts @@ -6,7 +6,7 @@ import {minimatch} from 'minimatch'; import {findLocalPackages} from '@code-like-a-carpenter/tooling-common'; -import type {DepsExecutor} from './__generated__/deps-types.ts'; +import type {DepsExecutor} from './__generated__/deps-types'; import {load} from './config'; import {runDepcheck} from './depcheck'; diff --git a/packages/@code-like-a-carpenter/tool-foundation/src/foundation.ts b/packages/@code-like-a-carpenter/tool-foundation/src/foundation.ts index 981aa978..88f72b6a 100644 --- a/packages/@code-like-a-carpenter/tool-foundation/src/foundation.ts +++ b/packages/@code-like-a-carpenter/tool-foundation/src/foundation.ts @@ -1,6 +1,6 @@ import {assert} from '@code-like-a-carpenter/assert'; -import type {Foundation} from './__generated__/foundation-types.ts'; +import type {Foundation} from './__generated__/foundation-types'; import {generateCode} from './lib'; export async function handler({ diff --git a/packages/@code-like-a-carpenter/tool-inliner/src/inliner.ts b/packages/@code-like-a-carpenter/tool-inliner/src/inliner.ts index 2e505d02..d4307533 100644 --- a/packages/@code-like-a-carpenter/tool-inliner/src/inliner.ts +++ b/packages/@code-like-a-carpenter/tool-inliner/src/inliner.ts @@ -7,7 +7,7 @@ import * as t from '@babel/types'; import {assert} from '@code-like-a-carpenter/assert'; -import type {InlinerExecutor} from './__generated__/inliner-types.ts'; +import type {InlinerExecutor} from './__generated__/inliner-types'; export async function handler(args: InlinerExecutor): Promise { const {sourceFile, targetFile, exportName} = args; diff --git a/packages/@code-like-a-carpenter/tool-json-schema/src/json-schema.ts b/packages/@code-like-a-carpenter/tool-json-schema/src/json-schema.ts index e4919355..40b325e6 100644 --- a/packages/@code-like-a-carpenter/tool-json-schema/src/json-schema.ts +++ b/packages/@code-like-a-carpenter/tool-json-schema/src/json-schema.ts @@ -4,7 +4,7 @@ import path from 'node:path'; import {glob} from 'glob'; -import type {JsonSchemaTool} from './__generated__/json-schema-types.ts'; +import type {JsonSchemaTool} from './__generated__/json-schema-types'; import {jsonSchemaToTypescript} from './json-schema-helpers'; export async function handler({ diff --git a/packages/@code-like-a-carpenter/tool-stack/src/list.ts b/packages/@code-like-a-carpenter/tool-stack/src/list.ts index 79174fc4..d00f9bb5 100644 --- a/packages/@code-like-a-carpenter/tool-stack/src/list.ts +++ b/packages/@code-like-a-carpenter/tool-stack/src/list.ts @@ -8,7 +8,7 @@ import { readPackageJson, } from '@code-like-a-carpenter/tooling-common'; -import type {StackListSchema} from './__generated__/list-types.ts'; +import type {StackListSchema} from './__generated__/list-types'; export async function handler(args: StackListSchema): Promise { const files = diff --git a/packages/@code-like-a-carpenter/tool-stack/src/name.ts b/packages/@code-like-a-carpenter/tool-stack/src/name.ts index 569bbd4d..2ea2756a 100644 --- a/packages/@code-like-a-carpenter/tool-stack/src/name.ts +++ b/packages/@code-like-a-carpenter/tool-stack/src/name.ts @@ -1,7 +1,7 @@ import {assert, fail} from '@code-like-a-carpenter/assert'; import {getStackName} from '@code-like-a-carpenter/tooling-common'; -import type {StackNameSchema} from './__generated__/name-types.ts'; +import type {StackNameSchema} from './__generated__/name-types'; export async function handler(args: StackNameSchema): Promise { if ('projectName' in args) { diff --git a/packages/@code-like-a-carpenter/tool-stack/src/proxy.ts b/packages/@code-like-a-carpenter/tool-stack/src/proxy.ts index 14e75603..9a786db6 100644 --- a/packages/@code-like-a-carpenter/tool-stack/src/proxy.ts +++ b/packages/@code-like-a-carpenter/tool-stack/src/proxy.ts @@ -7,7 +7,7 @@ import vhost from 'vhost'; import {assert} from '@code-like-a-carpenter/assert'; import {findLocalPackages} from '@code-like-a-carpenter/tooling-common'; -import type {StackProxySchema} from './__generated__/proxy-types.ts'; +import type {StackProxySchema} from './__generated__/proxy-types'; import {findEndpoints, findStacks} from './stacks'; // eslint-disable-next-line complexity diff --git a/tsconfig.base.json b/tsconfig.base.json index 7309859b..7923b58e 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "allowImportingTsExtensions": true, "allowJs": true, "checkJs": true, "declaration": true, @@ -8,7 +9,7 @@ "jsx": "react", "lib": ["dom", "es2022"], "module": "es2022", - "moduleResolution": "node", + "moduleResolution": "Node", "resolveJsonModule": true, "strict": true, "target": "es2022", diff --git a/tsconfig.json b/tsconfig.json index 3c62ebb8..0d55bf6c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,20 +4,29 @@ }, "extends": "./tsconfig.base.json", "include": [ - "*.ts", - "*.tsx", "*.js", "*.jsx", + "*.mjs", + "*.mts", + "*.ts", + "*.tsx", "examples/*/executors/**/*.js", + "examples/*/executors/**/*.mjs", + "examples/*/executors/**/*.mts", "examples/*/executors/**/*.ts", "examples/*/src/**/*.js", "examples/*/src/**/*.jsx", + "examples/*/src/**/*.mjs", + "examples/*/src/**/*.mts", "examples/*/src/**/*.ts", "examples/*/src/**/*.tsx", "packages/*/*/src/**/*.js", "packages/*/*/src/**/*.jsx", + "packages/*/*/src/**/*.mjs", + "packages/*/*/src/**/*.mts", "packages/*/*/src/**/*.ts", "packages/*/*/src/**/*.tsx", + "types/**/*.d.mts", "types/**/*.d.ts" ], "references": [