create-mikrojs 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -0
  3. package/bin/create-mikrojs.js +2 -0
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +106 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/inspect.d.ts +2 -0
  9. package/dist/inspect.d.ts.map +1 -0
  10. package/dist/inspect.js +56 -0
  11. package/dist/inspect.js.map +1 -0
  12. package/dist/logo.d.ts +2 -0
  13. package/dist/logo.d.ts.map +1 -0
  14. package/dist/logo.js +26 -0
  15. package/dist/logo.js.map +1 -0
  16. package/dist/pkg-manager.d.ts +5 -0
  17. package/dist/pkg-manager.d.ts.map +1 -0
  18. package/dist/pkg-manager.js +15 -0
  19. package/dist/pkg-manager.js.map +1 -0
  20. package/dist/scaffold.d.ts +22 -0
  21. package/dist/scaffold.d.ts.map +1 -0
  22. package/dist/scaffold.js +133 -0
  23. package/dist/scaffold.js.map +1 -0
  24. package/dist/scaffold.test.d.ts +2 -0
  25. package/dist/scaffold.test.d.ts.map +1 -0
  26. package/dist/scaffold.test.js +105 -0
  27. package/dist/scaffold.test.js.map +1 -0
  28. package/dist/templates/_common/dependencies.d.ts +7 -0
  29. package/dist/templates/_common/dependencies.d.ts.map +1 -0
  30. package/dist/templates/_common/dependencies.js +7 -0
  31. package/dist/templates/_common/dependencies.js.map +1 -0
  32. package/dist/templates/_common/env-example.d.ts +2 -0
  33. package/dist/templates/_common/env-example.d.ts.map +1 -0
  34. package/dist/templates/_common/env-example.js +10 -0
  35. package/dist/templates/_common/env-example.js.map +1 -0
  36. package/dist/templates/_common/gitignore.d.ts +2 -0
  37. package/dist/templates/_common/gitignore.d.ts.map +1 -0
  38. package/dist/templates/_common/gitignore.js +8 -0
  39. package/dist/templates/_common/gitignore.js.map +1 -0
  40. package/dist/templates/_common/package-json.d.ts +22 -0
  41. package/dist/templates/_common/package-json.d.ts.map +1 -0
  42. package/dist/templates/_common/package-json.js +22 -0
  43. package/dist/templates/_common/package-json.js.map +1 -0
  44. package/dist/templates/_common/readme.d.ts +11 -0
  45. package/dist/templates/_common/readme.d.ts.map +1 -0
  46. package/dist/templates/_common/readme.js +45 -0
  47. package/dist/templates/_common/readme.js.map +1 -0
  48. package/dist/templates/_common/tsconfig.d.ts +3 -0
  49. package/dist/templates/_common/tsconfig.d.ts.map +1 -0
  50. package/dist/templates/_common/tsconfig.js +26 -0
  51. package/dist/templates/_common/tsconfig.js.map +1 -0
  52. package/package.json +56 -0
  53. package/src/templates/_common/dependencies.ts +9 -0
  54. package/src/templates/_common/env-example.ts +9 -0
  55. package/src/templates/_common/gitignore.ts +7 -0
  56. package/src/templates/_common/package-json.ts +35 -0
  57. package/src/templates/_common/readme.ts +64 -0
  58. package/src/templates/_common/tsconfig.ts +27 -0
  59. package/src/templates/blank/app/main.ts +3 -0
  60. package/src/templates/blinky/app/main.ts +18 -0
  61. package/src/templates/neopixel/app/color.ts +23 -0
  62. package/src/templates/neopixel/app/main.ts +24 -0
  63. package/src/templates/neopixel/app/patterns/breathe.ts +22 -0
  64. package/src/templates/neopixel/app/patterns/color-wipe.ts +35 -0
  65. package/src/templates/neopixel/app/patterns/comet.ts +29 -0
  66. package/src/templates/neopixel/app/patterns/rainbow.ts +24 -0
  67. package/src/templates/neopixel/app/patterns/sparkle.ts +25 -0
  68. package/src/templates/pwm-led/app/main.ts +21 -0
  69. package/src/templates/rtc-counter/app/main.ts +20 -0
  70. package/src/templates/sntp/app/main.ts +35 -0
  71. package/src/templates/sntp/env.d.ts +4 -0
  72. package/src/templates/wifi-access-point/app/main.ts +40 -0
  73. package/src/templates/wifi-fetch/app/main.ts +35 -0
  74. package/src/templates/wifi-fetch/env.d.ts +4 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Bjørge Næss
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # create-mikrojs
2
+
3
+ Scaffolding tool for new Mikro.js projects.
4
+
5
+ ```sh
6
+ npm create mikrojs my-project
7
+ ```
8
+
9
+ ## Templates
10
+
11
+ | Template | Description |
12
+ | ------------------- | --------------------------- |
13
+ | `blank` | Empty starter project |
14
+ | `blinky` | Blink an LED |
15
+ | `pwm-led` | PWM LED fading |
16
+ | `neopixel` | RGB LED strip |
17
+ | `wifi-fetch` | WiFi + HTTP request |
18
+ | `wifi-access-point` | WiFi hotspot |
19
+ | `sntp` | NTP time sync |
20
+ | `rtc-counter` | RTC counter with deep sleep |
21
+
22
+ ## Usage
23
+
24
+ ```sh
25
+ # Interactive (prompts for template)
26
+ npm create mikrojs my-project
27
+
28
+ # With template
29
+ npm create mikrojs -- my-project --template blinky
30
+
31
+ # With pnpm
32
+ pnpm create mikrojs my-project --template blinky
33
+ ```
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import '../dist/index.js'
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,106 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import * as p from '@clack/prompts';
5
+ import { message, object, optional } from '@optique/core';
6
+ import { argument, option } from '@optique/core/primitives';
7
+ import { defineProgram } from '@optique/core/program';
8
+ import { string } from '@optique/core/valueparser';
9
+ import { run } from '@optique/run';
10
+ import { printLogo } from './logo.js';
11
+ import { detectPkgManager, installCommand } from './pkg-manager.js';
12
+ import { scaffold, TEMPLATES } from './scaffold.js';
13
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
14
+ const templatesDir = path.resolve(__dirname, '..', 'src', 'templates');
15
+ const pkg = JSON.parse(fs.readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf-8'));
16
+ const args = object({
17
+ name: optional(argument(string({ metavar: 'NAME' }))),
18
+ template: optional(option('-t', '--template', string({ metavar: 'TEMPLATE' }), {
19
+ description: message `Template to use`,
20
+ })),
21
+ });
22
+ const prog = defineProgram({
23
+ parser: args,
24
+ metadata: {
25
+ name: 'create-mikrojs',
26
+ version: pkg.version,
27
+ author: message `Bjørge Næss <bjoerge@gmail.com>`,
28
+ bugs: message `https://github.com/mikrojs/mikrojs/issues`,
29
+ },
30
+ });
31
+ async function main(config) {
32
+ const templateNames = TEMPLATES.map((t) => t.name);
33
+ printLogo();
34
+ p.intro('Create a new Mikro.js project');
35
+ const projectName = config.name ||
36
+ (await p.text({
37
+ message: 'Project name',
38
+ placeholder: 'my-mikrojs-project',
39
+ defaultValue: 'my-mikrojs-project',
40
+ validate: (value = '') => {
41
+ if (!value.trim())
42
+ return 'Project name is required';
43
+ if (/[^a-zA-Z0-9._-]/.test(value))
44
+ return 'Project name contains invalid characters';
45
+ },
46
+ }));
47
+ if (p.isCancel(projectName)) {
48
+ p.cancel('Cancelled.');
49
+ process.exit(0);
50
+ }
51
+ if (config.template && !templateNames.includes(config.template)) {
52
+ p.cancel(`Unknown template "${config.template}". Available templates: ${templateNames.join(', ')}`);
53
+ process.exit(1);
54
+ }
55
+ const template = config.template ||
56
+ (await p.select({
57
+ message: 'Select a template',
58
+ options: TEMPLATES.map((t) => ({
59
+ label: t.name,
60
+ hint: t.description,
61
+ value: t.name,
62
+ })),
63
+ }));
64
+ if (p.isCancel(template)) {
65
+ p.cancel('Cancelled.');
66
+ process.exit(0);
67
+ }
68
+ const typescript = await p.confirm({
69
+ message: 'Use TypeScript?',
70
+ initialValue: true,
71
+ });
72
+ if (p.isCancel(typescript)) {
73
+ p.cancel('Cancelled.');
74
+ process.exit(0);
75
+ }
76
+ const targetDir = path.resolve(process.cwd(), projectName);
77
+ if (fs.existsSync(targetDir) && fs.readdirSync(targetDir).length > 0) {
78
+ p.cancel(`Directory "${projectName}" already exists and is not empty.`);
79
+ process.exit(1);
80
+ }
81
+ const pm = detectPkgManager();
82
+ scaffold({
83
+ targetDir,
84
+ template,
85
+ projectName,
86
+ mikrojsVersion: pkg.version,
87
+ typescript,
88
+ templatesDir,
89
+ pkgManager: pm,
90
+ });
91
+ const mikro = pm === 'npm' ? 'npx mikro' : 'pnpm mikro';
92
+ const steps = [`cd ${projectName}`, installCommand(pm), `${mikro} dev`];
93
+ p.note(steps.join('\n'), 'Next steps');
94
+ p.outro(`Project created in ${projectName}/`);
95
+ }
96
+ const config = run(prog, {
97
+ help: 'both',
98
+ version: 'both',
99
+ args: process.argv.slice(2),
100
+ });
101
+ main(config).catch((error) => {
102
+ // eslint-disable-next-line no-console
103
+ console.error(error);
104
+ process.exit(1);
105
+ });
106
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
1
+ /* eslint-disable no-console */
2
+ import { execSync } from 'node:child_process';
3
+ import { mkdirSync, mkdtempSync, readdirSync, symlinkSync } from 'node:fs';
4
+ import { tmpdir } from 'node:os';
5
+ import path from 'node:path';
6
+ import { scaffold, TEMPLATES } from './scaffold.js';
7
+ const tempDir = mkdtempSync(path.join(tmpdir(), 'create-mikrojs-inspect-'));
8
+ const templateNames = TEMPLATES.map((t) => t.name);
9
+ const templatesDir = path.join(import.meta.dirname, 'templates');
10
+ // Parse args
11
+ const args = process.argv.slice(2).filter((a) => a !== '--');
12
+ let template;
13
+ for (let i = 0; i < args.length; i++) {
14
+ if ((args[i] === '-t' || args[i] === '--template') && args[i + 1]) {
15
+ template = args[++i];
16
+ }
17
+ }
18
+ if (!template || !templateNames.includes(template)) {
19
+ console.error(`Usage: pnpm inspect -- -t <template>`);
20
+ console.error(`Templates: ${templateNames.join(', ')}`);
21
+ process.exit(1);
22
+ }
23
+ const projectDir = path.join(tempDir, 'my-project');
24
+ scaffold({
25
+ targetDir: projectDir,
26
+ template,
27
+ projectName: 'my-project',
28
+ mikrojsVersion: '0.0.0',
29
+ typescript: true,
30
+ templatesDir,
31
+ pkgManager: 'npm',
32
+ });
33
+ // Symlink workspace mikrojs package so the CLI is available
34
+ const mikrojsPkgDir = path.resolve(import.meta.dirname, '..', '..', 'mikrojs');
35
+ const nodeModules = path.join(projectDir, 'node_modules');
36
+ const binDir = path.join(nodeModules, '.bin');
37
+ mkdirSync(binDir, { recursive: true });
38
+ symlinkSync(mikrojsPkgDir, path.join(nodeModules, 'mikrojs'));
39
+ symlinkSync(path.join(mikrojsPkgDir, 'bin', 'mikrojs.js'), path.join(binDir, 'mikro'));
40
+ symlinkSync(path.join(mikrojsPkgDir, 'bin', 'mikrojs.js'), path.join(binDir, 'mikrojs'));
41
+ console.log(`\nScaffolded "${template}" into ${projectDir}`);
42
+ // List files (skip node_modules)
43
+ const files = readdirSync(projectDir, { recursive: true, withFileTypes: false }).filter((f) => !f.startsWith('node_modules'));
44
+ for (const f of files) {
45
+ console.log(` ${f}`);
46
+ }
47
+ console.log(`\nDropping you into ${projectDir}`);
48
+ console.log(`Exit the shell to clean up.\n`);
49
+ try {
50
+ execSync(`${process.env.SHELL || 'bash'}`, { stdio: 'inherit', cwd: projectDir });
51
+ }
52
+ finally {
53
+ execSync(`rm -rf ${tempDir}`);
54
+ console.log(`Cleaned up ${tempDir}`);
55
+ }
56
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"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"}
package/dist/logo.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function printLogo(): void;
2
+ //# sourceMappingURL=logo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo.d.ts","sourceRoot":"","sources":["../src/logo.ts"],"names":[],"mappings":"AAiBA,wBAAgB,SAAS,SASxB"}
package/dist/logo.js ADDED
@@ -0,0 +1,26 @@
1
+ const d = '\x1b[2m';
2
+ const y = '\x1b[43m\x1b[30m';
3
+ const b = '\x1b[1m';
4
+ const r = '\x1b[0m';
5
+ // prettier-ignore
6
+ const logo = [
7
+ ` ${d}╷ ╷ ╷ ╷ ╷${r}`,
8
+ ` ${d}╭─┴─┴─┴─┴─┴─╮${r}`,
9
+ ` ${d}──│${r} ◦ ${d}├──${r}`,
10
+ ` ${d}──┤${r} ${y} ${r} ${d} ├──${r}`,
11
+ ` ${d}──┤${r} ${y} ${b}JS${r}${y} ${r} ${d} ├──${r}`,
12
+ ` ${d}──┤${r} ${d}├──${r}`,
13
+ ` ${d}╰─┬─┬─┬─┬─┬─╯${r}`,
14
+ ` ${d}╵ ╵ ╵ ╵ ╵${r}`,
15
+ ];
16
+ export function printLogo() {
17
+ // eslint-disable-next-line no-console
18
+ console.log();
19
+ for (const line of logo) {
20
+ // eslint-disable-next-line no-console
21
+ console.log(line);
22
+ }
23
+ // eslint-disable-next-line no-console
24
+ console.log();
25
+ }
26
+ //# sourceMappingURL=logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo.js","sourceRoot":"","sources":["../src/logo.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,GAAG,SAAS,CAAA;AACnB,MAAM,CAAC,GAAG,kBAAkB,CAAA;AAC5B,MAAM,CAAC,GAAG,SAAS,CAAA;AACnB,MAAM,CAAC,GAAG,SAAS,CAAA;AAEnB,kBAAkB;AAClB,MAAM,IAAI,GAAG;IACX,SAAS,CAAC,YAAY,CAAC,EAAE;IACzB,OAAO,CAAC,gBAAgB,CAAC,EAAE;IAC3B,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;IACrC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;IAC7C,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;IACzD,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;IACrC,OAAO,CAAC,gBAAgB,CAAC,EAAE;IAC3B,SAAS,CAAC,YAAY,CAAC,EAAE;CAC1B,CAAA;AAED,MAAM,UAAU,SAAS;IACvB,sCAAsC;IACtC,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC;IACD,sCAAsC;IACtC,OAAO,CAAC,GAAG,EAAE,CAAA;AACf,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type PkgManager = 'npm' | 'pnpm';
2
+ export declare function detectPkgManager(): PkgManager;
3
+ export declare function installCommand(pm: PkgManager): string;
4
+ export declare function runCommand(pm: PkgManager, script: string): string;
5
+ //# sourceMappingURL=pkg-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkg-manager.d.ts","sourceRoot":"","sources":["../src/pkg-manager.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,CAAA;AAEvC,wBAAgB,gBAAgB,IAAI,UAAU,CAI7C;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,CAErD;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGjE"}
@@ -0,0 +1,15 @@
1
+ export function detectPkgManager() {
2
+ const userAgent = process.env.npm_config_user_agent;
3
+ if (userAgent?.startsWith('pnpm/'))
4
+ return 'pnpm';
5
+ return 'npm';
6
+ }
7
+ export function installCommand(pm) {
8
+ return `${pm} install`;
9
+ }
10
+ export function runCommand(pm, script) {
11
+ if (pm === 'npm')
12
+ return `npm run ${script}`;
13
+ return `pnpm ${script}`;
14
+ }
15
+ //# sourceMappingURL=pkg-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkg-manager.js","sourceRoot":"","sources":["../src/pkg-manager.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB;IAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAA;IACnD,IAAI,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAA;IACjD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAc;IAC3C,OAAO,GAAG,EAAE,UAAU,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAc,EAAE,MAAc;IACvD,IAAI,EAAE,KAAK,KAAK;QAAE,OAAO,WAAW,MAAM,EAAE,CAAA;IAC5C,OAAO,QAAQ,MAAM,EAAE,CAAA;AACzB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { PkgManager } from './pkg-manager.js';
2
+ interface TemplateMeta {
3
+ name: string;
4
+ description: string;
5
+ hardware?: string;
6
+ wiring?: string;
7
+ /** true = generate WiFi credentials setup section */
8
+ wifiSetup?: boolean;
9
+ }
10
+ export declare const TEMPLATES: readonly TemplateMeta[];
11
+ export interface ScaffoldOptions {
12
+ targetDir: string;
13
+ template: string;
14
+ projectName: string;
15
+ mikrojsVersion: string;
16
+ typescript?: boolean;
17
+ templatesDir: string;
18
+ pkgManager: PkgManager;
19
+ }
20
+ export declare function scaffold(options: ScaffoldOptions): void;
21
+ export {};
22
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAQhD,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,eAAO,MAAM,SAAS,EAAE,SAAS,YAAY,EA6EnC,CAAA;AAEV,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,QA4DhD"}
@@ -0,0 +1,133 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { dependencies, devDependencies } from './templates/_common/dependencies.js';
4
+ import { envExample } from './templates/_common/env-example.js';
5
+ import { gitignore } from './templates/_common/gitignore.js';
6
+ import { packageJson } from './templates/_common/package-json.js';
7
+ import { readme } from './templates/_common/readme.js';
8
+ import { tsconfig } from './templates/_common/tsconfig.js';
9
+ export const TEMPLATES = [
10
+ {
11
+ name: 'blank',
12
+ description: 'Empty starter project. Prints heap memory usage and exits.',
13
+ },
14
+ {
15
+ name: 'blinky',
16
+ description: 'Blink an LED on and off. The "hello world" of microcontrollers.',
17
+ hardware: 'Any ESP32 board with a built-in LED, or an external LED connected to a GPIO pin.\n\nChange `PIN` in `app/main.ts` to match your board.',
18
+ wiring: `\`\`\`
19
+ ESP32 LED
20
+ ┌──────┐
21
+ │ GPIO ├───[330Ω]───►|── GND
22
+ │ 20 │ (anode) (cathode)
23
+ └──────┘
24
+ \`\`\`
25
+
26
+ Connect the LED's longer leg (anode) to GPIO 20 through a 330-ohm resistor. Connect the shorter leg (cathode) to GND.`,
27
+ },
28
+ {
29
+ name: 'pwm-led',
30
+ description: 'Fade an LED in and out using PWM.',
31
+ hardware: 'LED + resistor on GPIO 21. Change `LED_PIN` in `app/main.ts` for your board.',
32
+ wiring: `\`\`\`
33
+ ESP32 LED
34
+ ┌──────┐
35
+ │ GPIO ├───[330Ω]───►|── GND
36
+ │ 21 │ (anode) (cathode)
37
+ └──────┘
38
+ \`\`\``,
39
+ },
40
+ {
41
+ name: 'neopixel',
42
+ description: 'Animated NeoPixel/WS2812B LED patterns: rainbow, comet, breathe, sparkle, color wipe.',
43
+ hardware: [
44
+ 'Any ESP32 board + a NeoPixel-compatible LED strip (WS2812 or SK6812).',
45
+ '',
46
+ 'Configured for 24 LEDs on GPIO 8 at full brightness.',
47
+ 'Edit `PIN`, `NUM_LEDS`, `BRIGHTNESS` in `app/main.ts`.',
48
+ ].join('\n'),
49
+ wiring: `\`\`\`
50
+ ESP32 NeoPixel Strip
51
+ ┌──────┐ ┌──────────┐
52
+ │ GPIO ├───────────┤ DIN │
53
+ │ 8 │ │ │
54
+ │ 5V ├───────────┤ 5V │
55
+ │ GND ├───────────┤ GND │
56
+ └──────┘ └──────────┘
57
+ \`\`\`
58
+
59
+ For long strips (>8 LEDs), power the strip from an external 5V supply, not the board's USB.`,
60
+ },
61
+ {
62
+ name: 'wifi-fetch',
63
+ description: 'Connect to WiFi and fetch JSON from an HTTP API.',
64
+ hardware: 'Any ESP32 board with WiFi + a WiFi network with internet access.',
65
+ wifiSetup: true,
66
+ },
67
+ {
68
+ name: 'wifi-access-point',
69
+ description: 'Turn the ESP32 into a WiFi access point. Logs station connect/disconnect events.',
70
+ hardware: 'Any ESP32 board with WiFi.',
71
+ },
72
+ {
73
+ name: 'sntp',
74
+ description: 'Sync the device clock via NTP so `new Date()` returns real wall-clock time.',
75
+ hardware: 'Any ESP32 board with WiFi + a WiFi network with internet access.',
76
+ wifiSetup: true,
77
+ },
78
+ {
79
+ name: 'rtc-counter',
80
+ description: 'Count wake-ups from deep sleep using RTC memory. The counter survives deep sleep but resets on power loss.',
81
+ hardware: 'Any ESP32 board.',
82
+ },
83
+ ];
84
+ export function scaffold(options) {
85
+ const { targetDir, template, projectName, mikrojsVersion, typescript = true, templatesDir, pkgManager, } = options;
86
+ // Create project directory
87
+ fs.mkdirSync(targetDir, { recursive: true });
88
+ // Copy template files
89
+ const templateDir = path.join(templatesDir, template);
90
+ copyDir(templateDir, targetDir);
91
+ // Write shared files
92
+ fs.writeFileSync(path.join(targetDir, 'package.json'), JSON.stringify(packageJson(projectName, {
93
+ dependencies: { ...dependencies, mikrojs: mikrojsVersion },
94
+ devDependencies: typescript ? devDependencies : undefined,
95
+ typescript,
96
+ }), null, 2) + '\n');
97
+ if (typescript) {
98
+ const hasEnvDts = fs.existsSync(path.join(targetDir, 'env.d.ts'));
99
+ const tsconfigWithIncludes = hasEnvDts
100
+ ? { ...tsconfig, include: ['env.d.ts', ...(tsconfig.include ?? [])] }
101
+ : tsconfig;
102
+ fs.writeFileSync(path.join(targetDir, 'tsconfig.json'), JSON.stringify(tsconfigWithIncludes, null, 2) + '\n');
103
+ }
104
+ fs.writeFileSync(path.join(targetDir, '.gitignore'), gitignore);
105
+ fs.writeFileSync(path.join(targetDir, '.env.example'), envExample);
106
+ const templateMeta = TEMPLATES.find((t) => t.name === template);
107
+ const mikro = pkgManager === 'npm' ? 'npx mikro' : 'pnpm mikro';
108
+ const setup = templateMeta?.wifiSetup
109
+ ? `Set your WiFi credentials on the device:\n\n\`\`\`sh\n${mikro} env set WIFI_SSID YourNetworkName\n${mikro} env set WIFI_PASSPHRASE --secret\n\`\`\``
110
+ : undefined;
111
+ fs.writeFileSync(path.join(targetDir, 'README.md'), readme({
112
+ projectName,
113
+ description: templateMeta?.description ?? '',
114
+ pm: pkgManager,
115
+ hardware: templateMeta?.hardware,
116
+ wiring: templateMeta?.wiring,
117
+ setup,
118
+ }));
119
+ }
120
+ function copyDir(src, dest) {
121
+ fs.mkdirSync(dest, { recursive: true });
122
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
123
+ const srcPath = path.join(src, entry.name);
124
+ const destPath = path.join(dest, entry.name);
125
+ if (entry.isDirectory()) {
126
+ copyDir(srcPath, destPath);
127
+ }
128
+ else {
129
+ fs.copyFileSync(srcPath, destPath);
130
+ }
131
+ }
132
+ }
133
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scaffold.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.test.d.ts","sourceRoot":"","sources":["../src/scaffold.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,105 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, symlinkSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
7
+ import { scaffold, TEMPLATES } from './scaffold.js';
8
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
+ const templatesDir = __dirname + '/templates';
10
+ const mikrojsPkgDir = path.resolve(__dirname, '..', '..', 'mikrojs');
11
+ const createMikrojsPkgDir = path.resolve(__dirname, '..');
12
+ const tscBin = path.resolve(createMikrojsPkgDir, 'node_modules', '.bin', 'tsc');
13
+ // Extra packages needed for type-checking specific templates
14
+ const EXTRA_TYPE_DEPS = {};
15
+ describe.each(TEMPLATES)('template: $name', ({ name }) => {
16
+ let tempDir;
17
+ let targetDir;
18
+ beforeEach(() => {
19
+ tempDir = mkdtempSync(path.join(tmpdir(), `create-mikrojs-test-${name}-`));
20
+ targetDir = path.join(tempDir, 'test-project');
21
+ });
22
+ afterEach(() => {
23
+ rmSync(tempDir, { recursive: true, force: true });
24
+ });
25
+ describe('with typescript', () => {
26
+ beforeEach(() => {
27
+ scaffold({
28
+ targetDir,
29
+ template: name,
30
+ projectName: 'test-project',
31
+ mikrojsVersion: '0.0.0',
32
+ typescript: true,
33
+ templatesDir,
34
+ pkgManager: 'npm',
35
+ });
36
+ });
37
+ it('creates package.json with correct fields', () => {
38
+ const pkg = JSON.parse(readFileSync(path.join(targetDir, 'package.json'), 'utf-8'));
39
+ expect(pkg.name).toBe('test-project');
40
+ expect(pkg.type).toBe('module');
41
+ expect(pkg.main).toBe('./app/main.ts');
42
+ expect(pkg.dependencies.mikrojs).toBe('0.0.0');
43
+ expect(pkg.devDependencies.typescript).toBeDefined();
44
+ expect(pkg.scripts.dev).toBe('mikro dev');
45
+ expect(pkg.scripts.build).toBeUndefined();
46
+ expect(pkg.scripts.deploy).toBeUndefined();
47
+ expect(pkg.scripts.flash).toBeUndefined();
48
+ });
49
+ it('creates tsconfig.json with mikrojs runtime types', () => {
50
+ const tsconfig = JSON.parse(readFileSync(path.join(targetDir, 'tsconfig.json'), 'utf-8'));
51
+ expect(tsconfig.compilerOptions.types).toContain('mikrojs/runtime');
52
+ expect(tsconfig.include).toContain('app/**/*');
53
+ });
54
+ it('creates .gitignore', () => {
55
+ const content = readFileSync(path.join(targetDir, '.gitignore'), 'utf-8');
56
+ expect(content).toContain('node_modules');
57
+ expect(content).toContain('.mikro');
58
+ });
59
+ it('creates app/main.ts', () => {
60
+ const content = readFileSync(path.join(targetDir, 'app', 'main.ts'), 'utf-8');
61
+ expect(content.length).toBeGreaterThan(0);
62
+ });
63
+ it('type-checks against mikrojs types', () => {
64
+ // Symlink the workspace mikrojs package so tsc can resolve types
65
+ const nodeModules = path.join(targetDir, 'node_modules');
66
+ mkdirSync(nodeModules, { recursive: true });
67
+ symlinkSync(mikrojsPkgDir, path.join(nodeModules, 'mikrojs'));
68
+ // Symlink any extra dependencies needed for this template
69
+ const extras = EXTRA_TYPE_DEPS[name];
70
+ if (extras) {
71
+ for (const [pkg, pkgPath] of Object.entries(extras)) {
72
+ const dest = path.join(nodeModules, pkg);
73
+ mkdirSync(path.dirname(dest), { recursive: true });
74
+ symlinkSync(pkgPath, dest);
75
+ }
76
+ }
77
+ execFileSync(tscBin, ['--noEmit'], {
78
+ cwd: targetDir,
79
+ stdio: 'pipe',
80
+ env: { ...process.env, NODE_OPTIONS: '' },
81
+ });
82
+ });
83
+ });
84
+ describe('without typescript', () => {
85
+ beforeEach(() => {
86
+ scaffold({
87
+ targetDir,
88
+ template: name,
89
+ projectName: 'test-project',
90
+ mikrojsVersion: '0.0.0',
91
+ typescript: false,
92
+ templatesDir,
93
+ pkgManager: 'npm',
94
+ });
95
+ });
96
+ it('does not include typescript in devDependencies', () => {
97
+ const pkg = JSON.parse(readFileSync(path.join(targetDir, 'package.json'), 'utf-8'));
98
+ expect(pkg.devDependencies).toBeUndefined();
99
+ });
100
+ it('does not create tsconfig.json', () => {
101
+ expect(existsSync(path.join(targetDir, 'tsconfig.json'))).toBe(false);
102
+ });
103
+ });
104
+ });
105
+ //# sourceMappingURL=scaffold.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.test.js","sourceRoot":"","sources":["../src/scaffold.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const dependencies: {
2
+ mikrojs: string;
3
+ };
4
+ export declare const devDependencies: {
5
+ typescript: string;
6
+ };
7
+ //# sourceMappingURL=dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../../src/templates/_common/dependencies.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY;;CAEc,CAAA;AAEvC,eAAO,MAAM,eAAe;;CAEc,CAAA"}
@@ -0,0 +1,7 @@
1
+ export const dependencies = {
2
+ mikrojs: 'latest',
3
+ };
4
+ export const devDependencies = {
5
+ typescript: '^6.0.0-beta',
6
+ };
7
+ //# sourceMappingURL=dependencies.js.map