Skip to content

Commit

Permalink
fix: don't error out while catching a buildStart error (#422)
Browse files Browse the repository at this point in the history
- per in-line comment, if an error occurs during `buildStart` initialization, then the `cache` may not exist yet during `buildDone`
  - since we now use `context.error` instead of `throw` during initialization (from the `options` -> `buildStart` change), `buildEnd` will run during initialization
    - and the `cache` var is initialized in `buildStart` as well, so if an error occurs before then, the `cache` won't exist
      - we should gracefully handle this in all cases, since it's possible that even creating the `cache` could throw an error

- this error was hiding the underlying error, which was problematic for DX as well as bug reports (see my issue follow-up)

- add an integration test for `tsconfig` to make sure this code works
  - while this is similar to the previous `tsconfig` integration tests (that were moved to unit tests), this covers all cases of `buildStart` errors, and is not specific to the different `tsconfig` errors (unlike the unit tests)
  - this test will fail without the source code changes in this commit
  • Loading branch information
agilgur5 authored Sep 20, 2022
1 parent 0b99f8e commit e8f59ef
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 1 deletion.
7 changes: 7 additions & 0 deletions __tests__/integration/errors.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,3 +88,10 @@ test("integration - type-only import error - abortOnError: false / check: false"
expect(output.length).toEqual(files.length); // no other files
expect(onwarn).toBeCalledTimes(1);
});

// integration test variant of parse-tsconfig unit test, to test how other hooks interact with an error thrown in buildStart
test("integration - tsconfig error", async () => {
await expect(genBundle("semantic.ts", {
tsconfigOverride: { compilerOptions: { module: "none" } },
})).rejects.toThrow("Incompatible tsconfig option. Module resolves to 'None'. This is incompatible with Rollup, please use");
});
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ const typescript: PluginImpl<RPT2Options> = (options) =>
if (!watchMode && !noErrors)
context.info(yellow("there were errors or warnings."));

cache.done();
cache?.done(); // if there's an initialization error in `buildStart`, such as a `tsconfig` error, the cache may not exist yet
}

const pluginOptions: IOptions = Object.assign({},
Expand Down

0 comments on commit e8f59ef

Please sign in to comment.