initial drop
This commit is contained in:
Родитель
0422fd689f
Коммит
d8217bac38
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1,2 @@
|
|||
node_modules
|
||||
dist
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"arrowParens": "avoid",
|
||||
"semi": false,
|
||||
"tabWidth": 4
|
||||
}
|
|
@ -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"]
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
|
@ -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
|
||||
```
|
18
README.md
18
README.md
|
@ -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.
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
export * from "./hooks/useChange"
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Загрузка…
Ссылка в новой задаче