From 9c4e96d58574a590d642d6b3c426412403d85efd Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Fri, 22 Apr 2022 13:54:49 +0200 Subject: [PATCH] @syndicate-lang/create package --- packages/create/README.md | 10 ++++ packages/create/bin/run | 10 ++++ packages/create/package.json | 35 +++++++++++++ packages/create/src/create.ts | 43 +++++++++++++++ packages/create/template/.dir-locals.el | 22 ++++++++ packages/create/template/.gitignore | 6 +++ {todo => packages}/create/template/LICENCE | 0 packages/create/template/index.html | 17 ++++++ packages/create/template/package.json | 30 +++++++++++ .../template/protocols/schemas/example.prs | 3 ++ packages/create/template/rollup.config.js | 18 +++++++ packages/create/template/src/index.ts | 52 +++++++++++++++++++ packages/create/template/style.css | 0 .../template/syndicate-server.config.pr | 12 +++++ packages/create/template/tsconfig.json | 20 +++++++ packages/create/tsconfig.json | 17 ++++++ todo/create/.gitignore | 8 --- todo/create/all.do | 1 - todo/create/bin/run | 4 -- todo/create/bin/run.cmd | 3 -- todo/create/clean.do | 1 - todo/create/package.json | 32 ------------ todo/create/src/index.js | 44 ---------------- todo/create/src/syndicate-template.zip.do | 3 -- todo/create/template/.babelrc | 8 --- todo/create/template/package.json | 18 ------- todo/create/template/src/index.js | 17 ------ 27 files changed, 295 insertions(+), 139 deletions(-) create mode 100644 packages/create/README.md create mode 100755 packages/create/bin/run create mode 100644 packages/create/package.json create mode 100644 packages/create/src/create.ts create mode 100644 packages/create/template/.dir-locals.el create mode 100644 packages/create/template/.gitignore rename {todo => packages}/create/template/LICENCE (100%) create mode 100644 packages/create/template/index.html create mode 100644 packages/create/template/package.json create mode 100644 packages/create/template/protocols/schemas/example.prs create mode 100644 packages/create/template/rollup.config.js create mode 100644 packages/create/template/src/index.ts create mode 100644 packages/create/template/style.css create mode 100644 packages/create/template/syndicate-server.config.pr create mode 100644 packages/create/template/tsconfig.json create mode 100644 packages/create/tsconfig.json delete mode 100644 todo/create/.gitignore delete mode 100644 todo/create/all.do delete mode 100755 todo/create/bin/run delete mode 100644 todo/create/bin/run.cmd delete mode 100644 todo/create/clean.do delete mode 100644 todo/create/package.json delete mode 100644 todo/create/src/index.js delete mode 100644 todo/create/src/syndicate-template.zip.do delete mode 100644 todo/create/template/.babelrc delete mode 100644 todo/create/template/package.json delete mode 100644 todo/create/template/src/index.js diff --git a/packages/create/README.md b/packages/create/README.md new file mode 100644 index 0000000..e10e3c0 --- /dev/null +++ b/packages/create/README.md @@ -0,0 +1,10 @@ +# @syndicate-lang/create + + + +To create a new program/library using Syndicate/js, use `yarn create @syndicate-lang DIRECTORY`: + + yarn create @syndicate-lang myprogram + cd myprogram + yarn + node lib/index.js diff --git a/packages/create/bin/run b/packages/create/bin/run new file mode 100755 index 0000000..780ba68 --- /dev/null +++ b/packages/create/bin/run @@ -0,0 +1,10 @@ +#!/usr/bin/env node +/// SPDX-License-Identifier: GPL-3.0-or-later +/// SPDX-FileCopyrightText: Copyright © 2018-2022 Tony Garnock-Jones + +try { + require('../lib/create.js').main(process.argv.slice(2)); +} catch (e) { + console.error(e); + process.exit(1); +} diff --git a/packages/create/package.json b/packages/create/package.json new file mode 100644 index 0000000..cd754cc --- /dev/null +++ b/packages/create/package.json @@ -0,0 +1,35 @@ +{ + "name": "@syndicate-lang/create", + "version": "0.11.0", + "description": "Create a new Syndicate/js package", + "author": "Tony Garnock-Jones ", + "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/create", + "license": "GPL-3.0+", + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "https://git.syndicate-lang.org/syndicate-lang/syndicate-js" + }, + "bin": { + "create": "./bin/run" + }, + "scripts": { + "prepare": "yarn compile && yarn prepare-template", + "compile": "../../node_modules/.bin/tsc", + "compile:watch": "../../node_modules/.bin/tsc -w", + "prepare-template": "mkdir -p lib && cd template && zip -q -r ../lib/syndicate-template.zip .", + "clean": "rm -rf lib", + "veryclean": "yarn run clean && rm -rf node_modules" + }, + "main": "lib/create.js", + "dependencies": { + "unzipper": "^0.10.11", + "yargs": "^16.2.0" + }, + "devDependencies": { + "@types/unzipper": "^0.10.5", + "@types/yargs": "^15.0" + } +} diff --git a/packages/create/src/create.ts b/packages/create/src/create.ts new file mode 100644 index 0000000..b2b2655 --- /dev/null +++ b/packages/create/src/create.ts @@ -0,0 +1,43 @@ +import yargs from 'yargs/yargs'; + +import fs from 'fs'; +import path from 'path'; +import unzip from 'unzipper'; + +export type CommandLineArguments = { + directory: string, + package?: string, +}; + +export async function main(argv: string[]) { + const options: CommandLineArguments = yargs(argv) + .command('$0 ', + 'Create a new package configured for TypeScript and Syndicate/js', + yargs => yargs + .positional('directory', { + type: 'string', + description: 'Directory in which to place the new package', + }).demandOption('directory') + .option('package', { + alias: 'p', + type: 'string', + description: 'Package name to create; defaults to directory given', + }), + argv => argv) + .argv; + + const directory = path.resolve(options.directory); + const packageName = options.package ?? path.basename(directory); + console.log(`Creating package ${packageName} in ${directory}.`); + + fs.mkdirSync(directory, { recursive: true }); + fs.createReadStream(path.join(__dirname, 'syndicate-template.zip')).pipe( + unzip.Extract({ path: directory }).on('close', (err: any) => { + if (err) throw err; + const packageJsonPath = path.join(directory, 'package.json'); + const p = Object.assign({ + name: packageName, + }, require(packageJsonPath)); + fs.writeFileSync(packageJsonPath, JSON.stringify(p, null, 2)); + })); +} diff --git a/packages/create/template/.dir-locals.el b/packages/create/template/.dir-locals.el new file mode 100644 index 0000000..ee8e4a0 --- /dev/null +++ b/packages/create/template/.dir-locals.el @@ -0,0 +1,22 @@ +((typescript-mode + . ((eval + . (progn + ;; For TIDE: + (setq tide-tsserver-executable + (concat + (let ((d (dir-locals-find-file "."))) + (if (stringp d) d (car d))) + "node_modules/typescript/lib/tsserver.js")) + ;; For LSP: + (require 'lsp-javascript) + (let ((node-modules (concat + (let ((d (dir-locals-find-file "."))) + (if (stringp d) d (car d))) + "node_modules/"))) + (lsp-dependency 'typescript-language-server + `(:system ,(concat node-modules + "typescript-language-server/lib/cli.js"))) + (lsp-dependency 'typescript + `(:system ,(concat node-modules + "typescript/lib/tsserver.js"))))) + )))) diff --git a/packages/create/template/.gitignore b/packages/create/template/.gitignore new file mode 100644 index 0000000..b8efb86 --- /dev/null +++ b/packages/create/template/.gitignore @@ -0,0 +1,6 @@ +index.js +index.js.map +lib/ +node_modules/ +src/gen/ +src.ts/ diff --git a/todo/create/template/LICENCE b/packages/create/template/LICENCE similarity index 100% rename from todo/create/template/LICENCE rename to packages/create/template/LICENCE diff --git a/packages/create/template/index.html b/packages/create/template/index.html new file mode 100644 index 0000000..70f0c22 --- /dev/null +++ b/packages/create/template/index.html @@ -0,0 +1,17 @@ + + + + + + + + + + + + + +
+ + + diff --git a/packages/create/template/package.json b/packages/create/template/package.json new file mode 100644 index 0000000..66dd87f --- /dev/null +++ b/packages/create/template/package.json @@ -0,0 +1,30 @@ +{ + "private": true, + "version": "0.0.0", + "license": "GPL-3.0+", + "devDependencies": { + "@preserves/core": ">=0.20", + "@preserves/schema": ">=0.21", + "@syndicate-lang/ts-plugin": "*", + "@syndicate-lang/tsc": "*", + "rollup": "^2.60", + "rollup-plugin-sourcemaps": "^0.6", + "typescript": "^4.5" + }, + "dependencies": { + "@syndicate-lang/core": "*", + "@syndicate-lang/html": "*", + "@syndicate-lang/ws-relay": "*" + }, + "scripts": { + "prepare": "yarn regenerate && yarn compile && yarn rollup", + "regenerate": "rm -rf ./src/gen && preserves-schema-ts --output ./src/gen ./protocols/schemas", + "regenerate:watch": "yarn regenerate --watch", + "compile": "syndicate-tsc", + "compile:watch": "syndicate-tsc -w --verbose --intermediate-directory src.ts", + "rollup": "rollup -c", + "rollup:watch": "rollup -c -w", + "clean": "rm -rf lib/ src.ts/ src/gen/ index.js index.js.map", + "serve": "python -m http.server" + } +} diff --git a/packages/create/template/protocols/schemas/example.prs b/packages/create/template/protocols/schemas/example.prs new file mode 100644 index 0000000..4688216 --- /dev/null +++ b/packages/create/template/protocols/schemas/example.prs @@ -0,0 +1,3 @@ +version 1 . + +ExampleDefinition = . diff --git a/packages/create/template/rollup.config.js b/packages/create/template/rollup.config.js new file mode 100644 index 0000000..60fbc64 --- /dev/null +++ b/packages/create/template/rollup.config.js @@ -0,0 +1,18 @@ +import sourcemaps from 'rollup-plugin-sourcemaps'; + +export default { + input: 'lib/index.js', + plugins: [sourcemaps()], + output: { + file: 'index.js', + format: 'umd', + name: 'Main', + sourcemap: true, + globals: { + '@preserves/core': 'Preserves', + '@syndicate-lang/core': 'Syndicate', + '@syndicate-lang/html': 'SyndicateHtml', + '@syndicate-lang/ws-relay': 'SyndicateWsRelay', + }, + }, +}; diff --git a/packages/create/template/src/index.ts b/packages/create/template/src/index.ts new file mode 100644 index 0000000..59ce67f --- /dev/null +++ b/packages/create/template/src/index.ts @@ -0,0 +1,52 @@ +import { Dataspace, Ref, Sturdy, Reader, Schemas, Embedded } from "@syndicate-lang/core"; +import html from "@syndicate-lang/html"; +import wsRelay from "@syndicate-lang/ws-relay"; +import { ExampleDefinition } from './gen/example'; + +export function main() { + Dataspace.boot(ds => { + html.boot(ds); + wsRelay.boot(ds, true /* remove this `true` to turn off client/server debug logging */); + bootApp(ds); + }); +} + +function bootApp(ds: Ref) { + spawn named 'app' { + at ds { + /* + * This example expects a syndicate-server instance running on port 9001 on the + * server hosting index.html, exposing a dataspace entity via a capability called + * `"syndicate"` with empty "secret". See syndicate-server.config.pr. + */ + + const serverCap = Sturdy.asSturdyRef(new Reader( + '').next()); + + const this_instance = crypto.randomUUID(); + + during wsRelay.Resolved({ + "addr": wsRelay.RelayAddress(Schemas.transportAddress.WebSocket( + `ws://${document.location.hostname}:9001/`)), + "sturdyref": serverCap, + "resolved": $remoteDs_e: Embedded, + }) => { + const remoteDs = remoteDs_e.embeddedValue; + + at remoteDs { + assert ExampleDefinition(this_instance); + during ExampleDefinition($who: string) => { + console.log('saw', who); + const ui = new html.Anchor(); + at ds { + assert ui.html( + '#main', + html.template`

We see ${who}

`, + who); + } + } + } + } + } + } +} diff --git a/packages/create/template/style.css b/packages/create/template/style.css new file mode 100644 index 0000000..e69de29 diff --git a/packages/create/template/syndicate-server.config.pr b/packages/create/template/syndicate-server.config.pr new file mode 100644 index 0000000..46bdac6 --- /dev/null +++ b/packages/create/template/syndicate-server.config.pr @@ -0,0 +1,12 @@ +; Start the server with +; +; syndicate-server -c ./syndicate-server.config.pr +;--------------------------------------------------------------------------- + +; Expose the gatekeeper on port 9001: + $gatekeeper>> + +; Create a dataspace entity, and register it with the gatekeeper with name `"syndicate"` and an +; empty secret key: +let ?ds = dataspace + diff --git a/packages/create/template/tsconfig.json b/packages/create/template/tsconfig.json new file mode 100644 index 0000000..07bbdef --- /dev/null +++ b/packages/create/template/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["ES2017", "DOM"], + "declaration": true, + "baseUrl": "./src", + "rootDir": "./src", + "outDir": "./lib", + "declarationDir": "./lib", + "esModuleInterop": true, + "moduleResolution": "node", + "module": "es6", + "sourceMap": true, + "strict": true, + "plugins": [ + { "name": "@syndicate-lang/ts-plugin" } + ] + }, + "include": ["src/**/*"] +} diff --git a/packages/create/tsconfig.json b/packages/create/tsconfig.json new file mode 100644 index 0000000..62dde7f --- /dev/null +++ b/packages/create/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["ES2019", "DOM"], + "declaration": true, + "baseUrl": "./src", + "rootDir": "./src", + "outDir": "./lib", + "declarationDir": "./lib", + "esModuleInterop": true, + "moduleResolution": "node", + "module": "CommonJS", + "sourceMap": true, + "strict": true + }, + "include": ["src/**/*"] +} diff --git a/todo/create/.gitignore b/todo/create/.gitignore deleted file mode 100644 index 51220c4..0000000 --- a/todo/create/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -*-debug.log -*-error.log -/.nyc_output -/dist -/package-lock.json -/tmp -node_modules -/src/syndicate-template.zip diff --git a/todo/create/all.do b/todo/create/all.do deleted file mode 100644 index 0df2f23..0000000 --- a/todo/create/all.do +++ /dev/null @@ -1 +0,0 @@ -redo-ifchange src/syndicate-template.zip diff --git a/todo/create/bin/run b/todo/create/bin/run deleted file mode 100755 index 8d5f46d..0000000 --- a/todo/create/bin/run +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env node - -require('..').run() -.catch(require('@oclif/errors/handle')) diff --git a/todo/create/bin/run.cmd b/todo/create/bin/run.cmd deleted file mode 100644 index 968fc30..0000000 --- a/todo/create/bin/run.cmd +++ /dev/null @@ -1,3 +0,0 @@ -@echo off - -node "%~dp0\run" %* diff --git a/todo/create/clean.do b/todo/create/clean.do deleted file mode 100644 index e95d476..0000000 --- a/todo/create/clean.do +++ /dev/null @@ -1 +0,0 @@ -rm -f src/syndicate-template.zip diff --git a/todo/create/package.json b/todo/create/package.json deleted file mode 100644 index 7ed6c11..0000000 --- a/todo/create/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "@syndicate-lang/create", - "description": "Create a new Syndicate/js package", - "version": "0.0.5", - "author": "Tony Garnock-Jones ", - "bin": { - "create": "./bin/run" - }, - "scripts": { - "prepare": "which redo >/dev/null && redo || ../../do" - }, - "dependencies": { - "@oclif/command": "^1", - "@oclif/config": "^1", - "@oclif/plugin-help": "^2", - "unzipper": "^0.10.11" - }, - "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/create", - "license": "GPL-3.0+", - "publishConfig": { - "access": "public" - }, - "main": "src/index.js", - "oclif": { - "bin": "create" - }, - "repository": "github:syndicate-lang/syndicate-js", - "files": [ - "/bin", - "/src" - ] -} diff --git a/todo/create/src/index.js b/todo/create/src/index.js deleted file mode 100644 index 1cff8f4..0000000 --- a/todo/create/src/index.js +++ /dev/null @@ -1,44 +0,0 @@ -const {Command, flags} = require('@oclif/command') -const path = require('path'); -const fs = require('fs'); -const unzip = require('unzipper'); - -class SyndicateLangCreateCommand extends Command { - async run() { - const { args, flags} = this.parse(SyndicateLangCreateCommand) - const directory = path.resolve(args.directory); - const packageName = flags.package || path.basename(directory); - console.log(`Creating package ${packageName} in ${directory}.`); - fs.mkdir(directory, { recursive: true }, (err) => { - if (err) throw err; - fs.createReadStream(path.join(__dirname, 'syndicate-template.zip')).pipe( - unzip.Extract({ path: directory }).on('close', (err) => { - if (err) throw err; - const packageJsonPath = path.join(directory, 'package.json'); - const p = Object.assign({ - name: packageName, - }, require(packageJsonPath)); - fs.writeFile(packageJsonPath, JSON.stringify(p, null, 2), (err) => { - if (err) throw err; - }); - })); - }); - } -} - -SyndicateLangCreateCommand.id = ''; // ??? -SyndicateLangCreateCommand.args = [ - { name: 'directory', required: true }, -]; - -SyndicateLangCreateCommand.description = `Create a new Syndicate/js package.` - -SyndicateLangCreateCommand.flags = { - // add --version flag to show CLI version - version: flags.version({char: 'v'}), - // add --help flag to show CLI version - help: flags.help({char: 'h'}), - package: flags.string({char: 'n', description: 'package name to create'}), -} - -module.exports = SyndicateLangCreateCommand diff --git a/todo/create/src/syndicate-template.zip.do b/todo/create/src/syndicate-template.zip.do deleted file mode 100644 index f546a09..0000000 --- a/todo/create/src/syndicate-template.zip.do +++ /dev/null @@ -1,3 +0,0 @@ -redo-ifchange $(find ../template) -target="$(pwd)/$3" -(cd ../template; zip -q -r "$target" .) >&2 diff --git a/todo/create/template/.babelrc b/todo/create/template/.babelrc deleted file mode 100644 index aebf4f8..0000000 --- a/todo/create/template/.babelrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "presets": [ "@babel/preset-env" ], - "plugins": [ - "@syndicate-lang/syntax/plugin", - "@babel/plugin-transform-react-jsx", - "@babel/plugin-syntax-jsx" - ] -} diff --git a/todo/create/template/package.json b/todo/create/template/package.json deleted file mode 100644 index 4ee2160..0000000 --- a/todo/create/template/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "private": true, - "version": "0.0.0", - "license": "GPL-3.0+", - "devDependencies": { - "@babel/core": "^7", - "@babel/plugin-syntax-jsx": "^7", - "@babel/plugin-transform-react-jsx": "^7", - "@babel/preset-env": "^7", - "@syndicate-lang/syntax": "" - }, - "dependencies": { - "@syndicate-lang/core": "" - }, - "scripts": { - "build": "./node_modules/.bin/syndicate-babel src --out-dir lib" - } -} diff --git a/todo/create/template/src/index.js b/todo/create/template/src/index.js deleted file mode 100644 index 5808528..0000000 --- a/todo/create/template/src/index.js +++ /dev/null @@ -1,17 +0,0 @@ -"use strict"; - -import { Observe } from "@syndicate-lang/core"; - -message type Greeting(who); - -spawn named 'sender' { - on asserted Observe(Greeting(_)) { - send Greeting("world"); - } -} - -spawn named 'greeter' { - on message Greeting($who) { - console.log(`Hello, ${who}!`); - } -}