@brix-sdk/platform-shared 1.0.0

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/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # @brix-sdk/platform-shared
2
+
3
+ > Shared utilities for Brix Platform capabilities
4
+
5
+ ## Overview
6
+
7
+ This package provides shared utilities, types, and helpers used across Brix Platform capability implementations.
8
+
9
+ ## Features
10
+
11
+ - Common utility functions
12
+ - Shared type definitions
13
+ - Error handling utilities
14
+ - Logging helpers
15
+ - Validation utilities
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ npm install @brix-sdk/platform-shared
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ ```typescript
26
+ import {
27
+ createLogger,
28
+ validateConfig,
29
+ formatError,
30
+ deepMerge
31
+ } from '@brix-sdk/platform-shared';
32
+
33
+ // Create a namespaced logger
34
+ const logger = createLogger('my-capability');
35
+ logger.info('Capability initialized');
36
+ logger.error('Something went wrong', error);
37
+
38
+ // Validate configuration
39
+ const config = validateConfig(userConfig, schema);
40
+
41
+ // Deep merge objects
42
+ const merged = deepMerge(defaults, overrides);
43
+ ```
44
+
45
+ ## Utilities
46
+
47
+ | Utility | Description |
48
+ |---------|-------------|
49
+ | `createLogger` | Namespaced logging with levels |
50
+ | `validateConfig` | JSON schema validation |
51
+ | `formatError` | Error formatting and serialization |
52
+ | `deepMerge` | Deep object merging |
53
+ | `debounce` | Function debouncing |
54
+ | `throttle` | Function throttling |
55
+
56
+ ## License
57
+
58
+ Apache-2.0
@@ -0,0 +1,24 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __esm = (fn, res) => function __init() {
6
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
7
+ };
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ export { __esm, __export, __toCommonJS };
23
+ //# sourceMappingURL=chunk-4CV4JOE5.js.map
24
+ //# sourceMappingURL=chunk-4CV4JOE5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-4CV4JOE5.js"}
@@ -0,0 +1,162 @@
1
+ // src/constants/platform.ts
2
+ var PLATFORM_VERSION = "3.0.0";
3
+ var CAPABILITY_PREFIX = "brix";
4
+ var DEFAULT_TIMEOUT = 3e4;
5
+ var DEFAULT_RETRY_COUNT = 3;
6
+ var DEFAULT_RETRY_DELAY = 1e3;
7
+ var MAX_EVENT_HISTORY = 100;
8
+ var STORAGE_KEY_PREFIX = "shinwa:";
9
+ var STORAGE_KEYS = {
10
+ /**
11
+ * Locale setting
12
+ */
13
+ LOCALE: `${STORAGE_KEY_PREFIX}locale`,
14
+ /**
15
+ * Theme setting
16
+ */
17
+ THEME: `${STORAGE_KEY_PREFIX}theme`,
18
+ /**
19
+ * User preferences
20
+ */
21
+ PREFERENCES: `${STORAGE_KEY_PREFIX}preferences`,
22
+ /**
23
+ * Authentication token
24
+ */
25
+ AUTH_TOKEN: `${STORAGE_KEY_PREFIX}auth:token`,
26
+ /**
27
+ * Refresh token
28
+ */
29
+ REFRESH_TOKEN: `${STORAGE_KEY_PREFIX}auth:refresh`
30
+ };
31
+ var HTTP_METHODS = {
32
+ GET: "GET",
33
+ POST: "POST",
34
+ PUT: "PUT",
35
+ PATCH: "PATCH",
36
+ DELETE: "DELETE",
37
+ HEAD: "HEAD",
38
+ OPTIONS: "OPTIONS"
39
+ };
40
+ var HTTP_STATUS = {
41
+ OK: 200,
42
+ CREATED: 201,
43
+ NO_CONTENT: 204,
44
+ BAD_REQUEST: 400,
45
+ UNAUTHORIZED: 401,
46
+ FORBIDDEN: 403,
47
+ NOT_FOUND: 404,
48
+ CONFLICT: 409,
49
+ UNPROCESSABLE_ENTITY: 422,
50
+ TOO_MANY_REQUESTS: 429,
51
+ INTERNAL_SERVER_ERROR: 500,
52
+ BAD_GATEWAY: 502,
53
+ SERVICE_UNAVAILABLE: 503
54
+ };
55
+
56
+ // src/constants/errors.ts
57
+ var COMMON_ERROR_CODES = {
58
+ /**
59
+ * Unknown error
60
+ */
61
+ UNKNOWN: "ERR_UNKNOWN",
62
+ /**
63
+ * Invalid parameters
64
+ */
65
+ INVALID_PARAMS: "ERR_INVALID_PARAMS",
66
+ /**
67
+ * Operation timeout
68
+ */
69
+ TIMEOUT: "ERR_TIMEOUT",
70
+ /**
71
+ * Network error
72
+ */
73
+ NETWORK: "ERR_NETWORK",
74
+ /**
75
+ * Operation cancelled
76
+ */
77
+ CANCELLED: "ERR_CANCELLED",
78
+ /**
79
+ * Resource not found
80
+ */
81
+ NOT_FOUND: "ERR_NOT_FOUND",
82
+ /**
83
+ * Resource already exists
84
+ */
85
+ ALREADY_EXISTS: "ERR_ALREADY_EXISTS"
86
+ };
87
+ var AUTH_ERROR_CODES = {
88
+ /**
89
+ * Not authenticated
90
+ */
91
+ UNAUTHENTICATED: "ERR_AUTH_UNAUTHENTICATED",
92
+ /**
93
+ * Unauthorized
94
+ */
95
+ UNAUTHORIZED: "ERR_AUTH_UNAUTHORIZED",
96
+ /**
97
+ * Invalid token
98
+ */
99
+ INVALID_TOKEN: "ERR_AUTH_INVALID_TOKEN",
100
+ /**
101
+ * Token expired
102
+ */
103
+ TOKEN_EXPIRED: "ERR_AUTH_TOKEN_EXPIRED",
104
+ /**
105
+ * Session expired
106
+ */
107
+ SESSION_EXPIRED: "ERR_AUTH_SESSION_EXPIRED",
108
+ /**
109
+ * Refresh token failed
110
+ */
111
+ REFRESH_FAILED: "ERR_AUTH_REFRESH_FAILED"
112
+ };
113
+ var NAVIGATION_ERROR_CODES = {
114
+ /**
115
+ * Page not found
116
+ */
117
+ PAGE_NOT_FOUND: "ERR_NAV_PAGE_NOT_FOUND",
118
+ /**
119
+ * Navigation blocked
120
+ */
121
+ NAVIGATION_BLOCKED: "ERR_NAV_BLOCKED",
122
+ /**
123
+ * Permission denied
124
+ */
125
+ PERMISSION_DENIED: "ERR_NAV_PERMISSION_DENIED",
126
+ /**
127
+ * Invalid page ID
128
+ */
129
+ INVALID_PAGE_ID: "ERR_NAV_INVALID_PAGE_ID"
130
+ };
131
+ var PLUGIN_ERROR_CODES = {
132
+ /**
133
+ * Plugin load failed
134
+ */
135
+ LOAD_FAILED: "ERR_PLUGIN_LOAD_FAILED",
136
+ /**
137
+ * Plugin initialization failed
138
+ */
139
+ INIT_FAILED: "ERR_PLUGIN_INIT_FAILED",
140
+ /**
141
+ * Plugin not found
142
+ */
143
+ NOT_FOUND: "ERR_PLUGIN_NOT_FOUND",
144
+ /**
145
+ * Plugin version incompatible
146
+ */
147
+ VERSION_MISMATCH: "ERR_PLUGIN_VERSION_MISMATCH",
148
+ /**
149
+ * Plugin dependency missing
150
+ */
151
+ MISSING_DEPENDENCY: "ERR_PLUGIN_MISSING_DEPENDENCY"
152
+ };
153
+ var ERROR_CODES = {
154
+ ...COMMON_ERROR_CODES,
155
+ ...AUTH_ERROR_CODES,
156
+ ...NAVIGATION_ERROR_CODES,
157
+ ...PLUGIN_ERROR_CODES
158
+ };
159
+
160
+ export { AUTH_ERROR_CODES, CAPABILITY_PREFIX, COMMON_ERROR_CODES, DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY, DEFAULT_TIMEOUT, ERROR_CODES, HTTP_METHODS, HTTP_STATUS, MAX_EVENT_HISTORY, NAVIGATION_ERROR_CODES, PLATFORM_VERSION, PLUGIN_ERROR_CODES, STORAGE_KEYS, STORAGE_KEY_PREFIX };
161
+ //# sourceMappingURL=chunk-5CQ3FANY.js.map
162
+ //# sourceMappingURL=chunk-5CQ3FANY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants/platform.ts","../src/constants/errors.ts"],"names":[],"mappings":"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","file":"chunk-5CQ3FANY.js","sourcesContent":["/**\r\n * Copyright 2026 Brix Platform Authors\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @file Platform constants definitions\r\n * @description Cross-platform shared platform constants\r\n * @module @brix/platform-shared/constants/platform\r\n * @version 3.0.0\r\n */\r\n\r\n/**\r\n * Platform version number\r\n */\r\nexport const PLATFORM_VERSION = '3.0.0';\r\n\r\n/**\r\n * Capability type prefix\r\n */\r\nexport const CAPABILITY_PREFIX = 'brix';\r\n\r\n/**\r\n * Default timeout in milliseconds\r\n */\r\nexport const DEFAULT_TIMEOUT = 30000;\r\n\r\n/**\r\n * Default retry count\r\n */\r\nexport const DEFAULT_RETRY_COUNT = 3;\r\n\r\n/**\r\n * Default retry delay in milliseconds\r\n */\r\nexport const DEFAULT_RETRY_DELAY = 1000;\r\n\r\n/**\r\n * Maximum event history record count\r\n */\r\nexport const MAX_EVENT_HISTORY = 100;\r\n\r\n/**\r\n * Storage key prefix\r\n */\r\nexport const STORAGE_KEY_PREFIX = 'shinwa:';\r\n\r\n/**\r\n * Storage keys\r\n */\r\nexport const STORAGE_KEYS = {\r\n /**\r\n * Locale setting\r\n */\r\n LOCALE: `${STORAGE_KEY_PREFIX}locale`,\r\n \r\n /**\r\n * Theme setting\r\n */\r\n THEME: `${STORAGE_KEY_PREFIX}theme`,\r\n \r\n /**\r\n * User preferences\r\n */\r\n PREFERENCES: `${STORAGE_KEY_PREFIX}preferences`,\r\n \r\n /**\r\n * Authentication token\r\n */\r\n AUTH_TOKEN: `${STORAGE_KEY_PREFIX}auth:token`,\r\n \r\n /**\r\n * Refresh token\r\n */\r\n REFRESH_TOKEN: `${STORAGE_KEY_PREFIX}auth:refresh`,\r\n} as const;\r\n\r\n/**\r\n * HTTP methods\r\n */\r\nexport const HTTP_METHODS = {\r\n GET: 'GET',\r\n POST: 'POST',\r\n PUT: 'PUT',\r\n PATCH: 'PATCH',\r\n DELETE: 'DELETE',\r\n HEAD: 'HEAD',\r\n OPTIONS: 'OPTIONS',\r\n} as const;\r\n\r\n/**\r\n * HTTP status codes\r\n */\r\nexport const HTTP_STATUS = {\r\n OK: 200,\r\n CREATED: 201,\r\n NO_CONTENT: 204,\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n CONFLICT: 409,\r\n UNPROCESSABLE_ENTITY: 422,\r\n TOO_MANY_REQUESTS: 429,\r\n INTERNAL_SERVER_ERROR: 500,\r\n BAD_GATEWAY: 502,\r\n SERVICE_UNAVAILABLE: 503,\r\n} as const;\r\n","/**\r\n * Copyright 2026 Brix Platform Authors\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @file Error code definitions\r\n * @description Cross-platform shared error code constants\r\n * @module @brix/platform-shared/constants/errors\r\n * @version 3.0.0\r\n */\r\n\r\n/**\r\n * Common error codes\r\n */\r\nexport const COMMON_ERROR_CODES = {\r\n /**\r\n * Unknown error\r\n */\r\n UNKNOWN: 'ERR_UNKNOWN',\r\n \r\n /**\r\n * Invalid parameters\r\n */\r\n INVALID_PARAMS: 'ERR_INVALID_PARAMS',\r\n \r\n /**\r\n * Operation timeout\r\n */\r\n TIMEOUT: 'ERR_TIMEOUT',\r\n \r\n /**\r\n * Network error\r\n */\r\n NETWORK: 'ERR_NETWORK',\r\n \r\n /**\r\n * Operation cancelled\r\n */\r\n CANCELLED: 'ERR_CANCELLED',\r\n \r\n /**\r\n * Resource not found\r\n */\r\n NOT_FOUND: 'ERR_NOT_FOUND',\r\n \r\n /**\r\n * Resource already exists\r\n */\r\n ALREADY_EXISTS: 'ERR_ALREADY_EXISTS',\r\n} as const;\r\n\r\n/**\r\n * Authentication error codes\r\n */\r\nexport const AUTH_ERROR_CODES = {\r\n /**\r\n * Not authenticated\r\n */\r\n UNAUTHENTICATED: 'ERR_AUTH_UNAUTHENTICATED',\r\n \r\n /**\r\n * Unauthorized\r\n */\r\n UNAUTHORIZED: 'ERR_AUTH_UNAUTHORIZED',\r\n \r\n /**\r\n * Invalid token\r\n */\r\n INVALID_TOKEN: 'ERR_AUTH_INVALID_TOKEN',\r\n \r\n /**\r\n * Token expired\r\n */\r\n TOKEN_EXPIRED: 'ERR_AUTH_TOKEN_EXPIRED',\r\n \r\n /**\r\n * Session expired\r\n */\r\n SESSION_EXPIRED: 'ERR_AUTH_SESSION_EXPIRED',\r\n \r\n /**\r\n * Refresh token failed\r\n */\r\n REFRESH_FAILED: 'ERR_AUTH_REFRESH_FAILED',\r\n} as const;\r\n\r\n/**\r\n * Navigation error codes\r\n */\r\nexport const NAVIGATION_ERROR_CODES = {\r\n /**\r\n * Page not found\r\n */\r\n PAGE_NOT_FOUND: 'ERR_NAV_PAGE_NOT_FOUND',\r\n \r\n /**\r\n * Navigation blocked\r\n */\r\n NAVIGATION_BLOCKED: 'ERR_NAV_BLOCKED',\r\n \r\n /**\r\n * Permission denied\r\n */\r\n PERMISSION_DENIED: 'ERR_NAV_PERMISSION_DENIED',\r\n \r\n /**\r\n * Invalid page ID\r\n */\r\n INVALID_PAGE_ID: 'ERR_NAV_INVALID_PAGE_ID',\r\n} as const;\r\n\r\n/**\r\n * Plugin error codes\r\n */\r\nexport const PLUGIN_ERROR_CODES = {\r\n /**\r\n * Plugin load failed\r\n */\r\n LOAD_FAILED: 'ERR_PLUGIN_LOAD_FAILED',\r\n \r\n /**\r\n * Plugin initialization failed\r\n */\r\n INIT_FAILED: 'ERR_PLUGIN_INIT_FAILED',\r\n \r\n /**\r\n * Plugin not found\r\n */\r\n NOT_FOUND: 'ERR_PLUGIN_NOT_FOUND',\r\n \r\n /**\r\n * Plugin version incompatible\r\n */\r\n VERSION_MISMATCH: 'ERR_PLUGIN_VERSION_MISMATCH',\r\n \r\n /**\r\n * Plugin dependency missing\r\n */\r\n MISSING_DEPENDENCY: 'ERR_PLUGIN_MISSING_DEPENDENCY',\r\n} as const;\r\n\r\n/**\r\n * All error codes\r\n */\r\nexport const ERROR_CODES = {\r\n ...COMMON_ERROR_CODES,\r\n ...AUTH_ERROR_CODES,\r\n ...NAVIGATION_ERROR_CODES,\r\n ...PLUGIN_ERROR_CODES,\r\n} as const;\r\n"]}
@@ -0,0 +1,143 @@
1
+ import { __export, __esm } from './chunk-4CV4JOE5.js';
2
+
3
+ // src/utils/id.ts
4
+ var id_exports = {};
5
+ __export(id_exports, {
6
+ SimpleSnowflake: () => SimpleSnowflake,
7
+ createDailySequenceIdGenerator: () => createDailySequenceIdGenerator,
8
+ createSequenceIdGenerator: () => createSequenceIdGenerator,
9
+ extractTimestampFromId: () => extractTimestampFromId,
10
+ generateNanoId: () => generateNanoId,
11
+ generateShortId: () => generateShortId,
12
+ generateSnowflakeId: () => generateSnowflakeId,
13
+ generateTimestampId: () => generateTimestampId,
14
+ generateUUID: () => generateUUID,
15
+ isValidUUID: () => isValidUUID
16
+ });
17
+ function generateUUID() {
18
+ if (typeof crypto !== "undefined" && crypto.randomUUID) {
19
+ return crypto.randomUUID();
20
+ }
21
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
22
+ const r = Math.random() * 16 | 0;
23
+ const v = c === "x" ? r : r & 3 | 8;
24
+ return v.toString(16);
25
+ });
26
+ }
27
+ function isValidUUID(uuid) {
28
+ const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
29
+ return regex.test(uuid);
30
+ }
31
+ function generateShortId(length = 8, charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") {
32
+ const charsetLength = charset.length;
33
+ let result = "";
34
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
35
+ const randomValues = new Uint32Array(length);
36
+ crypto.getRandomValues(randomValues);
37
+ for (let i = 0; i < length; i++) {
38
+ result += charset[randomValues[i] % charsetLength];
39
+ }
40
+ } else {
41
+ for (let i = 0; i < length; i++) {
42
+ result += charset[Math.floor(Math.random() * charsetLength)];
43
+ }
44
+ }
45
+ return result;
46
+ }
47
+ function generateNanoId(length = 21) {
48
+ const charset = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
49
+ return generateShortId(length, charset);
50
+ }
51
+ function generateTimestampId(randomLength = 6) {
52
+ const timestamp = Date.now().toString(36);
53
+ const random = generateShortId(randomLength, "abcdefghijklmnopqrstuvwxyz0123456789");
54
+ return `${timestamp}${random}`;
55
+ }
56
+ function extractTimestampFromId(id) {
57
+ const timestampPart = id.slice(0, 8);
58
+ try {
59
+ const timestamp = parseInt(timestampPart, 36);
60
+ if (isNaN(timestamp)) return null;
61
+ return new Date(timestamp);
62
+ } catch {
63
+ return null;
64
+ }
65
+ }
66
+ function createSequenceIdGenerator(prefix = "", start = 1) {
67
+ let counter = start;
68
+ return () => `${prefix}${counter++}`;
69
+ }
70
+ function createDailySequenceIdGenerator(prefix = "") {
71
+ let lastDate = "";
72
+ let counter = 0;
73
+ return () => {
74
+ const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10).replace(/-/g, "");
75
+ if (today !== lastDate) {
76
+ lastDate = today;
77
+ counter = 0;
78
+ }
79
+ return `${prefix}${today}${(++counter).toString().padStart(6, "0")}`;
80
+ };
81
+ }
82
+ function generateSnowflakeId() {
83
+ return defaultSnowflake.generate();
84
+ }
85
+ var SimpleSnowflake, defaultSnowflake;
86
+ var init_id = __esm({
87
+ "src/utils/id.ts"() {
88
+ SimpleSnowflake = class {
89
+ constructor() {
90
+ /** 当前序列号 */
91
+ this.sequence = 0;
92
+ /** 上次生成时间戳 */
93
+ this.lastTimestamp = -1;
94
+ }
95
+ /**
96
+ * 生成雪花 ID
97
+ *
98
+ * @returns 雪花 ID 字符串
99
+ */
100
+ generate() {
101
+ let timestamp = Date.now();
102
+ if (timestamp === this.lastTimestamp) {
103
+ this.sequence = this.sequence + 1 & 4095;
104
+ if (this.sequence === 0) {
105
+ while (timestamp <= this.lastTimestamp) {
106
+ timestamp = Date.now();
107
+ }
108
+ }
109
+ } else {
110
+ this.sequence = 0;
111
+ }
112
+ this.lastTimestamp = timestamp;
113
+ const random = Math.floor(Math.random() * 1024);
114
+ const id = BigInt(timestamp) << BigInt(22) | BigInt(this.sequence) << BigInt(10) | BigInt(random);
115
+ return id.toString();
116
+ }
117
+ };
118
+ defaultSnowflake = new SimpleSnowflake();
119
+ }
120
+ });
121
+ /**
122
+ * @file id.ts
123
+ * @description ID 生成工具函数集
124
+ * @module @brix/utils/id
125
+ * @version 3.0.0
126
+ *
127
+ * 【模块说明】
128
+ * 提供各种 ID 生成工具,包括 UUID、短 ID、NanoID、时间戳 ID、雪花 ID 等。
129
+ * 不同场景可选择不同的 ID 生成策略。
130
+ *
131
+ * 【选择建议】
132
+ * - UUID:需要全球唯一且标准格式时使用
133
+ * - ShortId:用于 URL、临时标识等需要短 ID 的场景
134
+ * - NanoId:URL 安全的短 ID,比 ShortId 更随机
135
+ * - TimestampId:需要按时间排序的场景
136
+ * - SnowflakeId:高并发分布式系统(需配合节点 ID)
137
+ *
138
+ * @license Apache-2.0
139
+ */
140
+
141
+ export { SimpleSnowflake, createDailySequenceIdGenerator, createSequenceIdGenerator, extractTimestampFromId, generateNanoId, generateShortId, generateSnowflakeId, generateTimestampId, generateUUID, id_exports, init_id, isValidUUID };
142
+ //# sourceMappingURL=chunk-DJX6ASLI.js.map
143
+ //# sourceMappingURL=chunk-DJX6ASLI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/id.ts"],"names":[],"mappings":"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","file":"chunk-DJX6ASLI.js","sourcesContent":["/**\r\n * @file id.ts\r\n * @description ID 生成工具函数集\r\n * @module @brix/utils/id\r\n * @version 3.0.0\r\n * \r\n * 【模块说明】\r\n * 提供各种 ID 生成工具,包括 UUID、短 ID、NanoID、时间戳 ID、雪花 ID 等。\r\n * 不同场景可选择不同的 ID 生成策略。\r\n * \r\n * 【选择建议】\r\n * - UUID:需要全球唯一且标准格式时使用\r\n * - ShortId:用于 URL、临时标识等需要短 ID 的场景\r\n * - NanoId:URL 安全的短 ID,比 ShortId 更随机\r\n * - TimestampId:需要按时间排序的场景\r\n * - SnowflakeId:高并发分布式系统(需配合节点 ID)\r\n * \r\n * @license Apache-2.0\r\n */\r\n\r\n// ============================================================\r\n// UUID\r\n// ============================================================\r\n\r\n/**\r\n * 生成 UUID v4\r\n * \r\n * 【功能说明】\r\n * 生成符合 RFC 4122 v4 标准的 UUID。\r\n * 优先使用原生 crypto.randomUUID(),降级使用随机数生成。\r\n * \r\n * 【特点】\r\n * - 全球唯一\r\n * - 标准格式,便于跨系统交互\r\n * - 36字符(含连字符)\r\n * \r\n * @returns UUID 字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * generateUUID(); // 'f47ac10b-58cc-4372-a567-0e02b2c3d479'\r\n * generateUUID(); // '7c9e6679-7425-40de-944b-e07fc1f90ae7'\r\n * ```\r\n */\r\nexport function generateUUID(): string {\r\n // 优先使用 crypto API\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n\r\n // 降级方案\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\n\r\n/**\r\n * 验证 UUID 格式\r\n * \r\n * 【功能说明】\r\n * 验证字符串是否为有效的 UUID 格式(v1-v5)。\r\n * \r\n * @param uuid UUID 字符串\r\n * @returns 是否为有效 UUID\r\n * \r\n * @example\r\n * ```typescript\r\n * isValidUUID('f47ac10b-58cc-4372-a567-0e02b2c3d479'); // true\r\n * isValidUUID('not-a-uuid'); // false\r\n * isValidUUID('f47ac10b58cc4372a5670e02b2c3d479'); // false(缺少连字符)\r\n * ```\r\n */\r\nexport function isValidUUID(uuid: string): boolean {\r\n const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\r\n return regex.test(uuid);\r\n}\r\n\r\n// ============================================================\r\n// 短 ID\r\n// ============================================================\r\n\r\n/**\r\n * 生成短 ID\r\n * \r\n * 【功能说明】\r\n * 生成指定长度的随机 ID,默认使用字母数字字符集。\r\n * 适用于 URL 路径、临时标识等场景。\r\n * \r\n * 【碰撞概率】\r\n * 8位默认字符集约有 218 万亿种组合(62^8)\r\n * \r\n * @param length ID 长度(默认 8)\r\n * @param charset 字符集(默认字母数字)\r\n * @returns 短 ID 字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * generateShortId(); // 'a1B2c3D4'\r\n * generateShortId(12); // 'a1B2c3D4e5F6'\r\n * generateShortId(6, '0123456789'); // '123456'(纯数字)\r\n * ```\r\n */\r\nexport function generateShortId(\r\n length: number = 8,\r\n charset: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\r\n): string {\r\n const charsetLength = charset.length;\r\n let result = '';\r\n\r\n // 优先使用 crypto API\r\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\r\n const randomValues = new Uint32Array(length);\r\n crypto.getRandomValues(randomValues);\r\n for (let i = 0; i < length; i++) {\r\n result += charset[randomValues[i] % charsetLength];\r\n }\r\n } else {\r\n for (let i = 0; i < length; i++) {\r\n result += charset[Math.floor(Math.random() * charsetLength)];\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 生成 NanoID 风格的 ID\r\n * \r\n * 【功能说明】\r\n * 生成 NanoID 风格的随机 ID,使用 URL 安全字符集。\r\n * 比 UUID 更短,比 ShortId 更随机。\r\n * \r\n * 【特点】\r\n * - URL 安全(无需编码)\r\n * - 默认21位,碰撞概率极低\r\n * - 比 UUID 更短\r\n * \r\n * @param length ID 长度(默认 21)\r\n * @returns NanoID 字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * generateNanoId(); // 'V1StGXR8_Z5jdHi6B-myT'\r\n * generateNanoId(10); // 'IRFa-VaY2b'\r\n * ```\r\n */\r\nexport function generateNanoId(length: number = 21): string {\r\n // URL 安全字符集\r\n const charset = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict';\r\n return generateShortId(length, charset);\r\n}\r\n\r\n// ============================================================\r\n// 时间戳 ID\r\n// ============================================================\r\n\r\n/**\r\n * 生成基于时间戳的 ID\r\n * \r\n * 【功能说明】\r\n * 生成包含时间信息的 ID,格式为:时间戳(base36) + 随机串。\r\n * 适用于需要按时间排序或提取时间信息的场景。\r\n * \r\n * 【优势】\r\n * - 按创建时间自然排序\r\n * - 可以从 ID 中提取创建时间\r\n * - 比 UUID 更短\r\n * \r\n * @param randomLength 随机部分长度(默认 6)\r\n * @returns 时间戳 ID\r\n * \r\n * @example\r\n * ```typescript\r\n * generateTimestampId(); // 'lnjhgk4xabcdef'\r\n * generateTimestampId(10); // 'lnjhgk4xabcdefghij'\r\n * \r\n * // ID 可按时间排序\r\n * const ids = [id1, id2, id3].sort(); // 按创建时间排序\r\n * ```\r\n */\r\nexport function generateTimestampId(randomLength: number = 6): string {\r\n const timestamp = Date.now().toString(36);\r\n const random = generateShortId(randomLength, 'abcdefghijklmnopqrstuvwxyz0123456789');\r\n return `${timestamp}${random}`;\r\n}\r\n\r\n/**\r\n * 从时间戳 ID 中提取时间\r\n * \r\n * 【功能说明】\r\n * 尝试从时间戳 ID 中提取创建时间。\r\n * 仅适用于 generateTimestampId 生成的 ID。\r\n * \r\n * @param id 时间戳 ID\r\n * @returns Date 对象,解析失败返回 null\r\n * \r\n * @example\r\n * ```typescript\r\n * const id = generateTimestampId();\r\n * const date = extractTimestampFromId(id);\r\n * console.log(date); // 2024-01-01T12:00:00.000Z\r\n * \r\n * extractTimestampFromId('invalid'); // null\r\n * ```\r\n */\r\nexport function extractTimestampFromId(id: string): Date | null {\r\n // 尝试提取 base36 时间戳部分(前8位)\r\n const timestampPart = id.slice(0, 8);\r\n try {\r\n const timestamp = parseInt(timestampPart, 36);\r\n if (isNaN(timestamp)) return null;\r\n return new Date(timestamp);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 序列 ID\r\n// ============================================================\r\n\r\n/**\r\n * 创建序列 ID 生成器\r\n * \r\n * 【功能说明】\r\n * 创建一个自增序列 ID 生成器,每次调用返回递增的 ID。\r\n * 适用于单机环境下的唯一 ID 生成。\r\n * \r\n * 【注意】\r\n * - 仅在单进程内唯一\r\n * - 重启后计数器重置\r\n * - 不适合分布式环境\r\n * \r\n * @param prefix ID 前缀(可选)\r\n * @param start 起始值(默认 1)\r\n * @returns 生成器函数\r\n * \r\n * @example\r\n * ```typescript\r\n * const genOrderId = createSequenceIdGenerator('ORD-', 1000);\r\n * genOrderId(); // 'ORD-1000'\r\n * genOrderId(); // 'ORD-1001'\r\n * genOrderId(); // 'ORD-1002'\r\n * \r\n * const genId = createSequenceIdGenerator();\r\n * genId(); // '1'\r\n * genId(); // '2'\r\n * ```\r\n */\r\nexport function createSequenceIdGenerator(\r\n prefix: string = '',\r\n start: number = 1\r\n): () => string {\r\n let counter = start;\r\n return () => `${prefix}${counter++}`;\r\n}\r\n\r\n/**\r\n * 创建带日期前缀的序列 ID 生成器\r\n * \r\n * 【功能说明】\r\n * 创建按日自增的序列 ID 生成器。\r\n * 格式:前缀 + 日期(YYYYMMDD) + 序号(6位)。\r\n * 每天计数器自动重置。\r\n * \r\n * 【适用场景】\r\n * - 订单号\r\n * - 流水号\r\n * - 工单号\r\n * \r\n * @param prefix ID 前缀(可选)\r\n * @returns 生成器函数\r\n * \r\n * @example\r\n * ```typescript\r\n * const genOrderId = createDailySequenceIdGenerator('ORD');\r\n * genOrderId(); // 'ORD20240101000001'\r\n * genOrderId(); // 'ORD20240101000002'\r\n * \r\n * // 第二天\r\n * genOrderId(); // 'ORD20240102000001'(计数器重置)\r\n * ```\r\n */\r\nexport function createDailySequenceIdGenerator(prefix: string = ''): () => string {\r\n let lastDate = '';\r\n let counter = 0;\r\n\r\n return () => {\r\n const today = new Date().toISOString().slice(0, 10).replace(/-/g, '');\r\n if (today !== lastDate) {\r\n lastDate = today;\r\n counter = 0;\r\n }\r\n return `${prefix}${today}${(++counter).toString().padStart(6, '0')}`;\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 雪花 ID (简化版)\r\n// ============================================================\r\n\r\n/**\r\n * 简化版雪花 ID 生成器\r\n * \r\n * 【功能说明】\r\n * 生成类似 Twitter Snowflake 的 64 位唯一 ID。\r\n * 此为简化实现,不含 workerId/datacenterId。\r\n * \r\n * 【ID 结构】\r\n * - 时间戳(41位):可用约69年\r\n * - 序列号(12位):每毫秒可生成 4096 个 ID\r\n * - 随机数(10位):增加随机性\r\n * \r\n * 【注意】\r\n * - 简化版适用于单节点或对全局唯一性要求不高的场景\r\n * - 生产环境分布式部署建议使用服务端生成\r\n * \r\n * @example\r\n * ```typescript\r\n * const snowflake = new SimpleSnowflake();\r\n * snowflake.generate(); // '7123456789012345678'\r\n * snowflake.generate(); // '7123456789012345679'\r\n * ```\r\n */\r\nexport class SimpleSnowflake {\r\n /** 当前序列号 */\r\n private sequence = 0;\r\n /** 上次生成时间戳 */\r\n private lastTimestamp = -1;\r\n\r\n /**\r\n * 生成雪花 ID\r\n * \r\n * @returns 雪花 ID 字符串\r\n */\r\n generate(): string {\r\n let timestamp = Date.now();\r\n\r\n if (timestamp === this.lastTimestamp) {\r\n // 同一毫秒内,序列号递增\r\n this.sequence = (this.sequence + 1) & 0xfff; // 12 bit\r\n if (this.sequence === 0) {\r\n // 序列号溢出,等待下一毫秒\r\n while (timestamp <= this.lastTimestamp) {\r\n timestamp = Date.now();\r\n }\r\n }\r\n } else {\r\n // 新的毫秒,重置序列号\r\n this.sequence = 0;\r\n }\r\n\r\n this.lastTimestamp = timestamp;\r\n\r\n // 使用 BigInt 组合各部分\r\n const random = Math.floor(Math.random() * 1024); // 10 bit\r\n const id =\r\n (BigInt(timestamp) << BigInt(22)) |\r\n (BigInt(this.sequence) << BigInt(10)) |\r\n BigInt(random);\r\n\r\n return id.toString();\r\n }\r\n}\r\n\r\n/**\r\n * 默认的雪花 ID 生成器实例\r\n */\r\nconst defaultSnowflake = new SimpleSnowflake();\r\n\r\n/**\r\n * 生成雪花 ID\r\n * \r\n * 【功能说明】\r\n * 使用默认生成器实例生成雪花 ID。\r\n * 便捷函数,无需手动创建实例。\r\n * \r\n * @returns 雪花 ID 字符串\r\n * \r\n * @example\r\n * ```typescript\r\n * generateSnowflakeId(); // '7123456789012345678'\r\n * generateSnowflakeId(); // '7123456789012345679'\r\n * \r\n * // 可按数值排序(时间有序)\r\n * BigInt(id1) < BigInt(id2); // true(id1 先生成)\r\n * ```\r\n */\r\nexport function generateSnowflakeId(): string {\r\n return defaultSnowflake.generate();\r\n}\r\n"]}
@@ -0,0 +1,3 @@
1
+ export { DEFAULT_CACHE_OPTIONS, DEFAULT_RETRY_OPTIONS, HttpError, HttpErrorCode, RETRYABLE_NETWORK_ERRORS, RETRYABLE_STATUS_CODES, SimpleCache, calculateBackoffDelay, createRetryable, delay, generateCacheKey, shouldRetry, withCache, withRetry } from '@brix/infra-adapter-http-web';
2
+ //# sourceMappingURL=chunk-GNCIKXWI.js.map
3
+ //# sourceMappingURL=chunk-GNCIKXWI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-GNCIKXWI.js","sourcesContent":[]}