create-mikro 0.11.0 → 0.12.0-next.7.g0a0155c

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.
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAgB9D,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;IACnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B;AAED,eAAO,MAAM,SAAS,EAAE,SAAS,YAAY,EA4HnC,CAAA;AAEV,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,QA6DhD"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAgB9D,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;IACnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B;AAED,eAAO,MAAM,SAAS,EAAE,SAAS,YAAY,EA0InC,CAAA;AAEV,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,QA6DhD"}
package/dist/scaffold.js CHANGED
@@ -75,6 +75,18 @@ For long strips (>8 LEDs), power the strip from an external 5V supply, not the b
75
75
  description: 'Turn the ESP32 into a WiFi access point. Logs station connect/disconnect events.',
76
76
  hardware: 'Any ESP32 board with WiFi.',
77
77
  },
78
+ {
79
+ name: 'http-server',
80
+ description: 'Join WiFi and serve a small HTTP API: JSON status, a path param, and an SSE stream.',
81
+ hardware: 'Any ESP32 board with WiFi + a WiFi network.',
82
+ wifiSetup: true,
83
+ envVars: ['WIFI_SSID', 'WIFI_PASSPHRASE'],
84
+ },
85
+ {
86
+ name: 'captive-portal',
87
+ description: 'A WiFi captive portal: access point + DNS redirect + an HTTP page that opens on join.',
88
+ hardware: 'Any ESP32 board with WiFi.',
89
+ },
78
90
  {
79
91
  name: 'sntp',
80
92
  description: 'Sync the device clock via NTP so `new Date()` returns real wall-clock time.',
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ declare const _default: {
2
+ wifi: {
3
+ country: "NO";
4
+ };
5
+ };
6
+ export default _default;
7
+ //# sourceMappingURL=mikro.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mikro.config.d.ts","sourceRoot":"","sources":["../../../src/templates/captive-portal/mikro.config.ts"],"names":[],"mappings":";;;;;AAGA,wBAGG"}
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from "mikro";
2
+ // Project configuration. See https://mikrojs.dev/config for all options.
3
+ export default defineConfig({
4
+ // Set to your country code so WiFi uses the correct regulatory domain.
5
+ wifi: { country: "NO" },
6
+ });
7
+ //# sourceMappingURL=mikro.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mikro.config.js","sourceRoot":"","sources":["../../../src/templates/captive-portal/mikro.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,yEAAyE;AACzE,eAAe,YAAY,CAAC;IAC1B,uEAAuE;IACvE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;CACxB,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ declare const _default: {
2
+ wifi: {
3
+ country: "NO";
4
+ };
5
+ };
6
+ export default _default;
7
+ //# sourceMappingURL=mikro.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mikro.config.d.ts","sourceRoot":"","sources":["../../../src/templates/http-server/mikro.config.ts"],"names":[],"mappings":";;;;;AAGA,wBAGG"}
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from "mikro";
2
+ // Project configuration. See https://mikrojs.dev/config for all options.
3
+ export default defineConfig({
4
+ // Set to your country code so WiFi uses the correct regulatory domain.
5
+ wifi: { country: "NO" },
6
+ });
7
+ //# sourceMappingURL=mikro.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mikro.config.js","sourceRoot":"","sources":["../../../src/templates/http-server/mikro.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,yEAAyE;AACzE,eAAe,YAAY,CAAC;IAC1B,uEAAuE;IACvE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;CACxB,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-mikro",
3
- "version": "0.11.0",
3
+ "version": "0.12.0-next.7.g0a0155c",
4
4
  "description": "Create a new Mikro.js project",
5
5
  "keywords": [
6
6
  "esp32",
@@ -45,7 +45,7 @@
45
45
  "prettier": "^3.4.0",
46
46
  "typescript": "^6.0.3",
47
47
  "typescript-eslint": "^8.59.0",
48
- "@mikrojs/eslint-plugin": "0.11.0"
48
+ "@mikrojs/eslint-plugin": "0.12.0-next.7.g0a0155c"
49
49
  },
50
50
  "engines": {
51
51
  "node": ">=24.0.0"
@@ -0,0 +1,86 @@
1
+ import { createServer } from "mikro/http/server";
2
+ import { bind } from "mikro/udp";
3
+ import { wifi } from "mikro/wifi";
4
+
5
+ const SSID = "MikroJS-Portal";
6
+
7
+ // Start an open access point.
8
+ wifi.ap
9
+ .start({ ssid: SSID, authMode: "open", channel: 6, maxConnections: 4 })
10
+ .orPanic("Failed to start access point");
11
+
12
+ const ip = wifi.ap.ip ?? "192.168.4.1";
13
+ const octets = ip.split(".").map((n) => Number(n));
14
+ console.log('Open access point "%s" ready', SSID);
15
+ console.log("Portal: http://%s/", ip);
16
+
17
+ // Answer every DNS query with our own IP, so the client's captive-portal
18
+ // check lands on this device instead of the internet.
19
+ const dns = await bind({ port: 53, family: "ipv4" });
20
+ if (!dns.ok) {
21
+ console.error("DNS bind failed: %s", dns.error.name);
22
+ } else {
23
+ const sock = dns.value;
24
+ sock.onMessage.subscribe(({ msg, from }) => {
25
+ const reply = dnsReply(msg, octets);
26
+ if (reply) void sock.send(reply, from);
27
+ });
28
+ console.log("DNS responder listening on :53");
29
+ }
30
+
31
+ const PAGE = `<!doctype html>
32
+ <html>
33
+ <head>
34
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
35
+ <title>Mikro.js Captive Portal</title>
36
+ </head>
37
+ <body style="font-family: sans-serif; text-align: center; padding: 2rem">
38
+ <h1>Hello from Mikro.js</h1>
39
+ <p>You reached the captive portal running on an ESP32.</p>
40
+ </body>
41
+ </html>`;
42
+
43
+ // Serve the same page for every path so the OS connectivity check fails and
44
+ // opens its sign-in page.
45
+ const server = createServer(() => ({
46
+ status: 200,
47
+ headers: { "content-type": "text/html; charset=utf-8" },
48
+ body: PAGE,
49
+ }));
50
+ server.listen({ port: 80 }).orPanic("Failed to start HTTP server");
51
+ console.log("Captive portal ready. Join the network and a sign-in page should open.");
52
+
53
+ // Build a DNS response that points the queried name at `ip` (4 octets). Handles
54
+ // a single-question query: answers A records, leaves other types unanswered.
55
+ function dnsReply(query: Uint8Array, ip: number[]): Uint8Array | undefined {
56
+ if (query.length < 12) return undefined;
57
+ let i = 12;
58
+ while (i < query.length && query[i] !== 0) i += query[i]! + 1;
59
+ if (i >= query.length) return undefined;
60
+ const qend = i + 5; // null label + qtype(2) + qclass(2)
61
+ if (qend > query.length) return undefined;
62
+ const isA = ((query[i + 1]! << 8) | query[i + 2]!) === 1;
63
+
64
+ const question = query.subarray(12, qend);
65
+ const header = new Uint8Array(12);
66
+ header[0] = query[0]!; // transaction id
67
+ header[1] = query[1]!;
68
+ header[2] = 0x81; // QR=1, recursion-desired echoed
69
+ header[3] = 0x80; // recursion available
70
+ header[5] = 0x01; // QDCOUNT = 1
71
+ header[7] = isA ? 0x01 : 0x00; // ANCOUNT
72
+ if (!isA) {
73
+ const resp = new Uint8Array(12 + question.length);
74
+ resp.set(header, 0);
75
+ resp.set(question, 12);
76
+ return resp;
77
+ }
78
+
79
+ const a = [0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, 0, 0, 0, 0x3c, 0x00, 0x04, ...ip];
80
+ const answer = new Uint8Array(a);
81
+ const resp = new Uint8Array(12 + question.length + answer.length);
82
+ resp.set(header, 0);
83
+ resp.set(question, 12);
84
+ resp.set(answer, 12 + question.length);
85
+ return resp;
86
+ }
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from "mikro";
2
+
3
+ // Project configuration. See https://mikrojs.dev/config for all options.
4
+ export default defineConfig({
5
+ // Set to your country code so WiFi uses the correct regulatory domain.
6
+ wifi: { country: "NO" },
7
+ });
@@ -0,0 +1,69 @@
1
+ import { env } from "mikro/env";
2
+ import { createServer, type ServerResponse } from "mikro/http/server";
3
+ import { sleep } from "mikro/sleep";
4
+ import { memoryUsage, uptime } from "mikro/sys";
5
+ import { wifi } from "mikro/wifi";
6
+
7
+ const ssid = env.require("WIFI_SSID");
8
+ const passphrase = env.require("WIFI_PASSPHRASE");
9
+
10
+ console.log("Connecting to %s...", ssid);
11
+ const connected = await wifi.connect(ssid, passphrase);
12
+ if (!connected.ok) {
13
+ console.error("WiFi connect failed: %s", connected.error.name);
14
+ } else {
15
+ console.log("Connected. Open http://%s/", connected.value.ip);
16
+
17
+ const json = (status: number, value: unknown): ServerResponse => ({
18
+ status,
19
+ headers: { "content-type": "application/json" },
20
+ body: JSON.stringify(value),
21
+ });
22
+
23
+ // A short, finite stream. The server handles one request at a time, so a
24
+ // long-lived stream holds the connection until it ends.
25
+ async function* countdown() {
26
+ for (let i = 5; i > 0; i--) {
27
+ yield `data: ${i}\n\n`;
28
+ await sleep(1000);
29
+ }
30
+ yield "data: liftoff\n\n";
31
+ }
32
+
33
+ // Routing is left to the app: branch on req.method and the path.
34
+ const server = createServer((req): ServerResponse => {
35
+ if (req.method !== "GET") return json(405, { error: "method not allowed" });
36
+ const path = req.url.split("?")[0];
37
+
38
+ if (path === "/") {
39
+ return {
40
+ status: 200,
41
+ headers: { "content-type": "text/html; charset=utf-8" },
42
+ body: `<h1>Mikro.js HTTP server</h1>
43
+ <ul>
44
+ <li><a href="/api/status">/api/status</a>: JSON</li>
45
+ <li><a href="/api/echo/hello">/api/echo/&lt;msg&gt;</a>: path param</li>
46
+ <li><a href="/events">/events</a>: server-sent events</li>
47
+ </ul>`,
48
+ };
49
+ }
50
+
51
+ if (path === "/api/status") {
52
+ const mem = memoryUsage();
53
+ return json(200, { uptime: uptime(), freeHeapBytes: mem.heapTotal - mem.heapUsed });
54
+ }
55
+
56
+ if (path?.startsWith("/api/echo/")) {
57
+ return json(200, { echo: decodeURIComponent(path.slice("/api/echo/".length)) });
58
+ }
59
+
60
+ if (path === "/events") {
61
+ return { status: 200, headers: { "content-type": "text/event-stream" }, body: countdown() };
62
+ }
63
+
64
+ return json(404, { error: "not found" });
65
+ });
66
+
67
+ server.listen({ port: 80 }).orPanic("Failed to start HTTP server");
68
+ console.log("Listening on port 80");
69
+ }
@@ -0,0 +1,4 @@
1
+ declare interface ImportMetaEnv {
2
+ WIFI_SSID: string;
3
+ WIFI_PASSPHRASE: string;
4
+ }
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from "mikro";
2
+
3
+ // Project configuration. See https://mikrojs.dev/config for all options.
4
+ export default defineConfig({
5
+ // Set to your country code so WiFi uses the correct regulatory domain.
6
+ wifi: { country: "NO" },
7
+ });