diff --git a/.eslintignore-js b/.eslintignore-js index e7d6e21..a3c58ed 100644 --- a/.eslintignore-js +++ b/.eslintignore-js @@ -1,4 +1,5 @@ node_modules packages/* !packages/check-compose +packages/check-compose/index.js packages/*/__test__/* diff --git a/.gitignore b/.gitignore index 2df7dfd..d030206 100644 --- a/.gitignore +++ b/.gitignore @@ -107,3 +107,6 @@ Session.vim # Typescript *.tsbuildinfo + +##### VS Code +*.code-workspace diff --git a/package-lock.json b/package-lock.json index e376a89..dbf7fb1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@stamp/compose": "^1.0.2" }, "devDependencies": { + "@types/jest": "^29.2.5", "@typescript-eslint/eslint-plugin": "^5.48.0", "@typescript-eslint/parser": "^5.48.0", "del-cli": "^3.0.0", @@ -31,6 +32,7 @@ "jest": "^29.3.1", "lerna": "^6.4.0", "prettier": "^2.8.2", + "ts-jest": "^29.0.5", "typescript": "^4.9.4" }, "engines": { @@ -5565,6 +5567,16 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.5.tgz", + "integrity": "sha512-H2cSxkKgVmqNHXP7TC2L/WUorrZu8ZigyRywfVzv6EyBlxj39n4C00hjXYQWsbwqgElaj/CiAeSRmk5GoaKTgw==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -5625,6 +5637,15 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "node_modules/@types/tape": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@types/tape/-/tape-4.13.2.tgz", + "integrity": "sha512-V1ez/RtYRGN9cNYApw5xf27DpMkTB0033X6a2i3KUmKhSojBfbWN0i3EgZxboUG96WJLHLdOyZ01aiZwVW5aSA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/yargs": { "version": "17.0.19", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.19.tgz", @@ -6713,6 +6734,18 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -14348,6 +14381,12 @@ "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", "dev": true }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -14471,6 +14510,12 @@ "node": ">=6" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/make-fetch-happen": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", @@ -17458,6 +17503,76 @@ "node": ">=8" } }, + "node_modules/ts-jest": { + "version": "29.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -18141,6 +18256,9 @@ }, "bin": { "check-compose": "bin/check-compose.js" + }, + "devDependencies": { + "@types/tape": "^4.13.2" } }, "packages/collision": { @@ -22386,6 +22504,7 @@ "@stamp/check-compose": { "version": "file:packages/check-compose", "requires": { + "@types/tape": "*", "lodash": "^4.17.15", "prettyjson": "^1.2.1", "tape": "^4.11.0" @@ -22590,6 +22709,16 @@ "@types/istanbul-lib-report": "*" } }, + "@types/jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.5.tgz", + "integrity": "sha512-H2cSxkKgVmqNHXP7TC2L/WUorrZu8ZigyRywfVzv6EyBlxj39n4C00hjXYQWsbwqgElaj/CiAeSRmk5GoaKTgw==", + "dev": true, + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -22650,6 +22779,15 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "@types/tape": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@types/tape/-/tape-4.13.2.tgz", + "integrity": "sha512-V1ez/RtYRGN9cNYApw5xf27DpMkTB0033X6a2i3KUmKhSojBfbWN0i3EgZxboUG96WJLHLdOyZ01aiZwVW5aSA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/yargs": { "version": "17.0.19", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.19.tgz", @@ -23420,6 +23558,15 @@ "update-browserslist-db": "^1.0.9" } }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -29120,6 +29267,12 @@ "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", "dev": true }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -29211,6 +29364,12 @@ } } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "make-fetch-happen": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", @@ -31440,6 +31599,42 @@ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, + "ts-jest": { + "version": "29.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", diff --git a/package.json b/package.json index 6f40175..410ea9b 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,7 @@ "ci": "npm run test", "test": "jest", "posttest": "npm run lint", - "postinstall": "npm run bootstrap & npm run build-clean", - "bootstrap": "lerna bootstrap", + "postinstall": "npm run build-clean", "publish": "lerna publish -i -- --access=public", "updated": "lerna updated", "clean": "lerna clean", @@ -38,6 +37,7 @@ "node": ">= 10.18.0" }, "devDependencies": { + "@types/jest": "^29.2.5", "@typescript-eslint/eslint-plugin": "^5.48.0", "@typescript-eslint/parser": "^5.48.0", "del-cli": "^3.0.0", @@ -53,9 +53,11 @@ "jest": "^29.3.1", "lerna": "^6.4.0", "prettier": "^2.8.2", + "ts-jest": "^29.0.5", "typescript": "^4.9.4" }, "jest": { + "preset": "ts-jest", "testEnvironment": "node", "coverageReporters": [ "html", diff --git a/packages/check-compose/index.js b/packages/check-compose/index.ts similarity index 67% rename from packages/check-compose/index.js rename to packages/check-compose/index.ts index bbc8b53..03cc5cf 100644 --- a/packages/check-compose/index.js +++ b/packages/check-compose/index.ts @@ -3,18 +3,18 @@ 'use strict'; -const fs = require('fs'); -const test = require('tape'); +import fs from 'fs'; +import ttest from 'tape'; -module.exports = (compose) => { +function checkCompose(compose: CM) { if (typeof compose !== 'function') throw new Error('"compose" must be a function'); const files = fs.readdirSync(__dirname).filter(RegExp.prototype.test.bind(/.+-tests\.js$/)); - const failures = []; + const failures: any[] = []; return new Promise((resolve) => { - test + ttest .createStream({ objectMode: true }) .on('data', (assert) => { if (assert.error) failures.push(assert); @@ -28,3 +28,8 @@ module.exports = (compose) => { }); }); }; + +export default checkCompose; + +module.exports = checkCompose; +Object.defineProperty(module.exports, 'default', { enumerable: false, value: checkCompose }); diff --git a/packages/check-compose/package.json b/packages/check-compose/package.json index 8d46f62..12ff2d4 100644 --- a/packages/check-compose/package.json +++ b/packages/check-compose/package.json @@ -7,9 +7,16 @@ "bin": { "check-compose": "./bin/check-compose.js" }, + "scripts": { + "build": "tsc", + "link": "npm run build && lerna link" + }, "dependencies": { "lodash": "^4.17.15", "prettyjson": "^1.2.1", "tape": "^4.11.0" + }, + "devDependencies": { + "@types/tape": "^4.13.2" } } diff --git a/packages/compose/__tests__/index.js b/packages/compose/__tests__/index.js deleted file mode 100644 index d96ca99..0000000 --- a/packages/compose/__tests__/index.js +++ /dev/null @@ -1,25 +0,0 @@ -/* eslint-disable global-require */ -/* eslint-disable jest/expect-expect */ -/* eslint-disable jest/no-test-return-statement */ -/* eslint-disable node/no-unpublished-require */ - -'use strict'; - -const checkCompose = require('@stamp/check-compose'); - -describe('@stamp/compose', function() { - it('passes official tests', function() { - const compose = require('..'); - return checkCompose(compose).then(function(result) { - const { failures } = result; - if (failures && failures.length > 0) { - const errorString = failures - .map(function(f) { - return JSON.stringify(f); - }) - .join('\n'); - throw new Error(errorString); - } - }); - }); -}); diff --git a/packages/compose/__tests__/index.ts b/packages/compose/__tests__/index.ts new file mode 100644 index 0000000..42e6618 --- /dev/null +++ b/packages/compose/__tests__/index.ts @@ -0,0 +1,32 @@ +/* eslint-disable global-require */ +/* eslint-disable jest/expect-expect */ +/* eslint-disable jest/no-test-return-statement */ +/* eslint-disable node/no-unpublished-require */ + +'use strict'; + +import checkCompose from '@stamp/check-compose'; +import { ComposeMethod } from '..'; + +describe('@stamp/compose', function () { + it('passes official tests', async () => { + return import('..') + .then(module => { + if (!module) { + throw new Error('Module could not be imported') + } + const compose = module.default; + return checkCompose(compose).then(result => { + const { failures } = result as { failures?: any[] }; + if (failures && failures.length > 0) { + const errorString = failures + .map(function (f) { + return JSON.stringify(f); + }) + .join('\n'); + throw new Error(errorString); + } + }); + }); + }); +}); diff --git a/packages/compose/index.ts b/packages/compose/index.ts index 31dbec9..49b2c40 100644 --- a/packages/compose/index.ts +++ b/packages/compose/index.ts @@ -30,7 +30,7 @@ export type ComposableFactoryParams = Parameters; * @param {...(Composable)} [arguments] The list of composables. * @returns {Stamp} A new stamp (aka composable factory function) */ -interface ComposeMethod { +export interface ComposeMethod { (this: Stamp | unknown, ...args: (Composable | undefined)[]): Stamp; } diff --git a/tsconfig.json b/tsconfig.json index 72d2abf..fa04d56 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -40,6 +40,7 @@ "pretty": true }, "exclude": [ - // "node_modules" + "node_modules", + "**/__tests__/*", ] }