Skip to content

Commit

Permalink
Fix absolute path import typings (#72)
Browse files Browse the repository at this point in the history
* Add build check for absolute path typings

* Fix typings
  • Loading branch information
jscheiny authored Nov 1, 2018
1 parent 250d62e commit aac30ff
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 7 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@
"compile:src": "tsc -p src",
"lint:codegen": "tslint -p codegen/tsconfig.json -c tslint.json",
"lint:src": "tslint -p src/tsconfig.json -c tslint.json",
"lint": "npm-run-all -p lint:codegen lint:src",
"lint:types": "./scripts/check-typings.sh",
"lint": "npm-run-all -p lint:codegen lint:src lint:types",
"node:codegen": "node codegen/dist/emit",
"test": "jest --config jest.config.json",
"prepack": "yarn build",
Expand Down
8 changes: 8 additions & 0 deletions scripts/check-typings.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/usr/bin/env bash

if grep -q 'import(".*")\.' dist/**/*.d.ts; then
echo "ERROR: Found import() typings in dist .d.ts files. Check for exported values with inferred types."
exit 1
else
echo "No problematic typings found."
fi
4 changes: 2 additions & 2 deletions src/measure/measure.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { createMeasureType, GenericMeasure } from "./genericMeasure";
import { createMeasureType, GenericMeasure, GenericMeasureFactory } from "./genericMeasure";
import { Unit } from "./unitTypeArithmetic";

export type Measure<U extends Unit> = GenericMeasure<U, number>;
export const Measure = createMeasureType({
export const Measure: GenericMeasureFactory<number> = createMeasureType({
guard: (value): value is number => typeof value === "number",
one: () => 1,
neg: x => -x,
Expand Down
4 changes: 3 additions & 1 deletion src/quantity/quantities.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { GenericMeasure } from "../measure/genericMeasure";
import { Measure } from "../measure/measure";
import * as Base from "../unit/base";

// Dimensionless

/** A measure without any unit */
export const Dimensionless = Measure.dimensionless(1);
// HACKHACK: Explicitly type this so we can import GenericMeasure and avoid absolute paths in the generated typings.
export const Dimensionless: GenericMeasure<{}, number> = Measure.dimensionless(1);
export type Dimensionless = typeof Dimensionless;

// Base units
Expand Down
4 changes: 3 additions & 1 deletion src/unit/base.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { GenericMeasure } from "../measure/genericMeasure";
import { Measure } from "../measure/measure";

export const meters = Measure.dimension("length", "m");
// HACKHACK: Explicitly type this so we can import GenericMeasure and avoid absolute paths in the generated typings.
export const meters: GenericMeasure<{ length: 1 }, number> = Measure.dimension("length", "m");
export const kilograms = Measure.dimension("mass", "kg");
export const grams = Measure.of(0.001, kilograms, "g");
export const seconds = Measure.dimension("time", "s");
Expand Down
12 changes: 10 additions & 2 deletions src/unit/metric.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Exponent } from "../exponent";
import { GenericMeasure } from "../measure/genericMeasure";
import { Measure } from "../measure/measure";
import { Unit } from "../measure/unitTypeArithmetic";
import * as Quantity from "../quantity/quantities";
import { amperes, candelas, kilograms, meters, moles, seconds, steradians } from "./base";

Expand All @@ -23,7 +24,14 @@ export const luxes: Quantity.Illuminance = lumens.per(meters.squared()).withSymb

// Prefixes

function createPrefix(symbolPrefix: string, multiplier: number): <U extends Unit>(unit: Measure<U>) => Measure<U> {
// HACKHACK: Many of the typings here could be made more simple but instead use their base types to avoid absolute paths
// in the generated typings.
function createPrefix(
symbolPrefix: string,
multiplier: number,
): <U extends Partial<{ [dimension: string]: Exponent }>>(
unit: GenericMeasure<U, number>,
) => GenericMeasure<U, number> {
return unit => {
const { symbol } = unit;
const newSymbol = symbol !== undefined ? `${symbolPrefix}${symbol}` : undefined;
Expand Down

0 comments on commit aac30ff

Please sign in to comment.