From 2fd427a656e4417776d561b252e3bd3ce95fa3b9 Mon Sep 17 00:00:00 2001 From: Donnie Flood Date: Sat, 4 Feb 2023 17:30:51 -0700 Subject: [PATCH] Revamp gen implementation and add deno-project generator --- .changeset/seven-avocados-hide.md | 9 + package-lock.json | 908 +++++++++++++++++- .../deno-project/new/.gitignore.ejs.t | 2 +- .../deno-project/new/.prettierignore.ejs.t | 4 +- .../deno-project/new/.prettierrc.ejs.t | 4 +- .../deno-project/new/README.md.ejs.t | 2 +- .../deno-project/new/import_map.json.ejs.t | 7 +- .../gen/_templates/deno-project/new/index.js | 14 - .../deno-project/new/package.json.ejs.t | 2 +- .../deno-project/new/public/.keep.ejs.t | 2 +- .../new/src/client/index.ts.ejs.t | 2 +- .../deno-project/new/src/deps.ts.ejs.t | 2 +- .../new/src/server/autorun.ts.ejs.t | 2 +- .../new/src/server/index.ts.ejs.t | 15 +- .../new/src/server/liveTemplates.ts.ejs.t | 2 +- .../new/src/server/liveview/hello.ts.ejs.t | 2 +- .../new/src/server/liveview/router.ts.ejs.t | 4 +- .../deno-project/new/src/server/oak.ts.ejs.t | 2 +- .../new/tsconfig-client.json.ejs.t | 2 +- packages/gen/_templates/gatherer.js | 33 - .../node-project/new/.gitignore.ejs.t | 2 +- .../_templates/node-project/new/.npmrc.ejs.t | 4 +- .../node-project/new/.prettierignore.ejs.t | 4 +- .../node-project/new/.prettierrc.ejs.t | 4 +- .../node-project/new/README.md.ejs.t | 2 +- .../gen/_templates/node-project/new/index.js | 14 - .../node-project/new/package.json.ejs.t | 2 +- .../node-project/new/public/.keep.ejs.t | 2 +- .../new/src/client/index.ts.ejs.t | 2 +- .../new/src/server/autorun.ts.ejs.t | 2 +- .../new/src/server/express.ts.ejs.t | 2 +- .../new/src/server/index.ts.ejs.t | 2 +- .../new/src/server/liveTemplates.ts.ejs.t | 2 +- .../new/src/server/liveview/hello.ts.ejs.t | 2 +- .../new/src/server/liveview/router.ts.ejs.t | 2 +- .../new/tsconfig-client.json.ejs.t | 2 +- .../node-project/new/tsconfig.json.ejs.t | 2 +- .../node-project/new/z_npm_install.ejs.t | 4 - packages/gen/_templates/prompts.js | 27 - packages/gen/dist/cli.d.mts | 1 + packages/gen/dist/cli.d.ts | 2 - packages/gen/dist/cli.js | 43 - packages/gen/dist/cli.mjs | 107 +++ packages/gen/dist/null_logger.d.mts | 4 + packages/gen/dist/null_logger.mjs | 7 + packages/gen/dist/post_exec.d.mts | 4 + packages/gen/dist/post_exec.mjs | 27 + packages/gen/dist/project_helper.d.mts | 8 + packages/gen/dist/project_helper.mjs | 36 + packages/gen/dist/prompts.d.mts | 8 + packages/gen/dist/prompts.mjs | 17 + packages/gen/dist/yargs.d.mts | 11 + packages/gen/dist/yargs.mjs | 39 + packages/gen/package.json | 17 +- packages/gen/src/cli.mts | 115 +++ packages/gen/src/cli.ts | 43 - packages/gen/src/null_logger.mts | 8 + packages/gen/src/post_exec.mts | 31 + packages/gen/src/project_helper.mts | 54 ++ packages/gen/src/prompts.mts | 26 + packages/gen/src/yargs.mts | 52 + packages/gen/tsconfig.json | 21 +- 62 files changed, 1509 insertions(+), 275 deletions(-) create mode 100644 .changeset/seven-avocados-hide.md delete mode 100644 packages/gen/_templates/deno-project/new/index.js delete mode 100644 packages/gen/_templates/gatherer.js delete mode 100644 packages/gen/_templates/node-project/new/index.js delete mode 100644 packages/gen/_templates/node-project/new/z_npm_install.ejs.t delete mode 100644 packages/gen/_templates/prompts.js create mode 100644 packages/gen/dist/cli.d.mts delete mode 100644 packages/gen/dist/cli.d.ts delete mode 100644 packages/gen/dist/cli.js create mode 100644 packages/gen/dist/cli.mjs create mode 100644 packages/gen/dist/null_logger.d.mts create mode 100644 packages/gen/dist/null_logger.mjs create mode 100644 packages/gen/dist/post_exec.d.mts create mode 100644 packages/gen/dist/post_exec.mjs create mode 100644 packages/gen/dist/project_helper.d.mts create mode 100644 packages/gen/dist/project_helper.mjs create mode 100644 packages/gen/dist/prompts.d.mts create mode 100644 packages/gen/dist/prompts.mjs create mode 100644 packages/gen/dist/yargs.d.mts create mode 100644 packages/gen/dist/yargs.mjs create mode 100644 packages/gen/src/cli.mts delete mode 100644 packages/gen/src/cli.ts create mode 100644 packages/gen/src/null_logger.mts create mode 100644 packages/gen/src/post_exec.mts create mode 100644 packages/gen/src/project_helper.mts create mode 100644 packages/gen/src/prompts.mts create mode 100644 packages/gen/src/yargs.mts diff --git a/.changeset/seven-avocados-hide.md b/.changeset/seven-avocados-hide.md new file mode 100644 index 0000000..9b3a419 --- /dev/null +++ b/.changeset/seven-avocados-hide.md @@ -0,0 +1,9 @@ +--- +"@liveviewjs/lambda-examples": patch +"liveviewjs": patch +"@liveviewjs/examples": patch +"@liveviewjs/express": patch +"@liveviewjs/gen": patch +--- + +Revamp gen package and add deno project generator diff --git a/package-lock.json b/package-lock.json index b17c125..b2103a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ }, "apps/lambda-examples": { "name": "@liveviewjs/lambda-examples", - "version": "0.2.1", + "version": "0.10.0", "license": "MIT", "dependencies": { "@liveviewjs/examples": "*", @@ -4647,6 +4647,54 @@ "rollup": "^2.38.3" } }, + "node_modules/@rollup/plugin-json": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz", + "integrity": "sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-json/node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-json/node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, "node_modules/@rollup/plugin-node-resolve": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", @@ -5201,6 +5249,16 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, + "node_modules/@types/execa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/execa/-/execa-2.0.0.tgz", + "integrity": "sha512-aBnkJ0r3khaZkHzu9pDZeWXrDg1N/ZtDGRQkK+KIqNVvvTvW+URXMUHQQCQMYdb2GPrcwu9Fq6l9iiT+pirIbg==", + "deprecated": "This is a stub types definition. execa provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "execa": "*" + } + }, "node_modules/@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -5231,6 +5289,22 @@ "@types/express": "*" } }, + "node_modules/@types/figlet": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/figlet/-/figlet-1.5.5.tgz", + "integrity": "sha512-0sMBeFoqdGgdXoR/hgKYSWMpFufSpToosNsI2VgmkPqZJgeEXsXNu2hGr0FN401dBro2tNO5y2D6uw3UxVaxbg==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz", + "integrity": "sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==", + "dev": true, + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } + }, "node_modules/@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -5314,6 +5388,15 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, + "node_modules/@types/jsonfile": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", + "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/jsonwebtoken": { "version": "8.5.9", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", @@ -7490,14 +7573,16 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone": { @@ -10426,7 +10511,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -13363,6 +13447,151 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-update": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", + "dependencies": { + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/log-update/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -16562,7 +16791,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -17343,6 +17571,43 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/smartwrap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/smartwrap/-/smartwrap-2.0.2.tgz", @@ -20218,7 +20483,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -20237,18 +20501,17 @@ } }, "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "dev": true, + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" @@ -20322,7 +20585,7 @@ }, "packages/core": { "name": "liveviewjs", - "version": "0.9.1", + "version": "0.10.0", "license": "MIT", "dependencies": { "deep-object-diff": "^1.1.7", @@ -20409,7 +20672,7 @@ }, "packages/examples": { "name": "@liveviewjs/examples", - "version": "0.9.1", + "version": "0.10.0", "license": "MIT", "dependencies": { "liveviewjs": "*", @@ -20448,7 +20711,7 @@ }, "packages/express": { "name": "@liveviewjs/express", - "version": "0.9.1", + "version": "0.10.0", "license": "MIT", "dependencies": { "express": "^4.17.2", @@ -20494,17 +20757,31 @@ }, "packages/gen": { "name": "@liveviewjs/gen", - "version": "0.0.1", + "version": "0.10.0", "license": "MIT", "dependencies": { + "chalk": "^5.2.0", + "cli-spinners": "^2.7.0", "enquirer": "^2.3.6", - "hygen": "^6.2.11" + "execa": "^6.1.0", + "fs-extra": "^11.1.0", + "hygen": "^6.2.11", + "log-update": "^5.0.1", + "yargs": "^17.6.2" }, "bin": { "gen": "dist/cli.js" }, "devDependencies": { + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^13.1.3", + "@rollup/plugin-typescript": "^8.3.1", + "@types/execa": "^2.0.0", + "@types/figlet": "^1.5.5", + "@types/fs-extra": "^11.0.1", "@types/node": "^18.11.18", + "rollup": "^2.70.1", "ts-node": "^10.9.1", "typescript": "^4.9.4" } @@ -20532,12 +20809,243 @@ "typescript": "^4.9.4" } }, + "packages/gen/node_modules/@rollup/plugin-commonjs": { + "version": "24.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz", + "integrity": "sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.27.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "packages/gen/node_modules/@rollup/plugin-commonjs/node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "packages/gen/node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, "packages/gen/node_modules/@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, + "packages/gen/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "packages/gen/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "packages/gen/node_modules/execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "packages/gen/node_modules/fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "packages/gen/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/gen/node_modules/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "engines": { + "node": ">=12.20.0" + } + }, + "packages/gen/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/gen/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "packages/gen/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/gen/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/gen/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/gen/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/gen/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/gen/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/scaffold/create-lvjs-node": { "name": "@liveviewjs/create-node-project", "version": "0.0.4", @@ -23569,18 +24077,177 @@ "@liveviewjs/gen": { "version": "file:packages/gen", "requires": { + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^13.1.3", + "@rollup/plugin-typescript": "^8.3.1", + "@types/execa": "^2.0.0", + "@types/figlet": "^1.5.5", + "@types/fs-extra": "^11.0.1", "@types/node": "^18.11.18", + "chalk": "^5.2.0", + "cli-spinners": "^2.7.0", "enquirer": "^2.3.6", + "execa": "*", + "fs-extra": "^11.1.0", "hygen": "^6.2.11", + "log-update": "^5.0.1", + "rollup": "^2.70.1", "ts-node": "^10.9.1", - "typescript": "^4.9.4" + "typescript": "^4.9.4", + "yargs": "^17.6.2" }, "dependencies": { + "@rollup/plugin-commonjs": { + "version": "24.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz", + "integrity": "sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.27.0" + }, + "dependencies": { + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + } + } + }, + "@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, "@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==" + }, + "execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==" + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" + }, + "magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" } } }, @@ -23894,6 +24561,34 @@ "resolve": "^1.17.0" } }, + "@rollup/plugin-json": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz", + "integrity": "sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.1" + }, + "dependencies": { + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + } + } + }, "@rollup/plugin-node-resolve": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", @@ -24282,6 +24977,15 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, + "@types/execa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/execa/-/execa-2.0.0.tgz", + "integrity": "sha512-aBnkJ0r3khaZkHzu9pDZeWXrDg1N/ZtDGRQkK+KIqNVvvTvW+URXMUHQQCQMYdb2GPrcwu9Fq6l9iiT+pirIbg==", + "dev": true, + "requires": { + "execa": "*" + } + }, "@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -24312,6 +25016,22 @@ "@types/express": "*" } }, + "@types/figlet": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/figlet/-/figlet-1.5.5.tgz", + "integrity": "sha512-0sMBeFoqdGgdXoR/hgKYSWMpFufSpToosNsI2VgmkPqZJgeEXsXNu2hGr0FN401dBro2tNO5y2D6uw3UxVaxbg==", + "dev": true + }, + "@types/fs-extra": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz", + "integrity": "sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==", + "dev": true, + "requires": { + "@types/jsonfile": "*", + "@types/node": "*" + } + }, "@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -24395,6 +25115,15 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, + "@types/jsonfile": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", + "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/jsonwebtoken": { "version": "8.5.9", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", @@ -26066,13 +26795,12 @@ } }, "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, @@ -28142,8 +28870,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { "version": "1.1.2", @@ -30603,6 +31330,93 @@ "is-unicode-supported": "^0.1.0" } }, + "log-update": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", + "requires": { + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "requires": { + "type-fest": "^1.0.2" + } + }, + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "requires": { + "restore-cursor": "^4.0.0" + } + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -32890,8 +33704,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "require-from-string": { "version": "2.0.2", @@ -33494,6 +34307,27 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "requires": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==" + } + } + }, "smartwrap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/smartwrap/-/smartwrap-2.0.2.tgz", @@ -35537,8 +36371,7 @@ "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", @@ -35551,18 +36384,17 @@ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "dev": true, + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" } }, "yargs-parser": { diff --git a/packages/gen/_templates/deno-project/new/.gitignore.ejs.t b/packages/gen/_templates/deno-project/new/.gitignore.ejs.t index 3e686ed..fd2af7c 100644 --- a/packages/gen/_templates/deno-project/new/.gitignore.ejs.t +++ b/packages/gen/_templates/deno-project/new/.gitignore.ejs.t @@ -1,5 +1,5 @@ --- -to: .gitignore +to: <%= h.changeCase.lower(name) %>/.gitignore --- key.json local_import_map.json diff --git a/packages/gen/_templates/deno-project/new/.prettierignore.ejs.t b/packages/gen/_templates/deno-project/new/.prettierignore.ejs.t index c7795d1..aa969b1 100644 --- a/packages/gen/_templates/deno-project/new/.prettierignore.ejs.t +++ b/packages/gen/_templates/deno-project/new/.prettierignore.ejs.t @@ -1,5 +1,5 @@ --- -to: .prettierignore +to: <%= h.changeCase.lower(name) %>/.prettierignore --- node_modules .cache/ @@ -8,4 +8,4 @@ dist/ .parcel-cache/ .DS_Store coverage/ -package-lock.json \ No newline at end of file +package-lock.json diff --git a/packages/gen/_templates/deno-project/new/.prettierrc.ejs.t b/packages/gen/_templates/deno-project/new/.prettierrc.ejs.t index 8511ccd..83e1f4d 100644 --- a/packages/gen/_templates/deno-project/new/.prettierrc.ejs.t +++ b/packages/gen/_templates/deno-project/new/.prettierrc.ejs.t @@ -1,9 +1,9 @@ --- -to: .prettierrc +to: <%= h.changeCase.lower(name) %>/.prettierrc --- { "tabWidth": 2, "useTabs": false, "printWidth": 120, "bracketSameLine": true -} \ No newline at end of file +} diff --git a/packages/gen/_templates/deno-project/new/README.md.ejs.t b/packages/gen/_templates/deno-project/new/README.md.ejs.t index c0ce4dc..7dd5500 100644 --- a/packages/gen/_templates/deno-project/new/README.md.ejs.t +++ b/packages/gen/_templates/deno-project/new/README.md.ejs.t @@ -1,5 +1,5 @@ --- -to: README.md +to: <%= h.changeCase.lower(name) %>/README.md --- # <%= h.inflection.camelize(name, false) %> diff --git a/packages/gen/_templates/deno-project/new/import_map.json.ejs.t b/packages/gen/_templates/deno-project/new/import_map.json.ejs.t index 401b8c5..4886fdc 100644 --- a/packages/gen/_templates/deno-project/new/import_map.json.ejs.t +++ b/packages/gen/_templates/deno-project/new/import_map.json.ejs.t @@ -1,5 +1,5 @@ --- -to: import_map.json +to: <%= h.changeCase.lower(name) %>/import_map.json --- { "imports": { @@ -8,7 +8,8 @@ to: import_map.json "events": "https://deno.land/std@0.128.0/node/events.ts", "nanoid": "https://deno.land/x/nanoid@v3.0.0/mod.ts", "path-to-regexp": "https://deno.land/x/path_to_regexp@v6.2.1/index.ts", - "liveviewjs": "../core/dist/liveview.mjs", - "@liveviewjs/examples": "../examples/dist/liveviewjs-examples.mjs" + "liveviewjs": "https://raw.githubusercontent.com/floodfx/liveviewjs/main/packages/core/mod.ts", + "@liveviewjs/deno": "https://raw.githubusercontent.com/floodfx/liveviewjs/main/packages/deno/mod.ts", + "@liveviewjs/examples": "https://raw.githubusercontent.com/floodfx/liveviewjs/main/packages/examples/mod.ts" } } diff --git a/packages/gen/_templates/deno-project/new/index.js b/packages/gen/_templates/deno-project/new/index.js deleted file mode 100644 index ad7b4ed..0000000 --- a/packages/gen/_templates/deno-project/new/index.js +++ /dev/null @@ -1,14 +0,0 @@ -const { ProjectName, NpmInstall } = require('../../prompts'); - -module.exports = { - prompt: async ({ prompter, args }) => { - const name = await ProjectName({ prompter, args }); - const install = await NpmInstall({ prompter, args }); - const results = { - ...name, - ...install, - }; - console.log(results); - return results; - }, -}; diff --git a/packages/gen/_templates/deno-project/new/package.json.ejs.t b/packages/gen/_templates/deno-project/new/package.json.ejs.t index cd72190..44f87f7 100644 --- a/packages/gen/_templates/deno-project/new/package.json.ejs.t +++ b/packages/gen/_templates/deno-project/new/package.json.ejs.t @@ -1,5 +1,5 @@ --- -to: package.json +to: <%= h.changeCase.lower(name) %>/package.json --- { "private": true, diff --git a/packages/gen/_templates/deno-project/new/public/.keep.ejs.t b/packages/gen/_templates/deno-project/new/public/.keep.ejs.t index d0fc684..fc6de8a 100644 --- a/packages/gen/_templates/deno-project/new/public/.keep.ejs.t +++ b/packages/gen/_templates/deno-project/new/public/.keep.ejs.t @@ -1,3 +1,3 @@ --- -to: public/.keep +to: <%= h.changeCase.lower(name) %>/public/.keep --- diff --git a/packages/gen/_templates/deno-project/new/src/client/index.ts.ejs.t b/packages/gen/_templates/deno-project/new/src/client/index.ts.ejs.t index cf3e230..e320310 100644 --- a/packages/gen/_templates/deno-project/new/src/client/index.ts.ejs.t +++ b/packages/gen/_templates/deno-project/new/src/client/index.ts.ejs.t @@ -1,5 +1,5 @@ --- -to: src/client/index.ts +to: <%= h.changeCase.lower(name) %>/src/client/index.ts --- import NProgress from "nprogress"; import { Socket } from "phoenix"; diff --git a/packages/gen/_templates/deno-project/new/src/deps.ts.ejs.t b/packages/gen/_templates/deno-project/new/src/deps.ts.ejs.t index 43a056c..b7163b9 100644 --- a/packages/gen/_templates/deno-project/new/src/deps.ts.ejs.t +++ b/packages/gen/_templates/deno-project/new/src/deps.ts.ejs.t @@ -1,5 +1,5 @@ --- -to: src/deps.ts +to: <%= h.changeCase.lower(name) %>/src/deps.ts --- // @liveviewjs/examples export { diff --git a/packages/gen/_templates/deno-project/new/src/server/autorun.ts.ejs.t b/packages/gen/_templates/deno-project/new/src/server/autorun.ts.ejs.t index cb3d79c..906e8ae 100644 --- a/packages/gen/_templates/deno-project/new/src/server/autorun.ts.ejs.t +++ b/packages/gen/_templates/deno-project/new/src/server/autorun.ts.ejs.t @@ -1,5 +1,5 @@ --- -to: src/server/autorun.ts +to: <%= h.changeCase.lower(name) %>/src/server/autorun.ts --- import * as esbuild from "https://deno.land/x/esbuild@v0.15.9/mod.js"; diff --git a/packages/gen/_templates/deno-project/new/src/server/index.ts.ejs.t b/packages/gen/_templates/deno-project/new/src/server/index.ts.ejs.t index 0abfba5..8317f43 100644 --- a/packages/gen/_templates/deno-project/new/src/server/index.ts.ejs.t +++ b/packages/gen/_templates/deno-project/new/src/server/index.ts.ejs.t @@ -1,21 +1,18 @@ --- -to: src/server/index.ts +to: <%= h.changeCase.lower(name) %>/src/server/index.ts --- -import { BroadcastChannelPubSub } from "../deno/broadcastChannelPubSub.ts"; -import { DenoOakLiveViewServer } from "../deno/server.ts"; +import { BroadcastChannelPubSub, DenoOakLiveViewServer } from "@liveviewjs/deno"; import { Application, Router } from "../deps.ts"; -import { indexHandler } from "./indexHandler.ts"; -import { liveHtmlTemplate, wrapperTemplate } from "./liveTemplates.ts"; +import { htmlPageTemplate } from "./liveTemplates.ts"; import { liveRouter } from "./liveview/router.ts"; import { logRequests, serveStatic } from "./oak.ts"; // initialize the LiveViewServer const liveServer = new DenoOakLiveViewServer( liveRouter, - liveHtmlTemplate, + htmlPageTemplate, { title: "Deno Demo", suffix: " · LiveViewJS" }, { - wrapperTemplate, pubSub: new BroadcastChannelPubSub(), // onError: console.error, // uncomment to see errors // debug: console.log, // uncomment to see messages @@ -26,8 +23,8 @@ const liveServer = new DenoOakLiveViewServer( const router = new Router(); // send websocket requests to the LiveViewJS server router.get("/live/websocket", liveServer.wsMiddleware); -// setup the index route -router.get("/", indexHandler); +// redirect index to /hello +router.get("/", (ctx) => ctx.response.redirect("/hello")); // serve static files (images, js, and css) from public directory router.get("/(.*).(png|jpg|jpeg|gif|js|js.map|css)", serveStatic); diff --git a/packages/gen/_templates/deno-project/new/src/server/liveTemplates.ts.ejs.t b/packages/gen/_templates/deno-project/new/src/server/liveTemplates.ts.ejs.t index a668773..18ca5e3 100644 --- a/packages/gen/_templates/deno-project/new/src/server/liveTemplates.ts.ejs.t +++ b/packages/gen/_templates/deno-project/new/src/server/liveTemplates.ts.ejs.t @@ -1,5 +1,5 @@ --- -to: src/server/liveTemplates.ts +to: <%= h.changeCase.lower(name) %>/src/server/liveTemplates.ts --- import { html, LiveTitleOptions, LiveViewHtmlPageTemplate, LiveViewTemplate, live_title_tag, safe } from "liveviewjs"; diff --git a/packages/gen/_templates/deno-project/new/src/server/liveview/hello.ts.ejs.t b/packages/gen/_templates/deno-project/new/src/server/liveview/hello.ts.ejs.t index 5edacfe..2399e43 100644 --- a/packages/gen/_templates/deno-project/new/src/server/liveview/hello.ts.ejs.t +++ b/packages/gen/_templates/deno-project/new/src/server/liveview/hello.ts.ejs.t @@ -1,5 +1,5 @@ --- -to: src/server/liveview/hello.ts +to: <%= h.changeCase.lower(name) %>/src/server/liveview/hello.ts --- import { createLiveView, html } from "liveviewjs"; diff --git a/packages/gen/_templates/deno-project/new/src/server/liveview/router.ts.ejs.t b/packages/gen/_templates/deno-project/new/src/server/liveview/router.ts.ejs.t index 88b767a..5881601 100644 --- a/packages/gen/_templates/deno-project/new/src/server/liveview/router.ts.ejs.t +++ b/packages/gen/_templates/deno-project/new/src/server/liveview/router.ts.ejs.t @@ -1,8 +1,8 @@ --- -to: src/server/liveview/router.ts +to: <%= h.changeCase.lower(name) %>/src/server/liveview/router.ts --- import { LiveViewRouter } from "liveviewjs"; -import { helloLive } from "./hello"; +import { helloLive } from "./hello.ts"; // configure LiveView routes for <%= h.inflection.camelize(name, false) %> export const liveRouter: LiveViewRouter = { diff --git a/packages/gen/_templates/deno-project/new/src/server/oak.ts.ejs.t b/packages/gen/_templates/deno-project/new/src/server/oak.ts.ejs.t index a4d467b..9bf76c2 100644 --- a/packages/gen/_templates/deno-project/new/src/server/oak.ts.ejs.t +++ b/packages/gen/_templates/deno-project/new/src/server/oak.ts.ejs.t @@ -1,5 +1,5 @@ --- -to: src/server/oak.ts +to: <%= h.changeCase.lower(name) %>/src/server/oak.ts --- import { Context, LiveViewRouter, send } from "../deps.ts"; diff --git a/packages/gen/_templates/deno-project/new/tsconfig-client.json.ejs.t b/packages/gen/_templates/deno-project/new/tsconfig-client.json.ejs.t index 3484421..b0452ff 100644 --- a/packages/gen/_templates/deno-project/new/tsconfig-client.json.ejs.t +++ b/packages/gen/_templates/deno-project/new/tsconfig-client.json.ejs.t @@ -1,5 +1,5 @@ --- -to: tsconfig-client.json +to: <%= h.changeCase.lower(name) %>/tsconfig-client.json --- { "compilerOptions": { diff --git a/packages/gen/_templates/gatherer.js b/packages/gen/_templates/gatherer.js deleted file mode 100644 index f62a5a9..0000000 --- a/packages/gen/_templates/gatherer.js +++ /dev/null @@ -1,33 +0,0 @@ -// copied from: https://github.com/jondot/hygen/issues/35 -function Gatherer(questions) { - return async ({ prompter, args = {} }) => { - const result = await questions.reduce(async (resultsPromise, question) => { - const results = await resultsPromise; - - // only suggest answers instead of skipping. (principle of least surprise) - if (args[question.name]) question.initial = args[question.name]; - - const answer = await prompter.prompt(question); - - const nestedQuestions = - typeof question.questions === 'function' - ? await question.questions({ ...results, ...answer }) - : question.questions; - - const nestedAnswers = Array.isArray(nestedQuestions) - ? await Gatherer(nestedQuestions)({ prompter, args }) - : {}; - - return { - ...results, - ...answer, - ...nestedAnswers, - }; - }, Promise.resolve({})); - return result; - }; -} - -module.exports = { - Gatherer -}; diff --git a/packages/gen/_templates/node-project/new/.gitignore.ejs.t b/packages/gen/_templates/node-project/new/.gitignore.ejs.t index d7af26d..9bb9050 100644 --- a/packages/gen/_templates/node-project/new/.gitignore.ejs.t +++ b/packages/gen/_templates/node-project/new/.gitignore.ejs.t @@ -1,5 +1,5 @@ --- -to: .gitignore +to: <%= h.changeCase.lower(name) %>/.gitignore --- public/*.png public/*.gif diff --git a/packages/gen/_templates/node-project/new/.npmrc.ejs.t b/packages/gen/_templates/node-project/new/.npmrc.ejs.t index eb41030..816af9f 100644 --- a/packages/gen/_templates/node-project/new/.npmrc.ejs.t +++ b/packages/gen/_templates/node-project/new/.npmrc.ejs.t @@ -1,4 +1,4 @@ --- -to: .npmrc +to: <%= h.changeCase.lower(name) %>/.npmrc --- -engine-strict=true \ No newline at end of file +engine-strict=true diff --git a/packages/gen/_templates/node-project/new/.prettierignore.ejs.t b/packages/gen/_templates/node-project/new/.prettierignore.ejs.t index c7795d1..aa969b1 100644 --- a/packages/gen/_templates/node-project/new/.prettierignore.ejs.t +++ b/packages/gen/_templates/node-project/new/.prettierignore.ejs.t @@ -1,5 +1,5 @@ --- -to: .prettierignore +to: <%= h.changeCase.lower(name) %>/.prettierignore --- node_modules .cache/ @@ -8,4 +8,4 @@ dist/ .parcel-cache/ .DS_Store coverage/ -package-lock.json \ No newline at end of file +package-lock.json diff --git a/packages/gen/_templates/node-project/new/.prettierrc.ejs.t b/packages/gen/_templates/node-project/new/.prettierrc.ejs.t index 8511ccd..83e1f4d 100644 --- a/packages/gen/_templates/node-project/new/.prettierrc.ejs.t +++ b/packages/gen/_templates/node-project/new/.prettierrc.ejs.t @@ -1,9 +1,9 @@ --- -to: .prettierrc +to: <%= h.changeCase.lower(name) %>/.prettierrc --- { "tabWidth": 2, "useTabs": false, "printWidth": 120, "bracketSameLine": true -} \ No newline at end of file +} diff --git a/packages/gen/_templates/node-project/new/README.md.ejs.t b/packages/gen/_templates/node-project/new/README.md.ejs.t index 293ebb3..76bef58 100644 --- a/packages/gen/_templates/node-project/new/README.md.ejs.t +++ b/packages/gen/_templates/node-project/new/README.md.ejs.t @@ -1,5 +1,5 @@ --- -to: README.md +to: <%= h.changeCase.lower(name) %>/README.md --- # <%= h.inflection.camelize(name, false) %> diff --git a/packages/gen/_templates/node-project/new/index.js b/packages/gen/_templates/node-project/new/index.js deleted file mode 100644 index ad7b4ed..0000000 --- a/packages/gen/_templates/node-project/new/index.js +++ /dev/null @@ -1,14 +0,0 @@ -const { ProjectName, NpmInstall } = require('../../prompts'); - -module.exports = { - prompt: async ({ prompter, args }) => { - const name = await ProjectName({ prompter, args }); - const install = await NpmInstall({ prompter, args }); - const results = { - ...name, - ...install, - }; - console.log(results); - return results; - }, -}; diff --git a/packages/gen/_templates/node-project/new/package.json.ejs.t b/packages/gen/_templates/node-project/new/package.json.ejs.t index fc0f0f8..5ecfc19 100644 --- a/packages/gen/_templates/node-project/new/package.json.ejs.t +++ b/packages/gen/_templates/node-project/new/package.json.ejs.t @@ -1,5 +1,5 @@ --- -to: package.json +to: <%= h.changeCase.lower(name) %>/package.json --- { "name": "<%= name %>", diff --git a/packages/gen/_templates/node-project/new/public/.keep.ejs.t b/packages/gen/_templates/node-project/new/public/.keep.ejs.t index d0fc684..fc6de8a 100644 --- a/packages/gen/_templates/node-project/new/public/.keep.ejs.t +++ b/packages/gen/_templates/node-project/new/public/.keep.ejs.t @@ -1,3 +1,3 @@ --- -to: public/.keep +to: <%= h.changeCase.lower(name) %>/public/.keep --- diff --git a/packages/gen/_templates/node-project/new/src/client/index.ts.ejs.t b/packages/gen/_templates/node-project/new/src/client/index.ts.ejs.t index cf3e230..e320310 100644 --- a/packages/gen/_templates/node-project/new/src/client/index.ts.ejs.t +++ b/packages/gen/_templates/node-project/new/src/client/index.ts.ejs.t @@ -1,5 +1,5 @@ --- -to: src/client/index.ts +to: <%= h.changeCase.lower(name) %>/src/client/index.ts --- import NProgress from "nprogress"; import { Socket } from "phoenix"; diff --git a/packages/gen/_templates/node-project/new/src/server/autorun.ts.ejs.t b/packages/gen/_templates/node-project/new/src/server/autorun.ts.ejs.t index af284fe..d300768 100644 --- a/packages/gen/_templates/node-project/new/src/server/autorun.ts.ejs.t +++ b/packages/gen/_templates/node-project/new/src/server/autorun.ts.ejs.t @@ -1,5 +1,5 @@ --- -to: src/server/autorun.ts +to: <%= h.changeCase.lower(name) %>/src/server/autorun.ts --- import chalk from "chalk"; import { ChildProcess, spawn } from "child_process"; diff --git a/packages/gen/_templates/node-project/new/src/server/express.ts.ejs.t b/packages/gen/_templates/node-project/new/src/server/express.ts.ejs.t index 52828d2..8a2c138 100644 --- a/packages/gen/_templates/node-project/new/src/server/express.ts.ejs.t +++ b/packages/gen/_templates/node-project/new/src/server/express.ts.ejs.t @@ -1,5 +1,5 @@ --- -to: src/server/express.ts +to: <%= h.changeCase.lower(name) %>/src/server/express.ts --- import express, { NextFunction, Request, Response } from "express"; import session, { MemoryStore } from "express-session"; diff --git a/packages/gen/_templates/node-project/new/src/server/index.ts.ejs.t b/packages/gen/_templates/node-project/new/src/server/index.ts.ejs.t index 513417c..bf2cf6d 100644 --- a/packages/gen/_templates/node-project/new/src/server/index.ts.ejs.t +++ b/packages/gen/_templates/node-project/new/src/server/index.ts.ejs.t @@ -1,5 +1,5 @@ --- -to: src/server/index.ts +to: <%= h.changeCase.lower(name) %>/src/server/index.ts --- import { NodeExpressLiveViewServer } from "@liveviewjs/express"; import { Server } from "http"; diff --git a/packages/gen/_templates/node-project/new/src/server/liveTemplates.ts.ejs.t b/packages/gen/_templates/node-project/new/src/server/liveTemplates.ts.ejs.t index a668773..18ca5e3 100644 --- a/packages/gen/_templates/node-project/new/src/server/liveTemplates.ts.ejs.t +++ b/packages/gen/_templates/node-project/new/src/server/liveTemplates.ts.ejs.t @@ -1,5 +1,5 @@ --- -to: src/server/liveTemplates.ts +to: <%= h.changeCase.lower(name) %>/src/server/liveTemplates.ts --- import { html, LiveTitleOptions, LiveViewHtmlPageTemplate, LiveViewTemplate, live_title_tag, safe } from "liveviewjs"; diff --git a/packages/gen/_templates/node-project/new/src/server/liveview/hello.ts.ejs.t b/packages/gen/_templates/node-project/new/src/server/liveview/hello.ts.ejs.t index 5edacfe..2399e43 100644 --- a/packages/gen/_templates/node-project/new/src/server/liveview/hello.ts.ejs.t +++ b/packages/gen/_templates/node-project/new/src/server/liveview/hello.ts.ejs.t @@ -1,5 +1,5 @@ --- -to: src/server/liveview/hello.ts +to: <%= h.changeCase.lower(name) %>/src/server/liveview/hello.ts --- import { createLiveView, html } from "liveviewjs"; diff --git a/packages/gen/_templates/node-project/new/src/server/liveview/router.ts.ejs.t b/packages/gen/_templates/node-project/new/src/server/liveview/router.ts.ejs.t index 88b767a..3064a1f 100644 --- a/packages/gen/_templates/node-project/new/src/server/liveview/router.ts.ejs.t +++ b/packages/gen/_templates/node-project/new/src/server/liveview/router.ts.ejs.t @@ -1,5 +1,5 @@ --- -to: src/server/liveview/router.ts +to: <%= h.changeCase.lower(name) %>/src/server/liveview/router.ts --- import { LiveViewRouter } from "liveviewjs"; import { helloLive } from "./hello"; diff --git a/packages/gen/_templates/node-project/new/tsconfig-client.json.ejs.t b/packages/gen/_templates/node-project/new/tsconfig-client.json.ejs.t index fcbb6b8..fbaadf9 100644 --- a/packages/gen/_templates/node-project/new/tsconfig-client.json.ejs.t +++ b/packages/gen/_templates/node-project/new/tsconfig-client.json.ejs.t @@ -1,5 +1,5 @@ --- -to: tsconfig-client.json +to: <%= h.changeCase.lower(name) %>/tsconfig-client.json --- { "compilerOptions": { diff --git a/packages/gen/_templates/node-project/new/tsconfig.json.ejs.t b/packages/gen/_templates/node-project/new/tsconfig.json.ejs.t index 4d79328..65fb23d 100644 --- a/packages/gen/_templates/node-project/new/tsconfig.json.ejs.t +++ b/packages/gen/_templates/node-project/new/tsconfig.json.ejs.t @@ -1,5 +1,5 @@ --- -to: tsconfig.json +to: <%= h.changeCase.lower(name) %>/tsconfig.json --- { "compilerOptions": { diff --git a/packages/gen/_templates/node-project/new/z_npm_install.ejs.t b/packages/gen/_templates/node-project/new/z_npm_install.ejs.t deleted file mode 100644 index 908c499..0000000 --- a/packages/gen/_templates/node-project/new/z_npm_install.ejs.t +++ /dev/null @@ -1,4 +0,0 @@ ---- -# optionally run npm install if the user wants to -sh: "<%= locals.install ? `npm install` : null %>" ---- diff --git a/packages/gen/_templates/prompts.js b/packages/gen/_templates/prompts.js deleted file mode 100644 index 0c8ada6..0000000 --- a/packages/gen/_templates/prompts.js +++ /dev/null @@ -1,27 +0,0 @@ -// copied from: https://github.com/jondot/hygen/issues/35 -const { Gatherer } = require('./Gatherer'); - -async function ProjectName({ prompter, args = {} }) { - return Gatherer([ - { - type: 'input', - name: 'name', - message: "What should we call this project?", - }, - ])({ prompter, args }); -} - -async function NpmInstall({ prompter, args = {} }) { - return Gatherer([ - { - type: 'confirm', - name: 'install', - message: "Should we run npm install for you?", - }, - ])({ prompter, args }); -} - -module.exports = { - ProjectName, - NpmInstall -} diff --git a/packages/gen/dist/cli.d.mts b/packages/gen/dist/cli.d.mts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/packages/gen/dist/cli.d.mts @@ -0,0 +1 @@ +export {}; diff --git a/packages/gen/dist/cli.d.ts b/packages/gen/dist/cli.d.ts deleted file mode 100644 index b798801..0000000 --- a/packages/gen/dist/cli.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -export {}; diff --git a/packages/gen/dist/cli.js b/packages/gen/dist/cli.js deleted file mode 100644 index 2dbfd2e..0000000 --- a/packages/gen/dist/cli.js +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env node -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const child_process_1 = require("child_process"); -const enquirer_1 = require("enquirer"); -const hygen_1 = require("hygen"); -const path_1 = __importDefault(require("path")); -const run = async () => { - // first ask what generator to run - const { generator } = (await (0, enquirer_1.prompt)({ - type: "select", - name: "generator", - message: "What LiveViewJS generator would you like to run?", - choices: ["node-project"], // "deno-project"], - })); - const defaultTemplates = path_1.default.join(__dirname, "../_templates"); - // run hygen - const result = await (0, hygen_1.runner)([generator, "new"], { - templates: defaultTemplates, - cwd: process.cwd(), - logger: new hygen_1.Logger(console.log.bind(console)), - debug: !!process.env.DEBUG, - exec: (action, body) => { - console.log("Executing command: ", action, body); - const res = (0, child_process_1.exec)(action + " " + body); - if (res.exitCode !== 0) { - console.error("Command failed."); - return; - } - console.log("Command done."); - }, - createPrompter: () => require("enquirer"), - }); - if (result.failure) { - console.error("Failed to run generator: ", result.failure); - process.exit(1); - } - process.exit(result.success ? 0 : 1); -}; -run(); diff --git a/packages/gen/dist/cli.mjs b/packages/gen/dist/cli.mjs new file mode 100644 index 0000000..17dc2c7 --- /dev/null +++ b/packages/gen/dist/cli.mjs @@ -0,0 +1,107 @@ +import chalk from "chalk"; +import cliSpinners from "cli-spinners"; +import enquirer from "enquirer"; +import { execa } from "execa"; +import { Logger, runner } from "hygen"; +import logUpdate from "log-update"; +import path from "path"; +import * as url from "url"; +import { NullLogger } from "./null_logger.mjs"; +import { changeDirMsg, installMsg, runMsg } from "./post_exec.mjs"; +import { GeneratorTypePromptOptions, NamePromptOptions, NpmInstallPromptOptions } from "./prompts.mjs"; +import { genYargs, nodeYargs } from "./yargs.mjs"; +const { prompt } = enquirer; +const __dirname = url.fileURLToPath(new URL(".", import.meta.url)); +const templates = path.join(__dirname, "../_templates"); +async function runHygen(args, quiet) { + return await runner(args, { + templates, + cwd: process.cwd(), + logger: quiet ? new NullLogger() : new Logger(console.log.bind(console)), + debug: !!process.env.DEBUG, + exec: () => { }, + createPrompter: () => { + return { + prompt: async (questions) => { + return await prompt(questions); + }, + }; + }, + }); +} +async function runExeca(action) { + const { stderr, stdout, failed, exitCode } = await execa(action[0], action.slice(1)); + console.log(stdout); + if (failed) { + console.error(stderr); + process.exit(exitCode); + } +} +const run = async () => { + try { + const hygenArgs = []; + const postExec = []; + const msgs = []; + // check for common args + const gyargs = genYargs(process.argv.slice(2)); + let generator = gyargs.generator; + if (!generator) { + generator = (await prompt(GeneratorTypePromptOptions)).generator; + } + hygenArgs.push(generator, "new"); + if (!gyargs.name) { + gyargs.name = (await prompt(NamePromptOptions)).name; + } + msgs.push(changeDirMsg(generator, gyargs.name)); + hygenArgs.push("--name", gyargs.name); + if (gyargs.force) { + // force hygen to overwrite files + process.env.HYGEN_OVERWRITE = "1"; + } + // depending on generator parse args + if (generator === "node-project") { + const yargs = nodeYargs(process.argv.slice(2)); + if (yargs.install === undefined) { + yargs.install = (await prompt(NpmInstallPromptOptions)).install; + } + msgs.push(installMsg(generator, yargs.install)); + if (yargs.install) { + postExec.push(async () => { + const spinner = cliSpinners.squareCorners; + let i = 0; + const ref = setInterval(() => { + const { frames } = spinner; + logUpdate(frames[(i = ++i % frames.length)] + " Running npm install..."); + }, spinner.interval); + process.chdir(path.join(process.cwd(), gyargs.name)); + await runExeca(["npm", "install"]); + clearInterval(ref); + }); + } + } + msgs.push(runMsg(generator)); + const result = await runHygen(hygenArgs, !!gyargs.quiet); + // exit if we have errors + if (result.failure || !result.success) { + console.error("Error: ", result.failure ?? "unknown error"); + process.exit(1); + } + // run post template actions + for (const action of postExec) { + await action(); + } + // print success message + const msg = msgs + .filter((m) => m !== undefined) + .reduce((m, val) => { + m += `\n\t- ${val}`; + return m; + }, ""); + console.log(chalk.green(`\n\nSuccess! Created "${gyargs.name}" LiveViewJS project! ${msg}`)); + } + catch (e) { + console.error("Error: ", e); + process.exit(1); + } +}; +run(); diff --git a/packages/gen/dist/null_logger.d.mts b/packages/gen/dist/null_logger.d.mts new file mode 100644 index 0000000..eb9ef31 --- /dev/null +++ b/packages/gen/dist/null_logger.d.mts @@ -0,0 +1,4 @@ +import { Logger } from "hygen"; +export declare class NullLogger extends Logger { + constructor(); +} diff --git a/packages/gen/dist/null_logger.mjs b/packages/gen/dist/null_logger.mjs new file mode 100644 index 0000000..25b569d --- /dev/null +++ b/packages/gen/dist/null_logger.mjs @@ -0,0 +1,7 @@ +import { Logger } from "hygen"; +// logger that ignores all messages +export class NullLogger extends Logger { + constructor() { + super(() => { }); + } +} diff --git a/packages/gen/dist/post_exec.d.mts b/packages/gen/dist/post_exec.d.mts new file mode 100644 index 0000000..7a7bd37 --- /dev/null +++ b/packages/gen/dist/post_exec.d.mts @@ -0,0 +1,4 @@ +import { GeneratorType } from "./prompts.mjs"; +export declare function changeDirMsg(type: GeneratorType, name: string): string | undefined; +export declare function installMsg(type: GeneratorType, install: boolean): "Run `npm install` to install node dependencies." | undefined; +export declare function runMsg(type: GeneratorType): "Run `npm run dev` to start your LiveViewJS project.\"" | "Run `deno run --allow-run --allow-read --allow-write --allow-net --allow-env src/server/autorun.ts` to start your LiveViewJS project.\"" | undefined; diff --git a/packages/gen/dist/post_exec.mjs b/packages/gen/dist/post_exec.mjs new file mode 100644 index 0000000..964db65 --- /dev/null +++ b/packages/gen/dist/post_exec.mjs @@ -0,0 +1,27 @@ +export function changeDirMsg(type, name) { + switch (type) { + case "node-project": + case "deno-project": + return `cd ${name.toLowerCase()}`; + default: + return undefined; + } +} +export function installMsg(type, install) { + switch (type) { + case "node-project": + return install ? undefined : "Run `npm install` to install node dependencies."; + default: + return undefined; + } +} +export function runMsg(type) { + switch (type) { + case "node-project": + return 'Run `npm run dev` to start your LiveViewJS project."'; + case "deno-project": + return 'Run `deno run --allow-run --allow-read --allow-write --allow-net --allow-env src/server/autorun.ts` to start your LiveViewJS project."'; + default: + return undefined; + } +} diff --git a/packages/gen/dist/project_helper.d.mts b/packages/gen/dist/project_helper.d.mts new file mode 100644 index 0000000..96e162a --- /dev/null +++ b/packages/gen/dist/project_helper.d.mts @@ -0,0 +1,8 @@ +export type CreateAppArgs = { + projectType: "node-project" | "deno-project"; + projectDir?: string; + install?: boolean; + quiet?: boolean; +}; +declare function createApp({ projectType, projectDir, install, quiet }: CreateAppArgs): Promise; +export { createApp }; diff --git a/packages/gen/dist/project_helper.mjs b/packages/gen/dist/project_helper.mjs new file mode 100644 index 0000000..ad5f8d7 --- /dev/null +++ b/packages/gen/dist/project_helper.mjs @@ -0,0 +1,36 @@ +import { execSync } from "child_process"; +import * as path from "path"; +const MIN_VERSION = 16; +async function createApp({ projectType, projectDir, install, quiet }) { + let versions = process.versions; + if (projectType === "node-project" && versions?.node && parseInt(versions.node) < MIN_VERSION) { + console.log(`️🚨 Oops, Node v${versions.node} detected. LiveViewJS requires a Node version greater than ${MIN_VERSION}.`); + process.exit(1); + } + // Create the app directory + const relativeProjectDir = path.relative(process.cwd(), projectDir ?? ""); + console.log("cwd", process.cwd(), "rel", relativeProjectDir); + const projectDirIsCurrentDir = relativeProjectDir === ""; + if (install) { + execSync("npm install", { stdio: "inherit", cwd: process.cwd() }); + } + if (!quiet) { + let cdFirstMessage = ""; + if (!projectDirIsCurrentDir) { + cdFirstMessage = ` \`cd\` into "${path.relative(process.cwd(), projectDir ?? "")}". `; + } + let installMessage = ""; + if (projectType === "node-project" && !install) { + installMessage = `Run \`npm install\` to install dependencies.`; + } + let runMessage = ""; + if (projectType === "node-project") { + runMessage = ` Run \`npm run dev\` to start your LiveViewJS project.`; + } + if (projectType === "deno-project") { + runMessage = ` Run \`deno run --allow-run --allow-read --allow-write --allow-net --allow-env src/server/autorun.ts\` to start your LiveViewJS project.`; + } + console.log(`🖼 LiveViewJS app created!${cdFirstMessage}${installMessage}${runMessage} Check out the README for more details!`); + } +} +export { createApp }; diff --git a/packages/gen/dist/prompts.d.mts b/packages/gen/dist/prompts.d.mts new file mode 100644 index 0000000..5d4fac9 --- /dev/null +++ b/packages/gen/dist/prompts.d.mts @@ -0,0 +1,8 @@ +import { Prompt } from "enquirer"; +type PromptOptions = NonNullable[0]>; +export declare const GeneratorTypes: readonly ["node-project", "deno-project"]; +export type GeneratorType = typeof GeneratorTypes[number]; +export declare const GeneratorTypePromptOptions: PromptOptions; +export declare const NamePromptOptions: PromptOptions; +export declare const NpmInstallPromptOptions: PromptOptions; +export {}; diff --git a/packages/gen/dist/prompts.mjs b/packages/gen/dist/prompts.mjs new file mode 100644 index 0000000..f2b8959 --- /dev/null +++ b/packages/gen/dist/prompts.mjs @@ -0,0 +1,17 @@ +export const GeneratorTypes = ["node-project", "deno-project"]; +export const GeneratorTypePromptOptions = { + type: "select", + name: "generator", + message: "What LiveViewJS generator would you like to run?", + choices: GeneratorTypes, +}; +export const NamePromptOptions = { + type: "input", + name: "name", + message: "What should we call this project?", +}; +export const NpmInstallPromptOptions = { + type: "confirm", + name: "install", + message: "Should we run npm install for you?", +}; diff --git a/packages/gen/dist/yargs.d.mts b/packages/gen/dist/yargs.d.mts new file mode 100644 index 0000000..e379be6 --- /dev/null +++ b/packages/gen/dist/yargs.d.mts @@ -0,0 +1,11 @@ +export interface GenYargs { + generator?: string; + name?: string; + quiet?: boolean; + force?: boolean; +} +export declare const genYargs: (argv: string[]) => GenYargs; +export interface NodeProjectYargs { + install?: boolean; +} +export declare const nodeYargs: (argv: string[]) => NodeProjectYargs; diff --git a/packages/gen/dist/yargs.mjs b/packages/gen/dist/yargs.mjs new file mode 100644 index 0000000..554dcc8 --- /dev/null +++ b/packages/gen/dist/yargs.mjs @@ -0,0 +1,39 @@ +import yargs from "yargs/yargs"; +export const genYargs = (argv) => { + return yargs(argv) + .options({ + generator: { + type: "string", + alias: "g", + description: "Generator to run", + }, + name: { + type: "string", + alias: "n", + description: "Name of the project", + }, + quiet: { + type: "boolean", + alias: "q", + description: "Suppress all output", + }, + force: { + type: "boolean", + alias: "f", + description: "Overwrite existing files", + }, + }) + .parseSync(); +}; +export const nodeYargs = (argv) => { + return yargs(argv) + .usage("Usage: $0 [generator] [args]") + .options({ + install: { + type: "boolean", + alias: "i", + description: "Run npm install", + }, + }) + .parseSync(); +}; diff --git a/packages/gen/package.json b/packages/gen/package.json index fc4c5a1..e470219 100644 --- a/packages/gen/package.json +++ b/packages/gen/package.json @@ -12,6 +12,7 @@ "bugs": { "url": "https://github.com/floodfx/liveviewjs/issues" }, + "type": "module", "main": "./dist/cli.js", "bin": "./dist/cli.js", "types": "./dist/cli.d.ts", @@ -36,11 +37,25 @@ "framework" ], "dependencies": { + "chalk": "^5.2.0", + "cli-spinners": "^2.7.0", "enquirer": "^2.3.6", - "hygen": "^6.2.11" + "execa": "^6.1.0", + "fs-extra": "^11.1.0", + "hygen": "^6.2.11", + "log-update": "^5.0.1", + "yargs": "^17.6.2" }, "devDependencies": { + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^13.1.3", + "@rollup/plugin-typescript": "^8.3.1", + "@types/execa": "^2.0.0", + "@types/figlet": "^1.5.5", + "@types/fs-extra": "^11.0.1", "@types/node": "^18.11.18", + "rollup": "^2.70.1", "ts-node": "^10.9.1", "typescript": "^4.9.4" } diff --git a/packages/gen/src/cli.mts b/packages/gen/src/cli.mts new file mode 100644 index 0000000..981e915 --- /dev/null +++ b/packages/gen/src/cli.mts @@ -0,0 +1,115 @@ +import chalk from "chalk"; +import cliSpinners from "cli-spinners"; +import enquirer from "enquirer"; +import { execa } from "execa"; +import { Logger, runner } from "hygen"; +import logUpdate from "log-update"; +import path from "path"; +import * as url from "url"; +import { NullLogger } from "./null_logger.mjs"; +import { changeDirMsg, installMsg, runMsg } from "./post_exec.mjs"; +import { GeneratorType, GeneratorTypePromptOptions, NamePromptOptions, NpmInstallPromptOptions } from "./prompts.mjs"; +import { genYargs, nodeYargs } from "./yargs.mjs"; +const { prompt } = enquirer; +const __dirname = url.fileURLToPath(new URL(".", import.meta.url)); + +const templates = path.join(__dirname, "../_templates"); +async function runHygen(args: string[], quiet: boolean) { + return await runner(args, { + templates, + cwd: process.cwd(), + logger: quiet ? new NullLogger() : new Logger(console.log.bind(console)), // eslint-disable-line no-console + debug: !!process.env.DEBUG, + exec: () => {}, // ignore hygen shell actions + createPrompter: () => { + return { + prompt: async (questions: Q): Promise => { + return await prompt(questions as any); + }, + }; + }, + }); +} + +async function runExeca(action: string[]) { + const { stderr, stdout, failed, exitCode } = await execa(action[0], action.slice(1)); + console.log(stdout); + if (failed) { + console.error(stderr); + process.exit(exitCode); + } +} + +const run = async () => { + try { + const hygenArgs: string[] = []; + const postExec: Function[] = []; + const msgs: (string | undefined)[] = []; + + // check for common args + const gyargs = genYargs(process.argv.slice(2)); + let generator = gyargs.generator; + if (!generator) { + generator = ((await prompt(GeneratorTypePromptOptions)) as { generator: string }).generator; + } + hygenArgs.push(generator, "new"); + if (!gyargs.name) { + gyargs.name = ((await prompt(NamePromptOptions)) as { name: string }).name; + } + msgs.push(changeDirMsg(generator as GeneratorType, gyargs.name!)); + hygenArgs.push("--name", gyargs.name); + if (gyargs.force) { + // force hygen to overwrite files + process.env.HYGEN_OVERWRITE = "1"; + } + + // depending on generator parse args + if (generator === "node-project") { + const yargs = nodeYargs(process.argv.slice(2)); + if (yargs.install === undefined) { + yargs.install = ((await prompt(NpmInstallPromptOptions)) as { install: boolean }).install; + } + msgs.push(installMsg(generator as GeneratorType, yargs.install)); + if (yargs.install) { + postExec.push(async () => { + const spinner = cliSpinners.squareCorners; + let i = 0; + const ref = setInterval(() => { + const { frames } = spinner; + logUpdate(frames[(i = ++i % frames.length)] + " Running npm install..."); + }, spinner.interval); + process.chdir(path.join(process.cwd(), gyargs.name!)); + await runExeca(["npm", "install"]); + clearInterval(ref); + }); + } + } + msgs.push(runMsg(generator as GeneratorType)); + + const result = await runHygen(hygenArgs, !!gyargs.quiet); + // exit if we have errors + if (result.failure || !result.success) { + console.error("Error: ", result.failure ?? "unknown error"); + process.exit(1); + } + + // run post template actions + for (const action of postExec) { + await action(); + } + + // print success message + const msg = msgs + .filter((m) => m !== undefined) + .reduce((m, val) => { + m += `\n\t- ${val}`; + return m; + }, ""); + console.log(chalk.green(`\n\nSuccess! Created "${gyargs.name}" LiveViewJS project! ${msg}`)); + } catch (e) { + console.error("Error: ", e); + process.exit(1); + } +}; + +run(); diff --git a/packages/gen/src/cli.ts b/packages/gen/src/cli.ts deleted file mode 100644 index 13c5f73..0000000 --- a/packages/gen/src/cli.ts +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env node - -import { exec } from "child_process"; -import { prompt } from "enquirer"; -import { Logger, runner } from "hygen"; -import path from "path"; - -const run = async () => { - // first ask what generator to run - const { generator } = (await prompt({ - type: "select", - name: "generator", - message: "What LiveViewJS generator would you like to run?", - choices: ["node-project"], // "deno-project"], - })) as { generator: string }; - - const defaultTemplates = path.join(__dirname, "../_templates"); - - // run hygen - const result = await runner([generator, "new"], { - templates: defaultTemplates, - cwd: process.cwd(), - logger: new Logger(console.log.bind(console)), // eslint-disable-line no-console - debug: !!process.env.DEBUG, - exec: (action, body) => { - console.log("Executing command: ", action, body); - const res = exec(action + " " + body); - if (res.exitCode !== 0) { - console.error("Command failed."); - return; - } - console.log("Command done."); - }, - createPrompter: () => require("enquirer"), - }); - if (result.failure) { - console.error("Failed to run generator: ", result.failure); - process.exit(1); - } - process.exit(result.success ? 0 : 1); -}; - -run(); diff --git a/packages/gen/src/null_logger.mts b/packages/gen/src/null_logger.mts new file mode 100644 index 0000000..4c3f24e --- /dev/null +++ b/packages/gen/src/null_logger.mts @@ -0,0 +1,8 @@ +import { Logger } from "hygen"; + +// logger that ignores all messages +export class NullLogger extends Logger { + constructor() { + super(() => {}); + } +} diff --git a/packages/gen/src/post_exec.mts b/packages/gen/src/post_exec.mts new file mode 100644 index 0000000..def161f --- /dev/null +++ b/packages/gen/src/post_exec.mts @@ -0,0 +1,31 @@ +import { GeneratorType } from "./prompts.mjs"; + +export function changeDirMsg(type: GeneratorType, name: string) { + switch (type) { + case "node-project": + case "deno-project": + return `cd ${name.toLowerCase()}`; + default: + return undefined; + } +} + +export function installMsg(type: GeneratorType, install: boolean) { + switch (type) { + case "node-project": + return install ? undefined : "Run `npm install` to install node dependencies."; + default: + return undefined; + } +} + +export function runMsg(type: GeneratorType) { + switch (type) { + case "node-project": + return 'Run `npm run dev` to start your LiveViewJS project."'; + case "deno-project": + return 'Run `deno run --allow-run --allow-read --allow-write --allow-net --allow-env src/server/autorun.ts` to start your LiveViewJS project."'; + default: + return undefined; + } +} diff --git a/packages/gen/src/project_helper.mts b/packages/gen/src/project_helper.mts new file mode 100644 index 0000000..81a4242 --- /dev/null +++ b/packages/gen/src/project_helper.mts @@ -0,0 +1,54 @@ +import { execSync } from "child_process"; +import * as path from "path"; + +const MIN_VERSION = 16; + +export type CreateAppArgs = { + projectType: "node-project" | "deno-project"; + projectDir?: string; + install?: boolean; + quiet?: boolean; +}; + +async function createApp({ projectType, projectDir, install, quiet }: CreateAppArgs) { + let versions = process.versions; + + if (projectType === "node-project" && versions?.node && parseInt(versions.node) < MIN_VERSION) { + console.log( + `️🚨 Oops, Node v${versions.node} detected. LiveViewJS requires a Node version greater than ${MIN_VERSION}.` + ); + process.exit(1); + } + + // Create the app directory + const relativeProjectDir = path.relative(process.cwd(), projectDir ?? ""); + console.log("cwd", process.cwd(), "rel", relativeProjectDir); + const projectDirIsCurrentDir = relativeProjectDir === ""; + + if (install) { + execSync("npm install", { stdio: "inherit", cwd: process.cwd() }); + } + + if (!quiet) { + let cdFirstMessage = ""; + if (!projectDirIsCurrentDir) { + cdFirstMessage = ` \`cd\` into "${path.relative(process.cwd(), projectDir ?? "")}". `; + } + let installMessage = ""; + if (projectType === "node-project" && !install) { + installMessage = `Run \`npm install\` to install dependencies.`; + } + let runMessage = ""; + if (projectType === "node-project") { + runMessage = ` Run \`npm run dev\` to start your LiveViewJS project.`; + } + if (projectType === "deno-project") { + runMessage = ` Run \`deno run --allow-run --allow-read --allow-write --allow-net --allow-env src/server/autorun.ts\` to start your LiveViewJS project.`; + } + console.log( + `🖼 LiveViewJS app created!${cdFirstMessage}${installMessage}${runMessage} Check out the README for more details!` + ); + } +} + +export { createApp }; diff --git a/packages/gen/src/prompts.mts b/packages/gen/src/prompts.mts new file mode 100644 index 0000000..2c1c513 --- /dev/null +++ b/packages/gen/src/prompts.mts @@ -0,0 +1,26 @@ +import { Prompt } from "enquirer"; + +// extract options type from Prompt constructor +type PromptOptions = NonNullable[0]>; + +export const GeneratorTypes = ["node-project", "deno-project"] as const; +export type GeneratorType = typeof GeneratorTypes[number]; + +export const GeneratorTypePromptOptions: PromptOptions = { + type: "select", + name: "generator", + message: "What LiveViewJS generator would you like to run?", + choices: GeneratorTypes as unknown as string[], +}; + +export const NamePromptOptions: PromptOptions = { + type: "input", + name: "name", + message: "What should we call this project?", +}; + +export const NpmInstallPromptOptions: PromptOptions = { + type: "confirm", + name: "install", + message: "Should we run npm install for you?", +}; diff --git a/packages/gen/src/yargs.mts b/packages/gen/src/yargs.mts new file mode 100644 index 0000000..a8479df --- /dev/null +++ b/packages/gen/src/yargs.mts @@ -0,0 +1,52 @@ +import yargs from "yargs/yargs"; + +export interface GenYargs { + generator?: string; + name?: string; + quiet?: boolean; + force?: boolean; +} + +export const genYargs = (argv: string[]): GenYargs => { + return yargs(argv) + .options({ + generator: { + type: "string", + alias: "g", + description: "Generator to run", + }, + name: { + type: "string", + alias: "n", + description: "Name of the project", + }, + quiet: { + type: "boolean", + alias: "q", + description: "Suppress all output", + }, + force: { + type: "boolean", + alias: "f", + description: "Overwrite existing files", + }, + }) + .parseSync(); +}; + +export interface NodeProjectYargs { + install?: boolean; +} + +export const nodeYargs = (argv: string[]): NodeProjectYargs => { + return yargs(argv) + .usage("Usage: $0 [generator] [args]") + .options({ + install: { + type: "boolean", + alias: "i", + description: "Run npm install", + }, + }) + .parseSync(); +}; diff --git a/packages/gen/tsconfig.json b/packages/gen/tsconfig.json index fd126b4..ef1b608 100644 --- a/packages/gen/tsconfig.json +++ b/packages/gen/tsconfig.json @@ -1,18 +1,23 @@ { "compilerOptions": { - "target": "ESNext", - "module": "CommonJS", - "lib": ["ESNext"], - "declaration": true, - "types": ["node"], - "strict": true, - "moduleResolution": "node", + "module": "ESNext", "esModuleInterop": true, "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "strictPropertyInitialization": false, + "declaration": true, + "resolveJsonModule": true, + "strict": true, "skipLibCheck": true, + "target": "esnext", + "lib": ["esnext"], + "moduleResolution": "node", + "types": ["node"], "outDir": "./dist", "baseUrl": "." }, "include": ["src/**/*"], - "exclude": ["dist", "node_modules", "**/*.test.ts"] + "exclude": ["dist", "node_modules/**/*", "**/*.test.ts"] }