@nokecy/qc-ui 1.0.66 → 1.0.68
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/cjs/ag-grid-plus/hooks/useGridPlusColumnState.d.ts +12 -0
- package/dist/cjs/ag-grid-plus/hooks/useGridPlusColumnState.js +15 -0
- package/dist/cjs/ag-grid-plus/index.d.ts +2 -9
- package/dist/cjs/ag-grid-plus/index.js +8 -6
- package/dist/cjs/ag-grid-plus/setting/index.js +2 -2
- package/dist/cjs/array-table/columnHelper.d.ts +126 -0
- package/dist/cjs/array-table/columnHelper.js +241 -0
- package/dist/cjs/array-table/hooks.d.ts +23 -0
- package/dist/cjs/array-table/hooks.js +230 -0
- package/dist/cjs/array-table/index.js +141 -208
- package/dist/cjs/components/RegexEditor/core/RegexEditor.d.ts +34 -0
- package/dist/cjs/components/RegexEditor/core/RegexEditor.js +223 -0
- package/dist/cjs/components/RegexEditor/core/RegexEditor.less +119 -0
- package/dist/cjs/components/RegexEditor/core/extensions/errorMarker.d.ts +49 -0
- package/dist/cjs/components/RegexEditor/core/extensions/errorMarker.js +158 -0
- package/dist/cjs/components/RegexEditor/core/types.d.ts +79 -0
- package/dist/cjs/components/RegexEditor/core/types.js +5 -0
- package/dist/cjs/components/RegexEditor/hooks/index.d.ts +9 -0
- package/dist/cjs/components/RegexEditor/hooks/index.js +19 -0
- package/dist/cjs/components/RegexEditor/hooks/useRegexTester.d.ts +95 -0
- package/dist/cjs/components/RegexEditor/hooks/useRegexTester.js +234 -0
- package/dist/cjs/components/RegexEditor/hooks/useRegexValidation.d.ts +71 -0
- package/dist/cjs/components/RegexEditor/hooks/useRegexValidation.js +215 -0
- package/dist/cjs/components/RegexEditor/hooks/useTemplateManager.d.ts +64 -0
- package/dist/cjs/components/RegexEditor/hooks/useTemplateManager.js +438 -0
- package/dist/cjs/components/RegexEditor/index.d.ts +16 -0
- package/dist/cjs/components/RegexEditor/index.js +232 -0
- package/dist/cjs/components/RegexEditor/templates/TemplateSelector.d.ts +36 -0
- package/dist/cjs/components/RegexEditor/templates/TemplateSelector.js +322 -0
- package/dist/cjs/components/RegexEditor/templates/builtinTemplates.d.ts +36 -0
- package/dist/cjs/components/RegexEditor/templates/builtinTemplates.js +340 -0
- package/dist/cjs/components/RegexEditor/templates/index.d.ts +10 -0
- package/dist/cjs/components/RegexEditor/templates/index.js +184 -0
- package/dist/cjs/components/RegexEditor/templates/storage.d.ts +74 -0
- package/dist/cjs/components/RegexEditor/templates/storage.js +337 -0
- package/dist/cjs/components/RegexEditor/templates/templateManager.d.ts +67 -0
- package/dist/cjs/components/RegexEditor/templates/templateManager.js +277 -0
- package/dist/cjs/components/RegexEditor/templates/types.d.ts +111 -0
- package/dist/cjs/components/RegexEditor/templates/types.js +94 -0
- package/dist/cjs/components/RegexEditor/testing/types.d.ts +55 -0
- package/dist/cjs/components/RegexEditor/testing/types.js +5 -0
- package/dist/cjs/components/RegexEditor/validation/complexity.d.ts +22 -0
- package/dist/cjs/components/RegexEditor/validation/complexity.js +196 -0
- package/dist/cjs/components/RegexEditor/validation/parser.d.ts +53 -0
- package/dist/cjs/components/RegexEditor/validation/parser.js +129 -0
- package/dist/cjs/components/RegexEditor/validation/types.d.ts +146 -0
- package/dist/cjs/components/RegexEditor/validation/types.js +5 -0
- package/dist/cjs/components/RegexEditor/validation/validator.d.ts +60 -0
- package/dist/cjs/components/RegexEditor/validation/validator.js +218 -0
- package/dist/cjs/components/RegexEditor/visualizer/FlagsSelector.d.ts +20 -0
- package/dist/cjs/components/RegexEditor/visualizer/FlagsSelector.js +98 -0
- package/dist/cjs/components/RegexEditor/visualizer/MatchItem.d.ts +25 -0
- package/dist/cjs/components/RegexEditor/visualizer/MatchItem.js +201 -0
- package/dist/cjs/components/RegexEditor/visualizer/RegexRailroadDiagram.d.ts +32 -0
- package/dist/cjs/components/RegexEditor/visualizer/RegexRailroadDiagram.js +192 -0
- package/dist/cjs/components/RegexEditor/visualizer/RegexTester.d.ts +22 -0
- package/dist/cjs/components/RegexEditor/visualizer/RegexTester.js +255 -0
- package/dist/cjs/components/RegexEditor/visualizer/astToRailroad.d.ts +19 -0
- package/dist/cjs/components/RegexEditor/visualizer/astToRailroad.js +155 -0
- package/dist/cjs/components/RegexEditor/visualizer/index.d.ts +12 -0
- package/dist/cjs/components/RegexEditor/visualizer/index.js +76 -0
- package/dist/cjs/components/RegexEditor/visualizer/types.d.ts +131 -0
- package/dist/cjs/components/RegexEditor/visualizer/types.js +5 -0
- package/dist/cjs/components/RegexEditor/visualizer/utils.d.ts +106 -0
- package/dist/cjs/components/RegexEditor/visualizer/utils.js +268 -0
- package/dist/cjs/index.d.ts +6 -2
- package/dist/cjs/index.js +68 -0
- package/dist/cjs/standardFormDialog/useStandardFormSchema.d.ts +1 -1
- package/dist/cjs/standardFormDialog/withStandardForm.d.ts +2 -2
- package/dist/cjs/types/railroad-diagrams.d.ts +59 -0
- package/dist/cjs/types/regexp-tree.d.ts +175 -0
- package/dist/esm/ag-grid-plus/hooks/useGridPlusColumnState.d.ts +12 -0
- package/dist/esm/ag-grid-plus/hooks/useGridPlusColumnState.js +10 -0
- package/dist/esm/ag-grid-plus/index.d.ts +2 -9
- package/dist/esm/ag-grid-plus/index.js +2 -5
- package/dist/esm/ag-grid-plus/setting/index.js +1 -1
- package/dist/esm/array-table/columnHelper.d.ts +126 -0
- package/dist/esm/array-table/columnHelper.js +235 -0
- package/dist/esm/array-table/hooks.d.ts +23 -0
- package/dist/esm/array-table/hooks.js +224 -0
- package/dist/esm/array-table/index.js +142 -209
- package/dist/esm/components/RegexEditor/core/RegexEditor.d.ts +34 -0
- package/dist/esm/components/RegexEditor/core/RegexEditor.js +214 -0
- package/dist/esm/components/RegexEditor/core/RegexEditor.less +119 -0
- package/dist/esm/components/RegexEditor/core/extensions/errorMarker.d.ts +49 -0
- package/dist/esm/components/RegexEditor/core/extensions/errorMarker.js +154 -0
- package/dist/esm/components/RegexEditor/core/types.d.ts +79 -0
- package/dist/esm/components/RegexEditor/core/types.js +1 -0
- package/dist/esm/components/RegexEditor/hooks/index.d.ts +9 -0
- package/dist/esm/components/RegexEditor/hooks/index.js +8 -0
- package/dist/esm/components/RegexEditor/hooks/useRegexTester.d.ts +95 -0
- package/dist/esm/components/RegexEditor/hooks/useRegexTester.js +230 -0
- package/dist/esm/components/RegexEditor/hooks/useRegexValidation.d.ts +71 -0
- package/dist/esm/components/RegexEditor/hooks/useRegexValidation.js +211 -0
- package/dist/esm/components/RegexEditor/hooks/useTemplateManager.d.ts +64 -0
- package/dist/esm/components/RegexEditor/hooks/useTemplateManager.js +430 -0
- package/dist/esm/components/RegexEditor/index.d.ts +16 -0
- package/dist/esm/components/RegexEditor/index.js +27 -0
- package/dist/esm/components/RegexEditor/templates/TemplateSelector.d.ts +36 -0
- package/dist/esm/components/RegexEditor/templates/TemplateSelector.js +316 -0
- package/dist/esm/components/RegexEditor/templates/builtinTemplates.d.ts +36 -0
- package/dist/esm/components/RegexEditor/templates/builtinTemplates.js +335 -0
- package/dist/esm/components/RegexEditor/templates/index.d.ts +10 -0
- package/dist/esm/components/RegexEditor/templates/index.js +19 -0
- package/dist/esm/components/RegexEditor/templates/storage.d.ts +74 -0
- package/dist/esm/components/RegexEditor/templates/storage.js +335 -0
- package/dist/esm/components/RegexEditor/templates/templateManager.d.ts +67 -0
- package/dist/esm/components/RegexEditor/templates/templateManager.js +274 -0
- package/dist/esm/components/RegexEditor/templates/types.d.ts +111 -0
- package/dist/esm/components/RegexEditor/templates/types.js +90 -0
- package/dist/esm/components/RegexEditor/testing/types.d.ts +55 -0
- package/dist/esm/components/RegexEditor/testing/types.js +1 -0
- package/dist/esm/components/RegexEditor/validation/complexity.d.ts +22 -0
- package/dist/esm/components/RegexEditor/validation/complexity.js +190 -0
- package/dist/esm/components/RegexEditor/validation/parser.d.ts +53 -0
- package/dist/esm/components/RegexEditor/validation/parser.js +123 -0
- package/dist/esm/components/RegexEditor/validation/types.d.ts +145 -0
- package/dist/esm/components/RegexEditor/validation/types.js +1 -0
- package/dist/esm/components/RegexEditor/validation/validator.d.ts +60 -0
- package/dist/esm/components/RegexEditor/validation/validator.js +213 -0
- package/dist/esm/components/RegexEditor/visualizer/FlagsSelector.d.ts +20 -0
- package/dist/esm/components/RegexEditor/visualizer/FlagsSelector.js +93 -0
- package/dist/esm/components/RegexEditor/visualizer/MatchItem.d.ts +25 -0
- package/dist/esm/components/RegexEditor/visualizer/MatchItem.js +194 -0
- package/dist/esm/components/RegexEditor/visualizer/RegexRailroadDiagram.d.ts +32 -0
- package/dist/esm/components/RegexEditor/visualizer/RegexRailroadDiagram.js +186 -0
- package/dist/esm/components/RegexEditor/visualizer/RegexTester.d.ts +22 -0
- package/dist/esm/components/RegexEditor/visualizer/RegexTester.js +248 -0
- package/dist/esm/components/RegexEditor/visualizer/astToRailroad.d.ts +18 -0
- package/dist/esm/components/RegexEditor/visualizer/astToRailroad.js +150 -0
- package/dist/esm/components/RegexEditor/visualizer/index.d.ts +12 -0
- package/dist/esm/components/RegexEditor/visualizer/index.js +17 -0
- package/dist/esm/components/RegexEditor/visualizer/types.d.ts +131 -0
- package/dist/esm/components/RegexEditor/visualizer/types.js +1 -0
- package/dist/esm/components/RegexEditor/visualizer/utils.d.ts +106 -0
- package/dist/esm/components/RegexEditor/visualizer/utils.js +256 -0
- package/dist/esm/index.d.ts +6 -2
- package/dist/esm/index.js +7 -3
- package/dist/esm/types/railroad-diagrams.d.ts +59 -0
- package/dist/esm/types/regexp-tree.d.ts +175 -0
- package/dist/umd/qc-ui.min.css +1 -1
- package/dist/umd/qc-ui.min.js +1 -1
- package/package.json +23 -7
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.updateTemplateUsage = exports.saveCustomTemplate = exports.loadCustomTemplates = exports.isStorageAvailable = exports.importTemplates = exports.getStorageStats = exports.exportTemplates = exports.deleteCustomTemplate = exports.clearAllTemplates = exports.TemplateStorage = void 0;
|
|
7
|
+
var _types = require("./types");
|
|
8
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
9
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
10
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
11
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
12
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
13
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
14
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
15
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
16
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
17
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
18
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
19
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
20
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
21
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
22
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /**
|
|
23
|
+
* 自定义模板存储模块
|
|
24
|
+
* 使用 LocalStorage 持久化存储用户自定义的正则表达式模板
|
|
25
|
+
*/
|
|
26
|
+
var STORAGE_KEY = 'regex_editor_custom_templates';
|
|
27
|
+
var STORAGE_VERSION = '1.0';
|
|
28
|
+
/**
|
|
29
|
+
* 模板存储工具类
|
|
30
|
+
*/
|
|
31
|
+
var TemplateStorage = exports.TemplateStorage = /*#__PURE__*/function () {
|
|
32
|
+
function TemplateStorage() {
|
|
33
|
+
_classCallCheck(this, TemplateStorage);
|
|
34
|
+
}
|
|
35
|
+
_createClass(TemplateStorage, null, [{
|
|
36
|
+
key: "loadCustomTemplates",
|
|
37
|
+
value:
|
|
38
|
+
/**
|
|
39
|
+
* 加载所有自定义模板
|
|
40
|
+
*/
|
|
41
|
+
function loadCustomTemplates() {
|
|
42
|
+
try {
|
|
43
|
+
var data = localStorage.getItem(STORAGE_KEY);
|
|
44
|
+
if (!data) {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
var parsed = JSON.parse(data);
|
|
48
|
+
|
|
49
|
+
// 版本检查
|
|
50
|
+
if (parsed.version !== STORAGE_VERSION) {
|
|
51
|
+
console.warn('模板存储版本不匹配,将清空旧数据');
|
|
52
|
+
this.clearAllTemplates();
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// 恢复 Date 对象
|
|
57
|
+
return parsed.templates.map(function (t) {
|
|
58
|
+
return _objectSpread(_objectSpread({}, t), {}, {
|
|
59
|
+
lastUsed: t.lastUsed ? new Date(t.lastUsed) : undefined,
|
|
60
|
+
isCustom: true // 确保标记为自定义模板
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.error('加载自定义模板失败:', error);
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 保存自定义模板
|
|
71
|
+
*/
|
|
72
|
+
}, {
|
|
73
|
+
key: "saveCustomTemplate",
|
|
74
|
+
value: function saveCustomTemplate(template) {
|
|
75
|
+
try {
|
|
76
|
+
var templates = this.loadCustomTemplates();
|
|
77
|
+
|
|
78
|
+
// 检查是否已存在
|
|
79
|
+
var existingIndex = templates.findIndex(function (t) {
|
|
80
|
+
return t.id === template.id;
|
|
81
|
+
});
|
|
82
|
+
if (existingIndex >= 0) {
|
|
83
|
+
// 更新现有模板
|
|
84
|
+
templates[existingIndex] = _objectSpread(_objectSpread({}, template), {}, {
|
|
85
|
+
isCustom: true
|
|
86
|
+
});
|
|
87
|
+
} else {
|
|
88
|
+
// 添加新模板
|
|
89
|
+
templates.push(_objectSpread(_objectSpread({}, template), {}, {
|
|
90
|
+
isCustom: true,
|
|
91
|
+
category: template.category || _types.TemplateCategory.CUSTOM
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
this._persistTemplates(templates);
|
|
95
|
+
return true;
|
|
96
|
+
} catch (error) {
|
|
97
|
+
console.error('保存自定义模板失败:', error);
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* 更新模板使用统计
|
|
104
|
+
*/
|
|
105
|
+
}, {
|
|
106
|
+
key: "updateTemplateUsage",
|
|
107
|
+
value: function updateTemplateUsage(templateId) {
|
|
108
|
+
try {
|
|
109
|
+
var templates = this.loadCustomTemplates();
|
|
110
|
+
var template = templates.find(function (t) {
|
|
111
|
+
return t.id === templateId;
|
|
112
|
+
});
|
|
113
|
+
if (!template) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
template.useCount = (template.useCount || 0) + 1;
|
|
117
|
+
template.lastUsed = new Date();
|
|
118
|
+
this._persistTemplates(templates);
|
|
119
|
+
return true;
|
|
120
|
+
} catch (error) {
|
|
121
|
+
console.error('更新模板使用统计失败:', error);
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* 删除自定义模板
|
|
128
|
+
*/
|
|
129
|
+
}, {
|
|
130
|
+
key: "deleteCustomTemplate",
|
|
131
|
+
value: function deleteCustomTemplate(templateId) {
|
|
132
|
+
try {
|
|
133
|
+
var templates = this.loadCustomTemplates();
|
|
134
|
+
var filteredTemplates = templates.filter(function (t) {
|
|
135
|
+
return t.id !== templateId;
|
|
136
|
+
});
|
|
137
|
+
if (filteredTemplates.length === templates.length) {
|
|
138
|
+
// 未找到要删除的模板
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
this._persistTemplates(filteredTemplates);
|
|
142
|
+
return true;
|
|
143
|
+
} catch (error) {
|
|
144
|
+
console.error('删除自定义模板失败:', error);
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* 批量删除自定义模板
|
|
151
|
+
*/
|
|
152
|
+
}, {
|
|
153
|
+
key: "deleteMultipleTemplates",
|
|
154
|
+
value: function deleteMultipleTemplates(templateIds) {
|
|
155
|
+
try {
|
|
156
|
+
var templates = this.loadCustomTemplates();
|
|
157
|
+
var idSet = new Set(templateIds);
|
|
158
|
+
var filteredTemplates = templates.filter(function (t) {
|
|
159
|
+
return !idSet.has(t.id);
|
|
160
|
+
});
|
|
161
|
+
this._persistTemplates(filteredTemplates);
|
|
162
|
+
return true;
|
|
163
|
+
} catch (error) {
|
|
164
|
+
console.error('批量删除自定义模板失败:', error);
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* 清空所有自定义模板
|
|
171
|
+
*/
|
|
172
|
+
}, {
|
|
173
|
+
key: "clearAllTemplates",
|
|
174
|
+
value: function clearAllTemplates() {
|
|
175
|
+
try {
|
|
176
|
+
localStorage.removeItem(STORAGE_KEY);
|
|
177
|
+
return true;
|
|
178
|
+
} catch (error) {
|
|
179
|
+
console.error('清空自定义模板失败:', error);
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* 导出所有自定义模板为 JSON
|
|
186
|
+
*/
|
|
187
|
+
}, {
|
|
188
|
+
key: "exportTemplates",
|
|
189
|
+
value: function exportTemplates() {
|
|
190
|
+
var templates = this.loadCustomTemplates();
|
|
191
|
+
var data = {
|
|
192
|
+
version: STORAGE_VERSION,
|
|
193
|
+
templates: templates,
|
|
194
|
+
lastModified: new Date().toISOString()
|
|
195
|
+
};
|
|
196
|
+
return JSON.stringify(data, null, 2);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* 从 JSON 导入自定义模板
|
|
201
|
+
*/
|
|
202
|
+
}, {
|
|
203
|
+
key: "importTemplates",
|
|
204
|
+
value: function importTemplates(jsonString) {
|
|
205
|
+
var merge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
206
|
+
try {
|
|
207
|
+
var data = JSON.parse(jsonString);
|
|
208
|
+
|
|
209
|
+
// 版本检查
|
|
210
|
+
if (data.version !== STORAGE_VERSION) {
|
|
211
|
+
throw new Error("\u4E0D\u652F\u6301\u7684\u6A21\u677F\u7248\u672C: ".concat(data.version));
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// 验证模板格式
|
|
215
|
+
if (!Array.isArray(data.templates)) {
|
|
216
|
+
throw new Error('无效的模板数据格式');
|
|
217
|
+
}
|
|
218
|
+
var templates = data.templates.map(function (t) {
|
|
219
|
+
return _objectSpread(_objectSpread({}, t), {}, {
|
|
220
|
+
isCustom: true,
|
|
221
|
+
lastUsed: t.lastUsed ? new Date(t.lastUsed) : undefined
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
if (merge) {
|
|
225
|
+
// 合并模式: 与现有模板合并
|
|
226
|
+
var existingTemplates = this.loadCustomTemplates();
|
|
227
|
+
var existingIds = new Set(existingTemplates.map(function (t) {
|
|
228
|
+
return t.id;
|
|
229
|
+
}));
|
|
230
|
+
|
|
231
|
+
// 过滤掉 ID 重复的模板
|
|
232
|
+
var newTemplates = templates.filter(function (t) {
|
|
233
|
+
return !existingIds.has(t.id);
|
|
234
|
+
});
|
|
235
|
+
templates = [].concat(_toConsumableArray(existingTemplates), _toConsumableArray(newTemplates));
|
|
236
|
+
}
|
|
237
|
+
this._persistTemplates(templates);
|
|
238
|
+
return true;
|
|
239
|
+
} catch (error) {
|
|
240
|
+
console.error('导入自定义模板失败:', error);
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* 获取存储统计信息
|
|
247
|
+
*/
|
|
248
|
+
}, {
|
|
249
|
+
key: "getStorageStats",
|
|
250
|
+
value: function getStorageStats() {
|
|
251
|
+
try {
|
|
252
|
+
var data = localStorage.getItem(STORAGE_KEY);
|
|
253
|
+
if (!data) {
|
|
254
|
+
return {
|
|
255
|
+
count: 0,
|
|
256
|
+
size: 0,
|
|
257
|
+
lastModified: null
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
var parsed = JSON.parse(data);
|
|
261
|
+
return {
|
|
262
|
+
count: parsed.templates.length,
|
|
263
|
+
size: new Blob([data]).size,
|
|
264
|
+
lastModified: parsed.lastModified
|
|
265
|
+
};
|
|
266
|
+
} catch (error) {
|
|
267
|
+
console.error('获取存储统计失败:', error);
|
|
268
|
+
return {
|
|
269
|
+
count: 0,
|
|
270
|
+
size: 0,
|
|
271
|
+
lastModified: null
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* 内部方法: 持久化模板数据到 LocalStorage
|
|
278
|
+
*/
|
|
279
|
+
}, {
|
|
280
|
+
key: "_persistTemplates",
|
|
281
|
+
value: function _persistTemplates(templates) {
|
|
282
|
+
var data = {
|
|
283
|
+
version: STORAGE_VERSION,
|
|
284
|
+
templates: templates,
|
|
285
|
+
lastModified: new Date().toISOString()
|
|
286
|
+
};
|
|
287
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(data));
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* 检查 LocalStorage 是否可用
|
|
292
|
+
*/
|
|
293
|
+
}, {
|
|
294
|
+
key: "isStorageAvailable",
|
|
295
|
+
value: function isStorageAvailable() {
|
|
296
|
+
try {
|
|
297
|
+
var testKey = '__test_storage__';
|
|
298
|
+
localStorage.setItem(testKey, 'test');
|
|
299
|
+
localStorage.removeItem(testKey);
|
|
300
|
+
return true;
|
|
301
|
+
} catch (error) {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}]);
|
|
306
|
+
return TemplateStorage;
|
|
307
|
+
}();
|
|
308
|
+
/**
|
|
309
|
+
* 便捷函数导出
|
|
310
|
+
*/
|
|
311
|
+
var loadCustomTemplates = exports.loadCustomTemplates = function loadCustomTemplates() {
|
|
312
|
+
return TemplateStorage.loadCustomTemplates();
|
|
313
|
+
};
|
|
314
|
+
var saveCustomTemplate = exports.saveCustomTemplate = function saveCustomTemplate(template) {
|
|
315
|
+
return TemplateStorage.saveCustomTemplate(template);
|
|
316
|
+
};
|
|
317
|
+
var deleteCustomTemplate = exports.deleteCustomTemplate = function deleteCustomTemplate(templateId) {
|
|
318
|
+
return TemplateStorage.deleteCustomTemplate(templateId);
|
|
319
|
+
};
|
|
320
|
+
var updateTemplateUsage = exports.updateTemplateUsage = function updateTemplateUsage(templateId) {
|
|
321
|
+
return TemplateStorage.updateTemplateUsage(templateId);
|
|
322
|
+
};
|
|
323
|
+
var clearAllTemplates = exports.clearAllTemplates = function clearAllTemplates() {
|
|
324
|
+
return TemplateStorage.clearAllTemplates();
|
|
325
|
+
};
|
|
326
|
+
var exportTemplates = exports.exportTemplates = function exportTemplates() {
|
|
327
|
+
return TemplateStorage.exportTemplates();
|
|
328
|
+
};
|
|
329
|
+
var importTemplates = exports.importTemplates = function importTemplates(jsonString, merge) {
|
|
330
|
+
return TemplateStorage.importTemplates(jsonString, merge);
|
|
331
|
+
};
|
|
332
|
+
var getStorageStats = exports.getStorageStats = function getStorageStats() {
|
|
333
|
+
return TemplateStorage.getStorageStats();
|
|
334
|
+
};
|
|
335
|
+
var isStorageAvailable = exports.isStorageAvailable = function isStorageAvailable() {
|
|
336
|
+
return TemplateStorage.isStorageAvailable();
|
|
337
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模板管理器
|
|
3
|
+
* 统一管理内置模板和自定义模板
|
|
4
|
+
*/
|
|
5
|
+
import type { RegexTemplate } from './types';
|
|
6
|
+
import { TemplateCategory } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* 获取所有模板(内置 + 自定义)
|
|
9
|
+
*/
|
|
10
|
+
export declare const getAllTemplates: () => RegexTemplate[];
|
|
11
|
+
/**
|
|
12
|
+
* 根据 ID 获取模板(优先查找自定义模板)
|
|
13
|
+
*/
|
|
14
|
+
export declare const getTemplateById: (id: string) => RegexTemplate | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* 根据分类获取模板
|
|
17
|
+
*/
|
|
18
|
+
export declare const getTemplatesByCategory: (category: TemplateCategory) => RegexTemplate[];
|
|
19
|
+
/**
|
|
20
|
+
* 搜索模板(支持关键词搜索)
|
|
21
|
+
*/
|
|
22
|
+
export declare const searchTemplates: (keyword: string) => RegexTemplate[];
|
|
23
|
+
/**
|
|
24
|
+
* 获取最常用的模板
|
|
25
|
+
*/
|
|
26
|
+
export declare const getMostUsedTemplates: (limit?: number) => RegexTemplate[];
|
|
27
|
+
/**
|
|
28
|
+
* 获取最近使用的模板
|
|
29
|
+
*/
|
|
30
|
+
export declare const getRecentlyUsedTemplates: (limit?: number) => RegexTemplate[];
|
|
31
|
+
/**
|
|
32
|
+
* 创建新的自定义模板
|
|
33
|
+
*/
|
|
34
|
+
export declare const createCustomTemplate: (template: Omit<RegexTemplate, 'id' | 'isCustom' | 'useCount' | 'lastUsed'>) => RegexTemplate;
|
|
35
|
+
/**
|
|
36
|
+
* 更新自定义模板
|
|
37
|
+
*/
|
|
38
|
+
export declare const updateCustomTemplate: (id: string, updates: Partial<Omit<RegexTemplate, 'id' | 'isCustom'>>) => boolean;
|
|
39
|
+
/**
|
|
40
|
+
* 删除自定义模板
|
|
41
|
+
*/
|
|
42
|
+
export declare const deleteCustomTemplate: (id: string) => boolean;
|
|
43
|
+
/**
|
|
44
|
+
* 复制模板(创建副本)
|
|
45
|
+
*/
|
|
46
|
+
export declare const duplicateTemplate: (id: string, newName?: string) => RegexTemplate | null;
|
|
47
|
+
/**
|
|
48
|
+
* 使用模板(更新使用统计)
|
|
49
|
+
*/
|
|
50
|
+
export declare const useTemplate: (id: string) => RegexTemplate | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* 获取模板统计信息
|
|
53
|
+
*/
|
|
54
|
+
export declare const getTemplateStats: () => {
|
|
55
|
+
total: number;
|
|
56
|
+
builtin: number;
|
|
57
|
+
custom: number;
|
|
58
|
+
byCategory: Record<TemplateCategory, number>;
|
|
59
|
+
byComplexity: Record<'simple' | 'medium' | 'complex', number>;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* 验证模板是否有效
|
|
63
|
+
*/
|
|
64
|
+
export declare const validateTemplate: (template: Partial<RegexTemplate>) => {
|
|
65
|
+
valid: boolean;
|
|
66
|
+
errors: string[];
|
|
67
|
+
};
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.validateTemplate = exports.useTemplate = exports.updateCustomTemplate = exports.searchTemplates = exports.getTemplatesByCategory = exports.getTemplateStats = exports.getTemplateById = exports.getRecentlyUsedTemplates = exports.getMostUsedTemplates = exports.getAllTemplates = exports.duplicateTemplate = exports.deleteCustomTemplate = exports.createCustomTemplate = void 0;
|
|
8
|
+
var _types = require("./types");
|
|
9
|
+
var _builtinTemplates = require("./builtinTemplates");
|
|
10
|
+
var _storage = require("./storage");
|
|
11
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
12
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
13
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
14
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
15
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
16
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
17
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
18
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
19
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
20
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
21
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } /**
|
|
22
|
+
* 模板管理器
|
|
23
|
+
* 统一管理内置模板和自定义模板
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* 获取所有模板(内置 + 自定义)
|
|
27
|
+
*/
|
|
28
|
+
var getAllTemplates = exports.getAllTemplates = function getAllTemplates() {
|
|
29
|
+
var builtinTemplates = (0, _builtinTemplates.getAllBuiltinTemplates)();
|
|
30
|
+
var customTemplates = _storage.TemplateStorage.loadCustomTemplates();
|
|
31
|
+
return [].concat(_toConsumableArray(builtinTemplates), _toConsumableArray(customTemplates));
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 根据 ID 获取模板(优先查找自定义模板)
|
|
36
|
+
*/
|
|
37
|
+
var getTemplateById = exports.getTemplateById = function getTemplateById(id) {
|
|
38
|
+
// 先查找自定义模板
|
|
39
|
+
var customTemplates = _storage.TemplateStorage.loadCustomTemplates();
|
|
40
|
+
var customTemplate = customTemplates.find(function (t) {
|
|
41
|
+
return t.id === id;
|
|
42
|
+
});
|
|
43
|
+
if (customTemplate) {
|
|
44
|
+
return customTemplate;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 再查找内置模板
|
|
48
|
+
return (0, _builtinTemplates.getTemplateById)(id);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 根据分类获取模板
|
|
53
|
+
*/
|
|
54
|
+
var getTemplatesByCategory = exports.getTemplatesByCategory = function getTemplatesByCategory(category) {
|
|
55
|
+
var allTemplates = getAllTemplates();
|
|
56
|
+
return allTemplates.filter(function (t) {
|
|
57
|
+
return t.category === category;
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 搜索模板(支持关键词搜索)
|
|
63
|
+
*/
|
|
64
|
+
var searchTemplates = exports.searchTemplates = function searchTemplates(keyword) {
|
|
65
|
+
if (!keyword.trim()) {
|
|
66
|
+
return getAllTemplates();
|
|
67
|
+
}
|
|
68
|
+
var allTemplates = getAllTemplates();
|
|
69
|
+
var lowerKeyword = keyword.toLowerCase();
|
|
70
|
+
return allTemplates.filter(function (t) {
|
|
71
|
+
return t.name.toLowerCase().includes(lowerKeyword) || t.description.toLowerCase().includes(lowerKeyword) || t.tags.some(function (tag) {
|
|
72
|
+
return tag.toLowerCase().includes(lowerKeyword);
|
|
73
|
+
}) || t.pattern.toLowerCase().includes(lowerKeyword);
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* 获取最常用的模板
|
|
79
|
+
*/
|
|
80
|
+
var getMostUsedTemplates = exports.getMostUsedTemplates = function getMostUsedTemplates() {
|
|
81
|
+
var limit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
|
|
82
|
+
var allTemplates = getAllTemplates();
|
|
83
|
+
return allTemplates.filter(function (t) {
|
|
84
|
+
return t.useCount && t.useCount > 0;
|
|
85
|
+
}).sort(function (a, b) {
|
|
86
|
+
return (b.useCount || 0) - (a.useCount || 0);
|
|
87
|
+
}).slice(0, limit);
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* 获取最近使用的模板
|
|
92
|
+
*/
|
|
93
|
+
var getRecentlyUsedTemplates = exports.getRecentlyUsedTemplates = function getRecentlyUsedTemplates() {
|
|
94
|
+
var limit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
|
|
95
|
+
var allTemplates = getAllTemplates();
|
|
96
|
+
return allTemplates.filter(function (t) {
|
|
97
|
+
return t.lastUsed;
|
|
98
|
+
}).sort(function (a, b) {
|
|
99
|
+
var _a$lastUsed, _b$lastUsed;
|
|
100
|
+
var timeA = ((_a$lastUsed = a.lastUsed) === null || _a$lastUsed === void 0 ? void 0 : _a$lastUsed.getTime()) || 0;
|
|
101
|
+
var timeB = ((_b$lastUsed = b.lastUsed) === null || _b$lastUsed === void 0 ? void 0 : _b$lastUsed.getTime()) || 0;
|
|
102
|
+
return timeB - timeA;
|
|
103
|
+
}).slice(0, limit);
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* 创建新的自定义模板
|
|
108
|
+
*/
|
|
109
|
+
var createCustomTemplate = exports.createCustomTemplate = function createCustomTemplate(template) {
|
|
110
|
+
var newTemplate = _objectSpread(_objectSpread({}, template), {}, {
|
|
111
|
+
id: "custom_".concat(Date.now(), "_").concat(Math.random().toString(36).substr(2, 9)),
|
|
112
|
+
category: template.category || _types.TemplateCategory.CUSTOM,
|
|
113
|
+
isCustom: true,
|
|
114
|
+
useCount: 0
|
|
115
|
+
});
|
|
116
|
+
_storage.TemplateStorage.saveCustomTemplate(newTemplate);
|
|
117
|
+
return newTemplate;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* 更新自定义模板
|
|
122
|
+
*/
|
|
123
|
+
var updateCustomTemplate = exports.updateCustomTemplate = function updateCustomTemplate(id, updates) {
|
|
124
|
+
var template = getTemplateById(id);
|
|
125
|
+
if (!template || !template.isCustom) {
|
|
126
|
+
console.error('只能更新自定义模板');
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
var updatedTemplate = _objectSpread(_objectSpread(_objectSpread({}, template), updates), {}, {
|
|
130
|
+
id: template.id,
|
|
131
|
+
// 保持 ID 不变
|
|
132
|
+
isCustom: true // 保持自定义标记
|
|
133
|
+
});
|
|
134
|
+
return _storage.TemplateStorage.saveCustomTemplate(updatedTemplate);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 删除自定义模板
|
|
139
|
+
*/
|
|
140
|
+
var deleteCustomTemplate = exports.deleteCustomTemplate = function deleteCustomTemplate(id) {
|
|
141
|
+
var template = getTemplateById(id);
|
|
142
|
+
if (!template || !template.isCustom) {
|
|
143
|
+
console.error('只能删除自定义模板');
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
return _storage.TemplateStorage.deleteCustomTemplate(id);
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* 复制模板(创建副本)
|
|
151
|
+
*/
|
|
152
|
+
var duplicateTemplate = exports.duplicateTemplate = function duplicateTemplate(id, newName) {
|
|
153
|
+
var template = getTemplateById(id);
|
|
154
|
+
if (!template) {
|
|
155
|
+
console.error('模板不存在');
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
var duplicated = {
|
|
159
|
+
name: newName || "".concat(template.name, " (\u526F\u672C)"),
|
|
160
|
+
pattern: template.pattern,
|
|
161
|
+
description: template.description,
|
|
162
|
+
category: template.category,
|
|
163
|
+
tags: _toConsumableArray(template.tags),
|
|
164
|
+
examples: {
|
|
165
|
+
valid: _toConsumableArray(template.examples.valid),
|
|
166
|
+
invalid: _toConsumableArray(template.examples.invalid)
|
|
167
|
+
},
|
|
168
|
+
complexity: template.complexity
|
|
169
|
+
};
|
|
170
|
+
return createCustomTemplate(duplicated);
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* 使用模板(更新使用统计)
|
|
175
|
+
*/
|
|
176
|
+
var useTemplate = exports.useTemplate = function useTemplate(id) {
|
|
177
|
+
var template = getTemplateById(id);
|
|
178
|
+
if (!template) {
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// 如果是自定义模板,更新使用统计
|
|
183
|
+
if (template.isCustom) {
|
|
184
|
+
_storage.TemplateStorage.updateTemplateUsage(id);
|
|
185
|
+
// 重新获取更新后的模板
|
|
186
|
+
return getTemplateById(id);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// 内置模板不更新统计,直接返回
|
|
190
|
+
return template;
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* 获取模板统计信息
|
|
195
|
+
*/
|
|
196
|
+
var getTemplateStats = exports.getTemplateStats = function getTemplateStats() {
|
|
197
|
+
var allTemplates = getAllTemplates();
|
|
198
|
+
var builtinCount = (0, _builtinTemplates.getAllBuiltinTemplates)().length;
|
|
199
|
+
var customCount = allTemplates.length - builtinCount;
|
|
200
|
+
var byCategory = {};
|
|
201
|
+
var byComplexity = {
|
|
202
|
+
simple: 0,
|
|
203
|
+
medium: 0,
|
|
204
|
+
complex: 0
|
|
205
|
+
};
|
|
206
|
+
allTemplates.forEach(function (t) {
|
|
207
|
+
// 按分类统计
|
|
208
|
+
byCategory[t.category] = (byCategory[t.category] || 0) + 1;
|
|
209
|
+
|
|
210
|
+
// 按复杂度统计
|
|
211
|
+
byComplexity[t.complexity] += 1;
|
|
212
|
+
});
|
|
213
|
+
return {
|
|
214
|
+
total: allTemplates.length,
|
|
215
|
+
builtin: builtinCount,
|
|
216
|
+
custom: customCount,
|
|
217
|
+
byCategory: byCategory,
|
|
218
|
+
byComplexity: byComplexity
|
|
219
|
+
};
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* 验证模板是否有效
|
|
224
|
+
*/
|
|
225
|
+
var validateTemplate = exports.validateTemplate = function validateTemplate(template) {
|
|
226
|
+
var _template$name, _template$pattern, _template$description;
|
|
227
|
+
var errors = [];
|
|
228
|
+
|
|
229
|
+
// 必填字段检查
|
|
230
|
+
if (!((_template$name = template.name) !== null && _template$name !== void 0 && _template$name.trim())) {
|
|
231
|
+
errors.push('模板名称不能为空');
|
|
232
|
+
}
|
|
233
|
+
if (!((_template$pattern = template.pattern) !== null && _template$pattern !== void 0 && _template$pattern.trim())) {
|
|
234
|
+
errors.push('正则表达式不能为空');
|
|
235
|
+
}
|
|
236
|
+
if (!((_template$description = template.description) !== null && _template$description !== void 0 && _template$description.trim())) {
|
|
237
|
+
errors.push('模板描述不能为空');
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// 正则表达式语法检查
|
|
241
|
+
if (template.pattern) {
|
|
242
|
+
try {
|
|
243
|
+
new RegExp(template.pattern);
|
|
244
|
+
} catch (e) {
|
|
245
|
+
errors.push("\u6B63\u5219\u8868\u8FBE\u5F0F\u8BED\u6CD5\u9519\u8BEF: ".concat(e instanceof Error ? e.message : '未知错误'));
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// 分类检查
|
|
250
|
+
if (template.category && !Object.values(_types.TemplateCategory).includes(template.category)) {
|
|
251
|
+
errors.push('无效的模板分类');
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// 标签检查
|
|
255
|
+
if (template.tags && !Array.isArray(template.tags)) {
|
|
256
|
+
errors.push('标签必须是数组');
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// 示例检查
|
|
260
|
+
if (template.examples) {
|
|
261
|
+
if (!Array.isArray(template.examples.valid)) {
|
|
262
|
+
errors.push('有效示例必须是数组');
|
|
263
|
+
}
|
|
264
|
+
if (!Array.isArray(template.examples.invalid)) {
|
|
265
|
+
errors.push('无效示例必须是数组');
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// 复杂度检查
|
|
270
|
+
if (template.complexity && !['simple', 'medium', 'complex'].includes(template.complexity)) {
|
|
271
|
+
errors.push('无效的复杂度级别');
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
valid: errors.length === 0,
|
|
275
|
+
errors: errors
|
|
276
|
+
};
|
|
277
|
+
};
|