arethetypeswrong / arethetypeswrong/arethetypeswrong.github.io

How to check globs in exports

オープン
#73 コメント 0 件 リアクション 1 件 担当者 0 名 GitHub で見る
主要言語
TypeScript
スター
1.6k
フォーク
65
PR マージ指標
30日以内にマージされた PR はありません

説明

I wrote a wrapper around the invocation of attw, some may find it helpful:

```js
async function lintPublishedTypes({ cwd }) {
let manifest = await packageJson.read(cwd);
let name = manifest.name;

let entrypoints = [];

for (let [entryGlob, mapping] of Object.entries(manifest['exports'])) {
if (!entryGlob.includes('*')) {
let entry = path.join(name, entryGlob);

entrypoints.push(entry);
continue;
}

const files = globbySync(mapping.types.replace('*', '**/*'), {cwd});

// Map the files to full module paths
const mappedFiles = files.map(file => {
// Now that we found files, we need to map them _back_ to entrypoints.
// Based on the entryGlob, we need to remove the path leading up until the '*',
let toRemove = mapping.types.split('*')[0];
let moduleName = file.split(toRemove)[1];

// we need to chop off the extension IFF the mapping.types includes it
if (mapping.types.endsWith('.d.ts')) {
moduleName = moduleName.replace('.d.ts', '');
}

return moduleName;
});

entrypoints.push(...mappedFiles);
}

entrypoints = entrypoints
// Remove stuff we are going to exclude
.filter(entry => !entry.endsWith('*'))
.filter(entry => !entry.endsWith('addon-main'))
// Remove index files
.filter(entry => !entry.endsWith('index'));

let args = [
'attw', '--pack',
// This does not provide types
'--exclude-entrypoints', 'addon-main',
// We turn this one off because we don't care about CJS consumers
'--ignore-rules', 'cjs-resolves-to-esm',
// Wildcard is not official supported
'--ignore-rules', 'wildcard',
// publint will handle resolving
'--ignore-rules', 'internal-resolution-error',
'--include-entrypoints', ...entrypoints
];

console.info(chalk.blueBright('Running:\n', args.join(' ')));

await execa('pnpm', args, {
cwd,
stdio: 'inherit',
});
}

```

This takes my exports:
```
"exports": {
".": {
"types": "./dist-types/index.d.ts",
"default": "./dist/index.js"
},
"./*": {
"types": "./dist-types/*.d.ts",
"default": "./dist/*.js"
},
"./test-support": {
"types": "./dist-types/test-support/index.d.ts",
"default": "./dist/test-support/index.js"
},
"./addon-main": "./addon-main.cjs"
},
```

and invokes this command:

```
attw --pack \
--exclude-entrypoints addon-main \
--ignore-rules cjs-resolves-to-esm \
--ignore-rules wildcard \
--ignore-rules internal-resolution-error \
--include-entrypoints \
ember-primitives color-scheme helpers iframe proper-links template-registry utils \
components/dialog components/external-link components/link components/popover components/portal-targets components/portal components/shadowed components/switch components/toggle helpers/service \
test-support/routing \
components/-private/typed-elements components/-private/utils components/dialog/element-state components/dialog/state \
ember-primitives/test-support

```

it's not perfect -- but it's progress

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

調査の方向性

Issue に示されている提案済みの lintPublishedTypes wrapper と package exports のマッピングから始めます。表示されている attw コマンドを列挙された entrypoint に対して実行し、その wildcard exports の扱いを生成された entrypoint リストと比較します。glob 化された exports を手動の workaround なしで確実にチェックできれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
javascript, typescript
領域
devtools
issue の種類
機能追加
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。