This commit is contained in:
pelikhan 2021-10-26 08:26:34 -07:00
Родитель 0422fd689f
Коммит d8217bac38
13 изменённых файлов: 5447 добавлений и 13 удалений

42
.github/workflows/build.yml поставляемый Normal file
Просмотреть файл

@ -0,0 +1,42 @@
name: Build
# Controls when the action will run.
on:
# Triggers the workflow on push or pull request events but only for the main branch
push:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x]
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- uses: bahmutov/npm-install@v1
- run: yarn prettier
- run: yarn build
- run: yarn docs
- run: npx semantic-release
if: ${{ github.ref == 'refs/heads/main' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
- run: yarn builddocs
- name: github pages
uses: peaceiris/actions-gh-pages@v3
if: ${{ github.ref == 'refs/heads/main' }}
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
enable_jekyll: false
publish_dir: ./docs

49
.github/workflows/codeql-analysis.yml поставляемый Normal file
Просмотреть файл

@ -0,0 +1,49 @@
name: "CodeQL"
on:
push:
branches: [main, ]
pull_request:
# The branches below must be a subset of the branches above
branches: [main]
schedule:
- cron: '0 12 * * 3'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-20.04
steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
# Override language selection by uncommenting this and choosing your languages
# with:
# languages: go, javascript, csharp, python, cpp, java
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

2
.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1,2 @@
node_modules
dist

5
.prettierrc Normal file
Просмотреть файл

@ -0,0 +1,5 @@
{
"arrowParens": "avoid",
"semi": false,
"tabWidth": 4
}

57
.releaserc.json Normal file
Просмотреть файл

@ -0,0 +1,57 @@
{
"branch": "main",
"branches": ["main"],
"plugins": [
[
"@semantic-release/commit-analyzer",
{
"preset": "angular",
"releaseRules": [
{
"type": "doc",
"release": "patch"
},
{
"type": "fix",
"release": "patch"
},
{
"type": "patch",
"release": "patch"
},
{
"type": "minor",
"release": "minor"
},
{
"type": "feat",
"release": "minor"
},
{
"type": "feature",
"release": "minor"
},
{
"scope": "no-release",
"release": false
}
]
}
],
["@semantic-release/release-notes-generator"],
[
"@semantic-release/github",
{
"successComment": false,
"failComment": false
}
],
["@semantic-release/npm"],
[
"@semantic-release/git",
{
"assets": ["package.json", "src/**/*.ts"]
}
]
]
}

25
DOCS.md Normal file
Просмотреть файл

@ -0,0 +1,25 @@
# React package
This package allows you to integrate Jacdac into React applications.
The package exposes **JDOM**, a dependency-free JavaScript object model
that reflects the state of the Jacdac elements and allows sending commands as well.
JDOM also handles connection through WebUSB, WebBLE and other transports.
To read guides and overview documents about JDOM, go to [JDOM documentation](https://microsoft.github.io/jacdac-docs/clients/javascript/jdom).
To browser the API documentation, use the list on this page to explore classes.
## Installation
Add the [react-jacdac npm package](https://www.npmjs.com/package/react-jacdac) module
to your project
```
npm install --save react-jacdac
```
or
```
yarn add react-jacdac
```

Просмотреть файл

@ -1,18 +1,10 @@
# Project
# React-Jacdac
> This repo has been populated by an initial template to help get you started. Please
> make sure to update the content to build a great experience for community-building.
As the maintainer of this project, please make a few updates:
- Improving this README.MD file to provide a great experience
- Updating SUPPORT.MD with content about this project's support experience
- Understanding the security reporting process in SECURITY.MD
- Remove this section from the README
A library of hooks and context for [Jacdac](https://aka.ms/jacdac).
## Contributing
This project welcomes contributions and suggestions. Most contributions require you to agree to a
This project welcomes contributions and suggestions. Most contributions require you to agree to a
Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us
the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.
@ -26,8 +18,8 @@ contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additio
## Trademarks
This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft
trademarks or logos is subject to and must follow
This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft
trademarks or logos is subject to and must follow
[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).
Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.
Any use of third-party trademarks or logos are subject to those third-party's policies.

42
package.json Normal file
Просмотреть файл

@ -0,0 +1,42 @@
{
"name": "react-jacdac",
"version": "0.0.0",
"source": "src/index.ts",
"main": "dist/main.js",
"module": "dist/module.js",
"types": "dist/types.d.ts",
"author": "Microsoft Corporation",
"repository": {
"type": "git",
"url": "https://github.com/microsoft/react-jacdac.git"
},
"license": "MIT",
"engines": {
"node": ">=14.17.0"
},
"scripts": {
"prettier": "prettier --write src/**/*.ts tests/**/*.ts",
"watch": "parcel watch",
"build": "parcel build",
"docs": "node node_modules/typedoc/bin/typedoc",
"docs:watch": "node node_modules/typedoc/bin/typedoc --watch",
"docs:server": "cd docs && npx live-server --port=8082"
},
"devDependencies": {
"parcel": "latest",
"typescript": "^4.4.4",
"@semantic-release/exec": "^6.0.1",
"@semantic-release/git": "^10.0.0",
"@typescript-eslint/eslint-plugin": "^4.33.0",
"@typescript-eslint/parser": "^4.33.0",
"eslint": "^7.32.0",
"eslint-plugin-react": "^7.26.1",
"typedoc": "^0.22.5"
},
"dependencies": {
"jacdac-ts": "^1.18.23"
},
"peerDependencies": {
"react": "^16.0.0"
}
}

25
src/hooks/useChange.ts Normal file
Просмотреть файл

@ -0,0 +1,25 @@
import { useState, useEffect, useMemo } from "react"
import { IEventSource, CHANGE, assert } from "jacdac-ts"
export default function useChange<TNode extends IEventSource, TValue>(
node: TNode,
query?: (n: TNode) => TValue,
deps?: React.DependencyList
): TValue {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
assert((node as any) !== false)
const [version, setVersion] = useState(node?.changeId || 0)
const value = useMemo(
() => (query ? query(node) : undefined),
[node, version, ...(deps || [])]
)
useEffect(() => {
setVersion(node?.changeId || 0)
return node?.subscribe(CHANGE, () => {
setVersion(node.changeId)
})
}, [node, ...(deps || [])])
return value
}

1
src/index.ts Normal file
Просмотреть файл

@ -0,0 +1 @@
export * from "./hooks/useChange"

238
tslint.json Normal file
Просмотреть файл

@ -0,0 +1,238 @@
{
"rulesDirectory": [
"node_modules/tslint-microsoft-contrib"
],
"rules": {
"indent": [
true,
"spaces"
],
"no-internal-module": true,
"no-trailing-whitespace": [
true,
"ignore-comments"
],
"one-line": [
true,
"check-open-brace",
"check-whitespace"
],
"quotemark": [
false,
"double"
],
"semicolon": [
false,
"always"
],
"typedef-whitespace": [
true,
{
"call-signature": "nospace",
"index-signature": "nospace",
"parameter": "nospace",
"property-declaration": "nospace",
"variable-declaration": "nospace"
}
],
"variable-name": [
true,
"ban-keywords"
],
"whitespace": [
true,
"check-branch",
"check-decl",
"check-operator",
"check-type"
],
/**
* Security Rules. The following rules should be turned on because they find security issues
* or are recommended in the Microsoft Secure Development Lifecycle (SDL)
*/
"insecure-random": false, // pxt-override from true
"no-banned-terms": true,
"no-cookies": false, // pxt-override from true
"no-delete-expression": true,
"no-disable-auto-sanitization": true,
"no-document-domain": true,
"no-document-write": true,
"no-eval": true,
"no-exec-script": true,
"no-http-string": [
true,
"http://www.w3.org/?.*"
],
"no-inner-html": true,
"no-octal-literal": true,
"no-string-based-set-immediate": true,
"no-string-based-set-interval": true,
"no-string-based-set-timeout": true,
"non-literal-require": true,
"possible-timing-attack": true,
"react-anchor-blank-noopener": true,
"react-iframe-missing-sandbox": true,
"react-no-dangerous-html": true,
/**
* Common Bugs and Correctness. The following rules should be turned on because they find
* common bug patterns in the code or enforce type safety.
*/
"await-promise": true,
// pxt:override (TODO) "forin": true,
"jquery-deferred-must-complete": true,
"label-position": true,
"match-default-export-name": true,
"mocha-avoid-only": true,
"mocha-no-side-effect-code": true,
// pxt:override "no-any": true,
"no-arg": true,
// pxt:override "no-backbone-get-set-outside-model": true,
// pxt:override "no-bitwise": true,
"no-conditional-assignment": true,
// pxt:override "no-console": [false, "debug", "info", "log", "time", "timeEnd", "trace"],
// pxt:override (more work to be done here) "no-constant-condition": true,
"no-control-regex": true,
// pxt:override "no-debugger": true,
"no-duplicate-super": true,
"no-duplicate-switch-case": true,
"no-duplicate-variable": true,
// pxt:override (TODO) "no-empty": true,
// pxt:override "no-floating-promises": true,
"no-for-in-array": true,
// pxt:override "no-implicit-dependencies": true,
"no-import-side-effect": true,
// pxt:override "no-increment-decrement": true,
"no-invalid-regexp": true,
"no-invalid-template-strings": true,
// pxt:override "no-invalid-this": true,
"no-jquery-raw-elements": true,
"no-misused-new": true,
"no-non-null-assertion": false, // sometimes we're smarter than the typechecker
// pxt:override (TODO) "no-object-literal-type-assertion": true,
// pxt:override "no-parameter-reassignment": true,
"no-reference-import": true,
"no-regex-spaces": true,
"no-sparse-arrays": true,
// pxt:override "no-string-literal": true,
"no-string-throw": true,
"no-submodule-imports": true,
// pxt:override "no-unnecessary-callback-wrapper": true,
// pxt:override "no-unnecessary-initializer": true,
"no-unnecessary-override": true,
// pxt:override "no-unsafe-any": true,
"no-unsafe-finally": true,
"no-unused-expression": true,
// pxt:override (TODO) "no-use-before-declare": true,
"no-with-statement": true,
// pxt:override "promise-function-async": true,
// pxt:override (TODO 1) "promise-must-complete": true,
// pxt:override "radix": true,
"react-this-binding-issue": true,
"react-unused-props-and-state": true,
// pxt:override (TODO) "restrict-plus-operands": true, // the plus operand should really only be used for strings and numbers
// pxt:override "strict-boolean-expressions": true,
// pxt:override "switch-default": true,
// pxt:override "switch-final-break": true,
"triple-equals": [
false,
"allow-null-check"
], // pxt-override
"use-isnan": true,
// pxt:override (TODO) "use-named-parameter": true,
/**
* Code Clarity. The following rules should be turned on because they make the code
* generally more clear to the reader.
*/
// "adjacent-overload-signatures": true,
// "array-type": [true, "array"],
// "arrow-parens": false, // for simple functions the parens on arrow functions are not needed
// "ban-comma-operator": true, // possibly controversial
// "binary-expression-operand-order": true,
// "callable-types": true,
// "chai-prefer-contains-to-index-of": true,
// "chai-vague-errors": true,
"class-name": true,
"comment-format": [
false,
"check-space"
], // pxt-override
// "completed-docs": [true, "classes"],
// "export-name": true,
// "function-name": true,
// "import-name": true,
// "interface-name": true,
// "jsdoc-format": true,
// "max-classes-per-file": [true, 3], // we generally recommend making one public class per file
// "max-file-line-count": true,
// "max-func-body-length": [true, 100, {"ignore-parameters-to-function-regex": "describe"}],
// "max-line-length": [true, 140],
// "member-access": true,
// "member-ordering": [true, { "order": "fields-first" }],
// "missing-jsdoc": true,
// "mocha-unneeded-done": true,
// "new-parens": true,
// "no-construct": true,
// "no-default-export": true,
// "no-duplicate-imports": true,
// "no-empty-interface": true,
// "no-for-in": true,
// "no-function-expression": true,
// "no-inferrable-types": false, // turn no-inferrable-types off in order to make the code consistent in its use of type decorations
// "no-multiline-string": true, // multiline-strings often introduce unnecessary whitespace into the string literals
// "no-null-keyword": false, // turn no-null-keyword off and use undefined to mean not initialized and null to mean without a value
// "no-parameter-properties": true,
// "no-redundant-jsdoc": true,
// "no-relative-imports": true,
// "no-require-imports": true,
// "no-return-await": true,
// "no-shadowed-variable": true,
// "no-suspicious-comment": true,
// "no-this-assignment": true,
// "no-typeof-undefined": true,
// "no-unnecessary-class": true,
// "no-unnecessary-field-initialization": true,
// "no-unnecessary-local-variable": true,
// "no-unnecessary-qualifier": true,
// "no-unnecessary-type-assertion": true,
"no-unsupported-browser-code": true,
// "no-useless-files": true,
"no-var-keyword": true,
// "no-var-requires": true,
// "no-void-expression": true,
// "number-literal-format": true,
// "object-literal-sort-keys": false, // turn object-literal-sort-keys off and sort keys in a meaningful manner
// "one-variable-per-declaration": true,
// "only-arrow-functions": false, // there are many valid reasons to declare a function
// "ordered-imports": true,
// "prefer-array-literal": true,
// "prefer-const": true,
// "prefer-for-of": true,
// "prefer-method-signature": true,
// "prefer-object-spread": true,
// "prefer-template": true,
// "type-literal-delimiter": true,
// "typedef": [true, "call-signature", "arrow-call-signature", "parameter", "arrow-parameter", "property-declaration", "variable-declaration", "member-variable-declaration"],
// "underscore-consistent-invocation": true,
// "unified-signatures": true,
// "use-default-type-parameter": true,
//pxt: declared-above "variable-name": true,
/**
* Accessibility. The following rules should be turned on to guarantee the best user
* experience for keyboard and screen reader users.
*/
"react-a11y-anchors": true,
"react-a11y-aria-unsupported-elements": true,
"react-a11y-event-has-role": true,
"react-a11y-image-button-has-alt": true,
"react-a11y-img-has-alt": true,
"react-a11y-lang": true,
"react-a11y-meta": true,
"react-a11y-props": true,
"react-a11y-proptypes": true,
"react-a11y-role": true,
"react-a11y-role-has-required-aria-props": true,
"react-a11y-role-supports-aria-props": true,
"react-a11y-tabindex-no-positive": true,
"react-a11y-titles": true
}
}

15
typedoc.json Normal file
Просмотреть файл

@ -0,0 +1,15 @@
{
"entryPoints": ["src/jacdac.ts"],
"out": "docs",
"exclude": [
"src/index.ts",
],
"excludePrivate": true,
"excludeInternal": true,
"excludeExternals": true,
"name": "React Jacdac",
"categoryOrder": [],
"readme": "./DOCS.md",
"includeVersion": true,
"categorizeByGroup": false
}

4941
yarn.lock Normal file

Разница между файлами не показана из-за своего большого размера Загрузить разницу