@sylix/coworker 2.0.11 → 2.0.12
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.
- package/dist/commands/slash/config.d.ts.map +1 -1
- package/dist/commands/slash/config.js +22 -4
- package/dist/commands/slash/config.js.map +1 -1
- package/dist/core/CoWorkerAgent.d.ts.map +1 -1
- package/dist/core/CoWorkerAgent.js +6 -3
- package/dist/core/CoWorkerAgent.js.map +1 -1
- package/dist/skills/defaults/accessibility/screen-reader-testing.md +545 -0
- package/dist/skills/defaults/accessibility/wcag-audit-patterns.md +555 -0
- package/dist/skills/defaults/ai-ml/rag.md +276 -0
- package/dist/skills/defaults/backend-development/api-design-principles.md +528 -0
- package/dist/skills/defaults/backend-development/api-design.md +285 -0
- package/dist/skills/defaults/backend-development/architecture-patterns.md +494 -0
- package/dist/skills/defaults/backend-development/async-python.md +237 -0
- package/dist/skills/defaults/backend-development/auth-implementation-patterns.md +638 -0
- package/dist/skills/defaults/backend-development/bazel-build-optimization.md +387 -0
- package/dist/skills/defaults/backend-development/billing-automation/SKILL.md +566 -0
- package/dist/skills/defaults/backend-development/code-review-excellence.md +538 -0
- package/dist/skills/defaults/backend-development/cqrs-implementation.md +554 -0
- package/dist/skills/defaults/backend-development/database-design.md +305 -0
- package/dist/skills/defaults/backend-development/debugging-strategies.md +536 -0
- package/dist/skills/defaults/backend-development/e2e-testing-patterns.md +544 -0
- package/dist/skills/defaults/backend-development/error-handling-patterns.md +641 -0
- package/dist/skills/defaults/backend-development/fastapi-templates.md +559 -0
- package/dist/skills/defaults/backend-development/fastapi.md +309 -0
- package/dist/skills/defaults/backend-development/git-advanced-workflows.md +405 -0
- package/dist/skills/defaults/backend-development/microservices-patterns.md +595 -0
- package/dist/skills/defaults/backend-development/microservices.md +284 -0
- package/dist/skills/defaults/backend-development/monorepo-management.md +623 -0
- package/dist/skills/defaults/backend-development/nodejs-backend-patterns.md +1048 -0
- package/dist/skills/defaults/backend-development/nx-workspace-patterns.md +457 -0
- package/dist/skills/defaults/backend-development/paypal-integration/SKILL.md +478 -0
- package/dist/skills/defaults/backend-development/pci-compliance/SKILL.md +480 -0
- package/dist/skills/defaults/backend-development/python-anti-patterns.md +349 -0
- package/dist/skills/defaults/backend-development/python-background-jobs.md +364 -0
- package/dist/skills/defaults/backend-development/python-code-style.md +360 -0
- package/dist/skills/defaults/backend-development/python-configuration.md +368 -0
- package/dist/skills/defaults/backend-development/python-design-patterns.md +296 -0
- package/dist/skills/defaults/backend-development/python-error-handling.md +323 -0
- package/dist/skills/defaults/backend-development/python-packaging.md +887 -0
- package/dist/skills/defaults/backend-development/python-performance-optimization.md +874 -0
- package/dist/skills/defaults/backend-development/python-project-structure.md +252 -0
- package/dist/skills/defaults/backend-development/python-resilience.md +376 -0
- package/dist/skills/defaults/backend-development/python-resource-management.md +421 -0
- package/dist/skills/defaults/backend-development/python-type-safety.md +428 -0
- package/dist/skills/defaults/backend-development/sql-optimization-patterns.md +509 -0
- package/dist/skills/defaults/backend-development/stripe-integration/SKILL.md +522 -0
- package/dist/skills/defaults/backend-development/turborepo-caching.md +376 -0
- package/dist/skills/defaults/blockchain/defi-protocol-templates.md +430 -0
- package/dist/skills/defaults/blockchain/nft-standards.md +364 -0
- package/dist/skills/defaults/blockchain/solidity-security.md +514 -0
- package/dist/skills/defaults/blockchain/web3-testing.md +360 -0
- package/dist/skills/defaults/business/competitive-landscape/SKILL.md +527 -0
- package/dist/skills/defaults/business/market-sizing-analysis/SKILL.md +451 -0
- package/dist/skills/defaults/business/startup-financial-modeling/SKILL.md +494 -0
- package/dist/skills/defaults/business/startup-metrics-framework/SKILL.md +564 -0
- package/dist/skills/defaults/business/team-composition-analysis.md +437 -0
- package/dist/skills/defaults/compliance/employment-contract-templates/SKILL.md +527 -0
- package/dist/skills/defaults/compliance/gdpr-data-handling/SKILL.md +630 -0
- package/dist/skills/defaults/data-engineering/airflow-dag-patterns.md +436 -0
- package/dist/skills/defaults/data-engineering/airflow.md +519 -0
- package/dist/skills/defaults/data-engineering/data-quality.md +583 -0
- package/dist/skills/defaults/data-engineering/dbt-transformation-patterns.md +482 -0
- package/dist/skills/defaults/data-engineering/dbt.md +556 -0
- package/dist/skills/defaults/data-engineering/ml-pipeline-workflow/SKILL.md +247 -0
- package/dist/skills/defaults/data-engineering/spark-optimization.md +348 -0
- package/dist/skills/defaults/data-engineering/spark.md +411 -0
- package/dist/skills/defaults/database/postgresql.md +202 -0
- package/dist/skills/defaults/debugging/systematic-debugging.md +249 -0
- package/dist/skills/defaults/devops/architecture-decision-records.md +448 -0
- package/dist/skills/defaults/devops/changelog-automation.md +580 -0
- package/dist/skills/defaults/devops/cicd.md +314 -0
- package/dist/skills/defaults/devops/cloud.md +263 -0
- package/dist/skills/defaults/devops/code-review-excellence.md +299 -0
- package/dist/skills/defaults/devops/cost-optimization.md +295 -0
- package/dist/skills/defaults/devops/deployment-pipeline-design.md +356 -0
- package/dist/skills/defaults/devops/docker.md +281 -0
- package/dist/skills/defaults/devops/git-workflows.md +205 -0
- package/dist/skills/defaults/devops/github-actions.md +311 -0
- package/dist/skills/defaults/devops/gitlab-ci-patterns.md +266 -0
- package/dist/skills/defaults/devops/hybrid-cloud-networking.md +241 -0
- package/dist/skills/defaults/devops/istio-traffic-management.md +327 -0
- package/dist/skills/defaults/devops/kubernetes.md +339 -0
- package/dist/skills/defaults/devops/linkerd-patterns.md +311 -0
- package/dist/skills/defaults/devops/multi-cloud-architecture.md +181 -0
- package/dist/skills/defaults/devops/observability.md +243 -0
- package/dist/skills/defaults/devops/openapi-spec-generation.md +1024 -0
- package/dist/skills/defaults/devops/postmortem-writing.md +396 -0
- package/dist/skills/defaults/devops/prometheus-configuration.md +265 -0
- package/dist/skills/defaults/devops/secrets-management.md +341 -0
- package/dist/skills/defaults/devops/service-mesh-observability.md +385 -0
- package/dist/skills/defaults/devops/terraform-module-library.md +244 -0
- package/dist/skills/defaults/finance/backtesting-frameworks/SKILL.md +663 -0
- package/dist/skills/defaults/finance/risk-metrics-calculation/SKILL.md +557 -0
- package/dist/skills/defaults/frontend/accessibility-compliance.md +420 -0
- package/dist/skills/defaults/frontend/design-system-patterns.md +337 -0
- package/dist/skills/defaults/frontend/interaction-design.md +327 -0
- package/dist/skills/defaults/frontend/javascript.md +311 -0
- package/dist/skills/defaults/frontend/modern-javascript-patterns.md +927 -0
- package/dist/skills/defaults/frontend/react-native-design.md +440 -0
- package/dist/skills/defaults/frontend/react.md +345 -0
- package/dist/skills/defaults/frontend/responsive-design.md +472 -0
- package/dist/skills/defaults/frontend/tailwind-design-system.md +337 -0
- package/dist/skills/defaults/frontend/typescript-advanced-types.md +724 -0
- package/dist/skills/defaults/frontend/typescript.md +334 -0
- package/dist/skills/defaults/frontend/visual-design-foundations.md +326 -0
- package/dist/skills/defaults/frontend/web-component-design.md +279 -0
- package/dist/skills/defaults/game-development/godot-gdscript-patterns.md +188 -0
- package/dist/skills/defaults/game-development/unity-ecs-patterns.md +594 -0
- package/dist/skills/defaults/kubernetes/gitops-workflow.md +285 -0
- package/dist/skills/defaults/kubernetes/gitops.md +280 -0
- package/dist/skills/defaults/kubernetes/helm-chart-scaffolding.md +553 -0
- package/dist/skills/defaults/kubernetes/helm.md +343 -0
- package/dist/skills/defaults/kubernetes/k8s-manifest-generator.md +501 -0
- package/dist/skills/defaults/kubernetes/k8s-security-policies.md +342 -0
- package/dist/skills/defaults/kubernetes/manifests.md +330 -0
- package/dist/skills/defaults/kubernetes/security.md +337 -0
- package/dist/skills/defaults/llm-application/embedding-strategies.md +608 -0
- package/dist/skills/defaults/llm-application/hybrid-search-implementation.md +570 -0
- package/dist/skills/defaults/llm-application/hybrid-search.md +570 -0
- package/dist/skills/defaults/llm-application/langchain-architecture.md +666 -0
- package/dist/skills/defaults/llm-application/langchain.md +259 -0
- package/dist/skills/defaults/llm-application/llm-evaluation.md +695 -0
- package/dist/skills/defaults/llm-application/prompt-engineering-patterns.md +449 -0
- package/dist/skills/defaults/llm-application/prompt-engineering.md +219 -0
- package/dist/skills/defaults/llm-application/rag-implementation.md +434 -0
- package/dist/skills/defaults/llm-application/similarity-search-patterns.md +560 -0
- package/dist/skills/defaults/llm-application/similarity-search.md +560 -0
- package/dist/skills/defaults/llm-application/vector-index-tuning.md +523 -0
- package/dist/skills/defaults/mobile/mobile-android-design.md +440 -0
- package/dist/skills/defaults/mobile/mobile-ios-design.md +266 -0
- package/dist/skills/defaults/monitoring/distributed-tracing.md +436 -0
- package/dist/skills/defaults/monitoring/grafana-dashboards.md +370 -0
- package/dist/skills/defaults/monitoring/prometheus-configuration.md +379 -0
- package/dist/skills/defaults/monitoring/slo-implementation.md +323 -0
- package/dist/skills/defaults/refactoring/code-refactoring.md +349 -0
- package/dist/skills/defaults/security/anti-reversing-techniques/SKILL.md +559 -0
- package/dist/skills/defaults/security/auditor.md +168 -0
- package/dist/skills/defaults/security/binary-analysis-patterns/SKILL.md +438 -0
- package/dist/skills/defaults/security/memory-forensics/SKILL.md +483 -0
- package/dist/skills/defaults/security/mtls-configuration.md +349 -0
- package/dist/skills/defaults/security/protocol-reverse-engineering/SKILL.md +520 -0
- package/dist/skills/defaults/security/sast-configuration.md +182 -0
- package/dist/skills/defaults/security/security.md +313 -0
- package/dist/skills/defaults/security/stride-analysis.md +273 -0
- package/dist/skills/defaults/security/threat-mitigation-mapping.md +290 -0
- package/dist/skills/defaults/systems/bash-defensive-patterns/SKILL.md +539 -0
- package/dist/skills/defaults/systems/bats-testing-patterns/SKILL.md +631 -0
- package/dist/skills/defaults/systems/go-concurrency-patterns.md +657 -0
- package/dist/skills/defaults/systems/memory-safety-patterns.md +605 -0
- package/dist/skills/defaults/systems/rust-async-patterns.md +519 -0
- package/dist/skills/defaults/systems/shellcheck-configuration/SKILL.md +456 -0
- package/dist/skills/defaults/team-collaboration/multi-reviewer-patterns.md +126 -0
- package/dist/skills/defaults/team-collaboration/parallel-feature-development.md +151 -0
- package/dist/skills/defaults/testing/javascript-testing-patterns.md +1021 -0
- package/dist/skills/defaults/testing/python-testing-patterns.md +351 -0
- package/dist/skills/defaults/testing/testing.md +332 -0
- package/dist/skills/defaults/workflows/context-driven-development.md +384 -0
- package/dist/skills/defaults/workflows/track-management.md +592 -0
- package/dist/skills/defaults/workflows/workflow-patterns.md +622 -0
- package/dist/skills/index.d.ts +11 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +129 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/utils/character.js +4 -4
- package/dist/utils/character.js.map +1 -1
- package/dist/utils/inputbar.d.ts.map +1 -1
- package/dist/utils/inputbar.js +7 -0
- package/dist/utils/inputbar.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: javascript
|
|
3
|
+
description: Modern JavaScript patterns and best practices for clean, maintainable code.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Modern JavaScript — CoWorker Edition
|
|
7
|
+
|
|
8
|
+
Write clean, modern JavaScript.
|
|
9
|
+
|
|
10
|
+
## When to Use This Skill
|
|
11
|
+
|
|
12
|
+
- Writing JavaScript code
|
|
13
|
+
- Modern JS patterns
|
|
14
|
+
- Async JavaScript
|
|
15
|
+
- ES6+ features
|
|
16
|
+
|
|
17
|
+
## Core Concepts
|
|
18
|
+
|
|
19
|
+
### 1. Destructuring & Spread
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
// Object destructuring
|
|
23
|
+
const user = { name: 'John', age: 30, city: 'NYC' };
|
|
24
|
+
|
|
25
|
+
const { name, age } = user;
|
|
26
|
+
|
|
27
|
+
// With defaults
|
|
28
|
+
const { role = 'user' } = user;
|
|
29
|
+
|
|
30
|
+
// Rename
|
|
31
|
+
const { name: userName } = user;
|
|
32
|
+
|
|
33
|
+
// Nested
|
|
34
|
+
const { address: { city } } = user;
|
|
35
|
+
|
|
36
|
+
// Array destructuring
|
|
37
|
+
const [first, second, ...rest] = [1, 2, 3, 4, 5];
|
|
38
|
+
// first = 1, second = 2, rest = [3, 4, 5]
|
|
39
|
+
|
|
40
|
+
// Swap variables
|
|
41
|
+
[a, b] = [b, a];
|
|
42
|
+
|
|
43
|
+
// Spread
|
|
44
|
+
const merged = { ...user, age: 31 };
|
|
45
|
+
const combined = [...arr1, ...arr2];
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 2. Async/Await
|
|
49
|
+
|
|
50
|
+
```javascript
|
|
51
|
+
// Async function
|
|
52
|
+
async function fetchUser(id) {
|
|
53
|
+
try {
|
|
54
|
+
const response = await fetch(`/api/users/${id}`);
|
|
55
|
+
const user = await response.json();
|
|
56
|
+
return user;
|
|
57
|
+
} catch (error) {
|
|
58
|
+
console.error('Failed to fetch:', error);
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Parallel execution
|
|
64
|
+
async function fetchAllData() {
|
|
65
|
+
const [users, orders, products] = await Promise.all([
|
|
66
|
+
fetchUsers(),
|
|
67
|
+
fetchOrders(),
|
|
68
|
+
fetchProducts()
|
|
69
|
+
]);
|
|
70
|
+
|
|
71
|
+
return { users, orders, products };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Sequential with errors
|
|
75
|
+
async function processWithFallback() {
|
|
76
|
+
try {
|
|
77
|
+
return await primaryService.getData();
|
|
78
|
+
} catch {
|
|
79
|
+
return await fallbackService.getData();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Promise.allSettled
|
|
84
|
+
async function fetchAll() {
|
|
85
|
+
const results = await Promise.allSettled([
|
|
86
|
+
fetch('/api/users'),
|
|
87
|
+
fetch('/api/orders'),
|
|
88
|
+
fetch('/api/products')
|
|
89
|
+
]);
|
|
90
|
+
|
|
91
|
+
results.forEach((result, index) => {
|
|
92
|
+
if (result.status === 'fulfilled') {
|
|
93
|
+
console.log(`Request ${index}:`, result.value);
|
|
94
|
+
} else {
|
|
95
|
+
console.error(`Request ${index} failed:`, result.reason);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 3. Optional Chaining & Nullish
|
|
102
|
+
|
|
103
|
+
```javascript
|
|
104
|
+
// Optional chaining
|
|
105
|
+
const city = user?.address?.city;
|
|
106
|
+
const first = users?.[0]?.name;
|
|
107
|
+
const handler = obj?.method?.();
|
|
108
|
+
|
|
109
|
+
// Nullish coalescing
|
|
110
|
+
const name = user.name ?? 'Anonymous';
|
|
111
|
+
const value = data ?? defaultValue;
|
|
112
|
+
|
|
113
|
+
// Difference from OR
|
|
114
|
+
const a = 0 ?? 'default'; // 0
|
|
115
|
+
const b = '' ?? 'default'; // ''
|
|
116
|
+
const c = false ?? 'default'; // false
|
|
117
|
+
|
|
118
|
+
const d = 0 || 'default'; // 'default'
|
|
119
|
+
const e = '' || 'default'; // 'default'
|
|
120
|
+
const f = false || 'default'; // 'default'
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### 4. Classes
|
|
124
|
+
|
|
125
|
+
```javascript
|
|
126
|
+
class User {
|
|
127
|
+
#privateField; // Private field
|
|
128
|
+
|
|
129
|
+
static STATUS = {
|
|
130
|
+
ACTIVE: 'active',
|
|
131
|
+
INACTIVE: 'inactive'
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
constructor(name, email) {
|
|
135
|
+
this.name = name;
|
|
136
|
+
this.email = email;
|
|
137
|
+
this.#privateField = 'secret';
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Getter
|
|
141
|
+
get displayName() {
|
|
142
|
+
return `${this.name} (${this.email})`;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Setter
|
|
146
|
+
set status(value) {
|
|
147
|
+
if (!Object.values(User.STATUS).includes(value)) {
|
|
148
|
+
throw new Error('Invalid status');
|
|
149
|
+
}
|
|
150
|
+
this._status = value;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Method
|
|
154
|
+
async save() {
|
|
155
|
+
await db.users.insert(this);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Static method
|
|
159
|
+
static fromData(data) {
|
|
160
|
+
return new User(data.name, data.email);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Inheritance
|
|
165
|
+
class Admin extends User {
|
|
166
|
+
constructor(name, email, permissions) {
|
|
167
|
+
super(name, email);
|
|
168
|
+
this.permissions = permissions;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
async grantPermission(perm) {
|
|
172
|
+
this.permissions.push(perm);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 5. Modules
|
|
178
|
+
|
|
179
|
+
```javascript
|
|
180
|
+
// Named exports
|
|
181
|
+
export const API_URL = '/api';
|
|
182
|
+
export function fetchData() { }
|
|
183
|
+
export class UserService { }
|
|
184
|
+
|
|
185
|
+
// Default export
|
|
186
|
+
export default class App { }
|
|
187
|
+
|
|
188
|
+
// Import
|
|
189
|
+
import App, { API_URL, fetchData } from './app';
|
|
190
|
+
import * as utils from './utils';
|
|
191
|
+
|
|
192
|
+
// Dynamic import
|
|
193
|
+
const module = await import('./heavy-module.js');
|
|
194
|
+
const Component = module.default;
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 6. Functional Patterns
|
|
198
|
+
|
|
199
|
+
```javascript
|
|
200
|
+
// Map, Filter, Reduce
|
|
201
|
+
const names = users
|
|
202
|
+
.filter(u => u.active)
|
|
203
|
+
.map(u => u.name)
|
|
204
|
+
.join(', ');
|
|
205
|
+
|
|
206
|
+
const total = orders.reduce((sum, o) => sum + o.total, 0);
|
|
207
|
+
|
|
208
|
+
// Chaining
|
|
209
|
+
const result = data
|
|
210
|
+
.filter(x => x.valid)
|
|
211
|
+
.map(x => x.value)
|
|
212
|
+
.sort((a, b) => a - b)
|
|
213
|
+
.slice(0, 10);
|
|
214
|
+
|
|
215
|
+
// Currying
|
|
216
|
+
const add = a => b => a + b;
|
|
217
|
+
const add5 = add(5);
|
|
218
|
+
add5(3); // 8
|
|
219
|
+
|
|
220
|
+
// Compose
|
|
221
|
+
const compose = (...fns) => x =>
|
|
222
|
+
fns.reduceRight((acc, fn) => fn(acc), x);
|
|
223
|
+
|
|
224
|
+
const processData = compose(
|
|
225
|
+
validate,
|
|
226
|
+
transform,
|
|
227
|
+
sanitize
|
|
228
|
+
);
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### 7. Modern Array Methods
|
|
232
|
+
|
|
233
|
+
```javascript
|
|
234
|
+
// find/findLast
|
|
235
|
+
const user = users.find(u => u.id === 123);
|
|
236
|
+
const lastActive = users.findLast(u => u.lastLogin > cutoff);
|
|
237
|
+
|
|
238
|
+
// flatMap
|
|
239
|
+
const words = ['hello', 'world'];
|
|
240
|
+
const chars = words.flatMap(w => w.split(''));
|
|
241
|
+
// ['h','e','l','l','o','w','o','r','l','d']
|
|
242
|
+
|
|
243
|
+
// at (negative indexing)
|
|
244
|
+
const last = arr.at(-1);
|
|
245
|
+
const secondLast = arr.at(-2);
|
|
246
|
+
|
|
247
|
+
// groupBy (2024)
|
|
248
|
+
const grouped = Object.groupBy(users, u => u.role);
|
|
249
|
+
// { admin: [...], user: [...] }
|
|
250
|
+
|
|
251
|
+
// toSorted (2023)
|
|
252
|
+
const sorted = [...arr].toSorted((a, b) => a - b);
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### 8. Error Handling
|
|
256
|
+
|
|
257
|
+
```javascript
|
|
258
|
+
// Try-catch with finally
|
|
259
|
+
async function fetchData() {
|
|
260
|
+
let connection;
|
|
261
|
+
try {
|
|
262
|
+
connection = await connect();
|
|
263
|
+
return await connection.query('SELECT * FROM users');
|
|
264
|
+
} catch (error) {
|
|
265
|
+
console.error('Failed:', error);
|
|
266
|
+
throw error;
|
|
267
|
+
} finally {
|
|
268
|
+
if (connection) {
|
|
269
|
+
await connection.close();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Error-first callbacks (Node.js)
|
|
275
|
+
fs.readFile('file.txt', (err, data) => {
|
|
276
|
+
if (err) {
|
|
277
|
+
console.error(err);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
console.log(data);
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
// Custom errors
|
|
284
|
+
class AppError extends Error {
|
|
285
|
+
constructor(message, code, statusCode = 500) {
|
|
286
|
+
super(message);
|
|
287
|
+
this.code = code;
|
|
288
|
+
this.statusCode = statusCode;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
throw new AppError('User not found', 'NOT_FOUND', 404);
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## Best Practices
|
|
296
|
+
|
|
297
|
+
1. **Use const/let** - Avoid var
|
|
298
|
+
2. **Destructuring** - Clean access
|
|
299
|
+
3. **Async/await** - Readable async
|
|
300
|
+
4. **Optional chaining** - Safe access
|
|
301
|
+
5. **Modules** - Organize code
|
|
302
|
+
6. **Functional methods** - Array operations
|
|
303
|
+
|
|
304
|
+
## Common Mistakes
|
|
305
|
+
|
|
306
|
+
- Using var
|
|
307
|
+
- Not handling async errors
|
|
308
|
+
- Mutating arrays incorrectly
|
|
309
|
+
- Overusing any
|
|
310
|
+
- Not using optional chaining
|
|
311
|
+
- Callback hell (use async/await)
|