npm - Typescript lös typer för privat scope-paket


Jag har ett paket som är hostat i en Azure Artifacts npm-feed, scopat till @company, t.ex. för att lägga till paketet använder vi yarn add @company/package. Detta paket är ett TypeScript-projekt som när det kompileras även inkluderar typpfiler.

När man använder det löses inte de exponerade typerna, och kompileringen misslyckas.

Exempel på konstruktion:

  • bygga

    • index.js
    • index.d.ts

Exempel package.json

{
  "name": "@company/package",
  "version": "0.0.5",
  "module": "./build/index.js",
  "types": "./build/index.d.ts",
  "scripts": {
    "build": "rimraf ./build && tsc -p tsconfig.json --noEmit false",
    "prepublish": "npm run build"
  },
  "devDependencies": {
    "typescript": "^3.9.7"
  },
  "files": [
    "build/"
  ]
}

På samma nivå som package.json finns en .npmrc-fil och en tsconfig.json-fil.

.npmrc

@company:registry=https://company.pkgs.visualstudio.com/_packaging/company-npm/npm/registry/
                        
always-auth=true

tsconfig.json

{
  "compilerOptions": {
    "module": "esnext",
    "target": "ES2015",
    "lib": [
      "es2018",
      "dom"
    ],
    "sourceMap": true,
    "allowJs": false,
    "jsx": "preserve",
    "preserveConstEnums": false,
    "moduleResolution": "node",
    "rootDir": "src",
    "forceConsistentCasingInFileNames": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noImplicitAny": true,
    "strictNullChecks": false,
    "suppressImplicitAnyIndexErrors": true,
    "removeComments": true,
    "skipLibCheck": true,
    "typeRoots": [
      "node_modules/@types"
    ],
    "noUnusedLocals": true,
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "outDir": "build/esm",
    "declaration": true,
    "isolatedModules": true,
    "noEmit": true
  },
  "include": [
    "src/**/*"
  ],
  "exclude": [
    "node_modules/*",
    "build",
    "scripts",
    "acceptance-tests",
    "webpack",
    "jest",
    "src/setupTests.ts",
    "src/__mocks__/Api.ts"
  ]
}

Vi kan installera publika npmjs-paket och @types utan problem, och @company/package fungerar också (en @company-mapp dyker upp i node_modules och inkluderar paketkoden, inklusive index.d.ts-filen).

När man refererar till koden från vårt paket (som råkar vara React-komponenter), visas fel som säger JSX element type 'Button' does not have any construct or call signatures, vilket är ett resultat av att TypeScript-typningen inte löses korrekt.

Vi har försökt ändra tsconfig.json för projektet som använder det scoped-paketet, så att typerötterna även inkluderar @company-scope, t.ex.

"typeRoots": [
      "node_modules/@types",
      "node_modules/@company"
],

Vi har också försökt olika iterationer av att installera typerna (som inte har publicerats manuellt, jag tänkte bara att det kanske skulle fungera som en del av npm publish) yarn add -D @company/@types/package @types/@company@package men båda kommandona returnerar följande fel;

yarn add v1.22.0
warning package.json: No license field
warning [email : No license field
[1/4] Resolving packages...
error Command failed.
Exit code: 128
Command: git
Arguments: ls-remote --tags --heads ssh://[email /types/company-react-components.git
Directory: /mnt/c/Users/user/source/repos/project/src/project.Ui
Output:
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.

Hur refererar man korrekt till typer som publicerats som en del av ett scoped-paket? Om det refereras korrekt, varför löses inte typerna?

Svar #1

Jag vet att detta är en gammal fråga, men jag spenderade precis en halv dag med att slå mitt huvud mot väggen innan jag fick det att fungera.

Du behöver namnge ditt paket @myorg/mypackage för att npm ska använda scopet @myorg:registry=https://pkgs.dev.azure.com/... som du har definierat i .npmrc.

För att göra TypeScript nöjd, och för att slippa manuellt justera typeRoots, kan du installera paketet och aliasa det tillbaka till @types/myorg__mypackage namngivning:

npm i @types/myorg__mypackage@npm:@myorg/mypackage@latest --save-dev

Du skulle förmodligen vilja dokumentera det i readme-filen, eftersom det alls inte är intuitivt för de stackars själarna som vill använda paketet.

Relaterade artiklar