Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add TypeScript definitions #3

Merged
merged 29 commits into from
Mar 2, 2021
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
6f1b747
Mark argument as optional in documentation
mdingena Apr 24, 2020
965123a
PascalCase for React elements
mdingena Apr 24, 2020
6446e47
Update package author
mdingena Apr 24, 2020
d4d08e2
Add types (WIP)
mdingena Jun 3, 2020
60c49ff
Revert "Add types (WIP)"
mdingena Aug 13, 2020
ad2349a
Add dependencies and config
mdingena Aug 13, 2020
41904dd
Copy ResizeObserver type definitions from up-to-spec dependency
mdingena Aug 13, 2020
0d7a25c
Copy ResizeObserver type definitions to both src/ and dist/ directories
mdingena Oct 5, 2020
0a11350
Create tsconfig.json
mdingena Oct 5, 2020
ed058a7
Convert code to TypeScript
mdingena Oct 5, 2020
3fa2c59
Downgrade TypeScript due to ESLint weirdness
mdingena Oct 5, 2020
7b9395b
Export extended interfaces
mdingena Oct 5, 2020
47faa43
Expose types
mdingena Oct 5, 2020
b36a8f9
Clean up dist/ before building
mdingena Oct 5, 2020
70177c5
Update ResizeObserverContext.tsx
mdingena Oct 5, 2020
5e646a8
Add useResizeObserver types
mdingena Oct 5, 2020
7b7e477
Rename file (no TSX present)
mdingena Oct 5, 2020
d9947cd
Do not expose temporary temporary extended interfaces
mdingena Oct 5, 2020
02567a6
Update tsconfig.json
mdingena Oct 5, 2020
24bca2e
Rename ResizeObserverConstructor type
mdingena Oct 5, 2020
7ff53e8
Update JSDoc
mdingena Oct 5, 2020
3b65951
Update JSDoc
mdingena Oct 5, 2020
52f1d3b
Update with upcoming TS 4.2 changes
mdingena Jan 15, 2021
cfd5b01
Remove package-lock.json conflict with master
mdingena Jan 15, 2021
dc04877
Merge branch 'master' into typescript
mdingena Jan 15, 2021
3364fb9
Upgrade typescript package
mdingena Mar 2, 2021
e1afe63
Update peer dependency versions
mdingena Mar 2, 2021
81cc99c
Update .gitignore
mdingena Mar 2, 2021
d9ee924
Remove scripts spike
mdingena Mar 2, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# dependencies
/node_modules
/src/resize-observer
/.pnp
.pnp.js

Expand All @@ -16,6 +17,7 @@
.env.development.local
.env.test.local
.env.production.local
.eslintcache

npm-debug.log*
yarn-debug.log*
Expand Down
5,428 changes: 2,184 additions & 3,244 deletions package-lock.json

Large diffs are not rendered by default.

57 changes: 48 additions & 9 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,25 @@
"version": "1.0.1",
"description": "Observe multiple React components with a single ResizeObserver.",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"scripts": {
"build": "babel src/ -d dist/ --source-maps",
"src-type-definitions": "node scripts/src-type-definitions.js",
"dist-type-definitions": "node scripts/dist-type-definitions.js",
mdingena marked this conversation as resolved.
Show resolved Hide resolved
"build": "rimraf dist/ && npm run src-type-definitions && npx tsc && npm run dist-type-definitions",
"prepare": "npm run build"
},
"repository": {
"type": "git",
"url": "git+https://github.com/envato/react-resize-observer-hook.git"
},
"keywords": [
"resize-observer",
"react-hooks",
"hooks",
"react",
"performance",
"resize-observer"
"performance"
],
"author": "Envato",
"author": "marc.dingena@envato.com",
"license": "MIT",
"bugs": {
"url": "https://github.com/envato/react-resize-observer-hook/issues"
Expand All @@ -29,11 +32,47 @@
"react-dom": "^16.12.0"
},
"devDependencies": {
"@babel/cli": "^7.8.4",
"@babel/core": "^7.8.6",
"@babel/preset-env": "^7.7.7",
"@babel/preset-react": "^7.8.3",
"@juggle/resize-observer": "^3.2.0",
"@types/react": "^16.9.46",
"@typescript-eslint/eslint-plugin": "^2.34.0",
"@typescript-eslint/parser": "^2.34.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.8.0",
"eslint-config-react-app": "^5.2.1",
"eslint-plugin-flowtype": "^4.7.0",
"eslint-plugin-import": "^2.22.0",
"eslint-plugin-jsx-a11y": "^6.3.1",
"eslint-plugin-react": "^7.20.6",
"eslint-plugin-react-hooks": "^2.5.1",
"husky": "^4.2.5",
"lint-staged": "^10.2.11",
"prettier": "^2.0.5",
"react": "^16.12.0",
"react-dom": "^16.12.0"
"react-dom": "^16.12.0",
"rimraf": "^3.0.2",
"typescript": "^3.9.7"
},
"eslintConfig": {
"extends": "react-app"
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"**/*.{js,ts,tsx}": [
"eslint --cache --fix",
"prettier --write"
]
},
"prettier": {
"arrowParens": "avoid",
"jsxSingleQuote": true,
"printWidth": 120,
"quoteProps": "preserve",
"semi": true,
"singleQuote": true,
"trailingComma": "none"
}
}
14 changes: 14 additions & 0 deletions scripts/dist-type-definitions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
const fs = require('fs');
const path = require('path');

const sourceRoot = path.resolve('src/resize-observer');
const destinationRoot = path.resolve('dist/resize-observer');

fs.mkdirSync(destinationRoot);

fs.readdirSync(sourceRoot).forEach(fileName => {
const sourceFile = path.resolve(sourceRoot, fileName);
const destinationFile = path.resolve(destinationRoot, fileName);

fs.copyFileSync(sourceFile, destinationFile);
});
27 changes: 27 additions & 0 deletions scripts/src-type-definitions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
const fs = require('fs');
const path = require('path');
const rimraf = require('rimraf');

const sourceRoot = path.resolve('node_modules/@juggle/resize-observer');
const destinationRoot = path.resolve('src/resize-observer');
const files = [
['LICENSE', 'LICENSE'],
['lib/ResizeObserver.d.ts', 'ResizeObserver.d.ts'],
['lib/ResizeObserverController.d.ts', 'ResizeObserverController.d.ts'],
['lib/ResizeObserverCallback.d.ts', 'ResizeObserverCallback.d.ts'],
['lib/ResizeObserverOptions.d.ts', 'ResizeObserverOptions.d.ts'],
['lib/ResizeObserverBoxOptions.d.ts', 'ResizeObserverBoxOptions.d.ts'],
['lib/ResizeObserverEntry.d.ts', 'ResizeObserverEntry.d.ts'],
['lib/ResizeObserverSize.d.ts', 'ResizeObserverSize.d.ts'],
['lib/DOMRectReadOnly.d.ts', 'DOMRectReadOnly.d.ts']
];

rimraf.sync(destinationRoot);
fs.mkdirSync(destinationRoot);

files.forEach(([sourcePath, destinationPath]) => {
const sourceFile = path.resolve(sourceRoot, sourcePath);
const destinationFile = path.resolve(destinationRoot, destinationPath);

fs.copyFileSync(sourceFile, destinationFile);
});
5 changes: 5 additions & 0 deletions src/ExtendedElement.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { ExtendedResizeObserverEntry } from './ExtendedResizeObserverEntry';

export interface ExtendedElement extends Element {
onResizeObservation?: (resizeObserverEntry: ExtendedResizeObserverEntry) => void;
}
6 changes: 6 additions & 0 deletions src/ExtendedResizeObserverEntry.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { ExtendedElement } from './ExtendedElement';
import { ResizeObserverEntry } from './resize-observer/ResizeObserverEntry';

export interface ExtendedResizeObserverEntry extends ResizeObserverEntry {
target: ExtendedElement;
}
49 changes: 49 additions & 0 deletions src/ResizeObserverContext.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import React, { createContext } from 'react';
import { ResizeObserver } from './resize-observer/ResizeObserver';
import { ExtendedResizeObserverEntry } from './ExtendedResizeObserverEntry';

interface ResizeObserverConstructor {
new (...args: any): ResizeObserver;
}

interface ProviderProps {
ponyfill?: ResizeObserverConstructor;
children: React.ReactNode;
}

interface ExtendedWindow extends Window {
ResizeObserver: ResizeObserverConstructor;
}

declare var window: ExtendedWindow;

const ResizeObserverContext = createContext<ResizeObserver | null>(null);

/**
* Bootstraps a new ResizeObserver with a callback function used by the `useResizeObserver` hook.
* @argument {ResizeObserverConstructor} _ResizeObserver - Any ResizeObserver constructor, for example from window.ResizeObserver or a ponyfill.
* @returns {ResizeObserver} Bootstrapped ResizeObserver instance to assign to `ResizeObserverContext.Provider`'s value.
*/
const createResizeObserver = (_ResizeObserver: ResizeObserverConstructor): ResizeObserver => {
const handleResizeObserverEntry = (resizeObserverEntry: ExtendedResizeObserverEntry) => {
const { onResizeObservation } = resizeObserverEntry.target;
onResizeObservation && onResizeObservation(resizeObserverEntry);
};

return new _ResizeObserver((entries: ExtendedResizeObserverEntry[]) => entries.forEach(handleResizeObserverEntry));
};

/**
* Bootstraps a ResizeObserverContext.Provider with a ResizeObserver instance.
* @argument {ProviderProps} props
* @argument {ResizeObserverConstructor} [props.ponyfill=undefined] - Optional `ResizeObserver` constructor, for example from a ponyfill. Defaults to `window.ResizeObserver`. CAUTION: https://caniuse.com/#feat=mdn-api_resizeobserver_resizeobserver
* @argument {React.ReactNode} props.children - This component's children.
* @returns {JSX.Element} Context.Provider bootstrapped with a ResizeObserver instance.
*/
const Provider = ({ ponyfill = undefined, children }: ProviderProps): JSX.Element => {
const instance = createResizeObserver(ponyfill || window.ResizeObserver);

return <ResizeObserverContext.Provider value={instance}>{children}</ResizeObserverContext.Provider>;
};

export { ResizeObserverContext, createResizeObserver, Provider };
2 changes: 1 addition & 1 deletion src/index.js → src/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
export { ResizeObserverContext, createResizeObserver, Provider } from './resizeObserverContext';
export { ResizeObserverContext, createResizeObserver, Provider } from './ResizeObserverContext';
export { useResizeObserver } from './useResizeObserver';
36 changes: 0 additions & 36 deletions src/resizeObserverContext.js

This file was deleted.

36 changes: 0 additions & 36 deletions src/useResizeObserver.js

This file was deleted.

45 changes: 45 additions & 0 deletions src/useResizeObserver.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { useContext, useCallback, useRef, useState } from 'react';
import { ResizeObserverContext } from './ResizeObserverContext';
import { ExtendedElement } from './ExtendedElement';
import { ExtendedResizeObserverEntry } from './ExtendedResizeObserverEntry';
import { ResizeObserver } from './resize-observer/ResizeObserver';
import { ResizeObserverOptions } from './resize-observer/ResizeObserverOptions';

/**
* Observe an element's size.
* @argument {ResizeObserverOptions} [options] - Options object for `ResizeObserver.observe()`.
* @returns {[React.RefCallback<ExtendedElement | null>, ExtendedResizeObserverEntry | null]} Array with: a reference to observed element, a ResizeObserverEntry.
*/
const useResizeObserver = (
options: ResizeObserverOptions = {}
): [React.RefCallback<ExtendedElement | null>, ExtendedResizeObserverEntry | null] => {
const resizeObserver = useContext<ResizeObserver | null>(ResizeObserverContext);

const [observedEntry, setObservedEntry] = useState<ExtendedResizeObserverEntry | null>(null);

const handleResizeObservation = (resizeObserverEntry: ExtendedResizeObserverEntry) =>
setObservedEntry(resizeObserverEntry);

const ref = useRef<ExtendedElement | null>(null);

const setRef = useCallback(
node => {
if (ref.current) {
resizeObserver?.unobserve(ref.current);
delete ref.current.onResizeObservation;
}

if (node) {
node.onResizeObservation = handleResizeObservation;
resizeObserver?.observe(node, options);
}

ref.current = node;
},
[resizeObserver, options]
);

return [setRef, observedEntry];
};

export { useResizeObserver };
17 changes: 17 additions & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"jsx": "react",
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"outDir": "./dist",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": ["./src/**/*"],
"exclude": ["./src/resize-observer/**/*"]
}