Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
29 changes: 14 additions & 15 deletions .github/workflows/node.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,27 @@ name: Node.js CI

on:
push:
branches: [ "main" ]
branches: ["main"]
pull_request:
branches: [ "main" ]
branches: ["main"]

jobs:
build:

runs-on: ubuntu-latest

strategy:
matrix:
node-version: [22.x]
node-version: [24.x]

steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v2
with:
version: 9.5.0
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- run: pnpm test
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v2
with:
version: 10.20.0
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: "pnpm"
- run: pnpm install --frozen-lockfile
- run: pnpm test
16 changes: 8 additions & 8 deletions 02-the-module-system/01-revealing-module-pattern/index.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
const myModule = (() => {
const privateFoo = () => {}
const privateBar = []
const privateFoo = () => {};
const privateBar = [];

console.log('Inside:', privateFoo, privateBar)
console.log("Inside:", privateFoo, privateBar);

const exported = {
publicFoo: () => {},
publicBar: () => {},
}
};

return exported
})() // once the parenthesis here are parsed, the function will be invoked and the returned value assigned to myModule
return exported;
})(); // once the parenthesis here are parsed, the function will be invoked and the returned value assigned to myModule

console.log('Outside:', myModule.privateFoo, myModule.privateBar)
console.log('Module:', myModule)
console.log("Outside:", myModule.privateFoo, myModule.privateBar);
console.log("Module:", myModule);
10 changes: 5 additions & 5 deletions 02-the-module-system/02-esm-syntax/logger.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
// exports a function
export function log(message) {
console.log(message)
console.log(message);
}

// exports a constant
export const DEFAULT_LEVEL = 'info'
export const DEFAULT_LEVEL = "info";

// exports an object
export const LEVELS = {
Expand All @@ -14,15 +14,15 @@ export const LEVELS = {
data: 3,
info: 4,
verbose: 5,
}
};

// exports a class
export class Logger {
constructor(name) {
this.name = name
this.name = name;
}

log(message) {
console.log(`[${this.name}] ${message}`)
console.log(`[${this.name}] ${message}`);
}
}
5 changes: 2 additions & 3 deletions 02-the-module-system/02-esm-syntax/main1.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// using a namespace import

// biome-ignore lint/style/noNamespaceImport: demonstrating namespace import syntax
import * as loggerModule from './logger.js'
import * as loggerModule from "./logger.js";

console.log(loggerModule)
console.log(loggerModule);
4 changes: 2 additions & 2 deletions 02-the-module-system/02-esm-syntax/main2.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// import a single member of the module
import { log } from './logger.js'
import { log } from "./logger.js";

log('Hello World')
log("Hello World");
8 changes: 4 additions & 4 deletions 02-the-module-system/02-esm-syntax/main3.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// import multiple members of the module
import { Logger, log } from './logger.js'
import { Logger, log } from "./logger.js";

log('Hello World')
const logger = new Logger('DEFAULT')
logger.log('Hello world')
log("Hello World");
const logger = new Logger("DEFAULT");
logger.log("Hello world");
4 changes: 2 additions & 2 deletions 02-the-module-system/02-esm-syntax/main4.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// name clash
import { log } from './logger.js'
import { log } from "./logger.js";

// const log = console.log // <- this would generate a "SyntaxError: Identifier 'log' has already been declared" error
log('Hello world')
log("Hello world");
8 changes: 4 additions & 4 deletions 02-the-module-system/02-esm-syntax/main5.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// avoid name clash
import { log as log2 } from './logger.js'
import { log as log2 } from "./logger.js";

const log = console.log
const log = console.log;

log('message from log')
log2('message from log2')
log("message from log");
log2("message from log2");
4 changes: 2 additions & 2 deletions 02-the-module-system/03-esm-default/logger.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
// biome-ignore lint/style/noDefaultExport: demonstrating default export syntax
export default class Logger {
constructor(name) {
this.name = name
this.name = name;
}

log(message) {
console.log(`[${this.name}] ${message}`)
console.log(`[${this.name}] ${message}`);
}
}
6 changes: 3 additions & 3 deletions 02-the-module-system/03-esm-default/main.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import MyLogger from './logger.js'
import MyLogger from "./logger.js";

const logger = new MyLogger('info')
logger.log('Hello World')
const logger = new MyLogger("info");
logger.log("Hello World");
5 changes: 2 additions & 3 deletions 02-the-module-system/03-esm-default/showDefault.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// biome-ignore lint/style/noNamespaceImport: needs namespace import to show the default export
import * as loggerModule from './logger.js'
import * as loggerModule from "./logger.js";

console.log(loggerModule.default)
console.log(loggerModule.default);
4 changes: 2 additions & 2 deletions 02-the-module-system/04-esm-mixed-exports/logger.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// biome-ignore lint/style/noDefaultExport: showcases default exports
export default function log(message) {
console.log(message)
console.log(message);
}

export function info(message) {
log(`info: ${message}`)
log(`info: ${message}`);
}
6 changes: 3 additions & 3 deletions 02-the-module-system/04-esm-mixed-exports/main.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import mylog, { info } from './logger.js'
import mylog, { info } from "./logger.js";

mylog('Hello')
info('World')
mylog("Hello");
info("World");
20 changes: 10 additions & 10 deletions 02-the-module-system/05-esm-dynamic-imports/main.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
const SUPPORTED_LANGUAGES = ['el', 'en', 'es', 'it', 'pl'] // (1)
const selectedLanguage = process.argv[2] // (2)
const SUPPORTED_LANGUAGES = ["el", "en", "es", "it", "pl"]; // (1)
const selectedLanguage = process.argv[2]; // (2)

if (!selectedLanguage) {
// (3)
console.error(
`Please specify a language

Usage: node ${process.argv[1]} <language_code>
Supported languages: ${SUPPORTED_LANGUAGES.join(', ')}`
)
process.exit(1)
Supported languages: ${SUPPORTED_LANGUAGES.join(", ")}`,
);
process.exit(1);
}

if (!SUPPORTED_LANGUAGES.includes(selectedLanguage)) {
// (4)
console.error('The specified language is not supported')
process.exit(1)
console.error("The specified language is not supported");
process.exit(1);
}

const translationModule = `./strings-${selectedLanguage}.js` // (5)
const strings = await import(translationModule) // (6)
console.log(strings.HELLO) // (7)
const translationModule = `./strings-${selectedLanguage}.js`; // (5)
const strings = await import(translationModule); // (6)
console.log(strings.HELLO); // (7)
2 changes: 1 addition & 1 deletion 02-the-module-system/05-esm-dynamic-imports/strings-el.js
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export const HELLO = 'Γεια σου κόσμε'
export const HELLO = "Γεια σου κόσμε";
2 changes: 1 addition & 1 deletion 02-the-module-system/05-esm-dynamic-imports/strings-en.js
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export const HELLO = 'Hello World'
export const HELLO = "Hello World";
2 changes: 1 addition & 1 deletion 02-the-module-system/05-esm-dynamic-imports/strings-es.js
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export const HELLO = 'Hola mundo'
export const HELLO = "Hola mundo";
2 changes: 1 addition & 1 deletion 02-the-module-system/05-esm-dynamic-imports/strings-it.js
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export const HELLO = 'Ciao mondo'
export const HELLO = "Ciao mondo";
2 changes: 1 addition & 1 deletion 02-the-module-system/05-esm-dynamic-imports/strings-pl.js
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export const HELLO = 'Witaj świecie'
export const HELLO = "Witaj świecie";
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export let count = 0
export let count = 0;

export function increment() {
count++
count++;
}
8 changes: 4 additions & 4 deletions 02-the-module-system/06-esm-read-only-live-bindings/main.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { count, increment } from './counter.js'
import { count, increment } from "./counter.js";

console.log(count) // prints 0
increment()
console.log(count) // prints 1
console.log(count); // prints 0
increment();
console.log(count); // prints 1
// count++ // TypeError: Assignment to constant variable!
8 changes: 4 additions & 4 deletions 02-the-module-system/07-esm-module-resolution/main.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
console.log(import.meta.resolve('./utils/example.js')) // file://<project_path>/utils/example.js
console.log(import.meta.resolve("./utils/example.js")); // file://<project_path>/utils/example.js

console.log(import.meta.resolve('assert')) // node:assert
console.log(import.meta.resolve('node:assert')) // node:assert
console.log(import.meta.resolve('fastify/lib/logger.js')) // file://<project_path>/node_modules/fastify/lib/logger.js
console.log(import.meta.resolve("assert")); // node:assert
console.log(import.meta.resolve("node:assert")); // node:assert
console.log(import.meta.resolve("fastify/lib/logger.js")); // file://<project_path>/node_modules/fastify/lib/logger.js
9 changes: 4 additions & 5 deletions 02-the-module-system/08-esm-circular-dependencies/a.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// biome-ignore lint/style/noNamespaceImport: needs namespace import for simplicity
import * as bModule from './b.js'
import * as bModule from "./b.js";

export let loaded = false
export const b = bModule
export let loaded = false;
export const b = bModule;

loaded = true
loaded = true;
9 changes: 4 additions & 5 deletions 02-the-module-system/08-esm-circular-dependencies/b.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// biome-ignore lint/style/noNamespaceImport: needs namespace import for simplicity
import * as aModule from './a.js'
import * as aModule from "./a.js";

export let loaded = false
export const a = aModule
export let loaded = false;
export const a = aModule;

loaded = true
loaded = true;
10 changes: 4 additions & 6 deletions 02-the-module-system/08-esm-circular-dependencies/main.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
// biome-ignore lint/style/noNamespaceImport: needs namespace import for simplicity
import * as a from './a.js'
// biome-ignore lint/style/noNamespaceImport: needs namespace import for simplicity
import * as b from './b.js'
import * as a from "./a.js";
import * as b from "./b.js";

console.log('a ->', a)
console.log('b ->', b)
console.log("a ->", a);
console.log("b ->", b);
28 changes: 14 additions & 14 deletions 02-the-module-system/09-esm-monkey-patching/colorizeLogger.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import { logger } from './logger.js'
import { logger } from "./logger.js";

const RED = '\x1b[31m'
const YELLOW = '\x1b[33m'
const GREEN = '\x1b[32m'
const WHITE = '\x1b[37m'
const RESET = '\x1b[0m'
const RED = "\x1b[31m";
const YELLOW = "\x1b[33m";
const GREEN = "\x1b[32m";
const WHITE = "\x1b[37m";
const RESET = "\x1b[0m";

const originalInfo = logger.info
const originalWarn = logger.warn
const originalError = logger.error
const originalDebug = logger.debug
const originalInfo = logger.info;
const originalWarn = logger.warn;
const originalError = logger.error;
const originalDebug = logger.debug;

logger.info = message => originalInfo(`${GREEN}${message}${RESET}`)
logger.warn = message => originalWarn(`${YELLOW}${message}${RESET}`)
logger.error = message => originalError(`${RED}${message}${RESET}`)
logger.debug = message => originalDebug(`${WHITE}${message}${RESET}`)
logger.info = (message) => originalInfo(`${GREEN}${message}${RESET}`);
logger.warn = (message) => originalWarn(`${YELLOW}${message}${RESET}`);
logger.error = (message) => originalError(`${RED}${message}${RESET}`);
logger.debug = (message) => originalDebug(`${WHITE}${message}${RESET}`);
12 changes: 6 additions & 6 deletions 02-the-module-system/09-esm-monkey-patching/logger.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
export const logger = {
info(message) {
console.log(`[INFO]\t${message}`)
console.log(`[INFO]\t${message}`);
},
error(message) {
console.log(`[ERROR]\t${message}`)
console.log(`[ERROR]\t${message}`);
},
warn(message) {
console.log(`[WARN]\t${message}`)
console.log(`[WARN]\t${message}`);
},
debug(message) {
console.log(`[DEBUG]\t${message}`)
console.log(`[DEBUG]\t${message}`);
},
}
};

// biome-ignore lint/style/noDefaultExport: useful for monkey patching
export default {
logger,
}
};
12 changes: 6 additions & 6 deletions 02-the-module-system/09-esm-monkey-patching/main.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { logger } from './logger.js'
import './colorizeLogger.js'
import { logger } from "./logger.js";
import "./colorizeLogger.js";

logger.info('Hello, World!')
logger.warn('Free disk space is running low')
logger.error('Failed to connect to database')
logger.debug('main() is starting')
logger.info("Hello, World!");
logger.warn("Free disk space is running low");
logger.error("Failed to connect to database");
logger.debug("main() is starting");
12 changes: 6 additions & 6 deletions 02-the-module-system/09-esm-monkey-patching/main2.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import loggerModule from './logger.js'
import './replaceLogger3.js'
import loggerModule from "./logger.js";
import "./replaceLogger3.js";

loggerModule.logger.info('Hello, World!')
loggerModule.logger.warn('Free disk space is running low')
loggerModule.logger.error('Failed to connect to database')
loggerModule.logger.debug('main() is starting')
loggerModule.logger.info("Hello, World!");
loggerModule.logger.warn("Free disk space is running low");
loggerModule.logger.error("Failed to connect to database");
loggerModule.logger.debug("main() is starting");
Loading