Merge pull request from gnuboard:HeuJung/issue554
fix(admin_basic,core,ecommerce,plugins,basic): stale dist 전수 재빌드 + 소스맵 게이트 audit 룰 신설
This commit is contained in:
@@ -1106,6 +1106,8 @@ php artisan plugin:build sirsoft-payment --active # 활성 디렉토리에
|
||||
```
|
||||
|
||||
> **빌드 원칙**: 기본값은 `_bundled` 디렉토리. 빌드 결과물은 빌드 경로 내에만 남음.
|
||||
|
||||
`_bundled` 의 `dist/`(코어는 `public/build/core/`)는 Git 추적되는 배포 산출물이다 (`*.map` 만 ignore). src 변경 시 커밋 dist 를 `--production` 으로 동반 재빌드한다 — 신규 소스 리터럴이 dist 에 없으면 stale 빌드이며, 정적 검사가 이를 검출한다. 커밋 dist 에 `//# sourceMappingURL=` 참조를 남기지 않는다 — `.map` 은 배포본에 존재하지 않아 브라우저 개발자 도구에서 404 를 유발한다. 코어 3번들 재빌드는 `core:build --production` (`--full` 은 앱 번들 전용 — `public/build` 를 비워 코어 3번들을 지운다).
|
||||
> 활성 디렉토리 반영은 `update` 커맨드로만 수행. `--watch` 모드는 실시간 개발용으로 활성 디렉토리를 자동 사용.
|
||||
|
||||
---
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
- 확인 질문이 있는 Artisan 명령(확장 설치·삭제·업데이트, 코어 업데이트, 검색 인덱스 재생성 등)을 터미널이 아닌 곳에서 실행하면 아무 반응 없이 멈춰 있던 문제를 수정했습니다. 예약 작업·배포 스크립트·CI 처럼 사람이 답할 수 없는 환경에서는 질문이 화면에 나오지도 않은 채 응답을 기다렸기 때문에, 명령이 실패한 것도 아니고 진행 중인 것도 아닌 상태로 남아 "명령이 몹시 느리다" 로만 보였습니다. 이제 그런 환경에서는 질문을 건너뛰고 기본 동작을 따릅니다 — 삭제·업데이트처럼 되돌리기 어려운 명령의 기본 동작은 "중단" 이므로, 확인 없이 수행되는 일은 없습니다. 그대로 진행하려면 종전처럼 `--no-interaction` 이나 `--force` 를 붙이면 됩니다.
|
||||
- Windows 에서 확장(모듈·플러그인·템플릿) 업데이트가 "디렉토리 이동 실패" 로 중단되던 문제를 해소했습니다. Windows 는 편집기·개발 도구·파일 감시 프로그램이 폴더를 보고 있기만 해도 폴더 이름 바꾸기를 차단하므로, 폴더를 통째로 이동하는 방식으로는 실패를 피할 수 없었습니다. 이제 이동이 차단되면 파일 단위 교체로 자동 전환해 어떤 프로그램도 종료하지 않고 업데이트를 완료합니다. 잠근 프로그램을 찾아 강제 종료하던 이전 동작은 제거했습니다 — 사용 중인 편집기나 개발 도구가 예고 없이 종료되는 부작용이 있었고, 폴더를 감시만 하는 프로그램은 찾아내지도 못했습니다. 백업 복원에도 같은 방식이 적용되며, 실패한 업데이트가 남긴 임시 폴더는 다음 업데이트 때 자동으로 정리됩니다.
|
||||
- 빌드 산출물이 존재하지 않는 소스맵 파일을 참조해 브라우저 개발자 도구 사용 시 불필요한 404 요청이 발생하던 문제를 수정했습니다.
|
||||
|
||||
## [7.0.6] - 2026-08-10
|
||||
|
||||
|
||||
@@ -149,7 +149,7 @@ modules/_bundled/sirsoft-ecommerce/
|
||||
├── package.json ← npm 패키지 정의
|
||||
├── vite.config.ts ← Vite 빌드 설정
|
||||
├── tsconfig.json ← TypeScript 설정
|
||||
├── dist/ ← 빌드 출력 (git ignore)
|
||||
├── dist/ ← 빌드 출력 (_bundled 은 Git 추적 — 배포 산출물, `*.map` 만 ignore)
|
||||
│ ├── js/module.iife.js
|
||||
│ ├── css/module.css
|
||||
│ └── assets/
|
||||
|
||||
@@ -491,7 +491,7 @@ modules/_bundled/sirsoft-ecommerce/
|
||||
├── vite.config.ts # Vite 빌드 설정 (에셋 모듈만)
|
||||
├── tsconfig.json # TypeScript 설정 (에셋 모듈만)
|
||||
├── vendor/ # Composer 의존성 (자동 생성, gitignore 대상)
|
||||
├── dist/ # 프론트엔드 빌드 출력 (에셋 모듈만, gitignore 대상)
|
||||
├── dist/ # 프론트엔드 빌드 출력 (에셋 모듈만 — _bundled 은 Git 추적, `*.map` 만 ignore)
|
||||
│ ├── js/module.iife.js
|
||||
│ └── css/module.css
|
||||
├── upgrades/ # 버전 업그레이드 스텝 (AbstractUpgradeStep 상속 — g7_version >= 7.0.0-beta.5 모듈 의무)
|
||||
@@ -562,7 +562,7 @@ modules/_bundled/sirsoft-ecommerce/
|
||||
| `package.json` | npm 패키지 정의 (에셋 모듈만 해당) |
|
||||
| `vite.config.ts` | Vite IIFE 빌드 설정 (에셋 모듈만 해당) |
|
||||
| `vendor/` | Composer 의존성 디렉토리 (자동 생성, gitignore 대상) |
|
||||
| `dist/` | 프론트엔드 빌드 출력 (에셋 모듈만 해당, gitignore 대상) |
|
||||
| `dist/` | 프론트엔드 빌드 출력 (에셋 모듈만 해당 — `_bundled` 소스는 Git 추적되는 배포 산출물, `*.map` 만 ignore. 소스 변경 시 `--production` 재빌드 산출물을 함께 커밋한다) |
|
||||
| `config/` | 모듈별 설정 파일 |
|
||||
| `database/factories/` | 테스트용 Factory (autoload 등록 필수) |
|
||||
| `database/migrations/` | 데이터베이스 마이그레이션 |
|
||||
|
||||
@@ -5,9 +5,6 @@
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview",
|
||||
"test": "vitest",
|
||||
"test:run": "vitest run",
|
||||
"test:e2e": "playwright test --config=tests/Playwright/playwright.config.ts",
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
- 관리자 엑셀 다운로드 관리의 다운로드 이력 모달에서, 이력 항목이 아직 선택되지 않은 순간에 파일 정보·상태 배지가 비정상적으로 처리되던 문제를 보완했습니다. 항목을 선택한 뒤의 표시는 종전과 동일합니다.
|
||||
- 같은 모달의 "다운로드 기록" 목록이 항상 비어 보이던 문제를 수정했습니다. 이제 누가 언제 몇 번째로 내려받았는지 기록이 표시됩니다.
|
||||
- 같은 모달의 "처리중"·"실패"·"만료" 상태 배지에서 아이콘이 표시되지 않던 문제를 수정했습니다.
|
||||
- 빌드 산출물이 존재하지 않는 소스맵 파일을 참조해 브라우저 개발자 도구 사용 시 불필요한 404 요청이 발생하던 문제를 수정했습니다.
|
||||
|
||||
## [1.1.0] - 2026-08-10
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"identifier": "sirsoft-ecommerce",
|
||||
"version": "1.1.0",
|
||||
"version": "1.1.1",
|
||||
"components": {
|
||||
"basic": [],
|
||||
"composite": [],
|
||||
|
||||
File diff suppressed because one or more lines are too long
+7
@@ -698,6 +698,13 @@ describe('Partial 레이아웃 구조 검증', () => {
|
||||
|
||||
// ========== 합계행 백엔드 필드 마이그레이션 검증 ==========
|
||||
|
||||
/**
|
||||
* 합계행(footerCells)이 order.data 백엔드 필드에 바인딩되어 있는지의 구조 검증.
|
||||
* 공개 #98(stale dist) 시나리오 매니페스트 admin-order-detail-footer-totals.yaml 의
|
||||
* 레이아웃 계층 커버를 담당한다 — 서빙 번들 실검은 Playwright spec 이 맡는다.
|
||||
*
|
||||
* @effects order_detail_footer_totals_fields_bound
|
||||
*/
|
||||
it('합계행(footer)이 computed 대신 order.data 백엔드 필드를 사용한다', () => {
|
||||
const json = JSON.stringify(orderInfoPartial);
|
||||
// computed 참조가 없어야 함
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// audit:allow extension-dist-source-literal-sync 고아 중복 구현 — handlers/index.ts 는 noticeHandlers.ts 의 동명 핸들러를 사용하며 이 파일은 어디서도 import 되지 않아 번들에 포함되지 않는다 (공유 리터럴이 있어 번들 포함 게이트로는 걸러지지 않음)
|
||||
/**
|
||||
* 고시정보 템플릿 저장 확인 핸들러
|
||||
*
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// audit:allow extension-dist-source-literal-sync 수신 함수가 읽지 않는 handler 필드를 rollup 최적화가 소거해 해당 리터럴만 번들에서 빠진다 (fresh 빌드로 실측 — stale 아님)
|
||||
/**
|
||||
* 상품 목록 확장 행 옵션 지연 로딩 핸들러
|
||||
*
|
||||
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
/**
|
||||
* 주문 상세 — 합계행(tfoot) 텍스트 바인딩 해석 회귀 (공개 #98).
|
||||
*
|
||||
* 배경: admin_basic 1.0.4 릴리즈에 stale dist 가 실려, `components.json` 의
|
||||
* `skipBindingKeys`(footerCells 선평가 중단) 선언과 구형 JS(renderFooterCellText 부재)가
|
||||
* 어긋나 합계행 3셀(`수량`·`적립예정`·`배송비`)에 `{{order.data?.total_quantity ?? 0}}개`
|
||||
* 같은 표현식 원문이 그대로 노출됐다. 소스·단위 테스트는 정상(green)이었고 **서빙 산출물만**
|
||||
* 구형이었으므로, 서빙 번들을 실제로 로드하는 이 E2E 만이 해당 회귀를 잡는다.
|
||||
*
|
||||
* 측정 규율 (이 spec 을 고칠 사람에게):
|
||||
* - 값 하드코딩 금지 — 주문 데이터는 변동한다. 형태(정규식)로 단언한다.
|
||||
* - 헤더/라벨의 한글 문자열 단언 금지 — E2E 세션 로케일이 en 이면 `$t:` 라벨이 영문으로
|
||||
* 렌더된다(order-detail-numeric-alignment.spec.ts 실측 선례). 셀 식별은 레이아웃
|
||||
* JSON 이 부여한 className 훅으로 한다: 수량=`text-center`(비 blue), 적립=`text-center`+
|
||||
* `text-blue-600`, 배송비=`text-label`. `개`/`P` 접미사는 레이아웃에 리터럴로 박힌
|
||||
* 로케일 무관 문자라 단언에 써도 된다.
|
||||
* - tfoot 의 선행 빈 셀(expandable/selectable) 유무에 좌우되지 않도록 인덱스 단언 금지.
|
||||
*/
|
||||
import { test, expect, authenticatePage } from '../../fixtures/ecommerce-auth';
|
||||
import type { Page } from '@playwright/test';
|
||||
|
||||
/**
|
||||
* 첫 주문의 상세로 진입한다 (주문번호 하드코딩 회피).
|
||||
*
|
||||
* 목록 화면은 좁은 뷰포트에서 카드로 렌더되므로 진입은 항상 데스크톱 폭에서 한다.
|
||||
* 상세 진입은 주문번호 `<span>` 클릭(DataGrid onRowClick 계열).
|
||||
*/
|
||||
async function gotoFirstOrderDetail(page: Page): Promise<void> {
|
||||
await page.setViewportSize({ width: 1280, height: 900 });
|
||||
await page.goto('/admin/ecommerce/orders');
|
||||
await page.waitForLoadState('domcontentloaded', { timeout: 30_000 });
|
||||
|
||||
const orderNumber = page.locator('table tbody tr span.cursor-pointer').first();
|
||||
await orderNumber.waitFor({ state: 'visible', timeout: 30_000 });
|
||||
await orderNumber.click();
|
||||
|
||||
await page.waitForURL(/\/admin\/ecommerce\/orders\/[\w-]+$/, { timeout: 30_000 });
|
||||
}
|
||||
|
||||
test.describe('@sirsoft-ecommerce 주문 상세 합계행 텍스트 바인딩', () => {
|
||||
// @scenario footer_cell=quantity, viewport=desktop
|
||||
// @effects footer_text_bindings_resolved_no_raw_expression, footer_quantity_cell_shows_count_with_unit
|
||||
// @scenario footer_cell=points, viewport=desktop
|
||||
// @effects footer_points_cell_shows_formatted_number
|
||||
// @scenario footer_cell=delivery, viewport=desktop
|
||||
// @effects footer_delivery_cell_shows_shipping_fee_label
|
||||
test('합계행 수량·적립·배송비 셀이 표현식 원문 없이 값으로 렌더된다', async ({ page, ordersReadToken }) => {
|
||||
await authenticatePage(page, ordersReadToken);
|
||||
await gotoFirstOrderDetail(page);
|
||||
|
||||
// 상품 목록 표의 합계행이 뜰 때까지 대기 (footerCells 는 데이터 로드 후에만 렌더)
|
||||
const tfoot = page.locator('table tfoot').first();
|
||||
await tfoot.waitFor({ state: 'visible', timeout: 30_000 });
|
||||
|
||||
// ① 페이지 전체에 미해석 표현식 원문이 없다 — stale dist 회귀의 1차 증상.
|
||||
// (poll: 데이터 소스 응답 직후 재렌더 타이밍 흡수)
|
||||
await expect
|
||||
.poll(async () => (await page.evaluate(() => document.body.innerText)).includes('{{'), {
|
||||
timeout: 20_000,
|
||||
})
|
||||
.toBe(false);
|
||||
|
||||
// ② 수량 셀 — 레이아웃 className 훅: text-center 이면서 blue(적립) 가 아닌 셀.
|
||||
// `개` 는 레이아웃 리터럴(로케일 무관). 회귀 시 `{{...}}개` 라 정규식이 깨진다.
|
||||
const quantityCell = tfoot.locator('td.text-center:not(.text-blue-600)').first();
|
||||
await expect(quantityCell).toHaveText(/^[\d,]+개$/);
|
||||
|
||||
// ③ 적립예정 셀 — text-center + text-blue-600. `| number` 파이프 해석 결과라
|
||||
// 숫자(천단위 콤마 허용) + `P` 리터럴 형태여야 한다.
|
||||
const pointsCell = tfoot.locator('td.text-center.text-blue-600').first();
|
||||
await expect(pointsCell).toHaveText(/^[\d,]+P$/);
|
||||
|
||||
// ④ 배송비 셀 — text-label. 라벨은 `$t:` 로 로케일 의존이므로 라벨 문자열 대신
|
||||
// "라벨: 값" 구분자 존재 + 표현식 원문 부재를 단언한다.
|
||||
const deliveryCell = tfoot.locator('td.text-label').first();
|
||||
const deliveryText = (await deliveryCell.innerText()).trim();
|
||||
expect(deliveryText).not.toContain('{{');
|
||||
expect(deliveryText).toMatch(/:/);
|
||||
});
|
||||
});
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
feature: 관리자 주문상세 — 합계행(tfoot) 텍스트 바인딩 해석 (공개 #98 stale dist 회귀)
|
||||
|
||||
description: |
|
||||
관리자 주문 상세(`admin/ecommerce/orders/:orderNumber`) 상품 목록 표의 합계행은
|
||||
DataGrid `footerCells` 로 렌더된다. `components.json` 의 `skipBindingKeys` 선언으로
|
||||
엔진 선평가가 중단된 뒤에는 DataGrid `renderFooterCellText` 가 `text` 바인딩을
|
||||
해석해야 한다. admin_basic 1.0.4 는 stale dist(구형 JS) 가 릴리즈에 실려
|
||||
수량·적립예정·배송비 셀에 `{{order.data?.total_quantity ?? 0}}개` 같은 표현식
|
||||
원문이 노출됐다(공개 #98). 소스와 단위 테스트는 green 인 채 서빙 산출물만 구형인
|
||||
결함이므로, 서빙 번들을 실제 로드하는 브라우저 E2E 를 회귀 방벽으로 둔다.
|
||||
|
||||
axes 는 audit fallback YAML 파서 호환을 위해 flat 인라인 배열로만 선언한다.
|
||||
모바일 카드 푸터는 `footerCardChildren`(컴포넌트 children 경로) 라 이 결함의
|
||||
영향 밖이며(실측), Chrome MCP 검수 매트릭스 T8 축이 별도로 확인한다.
|
||||
|
||||
axes:
|
||||
footer_cell: [quantity, points, delivery]
|
||||
viewport: [desktop]
|
||||
|
||||
effects:
|
||||
# 브라우저 E2E (Playwright — 서빙 번들 실검)
|
||||
- footer_text_bindings_resolved_no_raw_expression # 페이지 전체 `{{` 0건
|
||||
- footer_quantity_cell_shows_count_with_unit # 수량 셀 `[\d,]+개` 형태
|
||||
- footer_points_cell_shows_formatted_number # 적립 셀 `[\d,]+P` 형태 (`| number` 파이프)
|
||||
- footer_delivery_cell_shows_shipping_fee_label # 배송비 셀 라벨: 값 형태 + 원문 부재
|
||||
# 컴포넌트 단위 (Vitest — admin_basic DataGrid)
|
||||
- datagrid_footer_cell_text_binding_resolved # footerCells[].text 바인딩/파이프 해석
|
||||
# 레이아웃 구조 (Vitest — 이커머스 주문상세 레이아웃 JSON)
|
||||
- order_detail_footer_totals_fields_bound # 합계행이 order.data 백엔드 필드 사용
|
||||
|
||||
test_files:
|
||||
- templates/_bundled/sirsoft-admin_basic/src/components/composite/__tests__/DataGrid.test.tsx
|
||||
- modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/orderDetailLayouts.test.tsx
|
||||
- modules/_bundled/sirsoft-ecommerce/tests/Playwright/specs/admin/order-detail-footer-totals.spec.ts
|
||||
|
||||
validation:
|
||||
audit_rule: frontend-change-requires-e2e
|
||||
@@ -5,9 +5,6 @@
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview",
|
||||
"test": "vitest",
|
||||
"test:run": "vitest run",
|
||||
"test:e2e": "playwright test --config=tests/Playwright/playwright.config.ts",
|
||||
|
||||
@@ -4,6 +4,12 @@
|
||||
형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며,
|
||||
[Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다.
|
||||
|
||||
## [1.0.3] - 2026-08-12
|
||||
|
||||
### Fixed
|
||||
|
||||
- 빌드 산출물이 존재하지 않는 소스맵 파일을 참조해 브라우저 개발자 도구 사용 시 불필요한 404 요청이 발생하던 문제를 수정했습니다.
|
||||
|
||||
## [1.0.2] - 2026-08-10
|
||||
|
||||
### Added
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "plugins/sirsoft-gdpr",
|
||||
"description": "GDPR (General Data Protection Regulation) plugin for G7 platform by sirsoft",
|
||||
"type": "library",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.3",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@plugins/sirsoft-gdpr",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.3",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"ko": "GDPR (일반 데이터 보호 규정)",
|
||||
"en": "GDPR (General Data Protection Regulation)"
|
||||
},
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.3",
|
||||
"description": {
|
||||
"ko": "쿠키 동의 배너, 자동 차단, 동의 이력 저장, 마이페이지 동의 철회를 제공하는 GDPR 대응 플러그인입니다.",
|
||||
"en": "GDPR-ready plugin: cookie consent banner, auto-blocking, consent history, and mypage consent withdrawal."
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// audit:allow extension-dist-source-literal-sync DEFAULT_BLOCKED_DOMAINS 는 현재 소비처가 없어 tree-shake 로 번들에서 제외된다 (도메인 문자열 부재 = stale 아님)
|
||||
/**
|
||||
* GDPR 도메인 기반 차단 매칭 + 기본 카탈로그
|
||||
*
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
### Fixed
|
||||
|
||||
- 빌드 산출물이 존재하지 않는 소스맵 파일을 참조해 브라우저 개발자 도구 사용 시 불필요한 404 요청이 발생하던 문제를 수정했습니다.
|
||||
- 이커머스 관리자 주문설정에서 다른 탭에 갔다 돌아오면 간편결제 항목의 브랜드 로고가 사라지고 회색 기본 아이콘으로 남던 문제를 수정했습니다. 화면을 새로고침해야만 다시 표시됐습니다.
|
||||
- 결제 취소 기록의 환불 금액에 원화 단위가 고정 표기되던 문제를 수정했습니다. 해외 결제(엔화 등) 취소도 실제 결제 통화로 표시됩니다.
|
||||
|
||||
@@ -163,7 +164,6 @@
|
||||
|
||||
- KG 이니시스 플러그인 설정 화면의 간편결제 토글은 이커머스 주문설정으로 통합 — 일반 결제수단과 동일한 인터페이스에서 활성화/정렬/최소 주문금액을 관리할 수 있습니다.
|
||||
|
||||
|
||||
### Added
|
||||
|
||||
- 일본 결제(CBT) 설정에 JPPG 결제창 표시용 가맹점명/문의처 입력 항목을 추가했습니다.
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -12,6 +12,7 @@
|
||||
|
||||
### Fixed
|
||||
|
||||
- 빌드 산출물이 존재하지 않는 소스맵 파일을 참조해 브라우저 개발자 도구 사용 시 불필요한 404 요청이 발생하던 문제를 수정했습니다.
|
||||
- 이커머스 관리자 주문설정에서 다른 탭에 갔다 돌아오면 간편결제 항목의 브랜드 색상 배지가 사라지고 회색 기본 아이콘으로 남던 문제를 수정했습니다. 화면을 새로고침해야만 다시 표시됐습니다.
|
||||
- 관리자 주문 상세의 거래 조회에서 취소·환불 금액에 원화 단위가 고정 표기되던 문제를 수정했습니다. 이제 주문 시점 기준 통화로 표시됩니다.
|
||||
- 결제 취소 기록의 환불 금액 표기도 결제 통화를 따르도록 수정했습니다.
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -12,6 +12,7 @@
|
||||
|
||||
### Fixed
|
||||
|
||||
- 빌드 산출물이 존재하지 않는 소스맵 파일을 참조해 브라우저 개발자 도구 사용 시 불필요한 404 요청이 발생하던 문제를 수정했습니다.
|
||||
- 이커머스 관리자 주문설정에서 다른 탭에 갔다 돌아오면 간편결제 항목의 브랜드 색상 배지가 사라지고 회색 기본 아이콘으로 남던 문제를 수정했습니다. 화면을 새로고침해야만 다시 표시됐습니다.
|
||||
- 결제 취소 기록과 환불 금액 오류 안내에 원화 단위가 고정 표기되던 문제를 수정했습니다. 이제 실제 결제 통화로 표시됩니다.
|
||||
- 쇼핑몰 주소를 기본값이 아닌 값으로 바꾸거나 주소 없이 운영하는 상점에서, 결제를 마치거나 결제에 실패한 구매자가 존재하지 않는 페이지로 이동하던 문제를 수정했습니다. 이동 주소가 기본 주소로 고정돼 있었기 때문이며, 이제 상점 주소 설정을 따라갑니다. 이미 운영 중인 사이트도 업데이트 시 자동으로 반영되며, 이동 주소를 직접 입력해 두었다면 그 값은 그대로 유지됩니다. (#85 @hwaryeon1234 님께서 제보해주셨습니다.)
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -4,6 +4,12 @@
|
||||
형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며,
|
||||
[Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다.
|
||||
|
||||
## [1.0.2] - 2026-08-12
|
||||
|
||||
### Fixed
|
||||
|
||||
- 빌드 산출물이 존재하지 않는 소스맵 파일을 참조해 브라우저 개발자 도구 사용 시 불필요한 404 요청이 발생하던 문제를 수정했습니다.
|
||||
|
||||
## [1.0.1] - 2026-08-11
|
||||
|
||||
### Fixed
|
||||
@@ -51,7 +57,6 @@
|
||||
|
||||
### Fixed
|
||||
|
||||
|
||||
- 쇼핑몰 주소를 기본값이 아닌 값으로 바꾸거나 주소 없이 운영하는 상점에서, 결제를 마치거나 결제에 실패한 구매자가 존재하지 않는 페이지로 이동하던 문제를 수정했습니다. 이동 주소가 기본 주소로 고정돼 있었기 때문이며, 이제 상점 주소 설정을 따라갑니다. 이미 운영 중인 사이트도 업데이트 시 자동으로 반영되며, 이동 주소를 직접 입력해 두었다면 그 값은 그대로 유지됩니다. (#85 @hwaryeon1234 님께서 제보해주셨습니다.)
|
||||
- 전액 환불이 부분취소로 잘못 요청되던 문제를 수정했습니다. 이미 부분취소한 이력이 있는 주문의 잔액 취소도 정확한 금액으로 처리됩니다.
|
||||
- 면세 상품이 포함된 주문을 환불할 때 면세 금액이 함께 전달되지 않아 부가세가 잘못 계산되던 문제를 수정했습니다.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"identifier": "sirsoft-tosspayments",
|
||||
"version": "1.0.0",
|
||||
"version": "1.0.1",
|
||||
"components": {
|
||||
"basic": [],
|
||||
"composite": [],
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "plugins/sirsoft-tosspayments",
|
||||
"description": "TossPayments PG Plugin for G7 platform",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.2",
|
||||
"type": "library",
|
||||
"authors": [
|
||||
{
|
||||
|
||||
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@g7/sirsoft-tosspayments",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.2",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@g7/sirsoft-tosspayments",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.2",
|
||||
"devDependencies": {
|
||||
"jsdom": "^27.4.0",
|
||||
"typescript": "^5.3.3",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@g7/sirsoft-tosspayments",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.2",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"ko": "토스페이먼츠",
|
||||
"en": "TossPayments"
|
||||
},
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.2",
|
||||
"license": "MIT",
|
||||
"description": {
|
||||
"ko": "토스페이먼츠 결제 게이트웨이 (통합결제창 연동)",
|
||||
|
||||
@@ -4,6 +4,12 @@ All notable changes to this plugin will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||
|
||||
## [1.0.3] - 2026-08-12
|
||||
|
||||
### Fixed
|
||||
|
||||
- 빌드 산출물이 존재하지 않는 소스맵 파일을 참조해 브라우저 개발자 도구 사용 시 불필요한 404 요청이 발생하던 문제를 수정했습니다.
|
||||
|
||||
## [1.0.2] - 2026-08-10
|
||||
|
||||
### Changed
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "plugins/sirsoft-verification_kginicis",
|
||||
"description": "KG Inicis Identity Verification provider for G7",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.3",
|
||||
"type": "library",
|
||||
"authors": [
|
||||
{
|
||||
|
||||
@@ -1,2 +1 @@
|
||||
var SirsoftVerificationKginicis=(function(o){"use strict";const s="sirsoft-verification_kginicis",D="inicis",C="width=400,height=640,scrollbars=yes,resizable=yes",L="https://sa.inicis.com/auth",I="identity-challenge-modal",l={info:(...e)=>console.info(`[${s}]`,...e),warn:(...e)=>console.warn(`[${s}]`,...e),error:(...e)=>console.error(`[${s}]`,...e)};function a(){return window.G7Core??null}function v(){return`${window.location.origin}/plugins/${s}/plugin/inicis/callback`}function P(e,i){const t=document.createElement("form");t.setAttribute("name","saForm"),t.setAttribute("method","POST"),t.setAttribute("action",L),t.setAttribute("target",i),t.setAttribute("accept-charset","UTF-8"),t.style.display="none";const f={mid:e.mid,reqSvcCd:e.reqSvcCd,mTxId:e.mtxid,authHash:e.authHash,flgFixedUser:e.flgFixedUser,successUrl:v(),failUrl:v(),reservedMsg:e.reservedMsg};for(const[d,c]of Object.entries(f)){const r=document.createElement("input");r.type="hidden",r.name=d,r.value=c,t.appendChild(r)}document.body.appendChild(t),t.submit(),window.setTimeout(()=>{try{t.remove()}catch{}},0)}function _(e){const t=a()?.state?.set;typeof t=="function"&&t({identityChallenge:{providerInProgress:e}})}const S={NOT_ADULT:"$t:sirsoft-verification_kginicis.errors.not_adult",INVALID_AUTH_URL:"$t:sirsoft-verification_kginicis.errors.invalid_auth_url",DECRYPT_FAILED:"$t:sirsoft-verification_kginicis.errors.decrypt_failed",REMOTE_CALL_FAILED:"$t:sirsoft-verification_kginicis.errors.remote_call_failed",NOT_FOUND:"$t:sirsoft-verification_kginicis.errors.not_found",ALREADY_CONSUMED:"$t:sirsoft-verification_kginicis.errors.already_consumed",IDENTITY_BINDING_MISMATCH:"$t:sirsoft-verification_kginicis.errors.binding_mismatch",INCOMPLETE_IDENTITY:"$t:sirsoft-verification_kginicis.errors.incomplete_identity",STORAGE_FAILED:"$t:sirsoft-verification_kginicis.errors.storage_failed"},T="$t:sirsoft-verification_kginicis.errors.verify_failed",U=new Set(["NOT_ADULT"]);function O(e){return S[e]??T}function b(){const e=a()?.identity?.markDomainNoticeShown;if(typeof e=="function")try{e()}catch{}}async function g(e,i="error"){const t=a()?.dispatch;if(typeof t=="function")try{await t({handler:"toast",params:{type:i,message:e}})}catch{}}function N(e){const i=a()?.dispatch;return typeof i!="function"?Promise.resolve():i({handler:"sequence",params:{actions:[{handler:"resolveIdentityChallenge",params:e},{handler:"closeModal",target:I}]}}).catch(()=>{})}async function h(){const e=a(),i=e?.state?.getGlobal?.()?.identityChallenge??e?.state?.get?.()?.identityChallenge;if(!i){l.error("_global.identityChallenge 미설정 — 코어 모달 진입 흐름 확인 필요");return}const t=i.public_payload;if(!t?.mid||!t?.mtxid||!t?.authHash){l.error("public_payload 의 mid/mtxid/authHash 부재 — Provider.requestChallenge 응답 확인 필요",t),await g("본인인증 페이로드가 준비되지 않았습니다. 잠시 후 다시 시도해 주세요.");return}const f="sa_popup",d=window.open("",f,C);if(!d){l.error("window.open null — 팝업 차단됨"),await g("팝업이 차단되었습니다. 브라우저 팝업 허용 설정 후 다시 시도해 주세요.");return}_(!0),P(t,f);let c=!1,r=null,u=null;const p=()=>{u&&(window.removeEventListener("message",u),u=null),r!==null&&(window.clearInterval(r),r=null)};u=A=>{if(A.origin!==window.location.origin)return;const n=A.data;if(!n||n.type!=="identity_result"||c)return;c=!0,p();try{d.close()}catch{}_(!1);const R=n.verification_token?{result:"verified",token:n.verification_token}:n.identity_error?{result:"failed",failureCode:n.identity_error}:{result:"cancelled"};n.identity_error&&(U.has(n.identity_error)&&b(),g(O(n.identity_error),"error")),N(R)},window.addEventListener("message",u),r=window.setInterval(()=>{if(c){p();return}d.closed&&(c=!0,p(),_(!1))},500)}function y(){const i=a()?.getActionDispatcher;if(typeof i!="function")return!1;const t=i();return!t||typeof t.registerHandler!="function"?!1:(t.registerHandler(`${s}.startAuth`,h,{category:"plugin",source:s}),l.info("startAuth handler registered"),!0)}function E(){if(y())return;let e=0;const i=window.setInterval(()=>{e++,(y()||e>=50)&&(window.clearInterval(i),e>=50&&l.warn("G7Core ActionDispatcher 미준비 — handler 등록 실패"))},100)}function w(){E()}function m(){E()}return m(),window.__SirsoftVerificationKginicis={identifier:s,init:m,initPlugin:w,startAuthHandler:h},o.MODAL_ID=I,o.PLUGIN_IDENTIFIER=s,o.PROVIDER_ID=D,o.init=m,o.initPlugin=w,o.startAuthHandler=h,Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}),o})({});
|
||||
//# sourceMappingURL=plugin.iife.js.map
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@g7/sirsoft-verification_kginicis",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.3",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@g7/sirsoft-verification_kginicis",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.3",
|
||||
"devDependencies": {
|
||||
"jsdom": "^27.4.0",
|
||||
"typescript": "^5.3.3",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@g7/sirsoft-verification_kginicis",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.3",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"ko": "KG이니시스 본인인증",
|
||||
"en": "KG Inicis Identity Verification"
|
||||
},
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.3",
|
||||
"license": "MIT",
|
||||
"description": {
|
||||
"ko": "KG이니시스 통합인증의 본인확인(reqSvcCd=03)을 G7 코어 IDV 인프라에 Provider 로 등록하는 플러그인",
|
||||
|
||||
@@ -4,6 +4,12 @@ All notable changes to this plugin will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||
|
||||
## [1.0.1] - 2026-08-12
|
||||
|
||||
### Fixed
|
||||
|
||||
- 빌드 산출물이 존재하지 않는 소스맵 파일을 참조해 브라우저 개발자 도구 사용 시 불필요한 404 요청이 발생하던 문제를 수정했습니다.
|
||||
|
||||
## [1.0.0] - 2026-08-10
|
||||
|
||||
### Added
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "plugins/sirsoft-verification_nhnkcp",
|
||||
"description": "NHN KCP mobile identity verification provider for G7",
|
||||
"version": "1.0.0",
|
||||
"version": "1.0.1",
|
||||
"type": "library",
|
||||
"authors": [
|
||||
{
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@g7/sirsoft-verification_nhnkcp",
|
||||
"version": "1.0.0",
|
||||
"version": "1.0.1",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@g7/sirsoft-verification_nhnkcp",
|
||||
"version": "1.0.0",
|
||||
"version": "1.0.1",
|
||||
"devDependencies": {
|
||||
"jsdom": "^27.4.0",
|
||||
"typescript": "^5.3.3",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@g7/sirsoft-verification_nhnkcp",
|
||||
"version": "1.0.0",
|
||||
"version": "1.0.1",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"ko": "NHN KCP 휴대폰 본인확인",
|
||||
"en": "NHN KCP Mobile Identity Verification"
|
||||
},
|
||||
"version": "1.0.0",
|
||||
"version": "1.0.1",
|
||||
"license": "MIT",
|
||||
"description": {
|
||||
"ko": "NHN KCP 휴대폰 본인확인(V2 REST)을 G7 코어 IDV 인프라에 Provider 로 등록하는 플러그인",
|
||||
|
||||
Vendored
-1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
@@ -4,6 +4,13 @@
|
||||
형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며,
|
||||
[Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다.
|
||||
|
||||
## [1.0.5] - 2026-08-12
|
||||
|
||||
### Fixed
|
||||
|
||||
- 표 하단 합계 영역의 값이 계산되지 않고 표현식 원문 그대로 표시되던 문제를 다시 수정했습니다. 1.0.4 에 수록 예정이던 수정이 빌드 산출물에 반영되지 않은 채 배포되어, 주문 상세의 합계 행에서 수량·적립금·배송비 자리에 값 대신 알 수 없는 문자열이 보였습니다. (#98 @hwaryeon1234 님께서 제보해주셨습니다.)
|
||||
- 빌드 산출물이 존재하지 않는 소스맵 파일을 참조해 브라우저 개발자 도구 사용 시 불필요한 404 요청이 발생하던 문제를 수정했습니다.
|
||||
|
||||
## [1.0.4] - 2026-08-10
|
||||
|
||||
### Added
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "sirsoft-admin_basic",
|
||||
"version": "1.0.4",
|
||||
"version": "1.0.5",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "sirsoft-admin_basic",
|
||||
"version": "1.0.4",
|
||||
"version": "1.0.5",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@dnd-kit/core": "^6.3.1",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "sirsoft-admin_basic",
|
||||
"version": "1.0.4",
|
||||
"version": "1.0.5",
|
||||
"description": "Gnuboard7 Basic Admin Template Components",
|
||||
"type": "module",
|
||||
"main": "dist/components.js",
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// audit:allow extension-dist-source-literal-sync 타입/미소비 상수 중심 모듈 — 타입 소거·tree-shake 로 일부 리터럴이 번들에 남지 않는다 (fresh 빌드로 실측 — stale 아님)
|
||||
/**
|
||||
* Font Awesome 아이콘 스타일
|
||||
*/
|
||||
|
||||
+2
@@ -1219,6 +1219,8 @@ describe('DataGrid', () => {
|
||||
* `renderCellChildren` 으로 넘기고 `cell.text` 는 원문 그대로 출력해 왔다.
|
||||
* 그 결과 `{{order.data?.total_quantity ?? 0}}개` 같은 값이 화면에 **원본 문자열로 노출**된다.
|
||||
* (브라우저 실측: `/admin/ecommerce/orders/:orderNumber` 합계 행 3셀)
|
||||
*
|
||||
* @effects datagrid_footer_cell_text_binding_resolved
|
||||
*/
|
||||
describe('푸터 행 text 바인딩 해석', () => {
|
||||
const footerColumns: DataGridColumn[] = [
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// audit:allow extension-dist-source-literal-sync 미등록(components.json 부재)·미참조 컴포넌트 — 배럴(modals/index.ts)만 재수출할 뿐 소비처가 없어 tree-shake 된다
|
||||
import React, { useEffect, useRef } from 'react';
|
||||
import { Div } from '../basic/Div';
|
||||
import { Button } from '../basic/Button';
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"ko": "Admin Basic",
|
||||
"en": "Admin Basic"
|
||||
},
|
||||
"version": "1.0.4",
|
||||
"version": "1.0.5",
|
||||
"license": "MIT",
|
||||
"description": {
|
||||
"ko": "그누보드7 기본 관리자 템플릿",
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
- 장바구니 옵션변경 모달의 재고 안내와 마이페이지 프로필의 입력 오류 메시지가, 표시할 값이 아직 준비되지 않은 순간에도 빈칸으로 남지 않도록 보완했습니다. 값이 준비된 뒤의 표시는 종전과 동일합니다.
|
||||
- 마이페이지 게시판 알림 수신 설정(댓글·답글 등 4개 항목)의 체크 상태가 저장값과 어긋날 수 있던 가능성을 차단했습니다. 저장된 값이 어떤 형태든 화면의 체크 표시와 저장 결과가 항상 일치합니다.
|
||||
- 장바구니 "전체 선택" 체크박스가 다크 모드에서 테두리 색을 따르지 않던 문제를 수정했습니다.
|
||||
- 빌드 산출물이 존재하지 않는 소스맵 파일을 참조해 브라우저 개발자 도구 사용 시 불필요한 404 요청이 발생하던 문제를 수정했습니다.
|
||||
|
||||
## [1.1.0] - 2026-08-10
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
+13
-15
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user