From 6495ec329487a30d9b7a84e0a2516eae93c956e1 Mon Sep 17 00:00:00 2001 From: ersimont <8042088+ersimont@users.noreply.github.com> Date: Wed, 11 Nov 2020 14:57:58 -0500 Subject: [PATCH] feat(micro-dash): add `isObject()` --- package.json | 4 +- projects/micro-dash-sizes/calc-sizes.ts | 8 ++-- .../src/app/lang/is-object.lodash.ts | 3 ++ .../src/app/lang/is-object.microdash.ts | 3 ++ projects/micro-dash-sizes/tsconfig.app.json | 5 ++- projects/micro-dash/src/lib/lang/index.ts | 1 + .../micro-dash/src/lib/lang/is-object.spec.ts | 39 +++++++++++++++++++ projects/micro-dash/src/lib/lang/is-object.ts | 10 +++++ 8 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 projects/micro-dash-sizes/src/app/lang/is-object.lodash.ts create mode 100644 projects/micro-dash-sizes/src/app/lang/is-object.microdash.ts create mode 100644 projects/micro-dash/src/lib/lang/is-object.spec.ts create mode 100644 projects/micro-dash/src/lib/lang/is-object.ts diff --git a/package.json b/package.json index 6f53b6bc..559da019 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,8 @@ "prenpm-publish": "yarn ts-node scripts/build-libs", "npm-publish": "yarn ts-node scripts/publish-libs", "precalc-micro-dash-sizes": "ng build --prod micro-dash", - "calc-micro-dash-sizes": "cd projects/micro-dash-sizes && yarn ts-node calc-sizes", - "ts-node": "ts-node -O \"{ \\\"module\\\": \\\"CommonJS\\\" }\"" + "calc-micro-dash-sizes": "cd projects/micro-dash-sizes && ts-node --project tsconfig.app.json -O \"{ \\\"module\\\": \\\"CommonJS\\\" }\" calc-sizes", + "ts-node": "ts-node -O \"{ \\\"module\\\": \\\"commonjs\\\" }\"" }, "dependencies": { "@angular/animations": "~10.2.2", diff --git a/projects/micro-dash-sizes/calc-sizes.ts b/projects/micro-dash-sizes/calc-sizes.ts index d1704364..99f313c7 100644 --- a/projects/micro-dash-sizes/calc-sizes.ts +++ b/projects/micro-dash-sizes/calc-sizes.ts @@ -7,9 +7,9 @@ import * as readline from 'readline'; import { explore } from 'source-map-explorer'; import { forEach } from '../micro-dash/src/lib/collection'; -const appDir = path.join(__dirname, 'src', 'app'); -const mainDir = path.join(__dirname, 'src'); const rootDir = path.join(__dirname, '..', '..'); +const mainDir = path.join(__dirname, 'src'); +const appDir = path.join(mainDir, 'app'); const bundleDir = path.join(rootDir, 'dist', 'micro-dash-sizes'); const sourceDir = path.join(rootDir, 'projects', 'micro-dash', 'src', 'lib'); @@ -74,7 +74,7 @@ async function build(inputPath: string): Promise { }); } -async function inspect(): Promise { +async function inspect(): Promise { const res = await explore(path.join(bundleDir, 'main.*.js')); let lodash = 0; @@ -86,7 +86,7 @@ async function inspect(): Promise { microdash += size; } }); - let summary: string; + let summary: string | undefined; if (lodash > 0) { summary = ` * - Lodash: ${lodash.toLocaleString()} bytes`; } else if (microdash > 0) { diff --git a/projects/micro-dash-sizes/src/app/lang/is-object.lodash.ts b/projects/micro-dash-sizes/src/app/lang/is-object.lodash.ts new file mode 100644 index 00000000..8516be3f --- /dev/null +++ b/projects/micro-dash-sizes/src/app/lang/is-object.lodash.ts @@ -0,0 +1,3 @@ +import isObject from 'lodash-es/isObject'; + +console.log(isObject(1), isObject({})); diff --git a/projects/micro-dash-sizes/src/app/lang/is-object.microdash.ts b/projects/micro-dash-sizes/src/app/lang/is-object.microdash.ts new file mode 100644 index 00000000..e6a8084c --- /dev/null +++ b/projects/micro-dash-sizes/src/app/lang/is-object.microdash.ts @@ -0,0 +1,3 @@ +import { isObject } from '@s-libs/micro-dash'; + +console.log(isObject(1), isObject({})); diff --git a/projects/micro-dash-sizes/tsconfig.app.json b/projects/micro-dash-sizes/tsconfig.app.json index 74119609..27e3ba9f 100644 --- a/projects/micro-dash-sizes/tsconfig.app.json +++ b/projects/micro-dash-sizes/tsconfig.app.json @@ -3,7 +3,10 @@ "extends": "../../tsconfig.json", "compilerOptions": { "outDir": "../../out-tsc/app", - "types": [] + "types": [], + + // Special just for micro-dash library functions, to reduce bundle size + "noImplicitReturns": false }, "files": ["src/main.ts"], "include": ["src/**/*.d.ts"] diff --git a/projects/micro-dash/src/lib/lang/index.ts b/projects/micro-dash/src/lib/lang/index.ts index 8288b2cd..8c3fc1c6 100644 --- a/projects/micro-dash/src/lib/lang/index.ts +++ b/projects/micro-dash/src/lib/lang/index.ts @@ -8,6 +8,7 @@ export { isFunction } from './is-function'; export { isMatch } from './is-match'; export { isNil } from './is-nil'; export { isNumber } from './is-number'; +export { isObject } from './is-object'; export { isRegExp } from './is-reg-exp'; export { isString } from './is-string'; export { isUndefined } from './is-undefined'; diff --git a/projects/micro-dash/src/lib/lang/is-object.spec.ts b/projects/micro-dash/src/lib/lang/is-object.spec.ts new file mode 100644 index 00000000..f5d80091 --- /dev/null +++ b/projects/micro-dash/src/lib/lang/is-object.spec.ts @@ -0,0 +1,39 @@ +import { isObject } from './is-object'; + +describe('isObject()', () => { + function getArguments(): IArguments { + return arguments; + } + + // + // stolen from https://github.com/lodash/lodash + // + + it('should return `true` for objects', () => { + expect(isObject(getArguments())).toBe(true); + expect(isObject([1, 2, 3])).toBe(true); + expect(isObject(Object(false))).toBe(true); + expect(isObject(new Date())).toBe(true); + expect(isObject(new Error())).toBe(true); + expect(isObject(Array.prototype.slice)).toBe(true); + expect(isObject({ a: 1 })).toBe(true); + expect(isObject(Object(0))).toBe(true); + expect(isObject(/x/)).toBe(true); + expect(isObject(Object('a'))).toBe(true); + expect(isObject(document.body)).toBe(true); + expect(isObject(Object(Symbol('a')))).toBe(true); + }); + + it('should return `false` for non-objects', () => { + expect(isObject(null)).toBe(false); + expect(isObject(undefined)).toBe(false); + expect(isObject(false)).toBe(false); + expect(isObject(0)).toBe(false); + expect(isObject(NaN)).toBe(false); + expect(isObject('')).toBe(false); + expect(isObject(true)).toBe(false); + expect(isObject(1)).toBe(false); + expect(isObject('a')).toBe(false); + expect(isObject(Symbol('a'))).toBe(false); + }); +}); diff --git a/projects/micro-dash/src/lib/lang/is-object.ts b/projects/micro-dash/src/lib/lang/is-object.ts new file mode 100644 index 00000000..a308f56d --- /dev/null +++ b/projects/micro-dash/src/lib/lang/is-object.ts @@ -0,0 +1,10 @@ +/** + * Checks if `value` is the [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) of `Object`. _(e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)_ + * + * Contribution to minified bundle size, when it is the only function imported: + * - Lodash: 105 bytes + * - Micro-dash: 41 bytes + */ +export function isObject(value: any): value is object { + return value instanceof Object; +}