🎓 EASYTUTORGUIDE

Practical tutorials, tools, courses, digital skills, and business promotion.

★ Free Learning
Translate this lesson:
Arabic and Persian automatically switch the lesson to right-to-left layout. Code stays left-to-right.

Node.js • Chapter 5 • Beginner Friendly

ECMAScript Modules

Learn this chapter by understanding what each Node.js feature does, when to use it, how it can fail, and how to verify the result.

5 focused topics50 teaching examplesCode + reasoningPractice + 20 Q&A
Estimated reading time0% read

5.1 Using import and export

Using import and export is part of Chapter 5, “ECMAScript Modules.” For a beginner, the first goal is to understand the observable behavior before memorizing an API. In this lesson, module means a file or package boundary used to organize and share code. The practical focus is module format, resolution rules, cache behavior, and public API boundaries.

Start from the smallest working behavior and name every input and output. In Chapter 5 (ECMAScript Modules), for Using import and export, write down what enters the operation, what Node.js is expected to do, and what the caller can observe afterward. If the result is asynchronous, also state when completion is known and where errors travel.

For Using import and export in Chapter 5, the mechanism to keep in mind is explicit imports, exports, package metadata, and predictable dependency boundaries. A good experiment changes one thing at a time and checks both success and failure. When you finish this topic, you should be able to explain why the code works, not only copy the syntax.

Key terms in plain language

  • module — a file or package boundary used to organize and share code.
  • import — a concrete part of using import and export that the lesson isolates so you can see its effect instead of treating the whole feature as a black box.
  • export — a concrete part of using import and export that the lesson isolates so you can see its effect instead of treating the whole feature as a black box.

10 teaching examples

  1. Example 1: Performance check

    While studying ECMAScript Modules, measure the resource most affected by Using import and export: elapsed time, bytes, memory, open connections, event-loop delay, or database round trips. Optimize only after the measurement identifies a meaningful cost.

  2. Example 2: Refactoring example

    In a ECMAScript Modules exercise, take code that mixes Using import and export with unrelated business logic and split it into a small function with an explicit input and return value. The caller should not need to know low-level details unless they are part of the contract.

  3. Example 3: Production reasoning

    Assume the Using import and export code from Chapter 5 runs thousands of times. Decide what needs a timeout, limit, retry rule, cleanup step, metric, or graceful-shutdown hook. The goal is predictable behavior under repetition, load, and partial failure.

  4. Example 4: Minimal working case

    In Chapter 5 (ECMAScript Modules), build the smallest Using import and export example that has one clear input and one visible result. Before running it, write what you expect to happen. Then verify module format, resolution rules, cache behavior, and public API boundaries. This establishes a baseline you can reason about.

  5. Example 5: Change one input

    For Chapter 5 (ECMAScript Modules), keep the same program but change exactly one input related to Using import and export. Compare the two outputs and explain why the change happened. This teaches cause and effect instead of memorizing syntax.

  6. Example 6: Compare two approaches

    Within ECMAScript Modules, solve one tiny task twice: first with the most direct approach to Using import and export, then with a reasonable alternative. Compare readability, error behavior, and resource use. Choose the version whose tradeoff matches the task.

  7. Example 7: Failure you can recognize

    For ECMAScript Modules, create a safe failure involving Using import and export, such as invalid data, a missing resource, a closed connection, or a rejected promise. Observe the error type and decide where the program should handle it rather than hiding it.

  8. Example 8: Real service scenario

    Imagine a small tutoring-service backend applying Using import and export during Chapter 5 (ECMAScript Modules). State what arrives from the caller, what the Node.js process must do, what it returns, and what must be logged if the operation fails.

  9. Example 9: Security or trust check

    In the ECMAScript Modules context, treat one value used by Using import and export as untrusted. Identify what must be validated, encoded, bounded, or refused before the value reaches a sensitive operation. Explain the consequence of trusting it blindly.

  10. Example 10: Concurrency check

    For Chapter 5, run or reason about two Using import and export operations close together. Ask whether ordering matters, whether shared state can conflict, and whether work should be awaited, queued, streamed, or moved to another worker.

Node.js coding example

// Topic: Using import and export
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const here = path.dirname(fileURLToPath(import.meta.url));
const file = path.join(here, 'chapter-5.json');
console.log(path.basename(file), path.isAbsolute(file));

Step-by-step code explanation

  1. Import built-in modules with the node: prefix.
  2. Convert import.meta.url to a local file-system path.
  3. Join path segments without hard-coding separators.
  4. Inspect the basename and whether the result is absolute.

Expected output: chapter-5.json true

Practice exercise

Build a small Chapter 5 example for Using import and export. Write the expected result before running it. Add one failure case, then change exactly one condition and explain why the behavior changed. For production reasoning, identify one limit, timeout, cleanup step, or validation rule that would make the code safer.

5.2 package.json type module

package.json type module is part of Chapter 5, “ECMAScript Modules.” For a beginner, the first goal is to understand the observable behavior before memorizing an API. In this lesson, module means a file or package boundary used to organize and share code. The practical focus is type boundaries, runtime behavior, erased types, and module compatibility.

Compare the correct approach with a common alternative so the tradeoff is visible. In Chapter 5 (ECMAScript Modules), the useful comparison for package.json type module is not “short code versus long code”; it is predictable behavior versus hidden assumptions. Check platform differences, lifetime of resources, and whether the caller must wait for completion.

For package.json type module in Chapter 5, the mechanism to keep in mind is explicit imports, exports, package metadata, and predictable dependency boundaries. A good experiment changes one thing at a time and checks both success and failure. When you finish this topic, you should be able to explain why the code works, not only copy the syntax.

Key terms in plain language

  • module — a file or package boundary used to organize and share code.
  • package.json — a concrete part of package.json type module that the lesson isolates so you can see its effect instead of treating the whole feature as a black box.
  • type — a concrete part of package.json type module that the lesson isolates so you can see its effect instead of treating the whole feature as a black box.

10 teaching examples

  1. Example 1: Production reasoning

    Assume the package.json type module code from Chapter 5 runs thousands of times. Decide what needs a timeout, limit, retry rule, cleanup step, metric, or graceful-shutdown hook. The goal is predictable behavior under repetition, load, and partial failure.

  2. Example 2: Minimal working case

    In Chapter 5 (ECMAScript Modules), build the smallest package.json type module example that has one clear input and one visible result. Before running it, write what you expect to happen. Then verify type boundaries, runtime behavior, erased types, and module compatibility. This establishes a baseline you can reason about.

  3. Example 3: Change one input

    For Chapter 5 (ECMAScript Modules), keep the same program but change exactly one input related to package.json type module. Compare the two outputs and explain why the change happened. This teaches cause and effect instead of memorizing syntax.

  4. Example 4: Compare two approaches

    Within ECMAScript Modules, solve one tiny task twice: first with the most direct approach to package.json type module, then with a reasonable alternative. Compare readability, error behavior, and resource use. Choose the version whose tradeoff matches the task.

  5. Example 5: Failure you can recognize

    For ECMAScript Modules, create a safe failure involving package.json type module, such as invalid data, a missing resource, a closed connection, or a rejected promise. Observe the error type and decide where the program should handle it rather than hiding it.

  6. Example 6: Real service scenario

    Imagine a small tutoring-service backend applying package.json type module during Chapter 5 (ECMAScript Modules). State what arrives from the caller, what the Node.js process must do, what it returns, and what must be logged if the operation fails.

  7. Example 7: Security or trust check

    In the ECMAScript Modules context, treat one value used by package.json type module as untrusted. Identify what must be validated, encoded, bounded, or refused before the value reaches a sensitive operation. Explain the consequence of trusting it blindly.

  8. Example 8: Concurrency check

    For Chapter 5, run or reason about two package.json type module operations close together. Ask whether ordering matters, whether shared state can conflict, and whether work should be awaited, queued, streamed, or moved to another worker.

  9. Example 9: Performance check

    While studying ECMAScript Modules, measure the resource most affected by package.json type module: elapsed time, bytes, memory, open connections, event-loop delay, or database round trips. Optimize only after the measurement identifies a meaningful cost.

  10. Example 10: Refactoring example

    In a ECMAScript Modules exercise, take code that mixes package.json type module with unrelated business logic and split it into a small function with an explicit input and return value. The caller should not need to know low-level details unless they are part of the contract.

Node.js coding example

// Topic: package.json type module
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const here = path.dirname(fileURLToPath(import.meta.url));
const file = path.join(here, 'chapter-5.json');
console.log(path.basename(file), path.isAbsolute(file));

Step-by-step code explanation

  1. Import built-in modules with the node: prefix.
  2. Convert import.meta.url to a local file-system path.
  3. Join path segments without hard-coding separators.
  4. Inspect the basename and whether the result is absolute.

Expected output: chapter-5.json true

Practice exercise

Build a small Chapter 5 example for package.json type module. Write the expected result before running it. Add one failure case, then change exactly one condition and explain why the behavior changed. For production reasoning, identify one limit, timeout, cleanup step, or validation rule that would make the code safer.

5.3 File URLs and import.meta

File URLs and import.meta is part of Chapter 5, “ECMAScript Modules.” For a beginner, the first goal is to understand the observable behavior before memorizing an API. In this lesson, module means a file or package boundary used to organize and share code. The practical focus is module format, resolution rules, cache behavior, and public API boundaries.

Deliberately inspect a failure case because error behavior is part of the API. In Chapter 5 (ECMAScript Modules), a robust understanding of File URLs and import.meta includes its failure path. Ask what happens with missing data, invalid input, a closed resource, cancellation, or partial completion. Handling those cases deliberately is part of correct Node.js design.

For File URLs and import.meta in Chapter 5, the mechanism to keep in mind is explicit imports, exports, package metadata, and predictable dependency boundaries. A good experiment changes one thing at a time and checks both success and failure. When you finish this topic, you should be able to explain why the code works, not only copy the syntax.

Key terms in plain language

  • module — a file or package boundary used to organize and share code.
  • File — a concrete part of file urls and import.meta that the lesson isolates so you can see its effect instead of treating the whole feature as a black box.
  • URLs — a concrete part of file urls and import.meta that the lesson isolates so you can see its effect instead of treating the whole feature as a black box.
  • import.meta — a concrete part of file urls and import.meta that the lesson isolates so you can see its effect instead of treating the whole feature as a black box.

10 teaching examples

  1. Example 1: Change one input

    For Chapter 5 (ECMAScript Modules), keep the same program but change exactly one input related to File URLs and import.meta. Compare the two outputs and explain why the change happened. This teaches cause and effect instead of memorizing syntax.

  2. Example 2: Compare two approaches

    Within ECMAScript Modules, solve one tiny task twice: first with the most direct approach to File URLs and import.meta, then with a reasonable alternative. Compare readability, error behavior, and resource use. Choose the version whose tradeoff matches the task.

  3. Example 3: Failure you can recognize

    For ECMAScript Modules, create a safe failure involving File URLs and import.meta, such as invalid data, a missing resource, a closed connection, or a rejected promise. Observe the error type and decide where the program should handle it rather than hiding it.

  4. Example 4: Real service scenario

    Imagine a small tutoring-service backend applying File URLs and import.meta during Chapter 5 (ECMAScript Modules). State what arrives from the caller, what the Node.js process must do, what it returns, and what must be logged if the operation fails.

  5. Example 5: Security or trust check

    In the ECMAScript Modules context, treat one value used by File URLs and import.meta as untrusted. Identify what must be validated, encoded, bounded, or refused before the value reaches a sensitive operation. Explain the consequence of trusting it blindly.

  6. Example 6: Concurrency check

    For Chapter 5, run or reason about two File URLs and import.meta operations close together. Ask whether ordering matters, whether shared state can conflict, and whether work should be awaited, queued, streamed, or moved to another worker.

  7. Example 7: Performance check

    While studying ECMAScript Modules, measure the resource most affected by File URLs and import.meta: elapsed time, bytes, memory, open connections, event-loop delay, or database round trips. Optimize only after the measurement identifies a meaningful cost.

  8. Example 8: Refactoring example

    In a ECMAScript Modules exercise, take code that mixes File URLs and import.meta with unrelated business logic and split it into a small function with an explicit input and return value. The caller should not need to know low-level details unless they are part of the contract.

  9. Example 9: Production reasoning

    Assume the File URLs and import.meta code from Chapter 5 runs thousands of times. Decide what needs a timeout, limit, retry rule, cleanup step, metric, or graceful-shutdown hook. The goal is predictable behavior under repetition, load, and partial failure.

  10. Example 10: Minimal working case

    In Chapter 5 (ECMAScript Modules), build the smallest File URLs and import.meta example that has one clear input and one visible result. Before running it, write what you expect to happen. Then verify module format, resolution rules, cache behavior, and public API boundaries. This establishes a baseline you can reason about.

Node.js coding example

// Topic: File URLs and import.meta
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const here = path.dirname(fileURLToPath(import.meta.url));
const file = path.join(here, 'chapter-5.json');
console.log(path.basename(file), path.isAbsolute(file));

Step-by-step code explanation

  1. Import built-in modules with the node: prefix.
  2. Convert import.meta.url to a local file-system path.
  3. Join path segments without hard-coding separators.
  4. Inspect the basename and whether the result is absolute.

Expected output: chapter-5.json true

Practice exercise

Build a small Chapter 5 example for File URLs and import.meta. Write the expected result before running it. Add one failure case, then change exactly one condition and explain why the behavior changed. For production reasoning, identify one limit, timeout, cleanup step, or validation rule that would make the code safer.

5.4 Dynamic import

Dynamic import is part of Chapter 5, “ECMAScript Modules.” For a beginner, the first goal is to understand the observable behavior before memorizing an API. In this lesson, module means a file or package boundary used to organize and share code. The practical focus is module format, resolution rules, cache behavior, and public API boundaries.

Connect the idea to a small service or automation task that a learner could actually build. In Chapter 5 (ECMAScript Modules), connect Dynamic import to a small backend, automation script, or command-line tool. That makes the API easier to remember because each method call has a reason, a boundary, and an expected result.

For Dynamic import in Chapter 5, the mechanism to keep in mind is explicit imports, exports, package metadata, and predictable dependency boundaries. A good experiment changes one thing at a time and checks both success and failure. When you finish this topic, you should be able to explain why the code works, not only copy the syntax.

Key terms in plain language

  • module — a file or package boundary used to organize and share code.
  • Dynamic — a concrete part of dynamic import that the lesson isolates so you can see its effect instead of treating the whole feature as a black box.
  • import — a concrete part of dynamic import that the lesson isolates so you can see its effect instead of treating the whole feature as a black box.

10 teaching examples

  1. Example 1: Failure you can recognize

    For ECMAScript Modules, create a safe failure involving Dynamic import, such as invalid data, a missing resource, a closed connection, or a rejected promise. Observe the error type and decide where the program should handle it rather than hiding it.

  2. Example 2: Real service scenario

    Imagine a small tutoring-service backend applying Dynamic import during Chapter 5 (ECMAScript Modules). State what arrives from the caller, what the Node.js process must do, what it returns, and what must be logged if the operation fails.

  3. Example 3: Security or trust check

    In the ECMAScript Modules context, treat one value used by Dynamic import as untrusted. Identify what must be validated, encoded, bounded, or refused before the value reaches a sensitive operation. Explain the consequence of trusting it blindly.

  4. Example 4: Concurrency check

    For Chapter 5, run or reason about two Dynamic import operations close together. Ask whether ordering matters, whether shared state can conflict, and whether work should be awaited, queued, streamed, or moved to another worker.

  5. Example 5: Performance check

    While studying ECMAScript Modules, measure the resource most affected by Dynamic import: elapsed time, bytes, memory, open connections, event-loop delay, or database round trips. Optimize only after the measurement identifies a meaningful cost.

  6. Example 6: Refactoring example

    In a ECMAScript Modules exercise, take code that mixes Dynamic import with unrelated business logic and split it into a small function with an explicit input and return value. The caller should not need to know low-level details unless they are part of the contract.

  7. Example 7: Production reasoning

    Assume the Dynamic import code from Chapter 5 runs thousands of times. Decide what needs a timeout, limit, retry rule, cleanup step, metric, or graceful-shutdown hook. The goal is predictable behavior under repetition, load, and partial failure.

  8. Example 8: Minimal working case

    In Chapter 5 (ECMAScript Modules), build the smallest Dynamic import example that has one clear input and one visible result. Before running it, write what you expect to happen. Then verify module format, resolution rules, cache behavior, and public API boundaries. This establishes a baseline you can reason about.

  9. Example 9: Change one input

    For Chapter 5 (ECMAScript Modules), keep the same program but change exactly one input related to Dynamic import. Compare the two outputs and explain why the change happened. This teaches cause and effect instead of memorizing syntax.

  10. Example 10: Compare two approaches

    Within ECMAScript Modules, solve one tiny task twice: first with the most direct approach to Dynamic import, then with a reasonable alternative. Compare readability, error behavior, and resource use. Choose the version whose tradeoff matches the task.

Node.js coding example

// Topic: Dynamic import
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const here = path.dirname(fileURLToPath(import.meta.url));
const file = path.join(here, 'chapter-5.json');
console.log(path.basename(file), path.isAbsolute(file));

Step-by-step code explanation

  1. Import built-in modules with the node: prefix.
  2. Convert import.meta.url to a local file-system path.
  3. Join path segments without hard-coding separators.
  4. Inspect the basename and whether the result is absolute.

Expected output: chapter-5.json true

Practice exercise

Build a small Chapter 5 example for Dynamic import. Write the expected result before running it. Add one failure case, then change exactly one condition and explain why the behavior changed. For production reasoning, identify one limit, timeout, cleanup step, or validation rule that would make the code safer.

5.5 Top-Level await

Top-Level await is part of Chapter 5, “ECMAScript Modules.” For a beginner, the first goal is to understand the observable behavior before memorizing an API. In this lesson, module means a file or package boundary used to organize and share code. The practical focus is completion order, rejection paths, and concurrency limits.

Finish by asking what changes when the code runs repeatedly, concurrently, or with untrusted input. In Chapter 5 (ECMAScript Modules), production code using Top-Level await should be reviewable by another developer. Keep responsibilities small, add limits around untrusted or repeated work, and record enough context to diagnose failures without exposing secrets.

For Top-Level await in Chapter 5, the mechanism to keep in mind is explicit imports, exports, package metadata, and predictable dependency boundaries. A good experiment changes one thing at a time and checks both success and failure. When you finish this topic, you should be able to explain why the code works, not only copy the syntax.

Key terms in plain language

  • module — a file or package boundary used to organize and share code.
  • Top-Level — a concrete part of top-level await that the lesson isolates so you can see its effect instead of treating the whole feature as a black box.
  • await — a concrete part of top-level await that the lesson isolates so you can see its effect instead of treating the whole feature as a black box.

10 teaching examples

  1. Example 1: Security or trust check

    In the ECMAScript Modules context, treat one value used by Top-Level await as untrusted. Identify what must be validated, encoded, bounded, or refused before the value reaches a sensitive operation. Explain the consequence of trusting it blindly.

  2. Example 2: Concurrency check

    For Chapter 5, run or reason about two Top-Level await operations close together. Ask whether ordering matters, whether shared state can conflict, and whether work should be awaited, queued, streamed, or moved to another worker.

  3. Example 3: Performance check

    While studying ECMAScript Modules, measure the resource most affected by Top-Level await: elapsed time, bytes, memory, open connections, event-loop delay, or database round trips. Optimize only after the measurement identifies a meaningful cost.

  4. Example 4: Refactoring example

    In a ECMAScript Modules exercise, take code that mixes Top-Level await with unrelated business logic and split it into a small function with an explicit input and return value. The caller should not need to know low-level details unless they are part of the contract.

  5. Example 5: Production reasoning

    Assume the Top-Level await code from Chapter 5 runs thousands of times. Decide what needs a timeout, limit, retry rule, cleanup step, metric, or graceful-shutdown hook. The goal is predictable behavior under repetition, load, and partial failure.

  6. Example 6: Minimal working case

    In Chapter 5 (ECMAScript Modules), build the smallest Top-Level await example that has one clear input and one visible result. Before running it, write what you expect to happen. Then verify completion order, rejection paths, and concurrency limits. This establishes a baseline you can reason about.

  7. Example 7: Change one input

    For Chapter 5 (ECMAScript Modules), keep the same program but change exactly one input related to Top-Level await. Compare the two outputs and explain why the change happened. This teaches cause and effect instead of memorizing syntax.

  8. Example 8: Compare two approaches

    Within ECMAScript Modules, solve one tiny task twice: first with the most direct approach to Top-Level await, then with a reasonable alternative. Compare readability, error behavior, and resource use. Choose the version whose tradeoff matches the task.

  9. Example 9: Failure you can recognize

    For ECMAScript Modules, create a safe failure involving Top-Level await, such as invalid data, a missing resource, a closed connection, or a rejected promise. Observe the error type and decide where the program should handle it rather than hiding it.

  10. Example 10: Real service scenario

    Imagine a small tutoring-service backend applying Top-Level await during Chapter 5 (ECMAScript Modules). State what arrives from the caller, what the Node.js process must do, what it returns, and what must be logged if the operation fails.

Node.js coding example

// Topic: Top-Level await
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const here = path.dirname(fileURLToPath(import.meta.url));
const file = path.join(here, 'chapter-5.json');
console.log(path.basename(file), path.isAbsolute(file));

Step-by-step code explanation

  1. Import built-in modules with the node: prefix.
  2. Convert import.meta.url to a local file-system path.
  3. Join path segments without hard-coding separators.
  4. Inspect the basename and whether the result is absolute.

Expected output: chapter-5.json true

Practice exercise

Build a small Chapter 5 example for Top-Level await. Write the expected result before running it. Add one failure case, then change exactly one condition and explain why the behavior changed. For production reasoning, identify one limit, timeout, cleanup step, or validation rule that would make the code safer.

Chapter 5 review — 20 questions and answers

1. What is the main purpose of Using import and export?

Answer: Its purpose is to make Using import and export explicit and observable so the program can use it predictably rather than relying on hidden assumptions.

2. What should a beginner identify before using Using import and export?

Answer: Identify the input, expected output, completion signal, possible error, and any resource that must be released.

3. Why is error handling important for Using import and export?

Answer: Because real inputs and resources fail. Correct code defines how the failure is reported and what cleanup still must happen.

4. How can you test Using import and export safely?

Answer: Start with a tiny deterministic case, test one failure case, then add concurrency or untrusted input only after the baseline is understood.

5. What is the main purpose of package.json type module?

Answer: Its purpose is to make package.json type module explicit and observable so the program can use it predictably rather than relying on hidden assumptions.

6. What should a beginner identify before using package.json type module?

Answer: Identify the input, expected output, completion signal, possible error, and any resource that must be released.

7. Why is error handling important for package.json type module?

Answer: Because real inputs and resources fail. Correct code defines how the failure is reported and what cleanup still must happen.

8. How can you test package.json type module safely?

Answer: Start with a tiny deterministic case, test one failure case, then add concurrency or untrusted input only after the baseline is understood.

9. What is the main purpose of File URLs and import.meta?

Answer: Its purpose is to make File URLs and import.meta explicit and observable so the program can use it predictably rather than relying on hidden assumptions.

10. What should a beginner identify before using File URLs and import.meta?

Answer: Identify the input, expected output, completion signal, possible error, and any resource that must be released.

11. Why is error handling important for File URLs and import.meta?

Answer: Because real inputs and resources fail. Correct code defines how the failure is reported and what cleanup still must happen.

12. How can you test File URLs and import.meta safely?

Answer: Start with a tiny deterministic case, test one failure case, then add concurrency or untrusted input only after the baseline is understood.

13. What is the main purpose of Dynamic import?

Answer: Its purpose is to make Dynamic import explicit and observable so the program can use it predictably rather than relying on hidden assumptions.

14. What should a beginner identify before using Dynamic import?

Answer: Identify the input, expected output, completion signal, possible error, and any resource that must be released.

15. Why is error handling important for Dynamic import?

Answer: Because real inputs and resources fail. Correct code defines how the failure is reported and what cleanup still must happen.

16. How can you test Dynamic import safely?

Answer: Start with a tiny deterministic case, test one failure case, then add concurrency or untrusted input only after the baseline is understood.

17. What is the main purpose of Top-Level await?

Answer: Its purpose is to make Top-Level await explicit and observable so the program can use it predictably rather than relying on hidden assumptions.

18. What should a beginner identify before using Top-Level await?

Answer: Identify the input, expected output, completion signal, possible error, and any resource that must be released.

19. Why is error handling important for Top-Level await?

Answer: Because real inputs and resources fail. Correct code defines how the failure is reported and what cleanup still must happen.

20. How can you test Top-Level await safely?

Answer: Start with a tiny deterministic case, test one failure case, then add concurrency or untrusted input only after the baseline is understood.