Skip to content

Enable strict mode #13

@AndreasGassmann

Description

@AndreasGassmann

I'm trying to integrate this package into AirGap, but I'm running into a lot of build issues after including this package. They seem to be mostly related to strict mode, which we have enabled.

The first error that appears is:

@airgap/angular-core: ✖ Compiling TypeScript sources through NGC
@airgap/angular-core: ERROR: /Users/main/Programming/Papers/airgap-common-components/node_modules/@keystonehq/bc-ur-registry/src/ScriptExpression.ts:1:1: Error encountered in metadata generated for exported symbol 'ScriptExpression': 
@airgap/angular-core:  /Users/main/Programming/Papers/airgap-common-components/node_modules/@keystonehq/bc-ur-registry/src/ScriptExpression.ts:7:27: Metadata collected contains an error that will be reported at runtime: Lambda not supported.
@airgap/angular-core:   {"__symbolic":"error","message":"Lambda not supported","line":6,"character":26}
@airgap/angular-core: An unhandled exception occurred: /Users/main/Programming/Papers/airgap-common-components/node_modules/@keystonehq/bc-ur-registry/src/ScriptExpression.ts:1:1: Error encountered in metadata generated for exported symbol 'ScriptExpression': 
@airgap/angular-core:  /Users/main/Programming/Papers/airgap-common-components/node_modules/@keystonehq/bc-ur-registry/src/ScriptExpression.ts:7:27: Metadata collected contains an error that will be reported at runtime: Lambda not supported.
@airgap/angular-core:   {"__symbolic":"error","message":"Lambda not supported","line":6,"character":26}

Setting "strictMetadataEmit": false seems to fix this, but is not ideal.

I'm not sure what exactly the problem is, but it might be this: https://github.com/KeystoneHQ/ur-registry/blob/main/src/ScriptExpression.ts#L4-L5

Maybe you could instead use a getter for those? See https://stackoverflow.com/questions/57594723/angular-metadata-collected-contains-an-error-that-will-be-reported-at-runtime


After the above error is fixed, I get a lot of errors related to strict mode:

@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/lib/index.ts:8:8 - error TS7016: Could not find a declaration file for module './cbor-sync'. '/Users/main/Programming/Papers/airgap-common-components/node_modules/@keystonehq/bc-ur-registry/src/lib/cbor-sync.js' implicitly has an 'any' type.
@airgap/angular-core: 8 } from './cbor-sync';
@airgap/angular-core:          ~~~~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/utils.ts:3:7 - error TS7034: Variable 'alreadyPatchedTag' implicitly has type 'any[]' in some locations where its type cannot be determined.
@airgap/angular-core: 3 const alreadyPatchedTag = [];
@airgap/angular-core:         ~~~~~~~~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/utils.ts:6:9 - error TS7005: Variable 'alreadyPatchedTag' implicitly has an 'any[]' type.
@airgap/angular-core: 6     if (alreadyPatchedTag.find((i) => i === tag)) return;
@airgap/angular-core:           ~~~~~~~~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/patchCBOR.ts:11:11 - error TS2345: Argument of type '(number | undefined)[]' is not assignable to parameter of type 'number[]'.
@airgap/angular-core:   Type 'number | undefined' is not assignable to type 'number'.
@airgap/angular-core:     Type 'undefined' is not assignable to type 'number'.
@airgap/angular-core: 11 patchTags(registryTags.concat(scriptExpressionTags));
@airgap/angular-core:              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoCoinInfo.ts:39:7 - error TS7053: Element implicitly has an 'any' type because expression of type 'Keys.type' can't be used to index type '{}'.
@airgap/angular-core:   Property '[Keys.type]' does not exist on type '{}'.
@airgap/angular-core: 39       map[Keys.type] = this.type;
@airgap/angular-core:          ~~~~~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoCoinInfo.ts:42:7 - error TS7053: Element implicitly has an 'any' type because expression of type 'Keys.network' can't be used to index type '{}'.
@airgap/angular-core:   Property '[Keys.network]' does not exist on type '{}'.
@airgap/angular-core: 42       map[Keys.network] = this.network;
@airgap/angular-core:          ~~~~~~~~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoKeypath.ts:44:11 - error TS7034: Variable 'components' implicitly has type 'any[]' in some locations where its type cannot be determined.
@airgap/angular-core: 44     const components = [];
@airgap/angular-core:              ~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoKeypath.ts:54:28 - error TS7005: Variable 'components' implicitly has an 'any[]' type.
@airgap/angular-core: 54     map[Keys.components] = components;
@airgap/angular-core:                               ~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoKeypath.ts:88:46 - error TS2454: Variable 'sourceFingerprint' is used before being assigned.
@airgap/angular-core: 88     return new CryptoKeypath(pathComponents, sourceFingerprint, depth);
@airgap/angular-core:                                                 ~~~~~~~~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:40:11 - error TS2564: Property 'master' has no initializer and is not definitely assigned in the constructor.
@airgap/angular-core: 40   private master: boolean;
@airgap/angular-core:              ~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:41:11 - error TS2564: Property 'privateKey' has no initializer and is not definitely assigned in the constructor.
@airgap/angular-core: 41   private privateKey: boolean;
@airgap/angular-core:              ~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:42:11 - error TS2564: Property 'key' has no initializer and is not definitely assigned in the constructor.
@airgap/angular-core: 42   private key: Buffer;
@airgap/angular-core:              ~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:43:11 - error TS2564: Property 'chainCode' has no initializer and is not definitely assigned in the constructor.
@airgap/angular-core: 43   private chainCode: Buffer;
@airgap/angular-core:              ~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:44:11 - error TS2564: Property 'useInfo' has no initializer and is not definitely assigned in the constructor.
@airgap/angular-core: 44   private useInfo: CryptoCoinInfo;
@airgap/angular-core:              ~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:45:11 - error TS2564: Property 'origin' has no initializer and is not definitely assigned in the constructor.
@airgap/angular-core: 45   private origin: CryptoKeypath;
@airgap/angular-core:              ~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:46:11 - error TS2564: Property 'children' has no initializer and is not definitely assigned in the constructor.
@airgap/angular-core: 46   private children: CryptoKeypath;
@airgap/angular-core:              ~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:47:11 - error TS2564: Property 'parentFingerprint' has no initializer and is not definitely assigned in the constructor.
@airgap/angular-core: 47   private parentFingerprint: Buffer;
@airgap/angular-core:              ~~~~~~~~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:48:11 - error TS2564: Property 'name' has no initializer and is not definitely assigned in the constructor.
@airgap/angular-core: 48   private name: string;
@airgap/angular-core:              ~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:49:11 - error TS2564: Property 'note' has no initializer and is not definitely assigned in the constructor.
@airgap/angular-core: 49   private note: string;
@airgap/angular-core:              ~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:72:7 - error TS2322: Type 'number | undefined' is not assignable to type 'number'.
@airgap/angular-core:   Type 'undefined' is not assignable to type 'number'.
@airgap/angular-core: 72       depth = this.getOrigin().getComponents().length || this.getOrigin().getDepth();
@airgap/angular-core:          ~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:88:31 - error TS2454: Variable 'index' is used before being assigned.
@airgap/angular-core: 88     indexBuffer.writeUInt32BE(index, 0);
@airgap/angular-core:                                  ~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:115:5 - error TS2322: Type 'boolean | undefined' is not assignable to type 'boolean'.
@airgap/angular-core:   Type 'undefined' is not assignable to type 'boolean'.
@airgap/angular-core: 115     this.privateKey = args.isPrivateKey;
@airgap/angular-core:         ~~~~~~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:117:5 - error TS2322: Type 'Buffer | undefined' is not assignable to type 'Buffer'.
@airgap/angular-core:   Type 'undefined' is not assignable to type 'Buffer'.
@airgap/angular-core: 117     this.chainCode = args.chainCode;
@airgap/angular-core:         ~~~~~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:118:5 - error TS2322: Type 'CryptoCoinInfo | undefined' is not assignable to type 'CryptoCoinInfo'.
@airgap/angular-core:   Type 'undefined' is not assignable to type 'CryptoCoinInfo'.
@airgap/angular-core: 118     this.useInfo = args.useInfo;
@airgap/angular-core:         ~~~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:119:5 - error TS2322: Type 'CryptoKeypath | undefined' is not assignable to type 'CryptoKeypath'.
@airgap/angular-core:   Type 'undefined' is not assignable to type 'CryptoKeypath'.
@airgap/angular-core: 119     this.origin = args.origin;
@airgap/angular-core:         ~~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:120:5 - error TS2322: Type 'CryptoKeypath | undefined' is not assignable to type 'CryptoKeypath'.
@airgap/angular-core:   Type 'undefined' is not assignable to type 'CryptoKeypath'.
@airgap/angular-core: 120     this.children = args.children;
@airgap/angular-core:         ~~~~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:121:5 - error TS2322: Type 'Buffer | undefined' is not assignable to type 'Buffer'.
@airgap/angular-core:   Type 'undefined' is not assignable to type 'Buffer'.
@airgap/angular-core: 121     this.parentFingerprint = args.parentFingerprint;
@airgap/angular-core:         ~~~~~~~~~~~~~~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:122:5 - error TS2322: Type 'string | undefined' is not assignable to type 'string'.
@airgap/angular-core:   Type 'undefined' is not assignable to type 'string'.
@airgap/angular-core: 122     this.name = args.name;
@airgap/angular-core:         ~~~~~~~~~
@airgap/angular-core: ../../node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts:123:5 - error TS2322: Type 'string | undefined' is not assignable to type 'string'.
@airgap/angular-core:   Type 'undefined' is not assignable to type 'string'.

To get rid of those errors, we would have to disable strict mode in our project.

I think you will be able to reproduce most of those errors if you enable strict mode in your tsconfig.json. We have the following settings:

    "strict": true /* Enable all strict type-checking options. */,
    "strictNullChecks": true /* Enable strict null checks. */,
    "strictFunctionTypes": true /* Enable strict checking of function types. */,
    "strictBindCallApply": true /* Enable strict 'bind', 'call', and 'apply' methods on functions. */,
    "strictPropertyInitialization": true /* Enable strict checking of property initialization in classes. */,
    "alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */,
    /* Additional Checks */
    "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */,
    "noImplicitThis": true /* Raise error on 'this' expressions with an implied 'any' type. */,
    "noImplicitReturns": true /* Report error when not all code paths in function return a value. */,
    "noUnusedLocals": true /* Report errors on unused locals. */,
    "noUnusedParameters": true /* Report errors on unused parameters. */,
    "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */,
    "forceConsistentCasingInFileNames": true
  "angularCompilerOptions": {
    "enableIvy": false,
    "strictInjectionParameters": true,
    "fullTemplateTypeCheck": true,
    "strictTemplates": true,
    "strictInputAccessModifiers": true,
    "strictMetadataEmit": true
  },

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions