@ablogcms/url 3.2.28-beta.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.
Files changed (49) hide show
  1. package/README.md +24 -0
  2. package/dist/acms.d.ts +16 -0
  3. package/dist/acms.mjs +1 -0
  4. package/dist/acms.mjs.map +1 -0
  5. package/dist/acmsField.d.ts +13 -0
  6. package/dist/acmsField.mjs +9 -0
  7. package/dist/acmsField.mjs.map +1 -0
  8. package/dist/acmsLink.d.ts +44 -0
  9. package/dist/acmsLink.mjs +81 -0
  10. package/dist/acmsLink.mjs.map +1 -0
  11. package/dist/acmsPath.d.ts +2 -0
  12. package/dist/acmsPath.mjs +9 -0
  13. package/dist/acmsPath.mjs.map +1 -0
  14. package/dist/chunk-GHGJBKQU.mjs +192 -0
  15. package/dist/chunk-GHGJBKQU.mjs.map +1 -0
  16. package/dist/chunk-HZZTSXXP.mjs +226 -0
  17. package/dist/chunk-HZZTSXXP.mjs.map +1 -0
  18. package/dist/chunk-OJI2ZTVL.mjs +23 -0
  19. package/dist/chunk-OJI2ZTVL.mjs.map +1 -0
  20. package/dist/chunk-OUKSKSZA.mjs +295 -0
  21. package/dist/chunk-OUKSKSZA.mjs.map +1 -0
  22. package/dist/chunk-PHGYMRZK.mjs +22 -0
  23. package/dist/chunk-PHGYMRZK.mjs.map +1 -0
  24. package/dist/chunk-XTN64CHF.mjs +73 -0
  25. package/dist/chunk-XTN64CHF.mjs.map +1 -0
  26. package/dist/chunk-ZDAAXRTI.mjs +43 -0
  27. package/dist/chunk-ZDAAXRTI.mjs.map +1 -0
  28. package/dist/createAcmsContextFromFormData.d.ts +5 -0
  29. package/dist/createAcmsContextFromFormData.mjs +63 -0
  30. package/dist/createAcmsContextFromFormData.mjs.map +1 -0
  31. package/dist/createAcmsPathHelper.d.ts +9 -0
  32. package/dist/createAcmsPathHelper.mjs +13 -0
  33. package/dist/createAcmsPathHelper.mjs.map +1 -0
  34. package/dist/defaults.d.ts +17 -0
  35. package/dist/defaults.mjs +7 -0
  36. package/dist/defaults.mjs.map +1 -0
  37. package/dist/index.d.ts +7 -0
  38. package/dist/index.mjs +43 -0
  39. package/dist/index.mjs.map +1 -0
  40. package/dist/parseAcmsPath.d.ts +2 -0
  41. package/dist/parseAcmsPath.mjs +11 -0
  42. package/dist/parseAcmsPath.mjs.map +1 -0
  43. package/dist/types.d.ts +105 -0
  44. package/dist/types.mjs +15 -0
  45. package/dist/types.mjs.map +1 -0
  46. package/dist/utils.d.ts +11 -0
  47. package/dist/utils.mjs +11 -0
  48. package/dist/utils.mjs.map +1 -0
  49. package/package.json +90 -0
@@ -0,0 +1,73 @@
1
+ // src/utils.ts
2
+ function formatDate(date) {
3
+ function twoDigits(num) {
4
+ return num < 10 ? `0${num}` : num;
5
+ }
6
+ const year = date.getFullYear();
7
+ const month = twoDigits(date.getMonth() + 1);
8
+ const day = twoDigits(date.getDate());
9
+ const hours = twoDigits(date.getHours());
10
+ const minutes = twoDigits(date.getMinutes());
11
+ const seconds = twoDigits(date.getSeconds());
12
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
13
+ }
14
+ function splitPath(path) {
15
+ if (path.startsWith("/")) {
16
+ path = path.substring(1);
17
+ }
18
+ const result = [];
19
+ let buffer = "";
20
+ let isEscaped = false;
21
+ for (let i = 0; i < path.length; i++) {
22
+ const char = path[i];
23
+ if (char === "\\" && !isEscaped) {
24
+ isEscaped = true;
25
+ buffer += char;
26
+ } else if (char === "/" && !isEscaped) {
27
+ result.push(buffer);
28
+ buffer = "";
29
+ } else {
30
+ buffer += char;
31
+ isEscaped = false;
32
+ }
33
+ }
34
+ if (buffer.length > 0) {
35
+ result.push(buffer);
36
+ }
37
+ return result;
38
+ }
39
+ function isPlainObject(value) {
40
+ if (typeof value !== "object" || value === null) {
41
+ return false;
42
+ }
43
+ if (Array.isArray(value) || value instanceof Date || value instanceof RegExp) {
44
+ return false;
45
+ }
46
+ const proto = Object.getPrototypeOf(value);
47
+ return proto === null || proto === Object.prototype;
48
+ }
49
+ function mergeConfig(defaults, overrides) {
50
+ const result = { ...defaults };
51
+ for (const key in overrides) {
52
+ if (Object.prototype.hasOwnProperty.call(overrides, key)) {
53
+ const overrideValue = overrides[key];
54
+ const defaultValue = defaults[key];
55
+ if (overrideValue === void 0) {
56
+ continue;
57
+ }
58
+ if (isPlainObject(overrideValue) && isPlainObject(defaultValue)) {
59
+ result[key] = mergeConfig(defaultValue, overrideValue);
60
+ } else {
61
+ result[key] = overrideValue;
62
+ }
63
+ }
64
+ }
65
+ return result;
66
+ }
67
+
68
+ export {
69
+ formatDate,
70
+ splitPath,
71
+ mergeConfig
72
+ };
73
+ //# sourceMappingURL=chunk-XTN64CHF.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts"],"sourcesContent":["export function formatDate(date: Date) {\n function twoDigits(num: number) {\n return num < 10 ? `0${num}` : num;\n }\n\n const year = date.getFullYear();\n const month = twoDigits(date.getMonth() + 1); // JavaScriptの月は0から始まるため、1を加える\n const day = twoDigits(date.getDate());\n const hours = twoDigits(date.getHours());\n const minutes = twoDigits(date.getMinutes());\n const seconds = twoDigits(date.getSeconds());\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n}\n\nexport function splitPath(path: string): string[] {\n if (path.startsWith('/')) {\n path = path.substring(1);\n }\n const result: string[] = [];\n let buffer: string = '';\n let isEscaped: boolean = false;\n for (let i = 0; i < path.length; i++) {\n const char = path[i];\n if (char === '\\\\' && !isEscaped) {\n // バックスラッシュを見つけたらエスケープ状態にする\n isEscaped = true;\n buffer += char; // バックスラッシュもバッファに追加\n } else if (char === '/' && !isEscaped) {\n // エスケープされていないスラッシュで分割\n result.push(buffer);\n buffer = '';\n } else {\n // 通常の文字をバッファに追加\n buffer += char;\n isEscaped = false; // 1文字進んだらエスケープ状態を解除\n }\n }\n // 最後の部分を追加\n if (buffer.length > 0) {\n result.push(buffer);\n }\n return result;\n}\n\n/**\n * プレーンオブジェクトかどうかを判定する\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isPlainObject(value: any): value is Record<string, any> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n // 配列やDate、その他の特殊なオブジェクトは除外\n if (Array.isArray(value) || value instanceof Date || value instanceof RegExp) {\n return false;\n }\n\n // プロトタイプがObjectまたはnullの場合のみtrue\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n\n/**\n * 設定オブジェクトを深くマージする関数\n * @param defaults - デフォルト設定\n * @param overrides - マージする設定(優先される)\n * @returns マージされた設定\n */\nexport function mergeConfig(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n defaults: Record<string, any>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overrides: Record<string, any>\n) {\n const result = { ...defaults };\n\n for (const key in overrides) {\n if (Object.prototype.hasOwnProperty.call(overrides, key)) {\n const overrideValue = overrides[key];\n const defaultValue = defaults[key];\n\n // undefined の場合はスキップ\n if (overrideValue === undefined) {\n continue;\n }\n\n // 両方がプレーンオブジェクトの場合は再帰的にマージ\n if (isPlainObject(overrideValue) && isPlainObject(defaultValue)) {\n result[key] = mergeConfig(defaultValue, overrideValue);\n } else {\n // それ以外は上書き(配列や基本型など)\n result[key] = overrideValue;\n }\n }\n }\n\n return result;\n}\n"],"mappings":";AAAO,SAAS,WAAW,MAAY;AACrC,WAAS,UAAU,KAAa;AAC9B,WAAO,MAAM,KAAK,IAAI,GAAG,KAAK;AAAA,EAChC;AAEA,QAAM,OAAO,KAAK,YAAY;AAC9B,QAAM,QAAQ,UAAU,KAAK,SAAS,IAAI,CAAC;AAC3C,QAAM,MAAM,UAAU,KAAK,QAAQ,CAAC;AACpC,QAAM,QAAQ,UAAU,KAAK,SAAS,CAAC;AACvC,QAAM,UAAU,UAAU,KAAK,WAAW,CAAC;AAC3C,QAAM,UAAU,UAAU,KAAK,WAAW,CAAC;AAE3C,SAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,IAAI,OAAO;AAC/D;AAEO,SAAS,UAAU,MAAwB;AAChD,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAO,KAAK,UAAU,CAAC;AAAA,EACzB;AACA,QAAM,SAAmB,CAAC;AAC1B,MAAI,SAAiB;AACrB,MAAI,YAAqB;AACzB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,OAAO,KAAK,CAAC;AACnB,QAAI,SAAS,QAAQ,CAAC,WAAW;AAE/B,kBAAY;AACZ,gBAAU;AAAA,IACZ,WAAW,SAAS,OAAO,CAAC,WAAW;AAErC,aAAO,KAAK,MAAM;AAClB,eAAS;AAAA,IACX,OAAO;AAEL,gBAAU;AACV,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,KAAK,MAAM;AAAA,EACpB;AACA,SAAO;AACT;AAMA,SAAS,cAAc,OAA0C;AAC/D,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AAGA,MAAI,MAAM,QAAQ,KAAK,KAAK,iBAAiB,QAAQ,iBAAiB,QAAQ;AAC5E,WAAO;AAAA,EACT;AAGA,QAAM,QAAQ,OAAO,eAAe,KAAK;AACzC,SAAO,UAAU,QAAQ,UAAU,OAAO;AAC5C;AAQO,SAAS,YAEd,UAEA,WACA;AACA,QAAM,SAAS,EAAE,GAAG,SAAS;AAE7B,aAAW,OAAO,WAAW;AAC3B,QAAI,OAAO,UAAU,eAAe,KAAK,WAAW,GAAG,GAAG;AACxD,YAAM,gBAAgB,UAAU,GAAG;AACnC,YAAM,eAAe,SAAS,GAAG;AAGjC,UAAI,kBAAkB,QAAW;AAC/B;AAAA,MACF;AAGA,UAAI,cAAc,aAAa,KAAK,cAAc,YAAY,GAAG;AAC/D,eAAO,GAAG,IAAI,YAAY,cAAc,aAAa;AAAA,MACvD,OAAO;AAEL,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,43 @@
1
+ // src/types.ts
2
+ function isConnector(value) {
3
+ return typeof value === "string" && ["and", "or"].includes(value);
4
+ }
5
+ function isOperator(value) {
6
+ return typeof value === "string" && ["eq", "neq", "gt", "lt", "gte", "lte", "lk", "nlk", "re", "nre", "em", "nem"].includes(value);
7
+ }
8
+ function isSeparator(value) {
9
+ return typeof value === "string" && ["_and_", "_or_"].includes(value);
10
+ }
11
+ function isAcmsFilter(value) {
12
+ return typeof value === "object" && value !== null && isOperator(value.operator) && (typeof value.value === "string" || typeof value.value === "number") && isConnector(value.connector);
13
+ }
14
+ function isAcmsField(value) {
15
+ if (typeof value !== "object") {
16
+ return false;
17
+ }
18
+ if (value == null) {
19
+ return false;
20
+ }
21
+ if (typeof value.key !== "string") {
22
+ return false;
23
+ }
24
+ if (!Array.isArray(value.filters)) {
25
+ return false;
26
+ }
27
+ if (!value.filters.every(isAcmsFilter)) {
28
+ return false;
29
+ }
30
+ if (value.separator !== void 0 && !isSeparator(value.separator)) {
31
+ return false;
32
+ }
33
+ return true;
34
+ }
35
+
36
+ export {
37
+ isConnector,
38
+ isOperator,
39
+ isSeparator,
40
+ isAcmsFilter,
41
+ isAcmsField
42
+ };
43
+ //# sourceMappingURL=chunk-ZDAAXRTI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import { RecursivePartial } from '@ablogcms/types/utils';\nimport AcmsFieldList from './acmsField';\n\nexport type ApiVersion = 'v1' | 'v2';\n\nexport interface AcmsPathParams {\n blog?: string | number;\n category?: string | string[] | number;\n entry?: string | number;\n user?: number;\n unit?: string;\n tag?: string[];\n field?: string | AcmsFieldList;\n span?: { start?: string | Date; end?: string | Date };\n date?: { year?: number; month?: number; day?: number };\n page?: number;\n order?: string;\n limit?: number;\n keyword?: string;\n admin?: string;\n tpl?: string;\n api?: string;\n searchParams?: Record<string, any> | URLSearchParams; // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\nexport interface AcmsContext {\n bid?: number;\n cid?: number;\n eid?: number;\n uid?: number;\n utid?: string;\n tag?: string[];\n field?: AcmsFieldList;\n span?: { start: string | Date; end: string | Date };\n date?: { year: number; month?: number; day?: number };\n page?: number;\n order?: string;\n limit?: number;\n keyword?: string;\n admin?: string;\n tpl?: string;\n api?: string;\n apiVersion?: ApiVersion;\n unresolvedPath?: string;\n}\n\nexport interface AcmsContextWithSearchParams extends AcmsContext {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n searchParams?: Record<string, any> | URLSearchParams;\n}\n\nexport interface AcmsPathSegments {\n bid: string;\n admin: string;\n cid: string;\n eid: string;\n uid: string;\n utid: string;\n tag: string;\n field: string;\n span: string;\n page: string;\n order: string;\n limit: string;\n keyword: string;\n tpl: string;\n api: string;\n}\n\nexport interface AcmsPathConfig {\n segments: AcmsPathSegments;\n apiVersion?: ApiVersion;\n}\n\nexport interface ParseAcmsPathConfig {\n segments: AcmsPathSegments;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface AcmsPathOptions extends RecursivePartial<AcmsPathConfig> {}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface ParseAcmsPathOptions extends RecursivePartial<ParseAcmsPathConfig> {}\n\nexport type Connector = 'and' | 'or';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isConnector(value: any): value is Connector {\n return typeof value === 'string' && ['and', 'or'].includes(value);\n}\n\nexport type Operator = 'eq' | 'neq' | 'gt' | 'lt' | 'gte' | 'lte' | 'lk' | 'nlk' | 're' | 'nre' | 'em' | 'nem';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isOperator(value: any): value is Operator {\n return (\n typeof value === 'string' &&\n ['eq', 'neq', 'gt', 'lt', 'gte', 'lte', 'lk', 'nlk', 're', 'nre', 'em', 'nem'].includes(value)\n );\n}\n\nexport type Separator = '_and_' | '_or_';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isSeparator(value: any): value is Separator {\n return typeof value === 'string' && ['_and_', '_or_'].includes(value);\n}\n\nexport interface AcmsFilter {\n operator: Operator;\n value: string;\n connector: Connector;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isAcmsFilter(value: any): value is AcmsFilter {\n return (\n typeof value === 'object' &&\n value !== null &&\n isOperator(value.operator) &&\n (typeof value.value === 'string' || typeof value.value === 'number') &&\n isConnector(value.connector)\n );\n}\n\nexport interface AcmsField {\n key: string;\n filters: AcmsFilter[];\n separator?: Separator;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isAcmsField(value: any): value is AcmsField {\n if (typeof value !== 'object') {\n return false;\n }\n if (value == null) {\n return false;\n }\n if (typeof value.key !== 'string') {\n return false;\n }\n if (!Array.isArray(value.filters)) {\n return false;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (!(value.filters as any[]).every(isAcmsFilter)) {\n return false;\n }\n if (value.separator !== undefined && !isSeparator(value.separator)) {\n return false;\n }\n return true;\n}\n"],"mappings":";AAuFO,SAAS,YAAY,OAAgC;AAC1D,SAAO,OAAO,UAAU,YAAY,CAAC,OAAO,IAAI,EAAE,SAAS,KAAK;AAClE;AAKO,SAAS,WAAW,OAA+B;AACxD,SACE,OAAO,UAAU,YACjB,CAAC,MAAM,OAAO,MAAM,MAAM,OAAO,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK,EAAE,SAAS,KAAK;AAEjG;AAKO,SAAS,YAAY,OAAgC;AAC1D,SAAO,OAAO,UAAU,YAAY,CAAC,SAAS,MAAM,EAAE,SAAS,KAAK;AACtE;AASO,SAAS,aAAa,OAAiC;AAC5D,SACE,OAAO,UAAU,YACjB,UAAU,QACV,WAAW,MAAM,QAAQ,MACxB,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,UAAU,aAC3D,YAAY,MAAM,SAAS;AAE/B;AASO,SAAS,YAAY,OAAgC;AAC1D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,MAAM,QAAQ,UAAU;AACjC,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,QAAQ,MAAM,OAAO,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,CAAE,MAAM,QAAkB,MAAM,YAAY,GAAG;AACjD,WAAO;AAAA,EACT;AACA,MAAI,MAAM,cAAc,UAAa,CAAC,YAAY,MAAM,SAAS,GAAG;AAClE,WAAO;AAAA,EACT;AACA,SAAO;AACT;","names":[]}
@@ -0,0 +1,5 @@
1
+ import { AcmsContext } from './types.js';
2
+ export default function createAcmsContextFromFormData(formData: FormData): {
3
+ context: AcmsContext;
4
+ searchParams: URLSearchParams;
5
+ };
@@ -0,0 +1,63 @@
1
+ import {
2
+ AcmsFieldList
3
+ } from "./chunk-OUKSKSZA.mjs";
4
+ import "./chunk-ZDAAXRTI.mjs";
5
+ import "./chunk-XTN64CHF.mjs";
6
+
7
+ // src/createAcmsContextFromFormData.ts
8
+ import { parseFormData } from "parse-nested-form-data";
9
+ function createAcmsContextFromFormData(formData) {
10
+ const data = parseFormData(formData);
11
+ const { query, start = "1000-01-01 00:00:00", span: _span, end = "9999-12-31 23:59:59", date: _date, ...rest } = data;
12
+ const searchParams = new URLSearchParams();
13
+ query?.forEach((key) => {
14
+ if (key in rest) {
15
+ const value = rest[key];
16
+ if (Array.isArray(value)) {
17
+ value.forEach((v) => {
18
+ searchParams.append(key, v);
19
+ });
20
+ } else {
21
+ searchParams.append(key, value);
22
+ }
23
+ delete rest[key];
24
+ }
25
+ });
26
+ let span;
27
+ if (_span != null && _span !== "") {
28
+ span = { start, end };
29
+ }
30
+ let date;
31
+ if (_date != null && _date !== "") {
32
+ date = Array.isArray(_date) ? { year: Number(_date[0]), month: Number(_date[1]), day: Number(_date[2]) } : _date.split("/").reduce(
33
+ (acc, v, i) => {
34
+ acc[["year", "month", "day"][i]] = Number(v);
35
+ return acc;
36
+ },
37
+ {}
38
+ );
39
+ }
40
+ const context = {
41
+ bid: rest.bid ? Number(rest.bid) : void 0,
42
+ cid: rest.cid ? Number(rest.cid) : void 0,
43
+ eid: rest.eid ? Number(rest.eid) : void 0,
44
+ uid: rest.uid ? Number(rest.uid) : void 0,
45
+ utid: rest.utid,
46
+ tag: rest.tag,
47
+ span,
48
+ date,
49
+ page: rest.page ? Number(rest.page) : void 0,
50
+ order: rest.order,
51
+ limit: rest.limit ? Number(rest.limit) : void 0,
52
+ keyword: rest.keyword,
53
+ admin: rest.admin,
54
+ tpl: rest.tpl,
55
+ api: rest.api,
56
+ field: AcmsFieldList.fromFormData(formData)
57
+ };
58
+ return { context, searchParams };
59
+ }
60
+ export {
61
+ createAcmsContextFromFormData as default
62
+ };
63
+ //# sourceMappingURL=createAcmsContextFromFormData.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/createAcmsContextFromFormData.ts"],"sourcesContent":["import { parseFormData } from 'parse-nested-form-data';\nimport AcmsFieldList from './acmsField';\nimport { AcmsContext } from './types';\n\ninterface ParsedObject {\n bid?: string;\n cid?: string;\n eid?: string;\n uid?: string;\n utid?: string;\n tag?: string[];\n start?: string;\n span?: string;\n end?: string;\n date?: string | string[];\n page?: string;\n order?: string;\n limit?: string;\n keyword?: string;\n admin?: string;\n tpl?: string;\n api?: string;\n query?: string[];\n field?: string[];\n [key: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\nexport default function createAcmsContextFromFormData(formData: FormData): {\n context: AcmsContext;\n searchParams: URLSearchParams;\n} {\n const data = parseFormData(formData) as ParsedObject;\n const { query, start = '1000-01-01 00:00:00', span: _span, end = '9999-12-31 23:59:59', date: _date, ...rest } = data;\n\n const searchParams = new URLSearchParams();\n query?.forEach((key) => {\n if (key in rest) {\n const value = rest[key];\n if (Array.isArray(value)) {\n value.forEach((v) => {\n searchParams.append(key, v);\n });\n } else {\n searchParams.append(key, value);\n }\n delete rest[key];\n }\n });\n\n let span;\n if (_span != null && _span !== '') {\n span = { start, end };\n }\n\n let date;\n if (_date != null && _date !== '') {\n date = Array.isArray(_date)\n ? { year: Number(_date[0]), month: Number(_date[1]), day: Number(_date[2]) }\n : _date.split('/').reduce(\n (acc, v, i) => {\n acc[['year', 'month', 'day'][i] as 'year' | 'month' | 'day'] = Number(v);\n return acc;\n },\n {} as { year: number; month?: number; day?: number }\n );\n }\n\n const context: AcmsContext = {\n bid: rest.bid ? Number(rest.bid) : undefined,\n cid: rest.cid ? Number(rest.cid) : undefined,\n eid: rest.eid ? Number(rest.eid) : undefined,\n uid: rest.uid ? Number(rest.uid) : undefined,\n utid: rest.utid,\n tag: rest.tag,\n span,\n date,\n page: rest.page ? Number(rest.page) : undefined,\n order: rest.order,\n limit: rest.limit ? Number(rest.limit) : undefined,\n keyword: rest.keyword,\n admin: rest.admin,\n tpl: rest.tpl,\n api: rest.api,\n field: AcmsFieldList.fromFormData(formData),\n };\n\n return { context, searchParams };\n}\n"],"mappings":";;;;;;;AAAA,SAAS,qBAAqB;AA2Bf,SAAR,8BAA+C,UAGpD;AACA,QAAM,OAAO,cAAc,QAAQ;AACnC,QAAM,EAAE,OAAO,QAAQ,uBAAuB,MAAM,OAAO,MAAM,uBAAuB,MAAM,OAAO,GAAG,KAAK,IAAI;AAEjH,QAAM,eAAe,IAAI,gBAAgB;AACzC,SAAO,QAAQ,CAAC,QAAQ;AACtB,QAAI,OAAO,MAAM;AACf,YAAM,QAAQ,KAAK,GAAG;AACtB,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,cAAM,QAAQ,CAAC,MAAM;AACnB,uBAAa,OAAO,KAAK,CAAC;AAAA,QAC5B,CAAC;AAAA,MACH,OAAO;AACL,qBAAa,OAAO,KAAK,KAAK;AAAA,MAChC;AACA,aAAO,KAAK,GAAG;AAAA,IACjB;AAAA,EACF,CAAC;AAED,MAAI;AACJ,MAAI,SAAS,QAAQ,UAAU,IAAI;AACjC,WAAO,EAAE,OAAO,IAAI;AAAA,EACtB;AAEA,MAAI;AACJ,MAAI,SAAS,QAAQ,UAAU,IAAI;AACjC,WAAO,MAAM,QAAQ,KAAK,IACtB,EAAE,MAAM,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,OAAO,MAAM,CAAC,CAAC,GAAG,KAAK,OAAO,MAAM,CAAC,CAAC,EAAE,IACzE,MAAM,MAAM,GAAG,EAAE;AAAA,MACf,CAAC,KAAK,GAAG,MAAM;AACb,YAAI,CAAC,QAAQ,SAAS,KAAK,EAAE,CAAC,CAA6B,IAAI,OAAO,CAAC;AACvE,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAAA,EACN;AAEA,QAAM,UAAuB;AAAA,IAC3B,KAAK,KAAK,MAAM,OAAO,KAAK,GAAG,IAAI;AAAA,IACnC,KAAK,KAAK,MAAM,OAAO,KAAK,GAAG,IAAI;AAAA,IACnC,KAAK,KAAK,MAAM,OAAO,KAAK,GAAG,IAAI;AAAA,IACnC,KAAK,KAAK,MAAM,OAAO,KAAK,GAAG,IAAI;AAAA,IACnC,MAAM,KAAK;AAAA,IACX,KAAK,KAAK;AAAA,IACV;AAAA,IACA;AAAA,IACA,MAAM,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI;AAAA,IACtC,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,IACzC,SAAS,KAAK;AAAA,IACd,OAAO,KAAK;AAAA,IACZ,KAAK,KAAK;AAAA,IACV,KAAK,KAAK;AAAA,IACV,OAAO,cAAc,aAAa,QAAQ;AAAA,EAC5C;AAEA,SAAO,EAAE,SAAS,aAAa;AACjC;","names":[]}
@@ -0,0 +1,9 @@
1
+ import { AcmsPathSegments } from './types.js';
2
+ import acmsPath from './acmsPath.js';
3
+ import parseAcmsPath from './parseAcmsPath.js';
4
+ interface AcmsPathHelper {
5
+ acmsPath: typeof acmsPath;
6
+ parseAcmsPath: typeof parseAcmsPath;
7
+ }
8
+ export default function createAcmsPathHelper(segments?: AcmsPathSegments): AcmsPathHelper;
9
+ export {};
@@ -0,0 +1,13 @@
1
+ import {
2
+ createAcmsPathHelper
3
+ } from "./chunk-PHGYMRZK.mjs";
4
+ import "./chunk-GHGJBKQU.mjs";
5
+ import "./chunk-HZZTSXXP.mjs";
6
+ import "./chunk-OUKSKSZA.mjs";
7
+ import "./chunk-ZDAAXRTI.mjs";
8
+ import "./chunk-XTN64CHF.mjs";
9
+ import "./chunk-OJI2ZTVL.mjs";
10
+ export {
11
+ createAcmsPathHelper as default
12
+ };
13
+ //# sourceMappingURL=createAcmsPathHelper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,17 @@
1
+ export declare const defaultAcmsPathSegments: {
2
+ readonly bid: "bid";
3
+ readonly cid: "cid";
4
+ readonly eid: "eid";
5
+ readonly uid: "uid";
6
+ readonly utid: "utid";
7
+ readonly tag: "tag";
8
+ readonly field: "field";
9
+ readonly span: "-";
10
+ readonly page: "page";
11
+ readonly order: "order";
12
+ readonly limit: "limit";
13
+ readonly keyword: "keyword";
14
+ readonly admin: "admin";
15
+ readonly tpl: "tpl";
16
+ readonly api: "api";
17
+ };
@@ -0,0 +1,7 @@
1
+ import {
2
+ defaultAcmsPathSegments
3
+ } from "./chunk-OJI2ZTVL.mjs";
4
+ export {
5
+ defaultAcmsPathSegments
6
+ };
7
+ //# sourceMappingURL=defaults.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,7 @@
1
+ export { default as acmsPath } from './acmsPath.js';
2
+ export { default as parseAcmsPath } from './parseAcmsPath.js';
3
+ export { default as createAcmsPathHelper } from './createAcmsPathHelper.js';
4
+ export { default as AcmsFieldList } from './acmsField.js';
5
+ export { defaultAcmsPathSegments } from './defaults.js';
6
+ export { formatDate, splitPath, mergeConfig } from './utils.js';
7
+ export * from './types.js';
package/dist/index.mjs ADDED
@@ -0,0 +1,43 @@
1
+ import {
2
+ createAcmsPathHelper
3
+ } from "./chunk-PHGYMRZK.mjs";
4
+ import {
5
+ parseAcmsPath
6
+ } from "./chunk-GHGJBKQU.mjs";
7
+ import {
8
+ acmsPath
9
+ } from "./chunk-HZZTSXXP.mjs";
10
+ import {
11
+ AcmsFieldList
12
+ } from "./chunk-OUKSKSZA.mjs";
13
+ import {
14
+ isAcmsField,
15
+ isAcmsFilter,
16
+ isConnector,
17
+ isOperator,
18
+ isSeparator
19
+ } from "./chunk-ZDAAXRTI.mjs";
20
+ import {
21
+ formatDate,
22
+ mergeConfig,
23
+ splitPath
24
+ } from "./chunk-XTN64CHF.mjs";
25
+ import {
26
+ defaultAcmsPathSegments
27
+ } from "./chunk-OJI2ZTVL.mjs";
28
+ export {
29
+ AcmsFieldList,
30
+ acmsPath,
31
+ createAcmsPathHelper,
32
+ defaultAcmsPathSegments,
33
+ formatDate,
34
+ isAcmsField,
35
+ isAcmsFilter,
36
+ isConnector,
37
+ isOperator,
38
+ isSeparator,
39
+ mergeConfig,
40
+ parseAcmsPath,
41
+ splitPath
42
+ };
43
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ import type { AcmsContext, ParseAcmsPathOptions } from './types.js';
2
+ export default function parseAcmsPath(path: string, options?: ParseAcmsPathOptions): AcmsContext;
@@ -0,0 +1,11 @@
1
+ import {
2
+ parseAcmsPath
3
+ } from "./chunk-GHGJBKQU.mjs";
4
+ import "./chunk-OUKSKSZA.mjs";
5
+ import "./chunk-ZDAAXRTI.mjs";
6
+ import "./chunk-XTN64CHF.mjs";
7
+ import "./chunk-OJI2ZTVL.mjs";
8
+ export {
9
+ parseAcmsPath as default
10
+ };
11
+ //# sourceMappingURL=parseAcmsPath.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,105 @@
1
+ import { RecursivePartial } from '@ablogcms/types/utils';
2
+ import AcmsFieldList from './acmsField.js';
3
+ export type ApiVersion = 'v1' | 'v2';
4
+ export interface AcmsPathParams {
5
+ blog?: string | number;
6
+ category?: string | string[] | number;
7
+ entry?: string | number;
8
+ user?: number;
9
+ unit?: string;
10
+ tag?: string[];
11
+ field?: string | AcmsFieldList;
12
+ span?: {
13
+ start?: string | Date;
14
+ end?: string | Date;
15
+ };
16
+ date?: {
17
+ year?: number;
18
+ month?: number;
19
+ day?: number;
20
+ };
21
+ page?: number;
22
+ order?: string;
23
+ limit?: number;
24
+ keyword?: string;
25
+ admin?: string;
26
+ tpl?: string;
27
+ api?: string;
28
+ searchParams?: Record<string, any> | URLSearchParams;
29
+ }
30
+ export interface AcmsContext {
31
+ bid?: number;
32
+ cid?: number;
33
+ eid?: number;
34
+ uid?: number;
35
+ utid?: string;
36
+ tag?: string[];
37
+ field?: AcmsFieldList;
38
+ span?: {
39
+ start: string | Date;
40
+ end: string | Date;
41
+ };
42
+ date?: {
43
+ year: number;
44
+ month?: number;
45
+ day?: number;
46
+ };
47
+ page?: number;
48
+ order?: string;
49
+ limit?: number;
50
+ keyword?: string;
51
+ admin?: string;
52
+ tpl?: string;
53
+ api?: string;
54
+ apiVersion?: ApiVersion;
55
+ unresolvedPath?: string;
56
+ }
57
+ export interface AcmsContextWithSearchParams extends AcmsContext {
58
+ searchParams?: Record<string, any> | URLSearchParams;
59
+ }
60
+ export interface AcmsPathSegments {
61
+ bid: string;
62
+ admin: string;
63
+ cid: string;
64
+ eid: string;
65
+ uid: string;
66
+ utid: string;
67
+ tag: string;
68
+ field: string;
69
+ span: string;
70
+ page: string;
71
+ order: string;
72
+ limit: string;
73
+ keyword: string;
74
+ tpl: string;
75
+ api: string;
76
+ }
77
+ export interface AcmsPathConfig {
78
+ segments: AcmsPathSegments;
79
+ apiVersion?: ApiVersion;
80
+ }
81
+ export interface ParseAcmsPathConfig {
82
+ segments: AcmsPathSegments;
83
+ }
84
+ export interface AcmsPathOptions extends RecursivePartial<AcmsPathConfig> {
85
+ }
86
+ export interface ParseAcmsPathOptions extends RecursivePartial<ParseAcmsPathConfig> {
87
+ }
88
+ export type Connector = 'and' | 'or';
89
+ export declare function isConnector(value: any): value is Connector;
90
+ export type Operator = 'eq' | 'neq' | 'gt' | 'lt' | 'gte' | 'lte' | 'lk' | 'nlk' | 're' | 'nre' | 'em' | 'nem';
91
+ export declare function isOperator(value: any): value is Operator;
92
+ export type Separator = '_and_' | '_or_';
93
+ export declare function isSeparator(value: any): value is Separator;
94
+ export interface AcmsFilter {
95
+ operator: Operator;
96
+ value: string;
97
+ connector: Connector;
98
+ }
99
+ export declare function isAcmsFilter(value: any): value is AcmsFilter;
100
+ export interface AcmsField {
101
+ key: string;
102
+ filters: AcmsFilter[];
103
+ separator?: Separator;
104
+ }
105
+ export declare function isAcmsField(value: any): value is AcmsField;
package/dist/types.mjs ADDED
@@ -0,0 +1,15 @@
1
+ import {
2
+ isAcmsField,
3
+ isAcmsFilter,
4
+ isConnector,
5
+ isOperator,
6
+ isSeparator
7
+ } from "./chunk-ZDAAXRTI.mjs";
8
+ export {
9
+ isAcmsField,
10
+ isAcmsFilter,
11
+ isConnector,
12
+ isOperator,
13
+ isSeparator
14
+ };
15
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,11 @@
1
+ export declare function formatDate(date: Date): string;
2
+ export declare function splitPath(path: string): string[];
3
+ /**
4
+ * 設定オブジェクトを深くマージする関数
5
+ * @param defaults - デフォルト設定
6
+ * @param overrides - マージする設定(優先される)
7
+ * @returns マージされた設定
8
+ */
9
+ export declare function mergeConfig(defaults: Record<string, any>, overrides: Record<string, any>): {
10
+ [x: string]: any;
11
+ };
package/dist/utils.mjs ADDED
@@ -0,0 +1,11 @@
1
+ import {
2
+ formatDate,
3
+ mergeConfig,
4
+ splitPath
5
+ } from "./chunk-XTN64CHF.mjs";
6
+ export {
7
+ formatDate,
8
+ mergeConfig,
9
+ splitPath
10
+ };
11
+ //# sourceMappingURL=utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "@ablogcms/url",
3
+ "version": "3.2.28-beta.0",
4
+ "type": "module",
5
+ "description": "a-blog cms の URL 生成・パース・パス規約ヘルパー",
6
+ "license": "MIT",
7
+ "homepage": "https://www.a-blogcms.jp",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+ssh://git@bitbucket.org:appleple/ablogcms.git",
11
+ "directory": "packages/frontend/url"
12
+ },
13
+ "sideEffects": false,
14
+ "dependencies": {
15
+ "parse-nested-form-data": "^1.0.0",
16
+ "qs": "^6.14.0",
17
+ "@ablogcms/types": "3.2.28-beta.0",
18
+ "@ablogcms/utils": "3.2.28-beta.0"
19
+ },
20
+ "devDependencies": {
21
+ "@types/qs": "^6.9.18",
22
+ "vitest": "^4.1.9"
23
+ },
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/index.mjs",
28
+ "default": "./dist/index.mjs"
29
+ },
30
+ "./acms": {
31
+ "types": "./dist/acms.d.ts",
32
+ "import": "./dist/acms.mjs",
33
+ "default": "./dist/acms.mjs"
34
+ },
35
+ "./acms-field": {
36
+ "types": "./dist/acmsField.d.ts",
37
+ "import": "./dist/acmsField.mjs",
38
+ "default": "./dist/acmsField.mjs"
39
+ },
40
+ "./acms-link": {
41
+ "types": "./dist/acmsLink.d.ts",
42
+ "import": "./dist/acmsLink.mjs",
43
+ "default": "./dist/acmsLink.mjs"
44
+ },
45
+ "./acms-path": {
46
+ "types": "./dist/acmsPath.d.ts",
47
+ "import": "./dist/acmsPath.mjs",
48
+ "default": "./dist/acmsPath.mjs"
49
+ },
50
+ "./create-acms-context-from-form-data": {
51
+ "types": "./dist/createAcmsContextFromFormData.d.ts",
52
+ "import": "./dist/createAcmsContextFromFormData.mjs",
53
+ "default": "./dist/createAcmsContextFromFormData.mjs"
54
+ },
55
+ "./create-acms-path-helper": {
56
+ "types": "./dist/createAcmsPathHelper.d.ts",
57
+ "import": "./dist/createAcmsPathHelper.mjs",
58
+ "default": "./dist/createAcmsPathHelper.mjs"
59
+ },
60
+ "./defaults": {
61
+ "types": "./dist/defaults.d.ts",
62
+ "import": "./dist/defaults.mjs",
63
+ "default": "./dist/defaults.mjs"
64
+ },
65
+ "./parse-acms-path": {
66
+ "types": "./dist/parseAcmsPath.d.ts",
67
+ "import": "./dist/parseAcmsPath.mjs",
68
+ "default": "./dist/parseAcmsPath.mjs"
69
+ },
70
+ "./types": {
71
+ "types": "./dist/types.d.ts",
72
+ "import": "./dist/types.mjs",
73
+ "default": "./dist/types.mjs"
74
+ },
75
+ "./utils": {
76
+ "types": "./dist/utils.d.ts",
77
+ "import": "./dist/utils.mjs",
78
+ "default": "./dist/utils.mjs"
79
+ }
80
+ },
81
+ "publishConfig": {
82
+ "access": "public"
83
+ },
84
+ "files": [
85
+ "dist"
86
+ ],
87
+ "scripts": {
88
+ "build": "node ../../../tools/build-package.mjs"
89
+ }
90
+ }