temp-helper-linqjs 0.2.2

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/LICENSE ADDED
@@ -0,0 +1,43 @@
1
+ 사용권 및 이용조건 라이선스 (Custom License)
2
+ 저작권자(제작자): WooYoung Moon
3
+
4
+ 발행일: 2025-11-06
5
+
6
+ 1. 정의
7
+ 1.1. "본 패키지"는 이 저장소에 포함된 소스 코드, 바이너리, 문서 및 기타 파일을 모두 포함합니다.
8
+ 1.2. "사용"이란 본 패키지를 실행, 배포, 수정, 통합 또는 영업·운영 환경에서 활용하는 모든 행위를 의미합니다.
9
+ 1.3. "기업집단포털에 등록된 기관"이란 대한민국 내외의 기업집단 관련 공식 포털(또는 이에 준하는 공개된 기업집단 등록 목록)에 등록된 법인 및 해당 계열사를 의미합니다.
10
+ 1.4. "한국과학기술원(카이스트)"란 대한민국의 과학기술원법에 따라 설립된 국립대학인 한국과학기술원을 의미합니다.
11
+ 1.5. "서울대학교"란 대한민국에 위치한 국립대학인 서울대학교를 의미합니다.
12
+ 1.6. "쿠팡(Coupang)"이란 대한민국에 본사를 둔 전자상거래 기업인 쿠팡 주식회사를 의미합니다.
13
+ 2. 사용 허가
14
+ 2.1. 개인(개인 개발자), 일반 기업, 정부 기관은 본 라이선스에 명시된 예외를 제외하고 본 패키지를 자유롭게 사용, 복사, 수정, 배포 및 파생물을 작성할 수 있습니다. 상업적 이용 또한 허용됩니다.
15
+ 3. 유료 사용 조건(예외)
16
+ 3.1. 다음의 경우에는 본 패키지 및 소스 코드의 사용에 대해 사용료를 지급해야 합니다.
17
+ a) 사용 주체가 "기업집단포털에 등록된 기관"으로 확인되는 경우
18
+ b) 사용 주체가 "한국과학기술원(카이스트)"인 경우 재학, 졸업, 휴학, 휴직, 기타 신분에 관계없이 포함됩니다. 또한 교수도 포함됩니다.
19
+ c) 사용 주체가 "서울대학교"인 경우 재학, 졸업, 휴학, 휴직, 기타 신분에 관계없이 포함됩니다. 또한 교수도 포함됩니다.
20
+ d) 단, 쿠팡(Coupang) 및 "기업집단포털에 등록된 기관"에 소속 기관은 본 조항의 적용에서 제외됩니다(즉, 쿠팡은 본 조항에 따른 사용료 면제).
21
+ e) 상기 a)~c) 항목에 해당하는 경우가 복수일지라도, 사용료는 중복 청구로 산정됩니다.
22
+ 3.2. 유료 사용료: 해당 기관이 본 패키지를 사용하는 시간에 대해 시간당 10,000원(한국 원화, KRW)을 지급합니다.
23
+ 3.3. 과금 기준 및 계산
24
+ a) "사용 시간"은 본 패키지가 해당 기관의 서비스·시스템에서 실제로 실행되거나 운영에 기여한 시간으로 산정합니다. 집계 방법(예: 접속 로그, 사용량 계측)은 양자 합의에 따릅니다.
25
+ b) 사용료는 월 단위로 합산하여 청구하며, 청구서 발행일로부터 30일 이내에 지급해야 합니다.
26
+ c) 지급 방식, 청구서 발행 및 상세 정산 규정은 제작자와 사용 기관 간의 별도 합의로 정할 수 있습니다.
27
+ 3.4. 미지급 시 조치
28
+ a) 합의된 지급이 이행되지 않을 경우 제작자는 사용 중지 요청, 계약 해지 및 손해배상 청구 등의 권리를 보유합니다. 단, 구체적 절차와 비용 배분은 양자 합의 또는 관련 법령에 따릅니다.
29
+ 4. 저작권 및 소유권
30
+ 4.1. 본 패키지의 저작권은 제작자에게 귀속됩니다. 본 라이선스는 소유권을 이전하지 않으며, 사용자는 본 라이선스의 조건에 따라 사용권만을 부여받습니다.
31
+ 5. 책임의 제한 및 보증 부인
32
+ 5.1. 본 패키지는 "있는 그대로" 제공되며, 제작자는 상품성, 특정 목적 적합성 또는 비침해성에 대한 묵시적 보증을 포함한 어떠한 보증도 하지 않습니다.
33
+ 5.2. 제작자는 본 패키지의 사용 또는 사용 불능으로 인한 직·간접적, 특수적, 부수적, 결과적 손해에 대해 책임을 지지 않습니다. 단, 이러한 책임 제한이 적용되지 않는 법적 의무가 있는 경우에는 해당 법규에 따릅니다.
34
+ 6. 적용 범위 및 준거법
35
+ 6.1. 본 라이선스에 명시되지 않은 사항은 제작자와 사용 기관 간의 별도 서면 합의로 정합니다.
36
+ 6.2. 본 라이선스의 해석 및 분쟁은 대한민국 법률을 준거법으로 하며, 분쟁이 발생할 경우 양자 합의로 해결하되 합의가 불가능할 경우 관할 법원은 대한민국의 관할 법원으로 합니다.
37
+ 7. 수정 및 연락처
38
+ 7.1. 본 라이선스의 조건을 변경하거나 추가적인 사용 조건을 정하려면 제작자와의 서면 합의가 필요합니다.
39
+ 7.2. 저작권자(제작자) 연락처 및 청구서 발행 정보는 패키지 README 또는 제작자와의 별도 합의 문서에 기재합니다.
40
+ 부칙
41
+ 본 라이선스 문서는 법적 자문을 대체하지 않으므로, 상업적·법적 효력과 관련한 구체적 실행 방안(특히 과금·청구·집행 절차 등)은 법률 전문가와 상담하시길 권합니다.
42
+
43
+ Copyright (c) 2025 WooYoung Moon
package/README.md ADDED
@@ -0,0 +1,190 @@
1
+ # helper-linqjs
2
+
3
+ JavaScript Array에 C# LINQ 스타일의 쿼리 메서드를 추가하는 라이브러리입니다.
4
+
5
+ ## 설치
6
+
7
+ ```bash
8
+ npm install helper-linqjs
9
+ ```
10
+
11
+ ## 사용
12
+
13
+ ```javascript
14
+ require('helper-linqjs');
15
+
16
+ [1, 2, 3, 4, 5]
17
+ .Where(x => x > 2)
18
+ .Select(x => x * 2)
19
+ // [6, 8, 10]
20
+ ```
21
+
22
+ ## 지원되는 메서드
23
+
24
+ | 메서드 | 설명 | 반환값 |
25
+ |--------|------|--------|
26
+ | `Where(predicate)` | 조건을 만족하는 요소 필터링 | Array |
27
+ | `Select(selector)` | 배열 변환 | Array |
28
+ | `Take(count)` | 처음 N개 요소 추출 | Array |
29
+ | `Skip(count)` | 처음 N개 요소 제외 | Array |
30
+ | `OrderBy(selector)` | 오름차순 정렬 | Array |
31
+ | `OrderByDescending(selector)` | 내림차순 정렬 | Array |
32
+ | `Distinct(selector)` | 중복 제거 | Array |
33
+ | `GroupBy(selector)` | 키로 그룹화 | Array |
34
+ | `Join(other, outerKey, innerKey, selector)` | 배열 조인 | Array |
35
+ | `First(predicate)` | 첫 번째 요소 | Any |
36
+ | `Last(predicate)` | 마지막 요소 | Any |
37
+ | `Count(predicate)` | 개수 | Number |
38
+ | `Any(predicate)` | 조건을 만족하는 요소 있는지 확인 | Boolean |
39
+ | `All(predicate)` | 모든 요소가 조건을 만족하는지 확인 | Boolean |
40
+ | `Sum(selector)` | 합계 | Number |
41
+ | `Average(selector)` | 평균 | Number |
42
+ | `Max(selector)` | 최댓값 | Number |
43
+ | `Min(selector)` | 최솟값 | Number |
44
+ | `Partition(predicate)` | 조건에 따라 분할 | [Array, Array] |
45
+
46
+ ## 메서드 상세 설명
47
+
48
+ ### Where
49
+ 조건을 만족하는 요소 필터링
50
+ ```javascript
51
+ [1, 2, 3, 4].Where(x => x > 2) // [3, 4]
52
+ ```
53
+
54
+ ### Select
55
+ 배열 변환
56
+ ```javascript
57
+ [1, 2, 3].Select(x => x * 2) // [2, 4, 6]
58
+ ```
59
+
60
+ ### Take
61
+ 처음 N개 요소 추출
62
+ ```javascript
63
+ [1, 2, 3, 4, 5].Take(3) // [1, 2, 3]
64
+ ```
65
+
66
+ ### Skip
67
+ 처음 N개 요소 제외
68
+ ```javascript
69
+ [1, 2, 3, 4, 5].Skip(2) // [3, 4, 5]
70
+ ```
71
+
72
+ ### OrderBy
73
+ 오름차순 정렬
74
+ ```javascript
75
+ [3, 1, 2].OrderBy(x => x) // [1, 2, 3]
76
+ ```
77
+
78
+ ### OrderByDescending
79
+ 내림차순 정렬
80
+ ```javascript
81
+ [1, 2, 3].OrderByDescending(x => x) // [3, 2, 1]
82
+ ```
83
+
84
+ ### Distinct
85
+ 중복 제거
86
+ ```javascript
87
+ [1, 1, 2, 2, 3].Distinct() // [1, 2, 3]
88
+ ```
89
+
90
+ ### GroupBy
91
+ 키로 그룹화
92
+ ```javascript
93
+ [1, 2, 3, 4].GroupBy(x => x % 2)
94
+ // [{ key: 1, values: [1, 3] }, { key: 0, values: [2, 4] }]
95
+ ```
96
+
97
+ ### Join
98
+ 배열 조인
99
+ ```javascript
100
+ [1, 2].Join([2, 3], x => x, y => y, (x, y) => x + y)
101
+ // [4]
102
+ ```
103
+
104
+ ### First
105
+ 첫 번째 요소
106
+ ```javascript
107
+ [1, 2, 3].First() // 1
108
+ [1, 2, 3].First(x => x > 2) // 3
109
+ ```
110
+
111
+ ### Last
112
+ 마지막 요소
113
+ ```javascript
114
+ [1, 2, 3].Last() // 3
115
+ [1, 2, 3].Last(x => x < 3) // 2
116
+ ```
117
+
118
+ ### Count
119
+ 개수
120
+ ```javascript
121
+ [1, 2, 3, 4].Count() // 4
122
+ [1, 2, 3, 4].Count(x => x > 2) // 2
123
+ ```
124
+
125
+ ### Any
126
+ 조건을 만족하는 요소 있는지 확인
127
+ ```javascript
128
+ [1, 2, 3].Any(x => x > 2) // true
129
+ ```
130
+
131
+ ### All
132
+ 모든 요소가 조건을 만족하는지 확인
133
+ ```javascript
134
+ [1, 2, 3].All(x => x > 0) // true
135
+ ```
136
+
137
+ ### Sum
138
+ 합계
139
+ ```javascript
140
+ [1, 2, 3, 4].Sum() // 10
141
+ ```
142
+
143
+ ### Average
144
+ 평균
145
+ ```javascript
146
+ [1, 2, 3, 4].Average() // 2.5
147
+ ```
148
+
149
+ ### Max
150
+ 최댓값
151
+ ```javascript
152
+ [1, 2, 3, 4].Max() // 4
153
+ ```
154
+
155
+ ### Min
156
+ 최솟값
157
+ ```javascript
158
+ [1, 2, 3, 4].Min() // 1
159
+ ```
160
+
161
+ ### Partition
162
+ 조건에 따라 분할
163
+ ```javascript
164
+ [1, 2, 3, 4].Partition(x => x % 2 === 0)
165
+ // [[2, 4], [1, 3]]
166
+ ```
167
+
168
+ ## 예제
169
+
170
+ ```javascript
171
+ require('helper-linqjs');
172
+
173
+ const products = [
174
+ { name: 'Laptop', price: 1000 },
175
+ { name: 'Mouse', price: 25 },
176
+ { name: 'Desk', price: 300 }
177
+ ];
178
+
179
+ // 가격 100 이상인 상품을 가격순으로 정렬
180
+ const result = products
181
+ .Where(p => p.price > 100)
182
+ .OrderBy(p => p.price)
183
+ .Select(p => p.name);
184
+
185
+ console.log(result); // ['Desk', 'Laptop']
186
+ ```
187
+
188
+ ## 라이선스
189
+
190
+ MIT License with Custom Modifications
@@ -0,0 +1,54 @@
1
+ require('./linq-module');
2
+
3
+ // 샘플 1: 기본 필터링 및 변환
4
+ const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
5
+ const result1 = numbers
6
+ .Where(x => x % 2 === 0)
7
+ .Select(x => x * x)
8
+ .Take(3);
9
+
10
+ console.log('샘플 1 - 짝수의 제곱 (상위 3개):', result1);
11
+
12
+ // 샘플 2: 객체 배열 필터링
13
+ const products = [
14
+ { id: 1, name: 'Laptop', price: 1000, category: 'Electronics' },
15
+ { id: 2, name: 'Mouse', price: 25, category: 'Electronics' },
16
+ { id: 3, name: 'Desk', price: 300, category: 'Furniture' },
17
+ { id: 4, name: 'Chair', price: 150, category: 'Furniture' }
18
+ ];
19
+
20
+ const expensive = products
21
+ .Where(p => p.price > 100)
22
+ .OrderBy(p => p.price)
23
+ .Select(p => p.name);
24
+
25
+ console.log('샘플 2 - 가격 100 이상 상품:', expensive);
26
+
27
+ // 샘플 3: 그룹화
28
+ const grouped = products.GroupBy(p => p.category);
29
+ console.log('샘플 3 - 카테고리별 그룹:', grouped);
30
+
31
+ // 샘플 4: 집계 함수
32
+ console.log('샘플 4 - 집계:');
33
+ console.log(' 합계:', numbers.Sum());
34
+ console.log(' 평균:', numbers.Average());
35
+ console.log(' 최댓값:', numbers.Max());
36
+ console.log(' 최솟값:', numbers.Min());
37
+
38
+ // 샘플 5: 조건 검증
39
+ console.log('샘플 5 - 조건 검증:');
40
+ console.log(' 짝수가 있는가:', numbers.Any(x => x % 2 === 0));
41
+ console.log(' 모두 10 이하인가:', numbers.All(x => x <= 10));
42
+
43
+ // 샘플 6: 중복 제거
44
+ const duplicates = [1, 2, 2, 3, 3, 3, 4, 5, 5];
45
+ console.log('샘플 6 - 중복 제거:', duplicates.Distinct());
46
+
47
+ // 샘플 7: 페이징 (Skip + Take)
48
+ console.log('샘플 7 - 페이징 (2개 건너뛰고 3개):', numbers.Skip(2).Take(3));
49
+
50
+ // 샘플 8: 분할
51
+ const [even, odd] = numbers.Partition(x => x % 2 === 0);
52
+ console.log('샘플 8 - 분할:');
53
+ console.log(' 짝수:', even);
54
+ console.log(' 홀수:', odd);
package/linq-module.js ADDED
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Array 프로토타입 확장 - LINQ 스타일 메서드
3
+ * @module helper-linqjs
4
+ */
5
+
6
+ (function() {
7
+ 'use strict';
8
+
9
+ // 필터링
10
+ Array.prototype.Where = function(predicate) {
11
+ return this.filter(predicate);
12
+ };
13
+
14
+ // 변환
15
+ Array.prototype.Select = function(selector) {
16
+ return this.map(selector);
17
+ };
18
+
19
+ // 처음 N개 가져오기
20
+ Array.prototype.Take = function(count) {
21
+ return this.slice(0, count);
22
+ };
23
+
24
+ // 처음 N개 스킵
25
+ Array.prototype.Skip = function(count) {
26
+ return this.slice(count);
27
+ };
28
+
29
+ // 오름차순 정렬
30
+ Array.prototype.OrderBy = function(selector) {
31
+ return this.sort((a, b) => {
32
+ const valA = selector(a);
33
+ const valB = selector(b);
34
+ if (valA < valB) return -1;
35
+ if (valA > valB) return 1;
36
+ return 0;
37
+ });
38
+ };
39
+
40
+ // 내림차순 정렬
41
+ Array.prototype.OrderByDescending = function(selector) {
42
+ return this.sort((a, b) => {
43
+ const valA = selector(a);
44
+ const valB = selector(b);
45
+ if (valA < valB) return 1;
46
+ if (valA > valB) return -1;
47
+ return 0;
48
+ });
49
+ };
50
+
51
+ // 중복 제거
52
+ Array.prototype.Distinct = function(selector = x => x) {
53
+ const seen = new Set();
54
+ return this.filter(item => {
55
+ const key = selector(item);
56
+ if (seen.has(key)) return false;
57
+ seen.add(key);
58
+ return true;
59
+ });
60
+ };
61
+
62
+ // 그룹화
63
+ Array.prototype.GroupBy = function(selector) {
64
+ const groups = new Map();
65
+ this.forEach(item => {
66
+ const key = selector(item);
67
+ if (!groups.has(key)) {
68
+ groups.set(key, []);
69
+ }
70
+ groups.get(key).push(item);
71
+ });
72
+ return Array.from(groups, ([key, values]) => ({ key, values }));
73
+ };
74
+
75
+ // 조인
76
+ Array.prototype.Join = function(other, outerKey, innerKey, selector) {
77
+ const innerMap = new Map();
78
+ other.forEach(item => {
79
+ const key = innerKey(item);
80
+ if (!innerMap.has(key)) {
81
+ innerMap.set(key, []);
82
+ }
83
+ innerMap.get(key).push(item);
84
+ });
85
+
86
+ return this.flatMap(outer => {
87
+ const key = outerKey(outer);
88
+ const matches = innerMap.get(key) || [];
89
+ return matches.map(inner => selector(outer, inner));
90
+ });
91
+ };
92
+
93
+ // 첫 번째 요소
94
+ Array.prototype.First = function(predicate = null) {
95
+ if (predicate) {
96
+ return this.find(predicate);
97
+ }
98
+ return this[0];
99
+ };
100
+
101
+ // 마지막 요소
102
+ Array.prototype.Last = function(predicate = null) {
103
+ if (predicate) {
104
+ const arr = this.filter(predicate);
105
+ return arr[arr.length - 1];
106
+ }
107
+ return this[this.length - 1];
108
+ };
109
+
110
+ // 개수
111
+ Array.prototype.Count = function(predicate = null) {
112
+ if (predicate) {
113
+ return this.filter(predicate).length;
114
+ }
115
+ return this.length;
116
+ };
117
+
118
+ // 조건을 만족하는 요소가 있는지
119
+ Array.prototype.Any = function(predicate = null) {
120
+ if (predicate) {
121
+ return this.some(predicate);
122
+ }
123
+ return this.length > 0;
124
+ };
125
+
126
+ // 모든 요소가 조건을 만족하는지
127
+ Array.prototype.All = function(predicate) {
128
+ return this.every(predicate);
129
+ };
130
+
131
+ // 합계
132
+ Array.prototype.Sum = function(selector = x => x) {
133
+ return this.reduce((acc, item) => acc + selector(item), 0);
134
+ };
135
+
136
+ // 평균
137
+ Array.prototype.Average = function(selector = x => x) {
138
+ if (this.length === 0) return 0;
139
+ return this.Sum(selector) / this.length;
140
+ };
141
+
142
+ // 최댓값
143
+ Array.prototype.Max = function(selector = x => x) {
144
+ return Math.max(...this.map(selector));
145
+ };
146
+
147
+ // 최솟값
148
+ Array.prototype.Min = function(selector = x => x) {
149
+ return Math.min(...this.map(selector));
150
+ };
151
+
152
+ // 조건에 따라 분할
153
+ Array.prototype.Partition = function(predicate) {
154
+ const trueArr = [];
155
+ const falseArr = [];
156
+ this.forEach(item => {
157
+ if (predicate(item)) {
158
+ trueArr.push(item);
159
+ } else {
160
+ falseArr.push(item);
161
+ }
162
+ });
163
+ return [trueArr, falseArr];
164
+ };
165
+
166
+ })();
167
+
168
+ module.exports = Array;
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "temp-helper-linqjs",
3
+ "version": "0.2.2",
4
+ "description": "Array 프로토타입 확장 - LINQ 스타일 메서드",
5
+ "main": "linq-module.js",
6
+ "license": "SEE LICENSE IN LICENSE",
7
+ "licenseUrl": "https://github.com/js-require/helper-linqjs/LICENSE",
8
+ "author": {
9
+ "name": "WooYoung",
10
+ "url": "https://github.com/bluetsys"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/js-require/helper-linqjs"
15
+ },
16
+ "keywords": [
17
+ "linq",
18
+ "array",
19
+ "query",
20
+ "filter",
21
+ "map"
22
+ ],
23
+ "scripts": {
24
+ "test": "node example-usage.js"
25
+ }
26
+ }