GithubHelp home page GithubHelp logo

pez / rn-rf-shadow Goto Github PK

View Code? Open in Web Editor NEW
363.0 15.0 52.0 1.99 MB

An example project to get you started with React Native using shadow-cljs in 3 minutes

JavaScript 1.60% Clojure 92.78% Shell 5.62%

rn-rf-shadow's Introduction

React Native using shadow-cljs in 3 minutes

The fastest way a ClojureScript coder can get started with React Native development. Prove me wrong.

This is an example project, only slightly beyond Hello World, using: shadow-cljs, React Native, Expo, Reagent, and re-frame.

Check this video out for a demo of this project.

ClojureScript ❤️ React Native

Follow along to get started. There are instructions for Calva, Emacs/CIDER, Cursive, and the command line. It is assumed you have Java and Node installad as well as dev tool chains for the platforms you are targeting. (If you are targeting the Web, then Chrome is enough.)

Installing

To facilitate that you can easily try this out without installing anything globally on your machine, this project installs everything it needs locally in node_modules. Then npx is used to execute tools like expo-cli.

To install dependencies, and setup the project, run:

  1. npm i

From there use your favorite editor and/or the prompt.

Using VS Code + Calva

Assuming you have installed the Calva extension in VS Code:

Build and start the app, and connect Calva

  1. Open the project in VS Code. Then:
  2. Run the Calva command Start a Project REPL and Connect (aka Jack-in)
    1. Wait for shadow to build the project.

Start Expo

  1. Then Run Build Task. This will start Expo and the Metro bundler. Wait for expo to show its menu options in the terminal pane.
  2. In the expo menu press w for open web.

The app now should be running in your web browser and Calva automatically connects to it. Confirm this by evaluating something like this in Calva (from a cljs file or in the REPL window):

(js/alert "Hello world!")

You should see the alert pop up where the app is running.

Of course you should try to fire up the app on all simulators, emulators and phones you have as well. Please note that Calva will only be connected to one of your apps at a time, and it is a bit arbitrary which one. Use (js/alert) to check this.

Using Emacs with CIDER

Open Emacs and a bash shell:

  1. Run npx shadow-cljs compile :app to perform an initial build of the app.

  2. In Emacs open one of the files in the project (deps.edn is fine)

  3. From that buffer, do cider-jack-in-clojurescript [C-c M-J] to launch a REPL. Follow the series of interactive prompts in the minibuffer:

    1. select shadow-cljs as the command to launch
    2. select shadow as the repl type
    3. select :app as the build to connect
    4. and optionally answer y or n to the final question about opening the shadow-cljs UI in a browser. At this point shadow-cljs will be watching the project folder and running new builds of the app if any files are changed. You'll also have a REPL prompt, however the REPL doesn't work because it isn't connected to anything. The app isn't running yet.
  4. In a shell run npm run ios (same as npx expo start -i). This starts the Metro bundler, perform the bundling, launch the iPhone simulator, and transmit the bundled app. Be patient at this step as it can take many seconds to complete. When the app is finally running expo will display the message:

    WebSocket connected!
    REPL init successful
    
  5. Once you see that the REPL is initalized, you can return to Emacs and confirm the REPL is connected and functional:

    cljs.user> (js/alert "hello world!")

    Which should pop-up a modal alert in the simulator, confirming the app is running and the REPL is connected end to end.

Using IntelliJ + Cursive REPL

  1. Follow the instructions specified in Or the Command line.
  2. Create a Maven POM using shadow-cljs pom, as described in the Shadow doc.
  3. There are now two options
    1. If you already have a project open, open the project in IntelliJ using File | New | Project from existing sources... and indicating the pom.xml file.
    2. If you're at the welcome screen, press the "Open" button and navigate to the pom.xml.
  4. Ensure the project has an SDK configured using File | Project Structure, and checking under Project.
  5. The project comes with a REPL run configuration called "REPL". Run the REPL using the Run | Run 'REPL' menu item, or the toolbar button.
  6. Run the commands in Using ClojureScript REPL

Or the Command line

$ npm i
$ npx shadow-cljs watch app
# wait for first compile to finish or expo gets confused
# on another terminal tab/window:
$ npm start

This will run Expo DevTools at http://localhost:19002/

To run the app in browser using expo-web (react-native-web), press w in the same terminal after expo devtools is started. This should open the app automatically on your browser after the web version is built. If it does not open automatically, open http://localhost:19006/ manually on your browser.

Note that you can also run the following instead of npm start to run the app in browser:

# same as npx expo start --web
$ npm run web

# or

# same as npx expo start --web-only
$ npm run web-only

Using ClojureScript REPL

Once the app is deployed and opened in phone/simulator/emulator/browser, connect to nrepl and run the following:

(shadow/nrepl-select :app)

NB: Calva users don't need to do ^ this ^.

To test the REPL connection:

(js/alert "Hello from Repl")

Command line CLJS REPL

Shadow can start a CLJS repl for you, if you prefer to stay at the terminal prompt:

$ npx shadow-cljs cljs-repl :app

Disabling Expo Fast Refresh

You will need to disable Fast Refresh provided by the Expo client, which conflicts with shadow-cljs hot reloading. You really want to use Shadow's, because it is way better and way faster than the Expo stuff is.

For the iOS and Android there is a Disable Fast Refresh option in the development menu. NB: Often you need to first enable it and then disable it.

For web there may be some way to disable it via a webpack.config file as per this example. But failing that, once the app has loaded you can block requests to/from localhost:19006/* (the Webpack dev server) in devtools like so, for instance by right-clicking on a request in the Network tab, selecting Block request URL, then editing the pattern. In Chrome this looks something like:

image image

This workaround is far from ideal, because the block needs to be manually toggled off whenever a full refresh is required (e.g. to load a new file), then back on again. But it seems to do the job.

Production builds

A production build involves first asking shadow-cljs to build a release, then to ask Expo to work in Production Mode.

  1. Kill the watch and expo tasks.
  2. Execute shadow-cljs release app
  3. Start the expo task (as per above)
    1. Enable Production mode.
    2. Start the app.

Using EAS Build

expo build is the classic way of building an Expo app, and eas build is the new version of expo build. Using EAS Build currently requires an Expo account with a paid plan subscription.

The steps below provide an example of using EAS Build to build an apk file to run on an Android emulator or device.

  1. Install the latest EAS CLI by running npm install -g eas-cli
  2. Log into your Expo account
  3. Configure EAS Build in your project with eas build:configure.
  4. Make your eas.json file contents look like this:
    {
      "build": {
        "production": {},
        "development": {
          "distribution": "internal",
          "android": {
            "buildType": "apk"
          },
          "ios": {
            "simulator": true
          }
        }
      }
    }
  5. Commit your changes, run eas build --profile development, and follow the prompts.
  6. Navigate to the URL given by the command to monitor the build. When it completes, download the apk and install it on your device or emulator.

See the EAS Build docs for more information.

If you want to use EAS Build with a project not based on this template, see this PR for information about how your project can be set up to avoid an error during the build process.

Note: The eas-build-pre-install.sh script makes EAS install Java in the MacOS environment when running a build for iOS. This ensures that shadow-cljs can be run in the EAS pipeline to build your ClojureScript code.

React Navigation included

The app is setup to use React Navigation. If you don't need that in your app, just remove it.

Happy Hacking! ❤️

Please don't hesitate to star the project repository.

rn-rf-shadow's People

Contributors

alidcast avatar bpringe avatar carnunmp avatar cursive-ide avatar dependabot[bot] avatar gonewest818 avatar gustaver avatar hjer avatar laibulle avatar looveh avatar neupsh avatar nsadeh avatar pez avatar prestancedesign avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rn-rf-shadow's Issues

unable to run expo web

I ran shadow-cljs watch app and yarn start but when I open up browser window I get an Error: goog.globalEval not available

based on #1, I thought expo web might be working. is there something that needs to be fixed in template, or a specific build step I'm missing?

Saving file causes the state to be lost

Hi.

Thank you very much for creating this repository which was a guide to me.

I cloned the repository and followed all the steps (VSCode + Calva).
I am able to run the app and clicking the button successfully updates the counter and I am able to change the UI.

The problem is that saving file (in order for the UI changes to be shown such as changing text color etc.) causes the state
to be lost. When file is saved after doing some changes such as changing the text color, causes the app to be reloaded and eventually the re-frame DB gets reinitialized causing all of the changes to be lost.

So far I have not been able to figure out the reason as I am new to ReactNative and ClojureScript.

Thank you for your help.

Instructions from README for IntelliJ + Cursive REPL does not work

On the step "Run REPL" I have such error:

Starting nREPL server...
/Users/lania-kea/Library/Java/JavaVirtualMachines/openjdk-17.0.1/Contents/Home/bin/java ...
Error: Could not find or load main class clojure.main
Caused by: java.lang.ClassNotFoundException: clojure.main

Process finished with exit code 1

And in Edit Configuration window it shows warning
Run Configuration Error: No modules containing clojure.main found

Although application works well.

yarn install yields errors on node v12

TL;DR: for documentation purposes, would you consider documenting "known good" versions of the development toolchain?

  • in the shadow-cljs documentation is where you'll find the dependency on JDK 1.8.

  • running yarn install with node v12 results in a bunch of build errors from fsevents. See the transcript below. Granted, the last entry in the log says you can ignore this entry but to be honest I didn't know if I should believe that message or not.

Tracking these version issues down took me longer than 3 minutes, and while educational, it was friction I would have appreciated not having to suffer as a newcomer.

Details below the line.


$ nvm version
v12.13.0
$ yarn
yarn install v1.19.1
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
warning " > [email protected]" has incorrect peer dependency "[email protected]".                               
warning "react-native > [email protected]" has unmet peer dependency "@babel/core@*".
warning "react-native > @react-native-community/cli > [email protected]" has unmet peer dependency "@babel/core@*".
[4/4] Building fresh packages...
warning Error running install script for optional dependency: "/private/tmp/rn-rf-shadow/node_modules/fsevents: Command failed.
Exit code: 1
Command: node install
Arguments: 
Directory: /private/tmp/rn-rf-shadow/node_modules/fsevents
Output:
node-pre-gyp info it worked if it ends with ok
node-pre-gyp info using [email protected]
node-pre-gyp info using [email protected] | darwin | x64
node-pre-gyp WARN Using needle for node-pre-gyp https download 
node-pre-gyp info check checked for \"/private/tmp/rn-rf-shadow/node_modules/fsevents/lib/binding/Release/node-v72-darwin-x64/fse.node\" (not found)
node-pre-gyp http GET https://fsevents-binaries.s3-us-west-2.amazonaws.com/v1.2.7/fse-v1.2.7-node-v72-darwin-x64.tar.gz
node-pre-gyp http 404 https://fsevents-binaries.s3-us-west-2.amazonaws.com/v1.2.7/fse-v1.2.7-node-v72-darwin-x64.tar.gz
node-pre-gyp WARN Tried to download(404): https://fsevents-binaries.s3-us-west-2.amazonaws.com/v1.2.7/fse-v1.2.7-node-v72-darwin-x64.tar.gz 
node-pre-gyp WARN Pre-built binaries not found for [email protected] and [email protected] (node-v72 ABI, unknown) (falling back to source compile with node-gyp) 
node-pre-gyp http 404 status code downloading tarball https://fsevents-binaries.s3-us-west-2.amazonaws.com/v1.2.7/fse-v1.2.7-node-v72-darwin-x64.tar.gz 
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | darwin | x64
gyp info ok 
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | darwin | x64
gyp info find Python using Python version 2.7.10 found at \"/usr/bin/python\"
gyp info spawn /usr/bin/python
gyp info spawn args [
gyp info spawn args   '/Users/neilo/.nvm/versions/node/v12.13.0/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py',
gyp info spawn args   'binding.gyp',
gyp info spawn args   '-f',
gyp info spawn args   'make',
gyp info spawn args   '-I',
gyp info spawn args   '/private/tmp/rn-rf-shadow/node_modules/fsevents/build/config.gypi',
gyp info spawn args   '-I',
gyp info spawn args   '/Users/neilo/.nvm/versions/node/v12.13.0/lib/node_modules/npm/node_modules/node-gyp/addon.gypi',
gyp info spawn args   '-I',
gyp info spawn args   '/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/common.gypi',
gyp info spawn args   '-Dlibrary=shared_library',
gyp info spawn args   '-Dvisibility=default',
gyp info spawn args   '-Dnode_root_dir=/Users/neilo/Library/Caches/node-gyp/12.13.0',
gyp info spawn args   '-Dnode_gyp_dir=/Users/neilo/.nvm/versions/node/v12.13.0/lib/node_modules/npm/node_modules/node-gyp',
gyp info spawn args   '-Dnode_lib_file=/Users/neilo/Library/Caches/node-gyp/12.13.0/<(target_arch)/node.lib',
gyp info spawn args   '-Dmodule_root_dir=/private/tmp/rn-rf-shadow/node_modules/fsevents',
gyp info spawn args   '-Dnode_engine=v8',
gyp info spawn args   '--depth=.',
gyp info spawn args   '--no-parallel',
gyp info spawn args   '--generator-output',
gyp info spawn args   'build',
gyp info spawn args   '-Goutput_dir=.'
gyp info spawn args ]
gyp info ok 
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | darwin | x64
gyp info spawn make
gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
  SOLINK_MODULE(target) Release/.node
  CXX(target) Release/obj.target/fse/fsevents.o
In file included from ../fsevents.cc:6:
In file included from ../../nan/nan.h:222:
In file included from ../../nan/nan_converters.h:67:
../../nan/nan_converters_43_inl.h:22:1: warning: 'ToBoolean' is deprecated: ToBoolean can never throw. Use Local version. [-Wdeprecated-declarations]
X(Boolean)
^
../../nan/nan_converters_43_inl.h:18:12: note: expanded from macro 'X'
      val->To ## TYPE(isolate->GetCurrentContext())                            \\\n           ^
<scratch space>:213:1: note: expanded from here
ToBoolean
^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:2567:3: note: 'ToBoolean' has been explicitly marked deprecated here
  V8_DEPRECATED(\"ToBoolean can never throw. Use Local version.\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:6:
In file included from ../../nan/nan.h:222:
In file included from ../../nan/nan_converters.h:67:
../../nan/nan_converters_43_inl.h:40:1: warning: 'BooleanValue' is deprecated: BooleanValue can never throw. Use Isolate version. [-Wdeprecated-declarations]
X(bool, Boolean)
^
../../nan/nan_converters_43_inl.h:37:15: note: expanded from macro 'X'
  return val->NAME ## Value(isolate->GetCurrentContext());                     \\\n              ^
<scratch space>:220:1: note: expanded from here
BooleanValue
^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:2605:3: note: 'BooleanValue' has been explicitly marked deprecated here
  V8_DEPRECATED(\"BooleanValue can never throw. Use Isolate version.\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:6:
In file included from ../../nan/nan.h:223:
In file included from ../../nan/nan_new.h:189:
../../nan/nan_implementation_12_inl.h:356:37: error: too few arguments to function call, expected 2, have 1
  return v8::StringObject::New(value).As<v8::StringObject>();
         ~~~~~~~~~~~~~~~~~~~~~      ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:5426:3: note: 'New' declared here
  static Local<Value> New(Isolate* isolate, Local<String> value);
  ^
In file included from ../fsevents.cc:6:
In file included from ../../nan/nan.h:223:
In file included from ../../nan/nan_new.h:189:
../../nan/nan_implementation_12_inl.h:356:58: error: expected '(' for function-style cast or type construction
  return v8::StringObject::New(value).As<v8::StringObject>();
                                         ~~~~~~~~~~~~~~~~^
../../nan/nan_implementation_12_inl.h:356:60: error: expected expression
  return v8::StringObject::New(value).As<v8::StringObject>();
                                                           ^
In file included from ../fsevents.cc:6:
In file included from ../../nan/nan.h:2722:
../../nan/nan_object_wrap.h:24:25: error: no member named 'IsNearDeath' in 'Nan::Persistent<v8::Object, v8::NonCopyablePersistentTraits<v8::Object> >'
    assert(persistent().IsNearDeath());
           ~~~~~~~~~~~~ ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/assert.h:93:25: note: expanded from macro 'assert'
    (__builtin_expect(!(e), 0) ? __assert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0)
                        ^
In file included from ../fsevents.cc:6:
In file included from ../../nan/nan.h:2722:
../../nan/nan_object_wrap.h:127:26: error: no member named 'IsNearDeath' in 'Nan::Persistent<v8::Object, v8::NonCopyablePersistentTraits<v8::Object> >'
    assert(wrap->handle_.IsNearDeath());
           ~~~~~~~~~~~~~ ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/assert.h:93:25: note: expanded from macro 'assert'
    (__builtin_expect(!(e), 0) ? __assert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0)
                        ^
../fsevents.cc:43:32: error: no template named 'Handle' in namespace 'v8'
    static void Initialize(v8::Handle<v8::Object> exports);
                           ~~~~^
In file included from ../fsevents.cc:73:
../src/constants.cc:89:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagNone\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagNone));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:90:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagMustScanSubDirs\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagMustScanSubDirs));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:91:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagUserDropped\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagUserDropped));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:92:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagKernelDropped\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagKernelDropped));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:93:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagEventIdsWrapped\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagEventIdsWrapped));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:94:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagHistoryDone\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagHistoryDone));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:95:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagRootChanged\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagRootChanged));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:96:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagMount\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagMount));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:97:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagUnmount\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagUnmount));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:98:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagItemCreated\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagItemCreated));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:99:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagItemRemoved\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagItemRemoved));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:100:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagItemInodeMetaMod\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagItemInodeMetaMod));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:101:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagItemRenamed\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagItemRenamed));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:102:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagItemModified\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagItemModified));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:103:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagItemFinderInfoMod\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagItemFinderInfoMod));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:104:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagItemChangeOwner\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagItemChangeOwner));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:105:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagItemXattrMod\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagItemXattrMod));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:106:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagItemIsFile\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagItemIsFile));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:107:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagItemIsDir\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagItemIsDir));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
In file included from ../fsevents.cc:73:
../src/constants.cc:108:11: warning: 'Set' is deprecated: Use maybe version [-Wdeprecated-declarations]
  object->Set(Nan::New<v8::String>(\"kFSEventStreamEventFlagItemIsSymlink\").ToLocalChecked(), Nan::New<v8::Integer>(kFSEventStreamEventFlagItemIsSymlink));
          ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8.h:3402:3: note: 'Set' has been explicitly marked deprecated here
  V8_DEPRECATED(\"Use maybe version\",
  ^
/Users/neilo/Library/Caches/node-gyp/12.13.0/include/node/v8config.h:311:29: note: expanded from macro 'V8_DEPRECATED'
  declarator __attribute__((deprecated(message)))
                            ^
../fsevents.cc:76:16: error: variable has incomplete type 'void'
void FSEvents::Initialize(v8::Handle<v8::Object> exports) {
               ^
../fsevents.cc:76:31: error: no member named 'Handle' in namespace 'v8'
void FSEvents::Initialize(v8::Handle<v8::Object> exports) {
                          ~~~~^
../fsevents.cc:76:48: error: expected '(' for function-style cast or type construction
void FSEvents::Initialize(v8::Handle<v8::Object> exports) {
                                     ~~~~~~~~~~^
../fsevents.cc:76:50: error: use of undeclared identifier 'exports'
void FSEvents::Initialize(v8::Handle<v8::Object> exports) {
                                                 ^
../fsevents.cc:76:58: error: expected ';' after top level declarator
void FSEvents::Initialize(v8::Handle<v8::Object> exports) {
                                                         ^
                                                         ;
22 warnings and 11 errors generated.
make: *** [Release/obj.target/fse/fsevents.o] Error 1
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/Users/neilo/.nvm/versions/node/v12.13.0/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:194:23)
gyp ERR! stack     at ChildProcess.emit (events.js:210:5)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:272:12)
gyp ERR! System Darwin 18.7.0
gyp ERR! command \"/Users/neilo/.nvm/versions/node/v12.13.0/bin/node\" \"/Users/neilo/.nvm/versions/node/v12.13.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js\" \"build\" \"--fallback-to-build\" \"--module=/private/tmp/rn-rf-shadow/node_modules/fsevents/lib/binding/Release/node-v72-darwin-x64/fse.node\" \"--module_name=fse\" \"--module_path=/private/tmp/rn-rf-shadow/node_modules/fsevents/lib/binding/Release/node-v72-darwin-x64\" \"--napi_version=5\" \"--node_abi_napi=napi\"
gyp ERR! cwd /private/tmp/rn-rf-shadow/node_modules/fsevents
gyp ERR! node -v v12.13.0
gyp ERR! node-gyp -v v5.0.5
gyp ERR! not ok 
node-pre-gyp ERR! build error 
node-pre-gyp ERR! stack Error: Failed to execute '/Users/neilo/.nvm/versions/node/v12.13.0/bin/node /Users/neilo/.nvm/versions/node/v12.13.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js build --fallback-to-build --module=/private/tmp/rn-rf-shadow/node_modules/fsevents/lib/binding/Release/node-v72-darwin-x64/fse.node --module_name=fse --module_path=/private/tmp/rn-rf-shadow/node_modules/fsevents/lib/binding/Release/node-v72-darwin-x64 --napi_version=5 --node_abi_napi=napi' (1)
node-pre-gyp ERR! stack     at ChildProcess.<anonymous> (/private/tmp/rn-rf-shadow/node_modules/fsevents/node_modules/node-pre-gyp/lib/util/compile.js:83:29)
node-pre-gyp ERR! stack     at ChildProcess.emit (events.js:210:5)
node-pre-gyp ERR! stack     at maybeClose (internal/child_process.js:1021:16)
node-pre-gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:283:5)
node-pre-gyp ERR! System Darwin 18.7.0
node-pre-gyp ERR! command \"/Users/neilo/.nvm/versions/node/v12.13.0/bin/node\" \"/private/tmp/rn-rf-shadow/node_modules/fsevents/node_modules/node-pre-gyp/bin/node-pre-gyp\" \"install\" \"--fallback-to-build\"
node-pre-gyp ERR! cwd /private/tmp/rn-rf-shadow/node_modules/fsevents
node-pre-gyp ERR! node -v v12.13.0
node-pre-gyp ERR! node-pre-gyp -v v0.10.3
node-pre-gyp ERR! not ok 
Failed to execute '/Users/neilo/.nvm/versions/node/v12.13.0/bin/node /Users/neilo/.nvm/versions/node/v12.13.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js build --fallback-to-build --module=/private/tmp/rn-rf-shadow/node_modules/fsevents/lib/binding/Release/node-v72-darwin-x64/fse.node --module_name=fse --module_path=/private/tmp/rn-rf-shadow/node_modules/fsevents/lib/binding/Release/node-v72-darwin-x64 --napi_version=5 --node_abi_napi=napi' (1)"
info This module is OPTIONAL, you can safely ignore this error
Done in 250.24s.

Here's why that dependency is there:

$ yarn why fsevents
yarn why v1.19.1
[1/4] 🤔  Why do we have the module "fsevents"...?
[2/4] 🚚  Initialising dependency graph...
[3/4] 🔍  Finding dependency...
[4/4] 🚡  Calculating file sizes...
=> Found "[email protected]"
info Reasons this module exists
   - "react-native#@react-native-community#cli#metro-core#jest-haste-map#sane" depends on it
   - Hoisted from "react-native#@react-native-community#cli#metro-core#jest-haste-map#sane#fsevents"
✨  Done in 0.69s.

And incidentally the build issue is supposedly fixed with this pull request resulting in [email protected], and this pull request in jest-haste-map, and I suppose eventually the updated package will work it's way into react native too.

Add Cursive setup guide to README

It'd be good to add a setup guide for users who use Cursive as their IDE to the README. The setup would have overlaps with the one for the command line, so it might be good to insert it close to that in order to avoid duplication.

Disabling live reload and enabling hot reload in web

Hello,

It is great to see such a project as I am working on the same idea. In terms of development, did you manage to get hot reloading work with the web target?

I can disable live reload with blocking request calls to sockjs-node in chrome, but then it blocks also live reloading.

Best regard,
David

Build failed npm run eas-build-post-install exited with non-zero code: 1

I am trying to build my app for production. It goes well for Android. But when I try to do the same for iOS i get the following message in the "Post-install hook" of the build:

Script 'eas-build-post-install' is present in package.json, running it...

> [email protected] eas-build-post-install

> npx shadow-cljs release app

[stderr] shadow-cljs - config: /Users/expo/workingdir/build/shadow-cljs.edn

[stderr] The operation couldn’t be completed. Unable to locate a Java Runtime.

[stderr] Please visit http://www.java.com for information on installing Java.

[stderr] ===== ERROR =================

[stderr] java process exit with non-zero exit code

[stderr] =============================

npm run eas-build-post-install exited with non-zero code: 1

So the app can not build because Java is not installed in the installation process, which is the point of the 'eas-build-pre-install.sh' file. It seams that the file is recognised - but Java is not installed.

Any ideas on why this is would be highly appreciated!

Calva: Run Build Task fails with missing index.js

I followed the steps for the Calva workflow as outlined in the README. During the Run Build Task step, I get this prompt in the VSCode Terminal.

image

After selecting "w" I get this output:

Web Bundling complete 3952ms
./index.js:1
Module not found: Can't resolve './app/index.js'
> 1 | import './app/index.js';

The ./app folder is indeed empty, so I presume this is due to the build not generating output as expected. However, I have no idea how to fix this. Please advise.

npm warnings

After running command npm i - there are a lot of vulnerabilities - some flagged as critical.

Screen Shot 2022-10-22 at 9 25 11 PM

EAS Build does not work for ios as configured

I realized today the eas-build-post-install hook I added recently errors when building for iOS, saying something about java not being available. I'm guessing that shadow-cljs depends on java being installed, and it's installed in the Android build environment because the environment is for Android, so that's why the shadow build works there.

@PEZ There are two options to fix this.

  1. Set the EAS_NO_VCS env var to 1 and include a .easignore file which functions similarly to .gitignore, except in that we wouldn’t ignore the shadow output folder. This is okay except there would be two ignore files to sort of keep in sync, though they're for different purposes. The .easignore file probably should always be the same as the .gitignore, except that it doesn't ignore app/index.js. However, when eas build is run with that flag enabled a warning is given: Using EAS CLI without version control system is not recommended, use this mode only if you know what you are doing.

  2. Don’t ignore app/index.js .gitignore. The only downside of this is that the shadow output file app/index.js would be committed in the repo, but functionally I don't see this as being an issue, and the warning mentioned above will not be shown. With this option, there could be a comment in the .gitignore above the line whitelisting app/index.js explaining it's to make eas build work.

Shadow-cljs hot reload don't work properly

Hi,

In the README, we can see :

In the Expo settings for your app (shake or force touch with two fingers), disable Live Reloadinhg and Hot Reloading. (Don't worry, shadow-cljs will take care of hot reloading for you, in the most beautiful way.)

Unfortunately this doesn't work well for my test.
It's only works when I edit the main CLJS file but it's stop working for required components on root and/or subdirectories like components/hello.cljs, etc.

Shadow-cljs hot reload works very well for my Reagent web project.
Anybody know why that bug for React Native/Expo project ?

Best regards.
Mike

shadow-cljs - remote-error, Event { "isTrusted": false,

shadow-cljs - remote-error, Event {
"isTrusted": false,
"message": "failed to connect to /192.168.1.164 (port 9630) from /192.168.1.169 (port 36966) after 10000ms"

I connects to my Android device, but after a few seconds I am getting this error message all the time.
Connecting to the web works although

Unable to locate DatePickerIOS, resolved by upgrading expo and React native

Hello, when I follow the run steps for VSCode and open the app in iOS/Expo, I get the following error:

Error: Unable to resolve module ./Libraries/Components/DatePicker/DatePickerIOS

I have tried installing this component but got an error about it clashing with something. Also tried removing expo-cli and relying on the new one that's published with Expo but no go.

I tried upgrading to expo 49.* and React Native 72.* and that removed the error!

Stop including build artifact in repo

With #29 I included app/index.js in the repo to make EAS Build work for iOS builds.

I've since learned a better way (at least in my opinion) to manage the builds. Java can be installed in the iOS build environment using a build hook, and then the shadow build can happen in the EAS build pipeline, rather than needing to happen locally.

PR coming soon.

Example without Expo?

I'm a react-native dev but a total newbie to CLJS. How would I go about setting up this project to use vanilla react-native (no expo, no expokit)?

I've attempted it but can't seem to figure out how to set up the entry point for vanilla rn.

Updated dependencies to make it work (again)

Great template project!
Unfortunately, I also ran into dependency issues before it worked.
The expo runtime on iOS had changed (?).
The following versions in package.json "seem" to work - note that expo-cli is removed (npm always scares me... yuk):

"dependencies": {
"@react-native/assets-registry": "^0.74.85",
"@react-navigation/native": "^6.1.6",
"@react-navigation/native-stack": "^6.9.12",
"create-react-class": "^15.7.0",
"expo": "^51.0.18",
"expo-status-bar": "^1.12.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-native": "0.74.3",
"react-native-safe-area-context": "4.10.1",
"react-native-screens": "~3.31.1",
"react-native-web": "^0.19.10"
},
"devDependencies": {
"shadow-cljs": "^2.28.10"
},

Documentation tweak: "Start build task"?

Step3 under the "VS Code + Calva" option says:

Then "Start build task". This will start Expo and the Metro builder.

I could not find such a command. I did find "Task: Run build task", which seems to work nicely.

hth

shadow-cljs: Failed to connect to localhost

I'm running into a problem when trying this and other examples. I'm getting the below error when running npm start (while running npx shadow-cljs watch app in another terminal). I'm not sure if it's a problem with the template, with expo, or with my local environment. In any case, tips are appreciated!

Android Running app on moto g(8) plus

Debugger and device times have drifted by more than 60s. Please correct this by running adb shell "date `date +%m%d%H%M%Y.%S`" on your debugger machine.
at node_modules/expo/build/logs/LogSerialization.js:155:14 in _captureConsoleStackTrace
at node_modules/expo/build/logs/LogSerialization.js:41:26 in serializeLogDataAsync
- ... 9 more stack frames from framework internals

Unable to symbolicate stack trace: The stack is null

The shadow-cljs Websocket was disconnected.
at node_modules/expo/build/logs/LogSerialization.js:155:14 in _captureConsoleStackTrace
at node_modules/expo/build/logs/LogSerialization.js:41:26 in serializeLogDataAsync
- ... 9 more stack frames from framework internals

shadow-cljs - remote-error, Event {
  "isTrusted": false,
  "message": "Failed to connect to localhost/127.0.0.1:9630",
}
at node_modules/expo/build/logs/LogSerialization.js:155:14 in _captureConsoleStackTrace
at node_modules/expo/build/logs/LogSerialization.js:41:26 in serializeLogDataAsync
- ... 9 more stack frames from framework internals

Potentially incorrect nREPL port specified in README

On Line 116 in the README, the user is prompted to connect to the nREPL on port 9000. However, as far as I can see, there is no indication that the nREPL will be started at port 9000. In my experience using the repo, shadow-cljs will start the nREPL at different ports each time it starts.

I suggest that either a configuration is added to always start the nREPL at port 9000, or the user should be directed to use the port in .shadow-cljs/nrepl.port.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.