@konomi-app/kintone-utilities 6.2.1 → 6.3.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/character-ime-roman.ts","../src/character-width-conversion.ts","../src/cybozu.ts","../src/cybozu-api/common.ts","../src/cybozu-api/group.ts","../src/cybozu-api/organization.ts","../src/cybozu-api/user.ts","../src/date.ts","../src/decorator.ts","../src/xapp/xapp.ts","../src/xapp/singleton.ts","../src/utilities.ts","../src/event-manager.ts","../src/plugin/config.ts","../src/plugin/local-storage.ts","../src/rest-api/common.ts","../src/rest-api/app.ts","../src/rest-api/record.ts","../src/rest-api/client.ts","../src/rest-api/file.ts","../src/rest-api/record-comment.ts","../src/rest-api/report.ts","../src/rest-api/space.ts","../src/rest-api/utility.ts"],"names":["field","subtable","v","id","buildPath","api","checkBrowser","requests","response"],"mappings":"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A;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAA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","file":"index.js","sourcesContent":["/**\n * IME入力方式に基づく1文字単位のローマ字マッピング\n *\n * ヘボン式(hebonMap)との違い:\n * - 2文字組(きゃ、しゅ等)を使用せず、すべてのひらがな1文字に固定のローマ字を割り当てる\n * - 後続文字に依存する変換が一切ないため、プレフィックスマッチが常に成立する\n */\nconst imeRomanMap: Record<string, string> = {\n あ: 'A',\n い: 'I',\n う: 'U',\n え: 'E',\n お: 'O',\n か: 'KA',\n き: 'KI',\n く: 'KU',\n け: 'KE',\n こ: 'KO',\n さ: 'SA',\n し: 'SI',\n す: 'SU',\n せ: 'SE',\n そ: 'SO',\n た: 'TA',\n ち: 'TI',\n つ: 'TU',\n て: 'TE',\n と: 'TO',\n な: 'NA',\n に: 'NI',\n ぬ: 'NU',\n ね: 'NE',\n の: 'NO',\n は: 'HA',\n ひ: 'HI',\n ふ: 'HU',\n へ: 'HE',\n ほ: 'HO',\n ま: 'MA',\n み: 'MI',\n む: 'MU',\n め: 'ME',\n も: 'MO',\n や: 'YA',\n ゆ: 'YU',\n よ: 'YO',\n ら: 'RA',\n り: 'RI',\n る: 'RU',\n れ: 'RE',\n ろ: 'RO',\n わ: 'WA',\n ゐ: 'WI',\n ゑ: 'WE',\n を: 'WO',\n ん: 'NN',\n が: 'GA',\n ぎ: 'GI',\n ぐ: 'GU',\n げ: 'GE',\n ご: 'GO',\n ざ: 'ZA',\n じ: 'ZI',\n ず: 'ZU',\n ぜ: 'ZE',\n ぞ: 'ZO',\n だ: 'DA',\n ぢ: 'DI',\n づ: 'DU',\n で: 'DE',\n ど: 'DO',\n ば: 'BA',\n び: 'BI',\n ぶ: 'BU',\n べ: 'BE',\n ぼ: 'BO',\n ぱ: 'PA',\n ぴ: 'PI',\n ぷ: 'PU',\n ぺ: 'PE',\n ぽ: 'PO',\n ゔ: 'VU',\n ぁ: 'XA',\n ぃ: 'XI',\n ぅ: 'XU',\n ぇ: 'XE',\n ぉ: 'XO',\n っ: 'XTU',\n ゃ: 'XYA',\n ゅ: 'XYU',\n ょ: 'XYO',\n ー: '',\n};\n\n/**\n * IME入力方式でひらがなをローマ字に変換します。\n *\n * 各ひらがな1文字を固定のローマ字に変換するため、後続文字に依存する変換が一切なく、\n * 文字列に文字を追加しても既存部分のローマ字が変化しません。\n * これによりプレフィックスマッチによるインクリメンタル検索が正しく動作します。\n */\nexport function toIMERoman(s: string): string {\n let result = '';\n for (let i = 0; i < s.length; i++) {\n const mapped = imeRomanMap[s[i]];\n result += mapped !== undefined ? mapped : s[i];\n }\n return result;\n}\n","import { toIMERoman } from './character-ime-roman';\r\n\r\n/**\r\n * カタカナをひらがなに変換します。\r\n *\r\n * @param target - 変換対象の文字列\r\n * @returns カタカナがひらがなに変換された文字列\r\n *\r\n * @example\r\n * ```\r\n * convertKatakanaToHiragana(\"カタカナ\") // => \"かたかな\"\r\n * convertKatakanaToHiragana(\"カタカナとひらがな\") // => \"かたかなとひらがな\"\r\n * ```\r\n */\r\nexport const convertKatakanaToHiragana = (target: string) => {\r\n return target.replace(/[\\u30a1-\\u30f6]/g, (match) =>\r\n String.fromCharCode(match.charCodeAt(0) - 0x60)\r\n );\r\n};\r\n\r\n/**\r\n * 全角英数字を半角英数字に変換します。\r\n *\r\n * @param target - 変換対象の文字列\r\n * @returns 全角英数字が半角英数字に変換された文字列\r\n *\r\n * @example\r\n * ```\r\n * convertFullwidthAlphanumericToHalfwidth(\"ABC123\") // => \"ABC123\"\r\n * convertFullwidthAlphanumericToHalfwidth(\"全角英数字\") // => \"全角英数字\"\r\n * ```\r\n */\r\nexport const convertFullwidthAlphanumericToHalfwidth = (target: string) => {\r\n return target.replace(/[A-Za-z0-9]/g, (s) => String.fromCharCode(s.charCodeAt(0) - 0xfee0));\r\n};\r\n\r\n/**\r\n * 半角カタカナを全角カタカナに変換します。\r\n *\r\n * @param target - 変換対象の文字列\r\n * @returns 半角カタカナが全角カタカナに変換された文字列\r\n *\r\n * @example\r\n * ```\r\n * convertHalfwidthKatakanaToFullwidth(\"カタカナ\") // => \"カタカナ\"\r\n * convertHalfwidthKatakanaToFullwidth(\"半角カタカナ\") // => \"半角カタカナ\"\r\n * ```\r\n */\r\nexport const convertHalfwidthKatakanaToFullwidth = (target: string) => {\r\n const KANA_CONVERTION_MAP = {\r\n ガ: 'ガ',\r\n ギ: 'ギ',\r\n グ: 'グ',\r\n ゲ: 'ゲ',\r\n ゴ: 'ゴ',\r\n ザ: 'ザ',\r\n ジ: 'ジ',\r\n ズ: 'ズ',\r\n ゼ: 'ゼ',\r\n ゾ: 'ゾ',\r\n ダ: 'ダ',\r\n ヂ: 'ヂ',\r\n ヅ: 'ヅ',\r\n デ: 'デ',\r\n ド: 'ド',\r\n バ: 'バ',\r\n ビ: 'ビ',\r\n ブ: 'ブ',\r\n ベ: 'ベ',\r\n ボ: 'ボ',\r\n パ: 'パ',\r\n ピ: 'ピ',\r\n プ: 'プ',\r\n ペ: 'ペ',\r\n ポ: 'ポ',\r\n ヴ: 'ヴ',\r\n ヷ: 'ヷ',\r\n ヺ: 'ヺ',\r\n ア: 'ア',\r\n イ: 'イ',\r\n ウ: 'ウ',\r\n エ: 'エ',\r\n オ: 'オ',\r\n カ: 'カ',\r\n キ: 'キ',\r\n ク: 'ク',\r\n ケ: 'ケ',\r\n コ: 'コ',\r\n サ: 'サ',\r\n シ: 'シ',\r\n ス: 'ス',\r\n セ: 'セ',\r\n ソ: 'ソ',\r\n タ: 'タ',\r\n チ: 'チ',\r\n ツ: 'ツ',\r\n テ: 'テ',\r\n ト: 'ト',\r\n ナ: 'ナ',\r\n ニ: 'ニ',\r\n ヌ: 'ヌ',\r\n ネ: 'ネ',\r\n ノ: 'ノ',\r\n ハ: 'ハ',\r\n ヒ: 'ヒ',\r\n フ: 'フ',\r\n ヘ: 'ヘ',\r\n ホ: 'ホ',\r\n マ: 'マ',\r\n ミ: 'ミ',\r\n ム: 'ム',\r\n メ: 'メ',\r\n モ: 'モ',\r\n ヤ: 'ヤ',\r\n ユ: 'ユ',\r\n ヨ: 'ヨ',\r\n ラ: 'ラ',\r\n リ: 'リ',\r\n ル: 'ル',\r\n レ: 'レ',\r\n ロ: 'ロ',\r\n ワ: 'ワ',\r\n ヲ: 'ヲ',\r\n ン: 'ン',\r\n ァ: 'ァ',\r\n ィ: 'ィ',\r\n ゥ: 'ゥ',\r\n ェ: 'ェ',\r\n ォ: 'ォ',\r\n ッ: 'ッ',\r\n ャ: 'ャ',\r\n ュ: 'ュ',\r\n ョ: 'ョ',\r\n '。': '。',\r\n '、': '、',\r\n ー: 'ー',\r\n '「': '「',\r\n '」': '」',\r\n '・': '・',\r\n };\r\n\r\n const regexp = new RegExp(`(${Object.keys(KANA_CONVERTION_MAP).join('|')})`, 'g');\r\n return target\r\n .replace(regexp, (s) => KANA_CONVERTION_MAP[s as keyof typeof KANA_CONVERTION_MAP])\r\n .replace(/゙/g, '゛')\r\n .replace(/゚/g, '゜');\r\n};\r\n\r\nexport type GetYuruCharaOptions = {\r\n isZenkakuEisujiSensitive: boolean;\r\n isCaseSensitive: boolean;\r\n isHankakuKatakanaSensitive: boolean;\r\n isKatakanaSensitive: boolean;\r\n isHebonSensitive: boolean;\r\n isHyphenSensitive: boolean;\r\n};\r\n\r\n/**\r\n * 指定された文字列に以下の変換をかけて返却します\r\n *\r\n * - 全角英数字を半角英数字へ\r\n * - アルファベットを大文字から小文字へ\r\n * - 半角カナを全角カナへ\r\n * - カタカナをひらがなへ\r\n *\r\n * 各変換はオプションによって制御できます\r\n *\r\n * @param target - 変換対象の文字列\r\n * @param options - 変換オプション\r\n * @param options.isZenkakuEisujiSensitive - 全角英数字を半角に変換するかどうか\r\n * @param options.isCaseSensitive - 大文字小文字を区別するかどうか\r\n * @param options.isHankakuKatakanaSensitive - 半角カタカナを全角カタカナに変換するかどうか\r\n * @param options.isKatakanaSensitive - カタカナをひらがなに変換するかどうか\r\n * @param options.isHebonSensitive - ヘボン式ローマ字に変換するかどうか\r\n * @param options.isHyphenSensitive - ハイフン、ダッシュ、長音を統一するかどうか\r\n * @returns 変換後の文字列\r\n *\r\n * @example\r\n * ```ts\r\n * getYuruChara('アイウエオ') // => 'あいうえお'\r\n * getYuruChara('アイウエオ', { isKatakanaSensitive: true }) // => 'アイウエオ'\r\n * getYuruChara('アイウエオ', { isHankakuKatakanaSensitive: true }) // => 'アイウエオ'\r\n * getYuruChara('ABC123') // => 'abc123'\r\n * getYuruChara('ABC123', { isCaseSensitive: true }) // => 'ABC123'\r\n * getYuruChara('ABC123', { isZenkakuEisujiSensitive: true }) // => 'abc123'\r\n * getYuruChara('ABC123', { isCaseSensitive: true, isZenkakuEisujiSensitive: true }) // => 'ABC123'\r\n * ```\r\n */\r\nexport const getYuruChara = (target: string, options?: Partial<GetYuruCharaOptions>) => {\r\n const {\r\n isZenkakuEisujiSensitive = false,\r\n isCaseSensitive = false,\r\n isHankakuKatakanaSensitive = false,\r\n isKatakanaSensitive = false,\r\n isHebonSensitive = false,\r\n isHyphenSensitive = false,\r\n } = options || {};\r\n\r\n let converted = target;\r\n\r\n if (!isZenkakuEisujiSensitive) {\r\n converted = convertFullwidthAlphanumericToHalfwidth(converted);\r\n }\r\n if (!isHankakuKatakanaSensitive) {\r\n converted = convertHalfwidthKatakanaToFullwidth(converted);\r\n }\r\n if (!isKatakanaSensitive) {\r\n converted = convertKatakanaToHiragana(converted);\r\n }\r\n\r\n if (!isHebonSensitive) {\r\n converted = toIMERoman(converted);\r\n }\r\n\r\n if (!isCaseSensitive) {\r\n converted = converted.toLowerCase();\r\n }\r\n\r\n if (!isHyphenSensitive) {\r\n // ハイフン、ダッシュ、長音を統一\r\n // 連続する場合は、1文字にまとめる\r\n converted = converted.replace(\r\n /[\\u002D\\u2010-\\u2015\\u2212\\u301C\\u30FC\\uFF0D\\u005F\\uFF3F\\uFF5E]+/g,\r\n '-'\r\n );\r\n }\r\n\r\n return converted;\r\n};\r\n","export namespace cx {\r\n export type Schema =\r\n | typeof cybozu.data.page.SCHEMA_DATA\r\n | typeof cybozu.data.page.FORM_DATA.schema;\r\n export type Field = (typeof cybozu.data.page.SCHEMA_DATA.table.fieldList)[string];\r\n export type Subtable = (typeof cybozu.data.page.SCHEMA_DATA.subTable)[string];\r\n}\r\n\r\nconst getSchema = (): cx.Schema | null =>\r\n cybozu?.data?.page?.SCHEMA_DATA || cybozu?.data?.page?.FORM_DATA?.schema || null;\r\n\r\n/**\r\n * **この関数は非公式のAPIを使用しています。kintoneのアップデートにより使用できなくなる可能性があります**\r\n *\r\n * 内部的に使用されている、サブテーブルを除くフィールドのメタデータを取得します\r\n *\r\n * @returns サブテーブルを除くフィールドのメタデータ一覧、またはnull\r\n */\r\nexport const getMetaTable_UNSTABLE = (): cx.Field[] | null => {\r\n const schema = getSchema();\r\n const fieldList = schema?.table?.fieldList;\r\n if (!fieldList) {\r\n return null;\r\n }\r\n\r\n return Object.values(fieldList);\r\n};\r\n\r\n/**\r\n * **この関数は非公式のAPIを使用しています。kintoneのアップデートにより使用できなくなる可能性があります**\r\n *\r\n * 内部的に使用されている、サブテーブルのメタデータを取得します\r\n *\r\n * @returns サブテーブルのメタデータ一覧、またはnull\r\n */\r\nexport const getMetaSubtable_UNSTABLE = (): cx.Subtable[] | null => {\r\n const schema = getSchema();\r\n const subtable = schema?.subTable;\r\n if (!subtable) {\r\n return null;\r\n }\r\n\r\n const subtableList = Object.values(subtable);\r\n return subtableList;\r\n};\r\n\r\n/**\r\n * **この関数は非公式のAPIを使用しています。kintoneのアップデートにより使用できなくなる可能性があります**\r\n *\r\n * 内部的に使用されている、フィールドのメタデータを取得します\r\n *\r\n * サブテーブルとそれ以外とで、データの構造が異なります\r\n *\r\n * @returns フィールドのメタデータ一覧、またはnull\r\n */\r\nexport const getMetaFields_UNSTABLE = (): (cx.Field | cx.Subtable)[] | null => {\r\n return [...(getMetaTable_UNSTABLE() || []), ...(getMetaSubtable_UNSTABLE() || [])];\r\n};\r\n\r\n/**\r\n * **この関数は非公式のAPIを使用しています。kintoneのアップデートにより使用できなくなる可能性があります**\r\n *\r\n * フィールドコードから、紐づくフィールドの内部的に使用されている一意なフィールドIDを返却します\r\n *\r\n * @param code フィールドコード\r\n * @returns フィールドID、またはnull\r\n */\r\nexport const getMetaFieldId_UNSTABLE = <T = any>(code: keyof T) => {\r\n const fields = getMetaFields_UNSTABLE();\r\n if (!fields) {\r\n return null;\r\n }\r\n\r\n for (const field of fields) {\r\n if (field?.var === code) {\r\n return field?.id || null;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * **この関数は非公式のAPIを使用しています。kintoneのアップデートにより使用できなくなる可能性があります**\r\n *\r\n * @param subtableCode サブテーブルのフィールドコード\r\n * @returns サブテーブル内に存在するフィールドのメタデータ一覧、またはnull\r\n */\r\nexport const getMetaSubtableFields_UNSTABLE = (subtableCode: string): cx.Field[] | null => {\r\n const schema = getSchema();\r\n const subtable = schema?.subTable;\r\n if (!subtable) {\r\n return null;\r\n }\r\n\r\n const subtableList = Object.values(subtable);\r\n\r\n for (const subtable of subtableList) {\r\n const fieldList = subtable?.fieldList;\r\n if (!fieldList) {\r\n continue;\r\n }\r\n if (subtable?.var === subtableCode) {\r\n return Object.values(fieldList);\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n * **この関数は非公式のAPIを使用しています。kintoneのアップデートにより使用できなくなる可能性があります**\r\n *\r\n * URLのクエリパラメータに含まれる一覧の検索条件を取得します\r\n * クエリパラメータでは、フィールドのキー情報としてフィールドコードの代わりにフィールドID(f + 数字)が使用されます\r\n *\r\n * 保険として、URLのクエリパラメータに含まれるqパラメータも取得します\r\n *\r\n * 取得する手順は以下の通りです\r\n *\r\n * 1. `cybozu.data.page.QUERY_STRING`\r\n * 2. `new URLSearchParams(location.search).get('q')`\r\n * 3. 空文字\r\n *\r\n * @example\r\n * ```ts\r\n * // URL: https://example.cybozu.com/k/1/?f100000=1&f200000=2\r\n * getQueryString_UNSTABLE(); // => 'f100000=1&f200000=2'\r\n * ```\r\n */\r\nexport const getQueryString_UNSTABLE = () => {\r\n return cybozu?.data?.page?.QUERY_STRING ?? new URLSearchParams(location.search).get('q') ?? '';\r\n};\r\n","import { kintoneAPI } from '../types/api';\r\n\r\nconst buildPath = (endpointName: string) => {\r\n return kintone.api.url(`/v1/${endpointName}`);\r\n};\r\n\r\nexport const api = async <T = any>(params: {\r\n endpointName: string;\r\n method: kintoneAPI.rest.Method;\r\n body: any;\r\n debug?: boolean;\r\n}): Promise<T> => {\r\n const { endpointName, method, body, debug } = params;\r\n try {\r\n checkBrowser();\r\n const path = buildPath(endpointName);\r\n if (debug) {\r\n console.groupCollapsed(\r\n `%ckintone REST API %c(${endpointName})`,\r\n 'color: #1e40af;',\r\n 'color: #aaa'\r\n );\r\n console.log(`path: ${path}`);\r\n console.log(`method: ${method}`);\r\n console.log('body', body);\r\n }\r\n const response: T = await kintone.api(path, method, body);\r\n if (debug) {\r\n console.log('response', response);\r\n }\r\n return response;\r\n } catch (error) {\r\n if (debug) {\r\n console.error(error);\r\n }\r\n throw error;\r\n } finally {\r\n if (debug) {\r\n console.groupEnd();\r\n }\r\n }\r\n};\r\n\r\nexport const checkBrowser = () => {\r\n if (typeof window === 'undefined') {\r\n throw new Error('この関数はブラウザでのみ使用できます');\r\n }\r\n if (typeof kintone === 'undefined') {\r\n throw new Error('kintoneオブジェクトが見つかりません');\r\n }\r\n};\r\n\r\nexport const sliceIntoChunks = <T>(array: T[], size: number): T[][] => {\r\n const result = [];\r\n for (let i = 0, j = array.length; i < j; i += size) {\r\n result.push(array.slice(i, i + size));\r\n }\r\n return result;\r\n};\r\n\r\nexport type WithDebug<T> = T & { debug?: boolean };\r\nexport type WithGuestSpaceId<T> = T & { guestSpaceId?: number | string };\r\nexport type WithCommonRequestParams<T> = WithDebug<WithGuestSpaceId<T>>;\r\nexport type TypeOmmited<T extends Record<string, any>> = {\r\n [P in keyof T]: Omit<T[P], 'type'>;\r\n};\r\n\r\nexport type RecordFrame = Record<string, any>;\r\n\r\nexport type RecordToRequest<T extends RecordFrame = kintoneAPI.RecordData> = Partial<\r\n TypeOmmited<T>\r\n>;\r\n","import { api } from './common';\n\n/**\n * サイボウズのグループ情報を取得します。\n *\n * @returns サイボウズAPIから取得したグループ情報のリストを含むPromise\n * @throws APIエラーが発生した場合にエラーをスローします\n *\n * @example\n * ```typescript\n * // グループ情報を取得する\n * const result = await getCybozuGroups();\n * console.log(result.groups); // グループの配列が出力される\n *\n * // エラーハンドリングと組み合わせる\n * try {\n * const { groups } = await getCybozuGroups();\n * groups.forEach(group => {\n * console.log(`グループ名: ${group.name}, ID: ${group.id}`);\n * });\n * } catch (error) {\n * console.error('グループ取得に失敗しました:', error);\n * }\n * ```\n */\nexport function getCybozuGroups(): Promise<{ groups: cybozu.api.Group[] }> {\n return api({ endpointName: 'groups', method: 'GET', body: {} });\n}\n\n/**\n * サイボウズのグループに所属するユーザー一覧を取得します。\n *\n * 詳細は、[サイボウズのAPIドキュメント](https://cybozu.dev/ja/common/docs/user-api/groups/get-groups-users/)を参照してください。\n *\n * @param groupCode - 取得対象のグループコード\n * @returns グループに所属するユーザー一覧を含むPromise\n * @see {@link getCybozuGroups} グループ情報を取得するための関数\n *\n * @example\n * ```typescript\n * // 営業部グループのユーザー一覧を取得\n * const result = await getCybozuGroupUsers('sales');\n * console.log(result.users); // User[]\n *\n * // 開発チームのユーザー一覧を取得\n * const devTeam = await getCybozuGroupUsers('dev-team');\n * devTeam.users.forEach(user => {\n * console.log(`${user.name}: ${user.email}`);\n * });\n * ```\n */\nexport function getCybozuGroupUsers(groupCode: string): Promise<{ users: cybozu.api.User[] }> {\n return api({ endpointName: 'group/users', method: 'GET', body: { code: groupCode } });\n}\n","import { api } from './common';\n\n/**\n * Cybozu組織情報を取得します。\n *\n * @description\n * このメソッドは、Cybozuのorganizations APIエンドポイントにGETリクエストを送信し、\n * 組織の一覧を取得します。\n *\n * @returns {Promise<{ organizations: cybozu.api.Organization[] }>}\n * 組織情報の配列を含むPromiseオブジェクト\n *\n * @example\n * ```typescript\n * // 組織情報を取得する例\n * const result = await getCybozuOrganizations();\n * console.log(result.organizations); // Organization[]\n *\n * // エラーハンドリングを含む例\n * try {\n * const { organizations } = await getCybozuOrganizations();\n * organizations.forEach(org => {\n * console.log(`組織名: ${org.name}, ID: ${org.id}`);\n * });\n * } catch (error) {\n * console.error('組織情報の取得に失敗しました:', error);\n * }\n * ```\n *\n * @throws {Error} APIリクエストが失敗した場合\n *\n * @since 1.0.0\n */\nexport function getCybozuOrganizations(): Promise<{ organizations: cybozu.api.Organization[] }> {\n return api({ endpointName: 'organizations', method: 'GET', body: {} });\n}\n\n/**\n * サイボウズ組織のユーザー一覧を取得します。\n *\n * 指定された組織コードに所属するユーザーの情報を取得するためのAPIを呼び出します。\n *\n * @param organizationCode - 取得対象の組織コード\n * @returns ユーザー一覧を含むPromiseオブジェクト\n *\n * @example\n * ```typescript\n * // 組織コード \"sales\" のユーザー一覧を取得\n * const result = await getCybozuOrganizationUsers(\"sales\");\n * console.log(result.users); // User[]\n *\n * // エラーハンドリングを含む使用例\n * try {\n * const { users } = await getCybozuOrganizationUsers(\"development\");\n * users.forEach(user => {\n * console.log(`ユーザー名: ${user.name}, ID: ${user.id}`);\n * });\n * } catch (error) {\n * console.error(\"ユーザー取得に失敗しました:\", error);\n * }\n * ```\n */\nexport function getCybozuOrganizationUsers(\n organizationCode: string\n): Promise<{ users: cybozu.api.User[] }> {\n return api({\n endpointName: 'organization/users',\n method: 'GET',\n body: { code: organizationCode },\n });\n}\n","import { api } from './common';\n\n/**\n * サイボウズのユーザ情報を返却します\n * @returns サイボウズのユーザ情報\n */\nexport const getCybozuUsers = (): Promise<{ users: cybozu.api.User[] }> => {\n return api({ endpointName: 'users', method: 'GET', body: {} });\n};\n\n/**\n * ユーザーが所属するグループを返却します\n * @param code ユーザーコード\n * @returns ユーザーが所属するグループ\n */\nexport const getCybozuUserGroups = (code: string): Promise<{ groups: cybozu.api.Group[] }> => {\n return api({ endpointName: `user/groups`, method: 'GET', body: { code } });\n};\n\n/**\n * ユーザーが所属する組織を返却します\n * @param code ユーザーコード\n * @returns ユーザーが所属する組織\n */\nexport const getCybozuUserOrganizations = (\n code: string\n): Promise<{ organizations: cybozu.api.Organization[] }> => {\n return api({ endpointName: `user/organizations`, method: 'GET', body: { code } });\n};\n","export const getWareki = (\r\n date: Date,\r\n option?: { era?: 'narrow' | 'short' | 'long' }\r\n): { gengo: string; year: number } => {\r\n const { era = 'narrow' } = option || {};\r\n\r\n const formatter = new Intl.DateTimeFormat('ja-JP-u-ca-japanese', { era });\r\n\r\n const formatted = formatter.format(date);\r\n const matched = formatted.match(/^(.*?)(\\d+).*/);\r\n if (!matched) {\r\n throw new Error('和暦情報のコンバートに失敗しました');\r\n }\r\n\r\n const [_, gengo, year] = matched;\r\n\r\n return { gengo, year: Number(year) };\r\n};\r\n","/**\n * 指定された関数にロギング機能を追加するデコレータ関数。\n *\n * ログはグループ化され、関数名、引数、戻り値、処理時間が表示される。\n *\n * @template T - 関数の型。\n * @param {T} fn - ロギングを追加する対象の関数。\n * @param {string} [name=fn.name] - ログに表示する関数名。デフォルトは関数の名前。\n * @returns {(...args: Parameters<T>) => ReturnType<T>} ロギング機能が追加された新しい関数。\n *\n * @example\n * const add = (a: number, b: number) => a + b;\n * const addWithLogging = withLogging(add);\n * addWithLogging(2, 3); // ログが出力される\n */\nexport const withLogging = <T extends (...args: any[]) => any>(fn: T, name = fn.name) => {\n return (...args: Parameters<T>): ReturnType<T> => {\n try {\n console.groupCollapsed(`🔧 ${name}`);\n console.log('🔧 args', args);\n const now = performance.now();\n const result = fn(...args);\n console.log('✨ result', result);\n console.log(`🕒 took ${performance.now() - now}ms`);\n return result;\n } finally {\n console.groupEnd();\n }\n };\n};\n","import { kintoneAPI } from '../types/api';\r\n\r\n/**\r\n * kintone javascript APIから実行環境を取得し、モバイル端末である場合はTrueを返却します\r\n *\r\n * 引数としてイベントタイプを設定することで、より安全なチェックを行います\r\n *\r\n * 判定の以下の優先順にしたがって実行されます\r\n *\r\n * 1. イベントタイプに指定がある場合はタイプ名から判定\r\n * 2. グローバル変数が存在する場合はそれに従う\r\n * 3. kintone javascript APIから、アプリIDを取得して判定\r\n *\r\n * @param eventType イベントタイプ\r\n * @returns 実行環境がモバイル端末である場合はtrue\r\n */\r\nexport const isMobile = (eventType?: string): boolean => {\r\n if (eventType) {\r\n return /^mobile\\./.test(eventType);\r\n }\r\n return kintone.app.getId() === null;\r\n};\r\n\r\n/**\r\n * kintone javascript APIのルートオブジェクトを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * 引数としてイベントタイプを設定することで、より安全なチェックを行います\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app} デスクトップ用のルートオブジェクト\r\n * @see {@link kintone.mobile.app} モバイル用のルートオブジェクト\r\n *\r\n * @param eventType イベントタイプ\r\n * @returns kintone javascript APIのルートオブジェクト\r\n */\r\nexport const getAppObject = (eventType?: string): typeof kintone.mobile.app | typeof kintone.app =>\r\n isMobile(eventType) ? kintone.mobile.app : kintone.app;\r\n\r\n/**\r\n * kintone javascript APIを使用し、現在のアプリIDを返却します\r\n *\r\n * アプリIDの取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.getId} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.getId} モバイル版の関数\r\n *\r\n * @returns 現在のアプリID、またはnull\r\n */\r\nexport const getAppId = (): number | null => getAppObject().getId();\r\n\r\n/**\r\n * kintone javascript APIを使用し、現在のレコードIDを返却します\r\n *\r\n * レコードIDの取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.record.getId} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.record.getId} モバイル版の関数\r\n *\r\n * @returns 現在のレコードID、またはnull\r\n */\r\nexport const getRecordId = (): number | null => getAppObject().record.getId();\r\n\r\n/**\r\n * kintone javascript APIを使用し、指定されたIDのスペースフィールドを返却します\r\n *\r\n * スペースフィールドの取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.record.getSpaceElement} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.record.getSpaceElement} モバイル版の関数\r\n *\r\n * @returns 指定されたIDのスペースフィールド、またはnull\r\n */\r\nexport const getSpaceElement = (spaceId: string): HTMLElement | null =>\r\n getAppObject().record.getSpaceElement(spaceId);\r\n\r\n/**\r\n * kintone javascript APIを使用し、オプションを含むレコード一覧のクエリ文字列を返却します\r\n *\r\n * クエリ文字列の取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.getQuery} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.getQuery} モバイル版の関数\r\n *\r\n * @returns オプションを含むレコード一覧のクエリ文字列、またはnull\r\n */\r\nexport const getQuery = (): string | null => getAppObject().getQuery();\r\n\r\n/**\r\n * kintone javascript APIを使用し、レコード一覧のクエリ文字列を返却します\r\n *\r\n * クエリ文字列の取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.getQueryCondition} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.getQueryCondition} モバイル版の関数\r\n *\r\n * @returns レコード一覧のクエリ文字列、またはnull\r\n */\r\nexport const getQueryCondition = (): string | null => getAppObject().getQueryCondition();\r\n\r\n/**\r\n * kintone javascript APIを使用し、現在開いてるレコードデータをJSON形式で返却します\r\n *\r\n * レコードデータの取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.record.get} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.record.get} モバイル版の関数\r\n *\r\n * @returns レコードデータ、またはnull\r\n */\r\nexport const getCurrentRecord = <T = kintoneAPI.RecordData>(): { record: T } =>\r\n getAppObject().record.get();\r\n\r\n/**\r\n * kintone javascript APIを使用し、現在開いてるレコードに値をセットします\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * {@link https://developer.cybozu.io/hc/ja/articles/201942014#step4}\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.record.set} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.record.set} モバイル版の関数\r\n */\r\nexport const setCurrentRecord = (record: { record: any }): void =>\r\n getAppObject().record.set(record);\r\n\r\n/**\r\n * kintone javascript APIを使用し、フィールドの表示/非表示を切り替えます\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.record.setFieldShown} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.record.setFieldShown} モバイル版の関数\r\n *\r\n * @param code 対象フィールドのフィールドコード\r\n * @param visible true: フィールドを表示、false: フィールドを非表示\r\n */\r\nexport const setFieldShown = <T = Record<string, unknown>>(code: keyof T, visible: boolean): void =>\r\n getAppObject().record.setFieldShown(String(code), visible);\r\n\r\n/**\r\n * kintone javascript APIを使用し、ツールバー部分を優先してヘッダー要素を返します\r\n *\r\n * ヘッダー要素の取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n *\r\n * @param eventType イベントタイプ\r\n * @returns レコードデータ、またはnull\r\n */\r\nexport const getHeaderSpace = (eventType: string): HTMLElement | null => {\r\n if (isMobile(eventType)) {\r\n kintone.mobile.app.getHeaderSpaceElement();\r\n } else if (!~eventType.indexOf('index')) {\r\n return kintone.app.record.getHeaderMenuSpaceElement();\r\n }\r\n return kintone.app.getHeaderMenuSpaceElement();\r\n};\r\n\r\n/**\r\n * kintone javascript APIを使用し、レコードに対応するフィールド要素を返却します\r\n *\r\n * フィールド要素の取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.record.getFieldElement} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.record.getFieldElement} モバイル版の関数\r\n *\r\n * @param fieldCode 対象フィールドのフィールドコード\r\n * @returns フィールド要素、またはnull\r\n */\r\nexport const getFieldElement = (fieldCode: string): HTMLElement | null => {\r\n return getAppObject().record.getFieldElement(fieldCode);\r\n};\r\n\r\n/**\r\n * kintone javascript APIを使用し、レコード一覧から対応するフィールド要素の配列を返却します\r\n *\r\n * フィールド要素の取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.getFieldElements} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.getFieldElements} モバイル版の関数\r\n *\r\n * @param fieldCode 対象フィールドのフィールドコード\r\n * @returns フィールド要素の配列、またはnull\r\n */\r\nexport const getFieldElements = (fieldCode: string): HTMLElement[] | null => {\r\n return getAppObject().getFieldElements(fieldCode);\r\n};\r\n","import { getAppObject } from './xapp';\n\n/**\n * kintone javascript APIのルートオブジェクト\n */\nexport const xapp = getAppObject();\n","import type { kintoneAPI } from './types/api';\r\nimport type { SavedFields } from './utility-types';\r\n\r\n/**\r\n * kintone の数値フィールドの値を指定された形式の文字列として取得します。\r\n *\r\n * @param params - 関数のパラメータオブジェクト\r\n * @param params.field - 数値フィールドの値を含むオブジェクト\r\n * @param params.property - フィールドのプロパティ設定(表示スケール、桁区切り、単位など)\r\n * @param params.locales - ロケール情報(オプション、デフォルトは 'ja')\r\n * @returns フォーマットされた数値の文字列\r\n *\r\n * @example\r\n * ```typescript\r\n * const params = {\r\n * field: { value: \"1234.56\" },\r\n * property: {\r\n * displayScale: \"2\",\r\n * digit: true,\r\n * unit: \"$\",\r\n * unitPosition: \"BEFORE\"\r\n * },\r\n * locales: 'en-US',\r\n * };\r\n * const result = getNumberFieldValueAsString(params);\r\n * // result: \"$1,234.56\"\r\n * ```\r\n */\r\nexport const getNumberFieldValueAsString = (params: {\r\n field: kintoneAPI.field.Number;\r\n property: kintoneAPI.property.Number;\r\n locales?: Intl.LocalesArgument;\r\n}): string => {\r\n const { field, property, locales = 'ja' } = params;\r\n\r\n const casted = Number(field.value);\r\n if (isNaN(casted)) {\r\n return field.value;\r\n }\r\n\r\n const displayScale = property?.displayScale ? Number(property.displayScale) : null;\r\n\r\n const scaled = displayScale\r\n ? Math.round(casted * Math.pow(10, Number(displayScale))) / Math.pow(10, Number(displayScale))\r\n : casted;\r\n\r\n const separated = property?.digit\r\n ? Number(scaled).toLocaleString(locales, {\r\n maximumFractionDigits: displayScale ?? undefined,\r\n minimumFractionDigits: displayScale ?? undefined,\r\n })\r\n : displayScale\r\n ? Number(scaled).toFixed(displayScale)\r\n : scaled;\r\n\r\n if (property?.unit) {\r\n if (property.unitPosition === 'BEFORE') {\r\n return `${property.unit}${separated}`;\r\n } else {\r\n return `${separated}${property.unit}`;\r\n }\r\n }\r\n\r\n return String(separated);\r\n};\r\n\r\n/**\r\n * 各フィールドタイプの値を文字列として返却します\r\n *\r\n * 配列で取得されるような値は区切り文字で連結されます\r\n * @param field\r\n * @param options\r\n * @returns\r\n */\r\nexport const getFieldValueAsString = (\r\n field: kintoneAPI.Field | SavedFields,\r\n options?: {\r\n separator?: string;\r\n ignoresCalculationError?: boolean;\r\n }\r\n): string => {\r\n const { separator = ', ', ignoresCalculationError = false } = options ?? {};\r\n\r\n if (\r\n field.type === 'MULTI_LINE_TEXT' ||\r\n field.type === 'RICH_TEXT' ||\r\n field.type === 'CREATED_TIME' ||\r\n field.type === 'DATE' ||\r\n field.type === 'DATETIME' ||\r\n field.type === 'DROP_DOWN' ||\r\n field.type === 'LINK' ||\r\n field.type === 'RECORD_NUMBER' ||\r\n field.type === 'STATUS' ||\r\n field.type === 'RADIO_BUTTON' ||\r\n field.type === 'TIME' ||\r\n field.type === 'UPDATED_TIME' ||\r\n field.type === '__ID__' ||\r\n field.type === '__REVISION__'\r\n ) {\r\n return field.value ?? '';\r\n } else if (\r\n field.type === 'SINGLE_LINE_TEXT' ||\r\n field.type === 'NUMBER' ||\r\n field.type === 'CALC'\r\n ) {\r\n const value = field.value ?? '';\r\n if (ignoresCalculationError) {\r\n return /^#.*!$/.test(value) ? '' : value;\r\n }\r\n return value;\r\n } else if (\r\n field.type === 'CATEGORY' ||\r\n field.type === 'CHECK_BOX' ||\r\n field.type === 'MULTI_SELECT'\r\n ) {\r\n return field.value.join(separator);\r\n } else if (field.type === 'CREATOR' || field.type === 'MODIFIER') {\r\n return field.value.name;\r\n } else if (\r\n field.type === 'GROUP_SELECT' ||\r\n field.type === 'ORGANIZATION_SELECT' ||\r\n field.type === 'USER_SELECT' ||\r\n field.type === 'STATUS_ASSIGNEE'\r\n ) {\r\n return field.value.map((value) => value.name).join(separator);\r\n } else if (field.type === 'FILE') {\r\n return field.value.map((value) => value.name).join(separator);\r\n } else if (field.type === 'SUBTABLE') {\r\n return field.value\r\n .map((row) =>\r\n Object.values(row.value)\r\n .map((cell) => getFieldValueAsString(cell, { separator }))\r\n .join(separator)\r\n )\r\n .join(separator);\r\n }\r\n return '';\r\n};\r\n\r\n/** 受け取ったフィールドが文字列として管理されるフィールドであれば`true`を返します */\r\nconst isStringField = (\r\n field: kintoneAPI.Field\r\n): field is\r\n | kintoneAPI.field.SingleLineText\r\n | kintoneAPI.field.MultiLineText\r\n | kintoneAPI.field.RichText\r\n | kintoneAPI.field.Dropdown\r\n | kintoneAPI.field.Link\r\n | kintoneAPI.field.RecordNumber\r\n | kintoneAPI.field.Status\r\n | kintoneAPI.field.RadioButton\r\n | kintoneAPI.field.ID\r\n | kintoneAPI.field.Revision => {\r\n return (\r\n field.type === 'SINGLE_LINE_TEXT' ||\r\n field.type === 'MULTI_LINE_TEXT' ||\r\n field.type === 'RICH_TEXT' ||\r\n field.type === 'DROP_DOWN' ||\r\n field.type === 'LINK' ||\r\n field.type === 'RECORD_NUMBER' ||\r\n field.type === 'STATUS' ||\r\n field.type === 'RADIO_BUTTON' ||\r\n field.type === '__ID__' ||\r\n field.type === '__REVISION__'\r\n );\r\n};\r\n\r\n/** 受け取ったフィールドが数値として管理されるフィールドであれば`true`を返します */\r\nconst isNumberField = (\r\n field: kintoneAPI.Field\r\n): field is kintoneAPI.field.Number | kintoneAPI.field.Calc => {\r\n return field.type === 'NUMBER' || field.type === 'CALC';\r\n};\r\n\r\n/** 受け取ったフィールドが日付として管理されるフィールドであれば`true`を返します */\r\nconst isDateField = (\r\n field: kintoneAPI.Field\r\n): field is\r\n | kintoneAPI.field.CreatedTime\r\n | kintoneAPI.field.UpdatedTime\r\n | kintoneAPI.field.Date\r\n | kintoneAPI.field.DateTime => {\r\n return (\r\n field.type === 'CREATED_TIME' ||\r\n field.type === 'UPDATED_TIME' ||\r\n field.type === 'DATE' ||\r\n field.type === 'DATETIME'\r\n );\r\n};\r\n\r\n/** 受け取ったフィールドが時間フィールドであれば`true`を返します */\r\nconst isTimeField = (field: kintoneAPI.Field): field is kintoneAPI.field.Time => {\r\n return field.type === 'TIME';\r\n};\r\n\r\n/**\r\n * 各フィールドのタイプに応じて、ソートを行います\r\n *\r\n * @param aField ソート対象のフィールド\r\n * @param bField ソート対象のフィールド\r\n * @returns aFieldがbFieldより小さい場合は負の整数、aFieldがbFieldより大きい場合は正の整数、等しい場合は0\r\n */\r\nexport const sortField = <T extends kintoneAPI.Field>(aField: T, bField: T): number => {\r\n const aFieldType = aField.type;\r\n const bFieldType = bField.type;\r\n\r\n if (aField.value === null && bField.value === null) {\r\n return 0;\r\n }\r\n if (aField.value === null) {\r\n return 1;\r\n }\r\n if (bField.value === null) {\r\n return -1;\r\n }\r\n\r\n if (aFieldType === 'RECORD_NUMBER' && bFieldType === 'RECORD_NUMBER') {\r\n // レコード番号は文字列だが、`アプリコード-連番`の形式で保存されているため、連番の部分を数値として比較する\r\n const regex = /.*?(\\d+)$/;\r\n const aMatch = aField.value.match(regex);\r\n const bMatch = bField.value.match(regex);\r\n if (aMatch && bMatch) {\r\n const aNumber = Number(aMatch[1]);\r\n const bNumber = Number(bMatch[1]);\r\n if (isNaN(aNumber) && isNaN(bNumber)) {\r\n return 0;\r\n }\r\n return Number(aMatch[1]) - Number(bMatch[1]);\r\n }\r\n return aField.value.localeCompare(bField.value);\r\n } else if (isStringField(aField) && isStringField(bField)) {\r\n return aField.value?.localeCompare(bField.value ?? '') ?? 0;\r\n } else if (isNumberField(aField) && isNumberField(bField)) {\r\n const aNum = Number(aField.value);\r\n const bNum = Number(bField.value);\r\n if (isNaN(aNum) && isNaN(bNum)) {\r\n return 0;\r\n }\r\n if (isNaN(aNum)) {\r\n return 1;\r\n }\r\n if (isNaN(bNum)) {\r\n return -1;\r\n }\r\n return aNum - bNum;\r\n } else if (isDateField(aField) && isDateField(bField)) {\r\n const aDate = new Date(aField.value);\r\n const bDate = new Date(bField.value);\r\n if (isNaN(aDate.getTime()) && isNaN(bDate.getTime())) {\r\n return 0;\r\n }\r\n if (isNaN(aDate.getTime())) {\r\n return 1;\r\n }\r\n if (isNaN(bDate.getTime())) {\r\n return -1;\r\n }\r\n return aDate.getTime() - bDate.getTime();\r\n } else if (isTimeField(aField) && isTimeField(bField)) {\r\n // TIME フィールドは \"HH:mm\" 形式の文字列なので、分に変換して比較する\r\n const parseTime = (value: string): number => {\r\n const [hours, minutes] = value.split(':').map(Number);\r\n if (isNaN(hours) || isNaN(minutes)) {\r\n return NaN;\r\n }\r\n return hours * 60 + minutes;\r\n };\r\n const aTime = parseTime(aField.value);\r\n const bTime = parseTime(bField.value);\r\n if (isNaN(aTime) && isNaN(bTime)) {\r\n return 0;\r\n }\r\n if (isNaN(aTime)) {\r\n return 1;\r\n }\r\n if (isNaN(bTime)) {\r\n return -1;\r\n }\r\n return aTime - bTime;\r\n } else if (\r\n (aFieldType === 'CATEGORY' || aFieldType === 'CHECK_BOX' || aFieldType === 'MULTI_SELECT') &&\r\n (bFieldType === 'CATEGORY' || bFieldType === 'CHECK_BOX' || bFieldType === 'MULTI_SELECT')\r\n ) {\r\n return getFieldValueAsString(aField).localeCompare(getFieldValueAsString(bField));\r\n } else if (\r\n (aFieldType === 'CREATOR' || aFieldType === 'MODIFIER') &&\r\n (bFieldType === 'CREATOR' || bFieldType === 'MODIFIER')\r\n ) {\r\n return aField.value.name.localeCompare(bField.value.name);\r\n } else if (\r\n (aFieldType === 'GROUP_SELECT' ||\r\n aFieldType === 'ORGANIZATION_SELECT' ||\r\n aFieldType === 'USER_SELECT' ||\r\n aFieldType === 'STATUS_ASSIGNEE') &&\r\n (bFieldType === 'GROUP_SELECT' ||\r\n bFieldType === 'ORGANIZATION_SELECT' ||\r\n bFieldType === 'USER_SELECT' ||\r\n bFieldType === 'STATUS_ASSIGNEE')\r\n ) {\r\n return getFieldValueAsString(aField).localeCompare(getFieldValueAsString(bField));\r\n } else if (aFieldType === 'FILE' && bFieldType === 'FILE') {\r\n return getFieldValueAsString(aField).localeCompare(getFieldValueAsString(bField));\r\n } else if (aFieldType === 'SUBTABLE' && bFieldType === 'SUBTABLE') {\r\n return getFieldValueAsString(aField).localeCompare(getFieldValueAsString(bField));\r\n }\r\n return 0;\r\n};\r\n\r\n/**\r\n * 計算フィールドの値と設定情報を基に、画面表示用の値を返却します\r\n */\r\nexport const getCalcFieldValueAsString = (params: {\r\n field: kintoneAPI.field.Calc;\r\n property: kintoneAPI.property.Calc;\r\n}) => {\r\n const { field, property } = params;\r\n const { unit, unitPosition, format } = property;\r\n let fieldValue: string = '';\r\n\r\n switch (format) {\r\n case 'NUMBER_DIGIT':\r\n if (property.displayScale) {\r\n const displayScale = Number(property.displayScale || 0);\r\n const scaled = Math.round(Number(field.value) * 10 ** displayScale) / 10 ** displayScale;\r\n fieldValue = scaled.toLocaleString();\r\n } else {\r\n fieldValue = Number(field.value).toLocaleString();\r\n }\r\n break;\r\n case 'DATE':\r\n fieldValue = new Date(field.value).toLocaleDateString();\r\n break;\r\n case 'TIME':\r\n fieldValue = new Date(field.value).toLocaleTimeString();\r\n break;\r\n case 'DATETIME':\r\n fieldValue = new Date(field.value).toLocaleString();\r\n break;\r\n case 'HOUR_MINUTE':\r\n const [h, m] = field.value.split(':');\r\n fieldValue = `${h}時間${m}分`;\r\n break;\r\n case 'DAY_HOUR_MINUTE':\r\n const [hourString, minute] = field.value.split(':');\r\n const hour = Number(hourString);\r\n const day = Math.floor(hour / 24);\r\n const hourInDay = hour % 24;\r\n fieldValue = `${day}日${hourInDay}時間${minute}分`;\r\n break;\r\n default:\r\n fieldValue = field.value;\r\n }\r\n\r\n if (unit) {\r\n if (unitPosition === 'BEFORE') {\r\n fieldValue = unit + fieldValue;\r\n } else {\r\n fieldValue += unit;\r\n }\r\n }\r\n return fieldValue;\r\n};\r\n\r\n/**\r\n * フィールドのタイプに応じて、空の値を返却します\r\n * @param field クリア対象のフィールド\r\n * @returns クリア後のフィールドの値\r\n */\r\nexport const getEmptyValue = (\r\n params: { type: kintoneAPI.Field['type'] } | { field: kintoneAPI.Field }\r\n): kintoneAPI.Field['value'] => {\r\n let type;\r\n if ('type' in params) {\r\n type = params.type;\r\n } else {\r\n type = params.field.type;\r\n }\r\n switch (type) {\r\n case '__ID__':\r\n case '__REVISION__':\r\n case 'CALC':\r\n case 'CREATED_TIME':\r\n case 'UPDATED_TIME':\r\n case 'CREATOR':\r\n case 'MODIFIER':\r\n if ('field' in params) {\r\n console.warn(\r\n `[kintone-utilities]: ${params.field.type}はクリアできないため、処理をスキップしました`\r\n );\r\n return params.field.value;\r\n }\r\n return null;\r\n case 'SINGLE_LINE_TEXT':\r\n case 'NUMBER':\r\n case 'MULTI_LINE_TEXT':\r\n case 'RICH_TEXT':\r\n case 'DATE':\r\n case 'TIME':\r\n case 'DATETIME':\r\n case 'DROP_DOWN':\r\n case 'LINK':\r\n case 'RECORD_NUMBER':\r\n case 'STATUS':\r\n case 'RADIO_BUTTON':\r\n return '';\r\n case 'CATEGORY':\r\n case 'CHECK_BOX':\r\n case 'MULTI_SELECT':\r\n case 'USER_SELECT':\r\n case 'GROUP_SELECT':\r\n case 'ORGANIZATION_SELECT':\r\n case 'STATUS_ASSIGNEE':\r\n case 'FILE':\r\n return [];\r\n case 'SUBTABLE':\r\n if ('field' in params) {\r\n return (params.field as kintoneAPI.field.Subtable).value.map((row) => ({\r\n ...row,\r\n value: Object.entries(row.value).reduce(\r\n (acc, [key, cell]) => ({ ...acc, [key]: getEmptyValue(cell) }),\r\n {}\r\n ),\r\n }));\r\n }\r\n default:\r\n //@ts-expect-error\r\n throw new Error(`未対応のフィールドタイプです: ${field.type}`);\r\n }\r\n};\r\n\r\nexport const getDefaultValue = (property: kintoneAPI.FieldProperty) => {\r\n switch (property.type) {\r\n case 'SINGLE_LINE_TEXT':\r\n case 'NUMBER':\r\n case 'MULTI_LINE_TEXT':\r\n case 'RICH_TEXT':\r\n case 'DROP_DOWN':\r\n case 'RADIO_BUTTON':\r\n case 'LINK':\r\n return 'defaultValue' in property ? property.defaultValue ?? '' : '';\r\n case 'DATE':\r\n const { defaultValue, defaultNowValue } = property;\r\n if (defaultValue) {\r\n return defaultValue;\r\n }\r\n return defaultNowValue ? new Date().toISOString().split('T')[0] : '';\r\n case 'TIME':\r\n const { defaultNowValue: n, defaultValue: v } = property;\r\n if (v) {\r\n return v;\r\n }\r\n return n ? new Date().toISOString().split('T')[1].split('.')[0] : '';\r\n case 'DATETIME':\r\n const { defaultNowValue: now, defaultValue: value } = property;\r\n if (value) {\r\n return value;\r\n }\r\n return now ? new Date().toISOString() : '';\r\n case 'CHECK_BOX':\r\n case 'MULTI_SELECT':\r\n case 'USER_SELECT':\r\n case 'GROUP_SELECT':\r\n case 'ORGANIZATION_SELECT':\r\n if (!('defaultValue' in property)) {\r\n return [];\r\n }\r\n const { defaultValue: d } = property;\r\n return d.map((v) => {\r\n if (typeof v === 'string') {\r\n return { code: v, name: v };\r\n }\r\n switch (v.type) {\r\n case 'USER':\r\n case 'GROUP':\r\n case 'ORGANIZATION':\r\n return { code: v.code, name: v.code };\r\n case 'FUNCTION':\r\n if (v.code === 'LOGINUSER()') {\r\n const loginUser = kintone.getLoginUser();\r\n return { code: loginUser.code, name: loginUser.name };\r\n }\r\n return [];\r\n default:\r\n return [];\r\n }\r\n });\r\n case 'STATUS':\r\n case 'CATEGORY':\r\n case 'RECORD_NUMBER':\r\n return null;\r\n }\r\n};\r\n\r\nexport const compareField = (\r\n field1: kintoneAPI.Field,\r\n field2: kintoneAPI.Field,\r\n options?: { ignoresType?: boolean }\r\n): boolean => {\r\n const { ignoresType = false } = options ?? {};\r\n\r\n if (!ignoresType && field1.type !== field2.type) {\r\n return false;\r\n }\r\n\r\n const separator = '$';\r\n return (\r\n getFieldValueAsString(field1, { separator }) === getFieldValueAsString(field2, { separator })\r\n );\r\n};\r\n\r\n/**\r\n * デスクトップ版のイベントタイプを基に、モバイル版を追加し返却します\r\n * @param events デスクトップのイベントタイプ\r\n * @returns モバイルを含むイベントタイプ\r\n */\r\nexport const withMobileEvents = (events: string[]): string[] => {\r\n const mobileEvents = events.filter((e) => !/^mobile/.test(e)).map((type) => 'mobile.' + type);\r\n return [...new Set([...events, ...mobileEvents])];\r\n};\r\n\r\n/**\r\n * 現在実行されている環境がゲストスペースかどうかを判定します\r\n *\r\n * ゲストスペースである場合は、ゲストスペースIDを返却します\r\n *\r\n * @returns ゲストスペースID\r\n */\r\nexport const detectGuestSpaceId = (): string | null => {\r\n const match = location.pathname.match(/^\\/k\\/guest\\/(\\d+)\\//);\r\n return match ? match[1] : null;\r\n};\r\n\r\nexport type OnFileLoadOptions = {\r\n encoding?: string;\r\n};\r\n\r\nexport const onFileLoad = (file: File | Blob, options?: OnFileLoadOptions) => {\r\n const { encoding = 'utf-8' } = options ?? {};\r\n\r\n return new Promise<ProgressEvent<FileReader>>((resolve, reject) => {\r\n try {\r\n const reader = new FileReader();\r\n\r\n reader.readAsText(file, encoding);\r\n\r\n reader.onload = (event) => resolve(event);\r\n reader.onerror = (event) => reject(event);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * クエリからソート条件を取得します。\r\n *\r\n * kintone.app.getQuery()の結果を想定しています。\r\n *\r\n * @param query クエリ文字列\r\n * @returns ソート条件の文字列\r\n * @see {@link https://cybozu.dev/ja/kintone/docs/js-api/app/get-record-list-query-with-order-by-limit-offset/ レコード一覧のクエリ文字列を取得する(オプション付き)}\r\n * @example\r\n * ```js\r\n * const query = kintone.app.getQuery(); // \"order by フィールド1 asc, フィールド2 desc limit 100 offset 0\"\r\n * const sort = getSortFromQuery(query); // [{ field: 'フィールド1', order: 'asc' }, { field: 'フィールド2', order: 'desc' }]\r\n * ```\r\n */\r\nexport const getSortFromQuery = (query: string): { field: string; order: 'asc' | 'desc' }[] => {\r\n const sort = query.match(/order by (.*)?(?=( limit | offset|$))/)?.[1];\r\n if (!sort) {\r\n return [];\r\n }\r\n return sort.split(',').map((s) => {\r\n const [field, order] = s.trim().split(' ');\r\n return { field, order: order as 'asc' | 'desc' };\r\n });\r\n};\r\n","import { getHeaderSpace } from './xapp';\r\nimport type { kintoneAPI } from './types/api';\r\nimport { detectGuestSpaceId, withMobileEvents } from './utilities';\r\n\r\ntype ErrorHandler = (error: any, props: { event: kintoneAPI.js.Event }) => kintoneAPI.js.Event;\r\n\r\ntype ConstructorProps = Partial<{\r\n errorHandler: ErrorHandler;\r\n pluginId: string;\r\n logDisabled: boolean;\r\n logPrefix: string;\r\n}>;\r\n\r\ntype CallbackOption = { pluginId?: string; guestSpaceId: string | null };\r\n\r\nexport class KintoneEventManager {\r\n readonly #uid: string = Math.random().toString(36).slice(2);\r\n readonly #pluginId?: string;\r\n readonly #commonErrorHandler: ErrorHandler;\r\n readonly #guestSpaceId: string | null;\r\n #logDisabled: boolean;\r\n #logPrefix: string;\r\n\r\n /**\r\n * 複数の処理を、各イベントに登録することができます\r\n */\r\n public constructor(props?: ConstructorProps) {\r\n const {\r\n errorHandler = (error: any) => {\r\n throw error;\r\n },\r\n pluginId,\r\n logDisabled = false,\r\n logPrefix = '',\r\n } = props ?? {};\r\n\r\n const guestSpaceId = detectGuestSpaceId();\r\n\r\n this.#commonErrorHandler = errorHandler;\r\n this.#pluginId = pluginId;\r\n this.#guestSpaceId = guestSpaceId;\r\n this.#logDisabled = logDisabled;\r\n this.#logPrefix = logPrefix;\r\n }\r\n\r\n /**\r\n * **この関数は`kintone.events.on`の代替関数です. 引数に互換性があります.**\r\n *\r\n * デスクトップ版のイベントを指定することで自動的に対応するモバイル版のイベントが登録されます.\r\n * また、インスタンス作成時に指定したエラーハンドラが、コールバック関数のエラー発生時に実行されます\r\n * @param events\r\n * @param callback\r\n */\r\n public add = <T = kintoneAPI.RecordData>(\r\n events: kintoneAPI.js.EventType[],\r\n callback: (\r\n event: kintoneAPI.js.Event<T>,\r\n options: CallbackOption\r\n ) => kintoneAPI.js.Event<T> | Promise<kintoneAPI.js.Event<T>>\r\n ) => {\r\n kintone.events.on(withMobileEvents(events), async (event) => {\r\n try {\r\n this.initialize(event);\r\n return await callback(event, {\r\n pluginId: this.#pluginId,\r\n guestSpaceId: this.#guestSpaceId,\r\n });\r\n } catch (error) {\r\n return await this.#commonErrorHandler(error, { event });\r\n } finally {\r\n this.tarminate();\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Changeイベントを登録します\r\n *\r\n * ChangeイベントはPromiseオブジェクトを返却することができません\r\n * @param events\r\n * @param callback\r\n */\r\n public addChangeEvents = <T = kintoneAPI.RecordData>(\r\n events: string[],\r\n callback: (event: kintoneAPI.js.Event<T>, options: CallbackOption) => kintoneAPI.js.Event<T>\r\n ) => {\r\n kintone.events.on(withMobileEvents(events), (event) => {\r\n try {\r\n this.initialize(event);\r\n return callback(event, { pluginId: this.#pluginId, guestSpaceId: this.#guestSpaceId });\r\n } catch (error) {\r\n return this.#commonErrorHandler(error, { event });\r\n } finally {\r\n this.tarminate();\r\n }\r\n });\r\n };\r\n\r\n public addHeaderButton(params: {\r\n id: string;\r\n label: string;\r\n color?: 'default' | 'blue' | 'red' | 'yellow';\r\n isButtonHidden?: (event: kintoneAPI.js.Event) => boolean | Promise<boolean>;\r\n onClick: () => void | Promise<void>;\r\n events: kintoneAPI.js.EventType[];\r\n isTolerantToFailure?: boolean;\r\n }) {\r\n const {\r\n id,\r\n label,\r\n color = 'default',\r\n onClick,\r\n isButtonHidden,\r\n events,\r\n isTolerantToFailure = false,\r\n } = params;\r\n\r\n this.addButtonStyle();\r\n\r\n this.add(events, async (event) => {\r\n if (isButtonHidden && (await isButtonHidden(event))) {\r\n return event;\r\n }\r\n\r\n if (document.getElementById(id)) {\r\n return event;\r\n }\r\n const headerSpace = getHeaderSpace(event.type);\r\n if (!headerSpace) {\r\n const message = `ヘッダーにボタンを追加することができませんでした。${event.type}イベントが発生したタイミングには、対象要素が存在しない可能性があります`;\r\n if (!isTolerantToFailure) {\r\n throw new Error(message);\r\n }\r\n console.error(message);\r\n return event;\r\n }\r\n\r\n const root = document.createElement('button');\r\n root.id = id;\r\n root.textContent = label;\r\n root.className = 'rkemb';\r\n root.dataset.color = color;\r\n root.addEventListener('click', onClick);\r\n headerSpace.append(root);\r\n\r\n return event;\r\n });\r\n }\r\n\r\n private addButtonStyle = () => {\r\n if (document.querySelector('style[data-rkem]')) {\r\n return;\r\n }\r\n\r\n const style = document.createElement('style');\r\n style.dataset.rkem = '';\r\n document.head.append(style);\r\n style.textContent = `\r\n\r\n:root {\r\n --rkemb-color-blue-lighter: #57aae1;\r\n --rkemb-color-blue-light: #4ba4df;\r\n --rkemb-color-blue: #3498db;\r\n --rkemb-color-blue-dark: #258bcf;\r\n --rkemb-color-blue-darker: #2383c4;\r\n}\r\n\r\n.rkemb {\r\n font-size: 16px;\r\n font-family: Yu Gothic Meduim, \"游ゴシック Medium\", \"游ゴシック体\", YuGothic, \"游ゴシック\", \"メイリオ\", sans-serif;\r\n display: inline-flex;\r\n justify-content: center;\r\n margin: 0 4px;\r\n padding: 0 16px;\r\n min-width: 160px;\r\n height: 48px;\r\n outline: none;\r\n color: #3498db;\r\n border-radius: 4px;\r\n text-align: center;\r\n line-height: 48px;\r\n transition: all 250ms ease;\r\n border: 0;\r\n border: 1px solid;\r\n}\r\n.rkemb[data-color=\"default\"] {\r\n background-color: #f9fafb;\r\n color: var(--rkemb-color-blue);\r\n border-color: #e5e7eb;\r\n}\r\n.rkemb[data-color=\"default\"]:hover {\r\n background-color: #f3f4f6;\r\n}\r\n.rkemb[data-color=\"default\"]:active {\r\n background-color: #e5e7eb;\r\n color: var(--rkemb-color-blue-darker);\r\n}\r\n.rkemb[data-color=\"default\"]:focus {\r\n box-shadow: 0 0 0 2px #fff, 0 0 0 3px #d1d5db;\r\n}\r\n.rkemb[data-color=\"blue\"] {\r\n background-color: #eff6ff;\r\n color: var(--rkemb-color-blue);\r\n border-color: #bfdbfe;\r\n}\r\n.rkemb[data-color=\"blue\"]:hover {\r\n background-color: #dbeafe;\r\n}\r\n.rkemb[data-color=\"blue\"]:active {\r\n background-color: #bfdbfe;\r\n color: var(--rkemb-color-blue-darker);\r\n}\r\n.rkemb[data-color=\"blue\"]:focus {\r\n box-shadow: 0 0 0 2px #fff, 0 0 0 3px #93c5fd;\r\n}\r\n.rkemb[data-color=\"red\"] {\r\n background-color: #fef2f2;\r\n color: #ef4444;\r\n border-color: #fecaca;\r\n}\r\n.rkemb[data-color=\"red\"]:hover {\r\n background-color: #fee2e2;\r\n}\r\n.rkemb[data-color=\"red\"]:active {\r\n background-color: #fecaca;\r\n color: #dc2626;\r\n}\r\n.rkemb[data-color=\"red\"]:focus {\r\n box-shadow: 0 0 0 2px #fff, 0 0 0 3px #fca5a5;\r\n}\r\n.rkemb[data-color=\"yellow\"] {\r\n background-color: #fffbeb;\r\n color: #f59e0b;\r\n border-color: #fde68a;\r\n}\r\n.rkemb[data-color=\"yellow\"]:hover {\r\n background-color: #fef3c7;\r\n}\r\n.rkemb[data-color=\"yellow\"]:active {\r\n background-color: #fde68a;\r\n color: #d97706;\r\n}\r\n.rkemb[data-color=\"yellow\"]:focus {\r\n box-shadow: 0 0 0 2px #fff, 0 0 0 3px #fcd34d;\r\n}\r\n `;\r\n };\r\n\r\n private initialize = (event: kintoneAPI.js.Event) => {\r\n window.addEventListener('beforeunload', this.beforeunload);\r\n if (!this.#logDisabled) {\r\n console.group(\r\n `${this.#logPrefix}%c${event.type} %c(${this.#uid})`,\r\n 'color: #1e40af;',\r\n 'color: #aaa'\r\n );\r\n }\r\n };\r\n\r\n private tarminate = () => {\r\n window.removeEventListener('beforeunload', this.beforeunload);\r\n if (!this.#logDisabled) {\r\n console.groupEnd();\r\n }\r\n };\r\n\r\n public set logDisabled(value: boolean) {\r\n this.#logDisabled = value;\r\n }\r\n\r\n public set logPrefix(value: string) {\r\n this.#logPrefix = value;\r\n }\r\n\r\n /** JavaScript中にページを離れようとした場合にアラートを表示します */\r\n private beforeunload(event: BeforeUnloadEvent) {\r\n event.preventDefault();\r\n event.returnValue = '';\r\n }\r\n}\r\n\r\n/**\r\n * @deprecated 代わりに`KintoneEventListener`を使用してください\r\n */\r\nexport const KintoneEventListener = KintoneEventManager;\r\n","const META_PROPERTY_KEY = '$meta';\r\n\r\ntype PluginConfigMetadata = {\r\n v: 1;\r\n flat: {\r\n property: string;\r\n ids: string[];\r\n }[];\r\n};\r\n\r\n/**\r\n * アプリにプラグインの設定情報を保存します\r\n * @param target プラグインの設定情報\r\n * @param callback 保存成功後に実行する処理. 省略すると、アプリ設定のプラグインの一覧画面に遷移し、設定完了メッセージを表示します。指定すると、アプリ設定のプラグインの一覧画面には遷移しません。\r\n * @deprecated 代わりに{@link storePluginConfig}を使用してください\r\n */\r\nexport const storeStorage = (target: Record<string, any>, callback?: () => void): void => {\r\n const converted = Object.entries(target)\r\n .filter(([_, v]) => v !== undefined)\r\n .reduce((acc, [key, value]) => ({ ...acc, [key]: JSON.stringify(value) }), {});\r\n\r\n kintone.plugin.app.setConfig(converted, callback);\r\n};\r\n\r\nconst createFlatPropertyKey = (property: string, id: string) => `${property}$${id}`;\r\n\r\n/**\r\n * プラグインがアプリ単位で保存している設定情報を返却します\r\n *\r\n * 設定情報の取得に失敗した場合は、nullを返却します\r\n * @param id プラグインID\r\n * @returns プラグインの設定情報\r\n */\r\nexport const restorePluginConfig = <T = any>(\r\n id: string,\r\n options: {\r\n fallback?: T;\r\n debug?: boolean;\r\n } = {}\r\n): T | null => {\r\n const { fallback, debug = false } = options;\r\n const config: Record<string, string> = kintone.plugin.app.getConfig(id);\r\n\r\n debug && console.log('[config] 📦 stored', config);\r\n\r\n if (!Object.keys(config).length) {\r\n return fallback ?? null;\r\n }\r\n\r\n if (!(META_PROPERTY_KEY in config)) {\r\n debug && console.warn('[config] Meta property is not found. Fallback to normal config.');\r\n return Object.fromEntries(\r\n Object.entries(config).map(([key, value]) => [key, JSON.parse(value)])\r\n ) as T;\r\n }\r\n\r\n const meta: PluginConfigMetadata = JSON.parse(config[META_PROPERTY_KEY]);\r\n\r\n let composed: Record<string, any> = {};\r\n const flatKeys = meta.flat.flatMap(({ ids, property }) =>\r\n ids.map((id) => createFlatPropertyKey(property, id))\r\n );\r\n for (const { property, ids } of meta.flat) {\r\n const properties = ids\r\n .map((id) => ({ id, key: createFlatPropertyKey(property, id) }))\r\n .filter(({ key }) => {\r\n if (!(key in config)) {\r\n console.warn(`[config] Property \"${key}\" is not found.`);\r\n return false;\r\n }\r\n return true;\r\n })\r\n .map(({ id, key }) => {\r\n return { id, ...JSON.parse(config[key]) };\r\n });\r\n composed = { ...composed, [property]: properties };\r\n }\r\n\r\n const rest = Object.entries(config).reduce<Record<string, string>>((acc, [key, value]) => {\r\n if (![META_PROPERTY_KEY, ...flatKeys].includes(key)) {\r\n return { ...acc, [key]: JSON.parse(value) };\r\n }\r\n return acc;\r\n }, {});\r\n\r\n debug && console.log('[config] 📦 Composed:', { ...rest, ...composed });\r\n\r\n return { ...rest, ...composed } as T;\r\n};\r\n\r\n/**\r\n * アプリにプラグインの設定情報を保存します\r\n * @param target プラグインの設定情報\r\n * @param options.flatProperties 分割保存するプロパティ名の配列\r\n * @param options.debug デバッグモードを有効にするかどうか\r\n * @returns 保存完了後に解決されるPromise。callbackを指定しない場合、アプリ設定のプラグインの一覧画面に遷移し、設定完了メッセージを表示します。\r\n */\r\nexport const storePluginConfig = <T extends Record<string, any> = Record<string, any>>(\r\n target: T,\r\n options?: {\r\n flatProperties?: (keyof T)[];\r\n debug?: boolean;\r\n }\r\n): Promise<void> => {\r\n const { flatProperties = [], debug = false } = options || {};\r\n const meta: PluginConfigMetadata = {\r\n v: 1,\r\n flat: [],\r\n };\r\n\r\n let decomposed: Record<string, string> = {};\r\n let appliedProperties: string[] = [];\r\n for (const property of flatProperties) {\r\n if (typeof property !== 'string') {\r\n debug && console.warn('[config] Property name should be a string.');\r\n continue;\r\n }\r\n if (!(property in target) || !Array.isArray(target[property])) {\r\n debug && console.warn(`[config] Property \"${property}\" is not found or not an array.`);\r\n continue;\r\n }\r\n\r\n if (target[property].some((item) => !('id' in item))) {\r\n debug && console.warn(`[config] Property \"${property}\" has an item without \"id\" property.`);\r\n continue;\r\n }\r\n\r\n const ids = target[property].map((item) => item.id);\r\n\r\n const decomposedProperties = target[property].reduce<Record<string, string>>((acc, item) => {\r\n const { id, ...rest } = item;\r\n const key = createFlatPropertyKey(property, id);\r\n return { ...acc, [key]: JSON.stringify(rest) };\r\n }, {});\r\n\r\n meta.flat.push({ property, ids });\r\n decomposed = { ...decomposed, ...decomposedProperties };\r\n appliedProperties.push(property);\r\n }\r\n\r\n const converted = Object.entries(target)\r\n .filter(([key]) => !appliedProperties.includes(key))\r\n .reduce((acc, [key, value]) => ({ ...acc, [key]: JSON.stringify(value) }), {});\r\n\r\n const result = { [META_PROPERTY_KEY]: JSON.stringify(meta), ...converted, ...decomposed };\r\n\r\n debug && console.log('[config] 📦 Converted:', result);\r\n\r\n return new Promise<void>((resolve) => {\r\n kintone.plugin.app.setConfig(result, () => {\r\n resolve();\r\n });\r\n });\r\n};\r\n\r\ntype PrimitiveSetPluginProxyConfig = typeof kintone.plugin.app.setProxyConfig;\r\n\r\ntype PrimitiveSetPluginProxyConfigArgs = Parameters<PrimitiveSetPluginProxyConfig>;\r\n\r\n/**\r\n * `kintone.plugin.app.setProxyConfig`のラッパー関数\r\n *\r\n * 引数の`callback`を省略して、Promiseを返すように変更したものです\r\n *\r\n * @example\r\n * ```ts\r\n * await setPluginProxyConfig('https://example.com', 'POST', { \"Authorization\": \"Bearer XXXXXXXXX\"}, { \"provider\": \"kintone\"});\r\n * ```\r\n */\r\nexport function setPluginProxyConfig(\r\n url: PrimitiveSetPluginProxyConfigArgs[0],\r\n method: PrimitiveSetPluginProxyConfigArgs[1],\r\n headers: PrimitiveSetPluginProxyConfigArgs[2],\r\n data: PrimitiveSetPluginProxyConfigArgs[3]\r\n) {\r\n return new Promise<void>((resolve) => {\r\n kintone.plugin.app.setProxyConfig(url, method, headers, data, () => {\r\n resolve();\r\n });\r\n });\r\n}\r\n","export class PluginLocalStorage {\r\n readonly #key: string;\r\n #storage: Record<string, any>;\r\n\r\n public constructor(key: string) {\r\n this.#key = key;\r\n const stored = localStorage.getItem(this.#key) ?? '{}';\r\n this.#storage = JSON.parse(stored);\r\n }\r\n\r\n private save() {\r\n localStorage.setItem(this.#key, JSON.stringify(this.#storage));\r\n }\r\n\r\n public updateVersion = (currentVersion: string) => {\r\n const latestVersion: string = this.#storage.latestVersion ?? currentVersion;\r\n\r\n this.#storage.version = currentVersion;\r\n\r\n const [latestMajor, latestMinor] = latestVersion.split('.').map((v) => parseInt(v, 10));\r\n const [currentMajor, currentMinor] = currentVersion.split('.').map((v) => parseInt(v, 10));\r\n\r\n this.#storage.hasNewVersion =\r\n latestMajor > currentMajor || (latestMajor === currentMajor && latestMinor > currentMinor);\r\n\r\n this.save();\r\n };\r\n\r\n public get hasNewVersion(): boolean {\r\n return this.#storage.hasNewVersion ?? false;\r\n }\r\n}\r\n","import { kintoneAPI } from '../types/api';\r\n\r\n/**\r\n * kintone REST APIのエンドポイントパスを構築します。\r\n *\r\n * ゲストスペースやプレビュー環境に対応したパスを自動的に生成します。\r\n *\r\n * @param params.endpointName - APIエンドポイント名(例: `'record'`, `'records'`)\r\n * @param params.guestSpaceId - ゲストスペースID(省略時は通常スペース)\r\n * @param params.preview - プレビュー環境のAPIを使用する場合は `true`\r\n * @returns 構築されたAPIパス文字列(例: `'/k/v1/record.json'`)\r\n *\r\n * @example\r\n * ```ts\r\n * buildPath({ endpointName: 'record' });\r\n * // => '/k/v1/record.json'\r\n *\r\n * buildPath({ endpointName: 'record', guestSpaceId: 1, preview: true });\r\n * // => '/k/guest/1/v1/preview/record.json'\r\n * ```\r\n */\r\nexport const buildPath = (params: {\r\n endpointName: string;\r\n guestSpaceId?: number | string;\r\n preview?: boolean;\r\n}) => {\r\n const { endpointName, guestSpaceId, preview } = params;\r\n const guestPath = guestSpaceId !== undefined ? `/guest/${guestSpaceId}` : '';\r\n const previewPath = preview ? '/preview' : '';\r\n return `/k${guestPath}/v1${previewPath}/${endpointName}.json`;\r\n};\r\n\r\n/**\r\n * kintone REST APIへリクエストを送信する汎用関数です。\r\n *\r\n * `kintone.api()` をラップし、パス構築・デバッグログ・エラーハンドリングを統合しています。\r\n *\r\n * @typeParam T - レスポンスの型\r\n * @param params.endpointName - APIエンドポイント名\r\n * @param params.method - HTTPメソッド(`'GET'` | `'POST'` | `'PUT'` | `'DELETE'`)\r\n * @param params.body - リクエストボディ\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.preview - プレビュー環境を使用する場合は `true`\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns APIレスポンス\r\n * @throws ブラウザ環境でない場合、または `kintone` オブジェクトが存在しない場合にエラー\r\n */\r\nexport const api = async <T = any>(params: {\r\n endpointName: string;\r\n method: kintoneAPI.rest.Method;\r\n body: any;\r\n guestSpaceId?: number | string;\r\n preview?: boolean;\r\n debug?: boolean;\r\n}): Promise<T> => {\r\n const { endpointName, method, body, guestSpaceId, preview, debug } = params;\r\n try {\r\n checkBrowser();\r\n const path = buildPath({ endpointName, guestSpaceId, preview });\r\n if (debug) {\r\n console.log(`%ckintone REST API %c(${endpointName})`, 'color: #1e40af;', 'color: #aaa', {\r\n path,\r\n method,\r\n body,\r\n });\r\n }\r\n const response: T = await kintone.api(path, method, body);\r\n if (debug) {\r\n console.log('response', response);\r\n }\r\n return response;\r\n } catch (error) {\r\n if (debug) {\r\n console.error(error);\r\n }\r\n throw error;\r\n } finally {\r\n if (debug) {\r\n console.groupEnd();\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * 現在の実行環境がkintoneのブラウザ環境であることを検証します。\r\n *\r\n * `window` オブジェクトまたは `kintone` オブジェクトが存在しない場合にエラーをスローします。\r\n *\r\n * @throws {Error} ブラウザ環境でない場合\r\n * @throws {Error} `kintone` オブジェクトが見つからない場合\r\n */\r\nexport const checkBrowser = () => {\r\n if (typeof window === 'undefined') {\r\n throw new Error('この関数はブラウザでのみ使用できます');\r\n }\r\n if (typeof kintone === 'undefined') {\r\n throw new Error('kintoneオブジェクトが見つかりません');\r\n }\r\n};\r\n\r\n/**\r\n * 配列を指定したサイズごとのチャンクに分割します。\r\n *\r\n * REST APIの一括処理で、API制限数ごとにリクエストを分割する際に使用します。\r\n *\r\n * @typeParam T - 配列要素の型\r\n * @param array - 分割対象の配列\r\n * @param size - 1チャンクあたりの要素数\r\n * @returns 分割された二次元配列\r\n *\r\n * @example\r\n * ```ts\r\n * sliceIntoChunks([1, 2, 3, 4, 5], 2);\r\n * // => [[1, 2], [3, 4], [5]]\r\n * ```\r\n */\r\nexport const sliceIntoChunks = <T>(array: T[], size: number): T[][] => {\r\n const result = [];\r\n for (let i = 0, j = array.length; i < j; i += size) {\r\n result.push(array.slice(i, i + size));\r\n }\r\n return result;\r\n};\r\n\r\n/** デバッグオプションを付与するユーティリティ型 */\r\nexport type WithDebug<T> = T & { debug?: boolean };\r\n/** ゲストスペースIDオプションを付与するユーティリティ型 */\r\nexport type WithGuestSpaceId<T> = T & { guestSpaceId?: number | string };\r\n/** デバッグ・ゲストスペースIDの共通リクエストパラメータを付与するユーティリティ型 */\r\nexport type WithCommonRequestParams<T> = WithDebug<WithGuestSpaceId<T>>;\r\n/** レコードデータから各フィールドの `type` プロパティを除外するユーティリティ型 */\r\nexport type TypeOmmited<T extends Record<string, any>> = {\r\n [P in keyof T]: Omit<T[P], 'type'>;\r\n};\r\n\r\n/** レコードデータのベースとなるフレーム型 */\r\nexport type RecordFrame = Record<string, any>;\r\n\r\n/** REST APIへのレコード送信時に使用する型。各フィールドから `type` を除外し、全フィールドをオプショナルにします。 */\r\nexport type RecordToRequest<T extends RecordFrame = kintoneAPI.RecordData> = Partial<\r\n TypeOmmited<T>\r\n>;\r\n","import { kintoneAPI } from '../types/api';\r\nimport { WithCommonRequestParams, api } from './common';\r\n\r\nconst API_LIMIT_APP = 100;\r\n\r\nconst API_ENDPOINT_APP = `app`;\r\nconst API_ENDPOINT_APPS = `apps`;\r\nconst API_ENDPOINT_VIEWS = 'app/views';\r\nconst API_ENDPOINT_FORM_FIELDS = 'app/form/fields';\r\nconst API_ENDPOINT_FORM_LAYOUT = 'app/form/layout';\r\nconst API_ENDPOINT_APP_SETTINGS = 'app/settings';\r\nconst API_ENDPOINT_STATUS = 'app/status';\r\n\r\n/**\r\n * 指定したIDのアプリ情報を1件取得します。\r\n *\r\n * @param params.id - 取得対象のアプリID\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns アプリ情報オブジェクト\r\n *\r\n * @example\r\n * ```ts\r\n * const app = await getApp({ id: 1 });\r\n * console.log(app.name); // アプリ名\r\n * ```\r\n */\r\nexport const getApp = async (\r\n params: WithCommonRequestParams<{ id: kintoneAPI.IDToRequest }>\r\n): Promise<kintoneAPI.App> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_APP,\r\n method: 'GET',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * アプリ一覧を取得します(内部使用)。\r\n *\r\n * @param params.limit - 取得件数の上限\r\n * @param params.offset - 取得開始位置\r\n * @returns アプリの配列を含むオブジェクト\r\n */\r\nconst getApps = async (\r\n params: WithCommonRequestParams<{\r\n limit: number;\r\n offset: number;\r\n }>\r\n): Promise<{ apps: kintoneAPI.App[] }> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_APPS,\r\n method: 'GET',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * kintone環境内の全アプリ情報を再帰的に取得します。\r\n *\r\n * APIの取得件数上限(100件)を超える場合も、全件自動で取得します。\r\n *\r\n * @param params.offset - 取得開始位置(デフォルト: `0`)\r\n * @param params._apps - 内部用の蓄積配列(外部からの指定不要)\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns 全アプリ情報の配列\r\n *\r\n * @example\r\n * ```ts\r\n * const apps = await getAllApps();\r\n * console.log(`アプリ数: ${apps.length}`);\r\n * ```\r\n */\r\nexport const getAllApps = async (\r\n params: WithCommonRequestParams<{\r\n offset?: number;\r\n _apps?: kintoneAPI.App[];\r\n }> = {}\r\n): Promise<kintoneAPI.App[]> => {\r\n const { offset = 0, _apps = [], debug, guestSpaceId } = params;\r\n const { apps } = await getApps({ limit: API_LIMIT_APP, offset, debug, guestSpaceId });\r\n\r\n const allApps = [..._apps, ...apps];\r\n\r\n return apps.length === API_LIMIT_APP\r\n ? getAllApps({ offset: offset + API_LIMIT_APP, _apps: allApps, debug, guestSpaceId })\r\n : allApps;\r\n};\r\n\r\n/**\r\n * 指定アプリの一覧(ビュー)情報を取得します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.lang - 取得する言語(デフォルト: `'default'`)\r\n * @param params.preview - プレビュー環境のビューを取得する場合は `true`\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns ビュー情報のオブジェクトとリビジョン番号\r\n *\r\n * @example\r\n * ```ts\r\n * const { views, revision } = await getViews({ app: 1 });\r\n * Object.keys(views).forEach((viewName) => {\r\n * console.log(viewName, views[viewName]);\r\n * });\r\n * ```\r\n */\r\nexport const getViews = async (\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.IDToRequest;\r\n lang?: kintoneAPI.rest.Lang;\r\n preview?: boolean;\r\n }>\r\n): Promise<{ views: Record<string, kintoneAPI.view.Response>; revision: string }> => {\r\n const { app, preview = false, lang = 'default', debug, guestSpaceId } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_VIEWS,\r\n method: 'GET',\r\n body: { app, lang },\r\n preview,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * 指定アプリの一覧(ビュー)設定を更新します。\r\n *\r\n * …※ プレビュー環境に対して更新されます。運用環境への反映には別途デプロイが必要です。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.views - 更新するビュー情報のオブジェクト\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns 更新後のリビジョン情報\r\n *\r\n * @example\r\n * ```ts\r\n * await updateViews({\r\n * app: 1,\r\n * views: {\r\n * '一覧': { type: 'LIST', name: '一覧', fields: ['フィールドA'], index: 0 },\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport const updateViews = async (\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.IDToRequest;\r\n views: Record<string, kintoneAPI.view.Parameter>;\r\n }>\r\n) => {\r\n const { app, views, debug, guestSpaceId } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_VIEWS,\r\n method: 'PUT',\r\n body: { app, views },\r\n preview: true,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * 指定アプリのフォームフィールド情報を取得します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.preview - プレビュー環境のフィールドを取得する場合は `true`\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns フィールドプロパティとリビジョン番号\r\n *\r\n * @example\r\n * ```ts\r\n * const { properties, revision } = await getFormFields({ app: 1 });\r\n * Object.entries(properties).forEach(([code, field]) => {\r\n * console.log(`${code}: ${field.type}`);\r\n * });\r\n * ```\r\n */\r\nexport const getFormFields = async (\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.IDToRequest;\r\n preview?: boolean;\r\n }>\r\n): Promise<{ properties: kintoneAPI.FieldProperties; revision: string }> => {\r\n const { app, preview = false, debug, guestSpaceId } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_FORM_FIELDS,\r\n method: 'GET',\r\n body: { app },\r\n preview,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * 指定アプリのフォームレイアウト情報を取得します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.preview - プレビュー環境のレイアウトを取得する場合は `true`\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns レイアウト情報とリビジョン番号\r\n *\r\n * @example\r\n * ```ts\r\n * const { layout } = await getFormLayout({ app: 1 });\r\n * layout.forEach((row) => console.log(row.type));\r\n * ```\r\n */\r\nexport const getFormLayout = async (\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.IDToRequest;\r\n preview?: boolean;\r\n }>\r\n): Promise<{ layout: kintoneAPI.Layout; revision: string }> => {\r\n const { app, preview = false, debug, guestSpaceId } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_FORM_LAYOUT,\r\n method: 'GET',\r\n body: { app },\r\n preview,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * 指定アプリのアプリ設定(アイコン、テーマなど)を取得します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.preview - プレビュー環境の設定を取得する場合は `true`\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns アプリ設定オブジェクト\r\n *\r\n * @example\r\n * ```ts\r\n * const settings = await getAppSettings({ app: 1 });\r\n * console.log(settings.name, settings.icon);\r\n * ```\r\n */\r\nexport const getAppSettings = async (\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.IDToRequest;\r\n preview?: boolean;\r\n }>\r\n): Promise<kintoneAPI.AppSettings> => {\r\n const { app, preview = false, debug, guestSpaceId } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_APP_SETTINGS,\r\n method: 'GET',\r\n body: { app },\r\n preview,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * 指定アプリのプロセス管理設定を取得します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.lang - 取得する言語(デフォルト: `'default'`)\r\n * @param params.preview - プレビュー環境の設定を取得する場合は `true`\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns プロセス管理設定オブジェクト(有効フラグ、ステータス一覧、アクション一覧)\r\n *\r\n * @example\r\n * ```ts\r\n * const status = await getAppStatus({ app: 1 });\r\n * if (status.enable) {\r\n * console.log(Object.keys(status.states ?? {})); // ステータス名一覧\r\n * status.actions?.forEach((action) => console.log(action.name));\r\n * }\r\n * ```\r\n */\r\nexport const getAppStatus = async (\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.IDToRequest;\r\n lang?: kintoneAPI.rest.Lang;\r\n preview?: boolean;\r\n }>\r\n): Promise<kintoneAPI.AppStatus> => {\r\n const { app, lang = 'default', preview = false, debug, guestSpaceId } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_STATUS,\r\n method: 'GET',\r\n body: { app, lang },\r\n preview,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n","import { kintoneAPI } from '../types/api';\r\nimport { WithCommonRequestParams, api, buildPath, checkBrowser, sliceIntoChunks } from './common';\r\n\r\nconst API_ENDPOINT_RECORD = `record`;\r\nconst API_ENDPOINT_RECORDS = `records`;\r\nconst API_ENDPOINT_CURSOR = `records/cursor`;\r\nconst API_ENDPOINT_ASSIGNEES = `record/assignees`;\r\nconst API_ENDPOINT_RECORD_STATUS = `record/status`;\r\nconst API_ENDPOINT_RECORD_STATUSES = `records/status`;\r\nconst API_ENDPOINT_ACL_EVALUATE = `records/acl/evaluate`;\r\nconst API_ENDPOINT_BULK = `bulkRequest`;\r\nconst API_LIMIT_GET = 500;\r\nconst API_LIMIT_PUT = 100;\r\nexport const API_LIMIT_POST = 100;\r\nconst API_LIMIT_DELETE = 100;\r\nconst API_LIMIT_STATUS_PUT = 100;\r\nconst API_LIMIT_BULK_REQUEST = 20;\r\n\r\ntype BulkRequestProgressParams = { total: number; done: number };\r\ntype WithBulkRequestCallback<T> = T & { onProgress?: (params: BulkRequestProgressParams) => void };\r\n\r\n/**\r\n * バックドア(プロキシ経由)でkintone REST APIを呼び出します。\r\n *\r\n * APIトークン認証を使い、`kintone.proxy()` を通じてリクエストを送信します。\r\n * アプリAのカスタマイズからアプリBのレコードを操作するようなケースで使用します。\r\n *\r\n * @param params.apiToken - APIトークン\r\n * @param params.method - HTTPメソッド\r\n * @param params.path - APIエンドポイントのパス\r\n * @param params.body - リクエストボディ(省略可)\r\n * @returns APIレスポンス(JSONパース済み)\r\n * @throws レスポンスのステータスコードが200でない場合\r\n *\r\n * @example\r\n * ```ts\r\n * const record = await backdoor({\r\n * apiToken: 'YOUR_API_TOKEN',\r\n * method: 'GET',\r\n * path: 'record',\r\n * body: { app: 1, id: 100 },\r\n * });\r\n * ```\r\n */\r\nexport const backdoor = async (params: {\r\n apiToken: string;\r\n method: kintoneAPI.rest.Method;\r\n path: string;\r\n body?: any;\r\n}): Promise<any> => {\r\n checkBrowser();\r\n const { apiToken, method, path, body } = params;\r\n\r\n const header: Record<string, string> = {\r\n 'X-Cybozu-API-Token': apiToken,\r\n };\r\n if (method !== 'GET') {\r\n header['Content-Type'] = 'application/json';\r\n }\r\n\r\n const uri = kintone.api.url(path, true);\r\n\r\n const response = await kintone.proxy(uri, method, header, body);\r\n\r\n if (response[1] !== 200) {\r\n throw new Error(`Backdoor API Error: ${response[1]} ${response[0]}`);\r\n }\r\n\r\n return JSON.parse(response[0]);\r\n};\r\n\r\nexport type RecordGetRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n id: kintoneAPI.IDToRequest;\r\n};\r\ntype GetRecordParams = WithCommonRequestParams<RecordGetRequest>;\r\n\r\n/**\r\n * 指定したIDのレコードを1件取得します。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.id - レコードID\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns レコードデータ\r\n *\r\n * @example\r\n * ```ts\r\n * const record = await getRecord({ app: 1, id: 100 });\r\n * console.log(record['フィールドコード'].value);\r\n * ```\r\n */\r\nexport const getRecord = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: GetRecordParams\r\n): Promise<T> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n const { record } = await api<kintoneAPI.rest.RecordGetResponse<T>>({\r\n endpointName: API_ENDPOINT_RECORD,\r\n method: 'GET',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n return record;\r\n};\r\n/**\r\n * バックドア(APIトークン認証)を使用してレコードを1件取得します。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.id - レコードID\r\n * @param params.apiToken - APIトークン\r\n * @returns レコードデータ\r\n *\r\n * @example\r\n * ```ts\r\n * const record = await backdoorGetRecord({\r\n * app: 1,\r\n * id: 100,\r\n * apiToken: 'YOUR_API_TOKEN',\r\n * });\r\n * ```\r\n */\r\nexport const backdoorGetRecord = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: RecordGetRequest & { apiToken: string }\r\n): Promise<T> => {\r\n const { app, id, apiToken } = params;\r\n const { record } = await backdoor({\r\n apiToken,\r\n method: 'GET',\r\n path: API_ENDPOINT_RECORD,\r\n body: { app, id },\r\n });\r\n return record;\r\n};\r\n\r\n/**\r\n * 複数のレコードを一度に取得します(最大500件)。\r\n *\r\n * クエリでフィルタリングやソートが可能です。500件を超える場合は `getAllRecords` を使用してください。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.query - クエリ文字列(省略可)\r\n * @param params.fields - 取得するフィールドコードの配列(省略可)\r\n * @param params.totalCount - トータルカウントを取得する場合は `true`\r\n * @returns レコード配列とトータルカウント\r\n *\r\n * @example\r\n * ```ts\r\n * const { records, totalCount } = await getRecords({\r\n * app: 1,\r\n * query: 'ステータス in (\"未処理\")',\r\n * fields: ['$id', 'タイトル'],\r\n * totalCount: true,\r\n * });\r\n * ```\r\n */\r\nexport const getRecords = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: GetRecordsParams\r\n): Promise<kintoneAPI.rest.RecordsGetResponse<T>> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return await api<kintoneAPI.rest.RecordsGetResponse<T>>({\r\n endpointName: API_ENDPOINT_RECORDS,\r\n method: 'GET',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type UpdateKey<T extends kintoneAPI.rest.Frame> = {\r\n field: keyof T;\r\n value: string | number;\r\n};\r\n\r\nexport type PrimaryKeyToUpdate<T extends kintoneAPI.rest.Frame> =\r\n | { id: kintoneAPI.IDToRequest }\r\n | { updateKey: UpdateKey<T> };\r\n\r\nexport type RecordPutRequest<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> = {\r\n app: kintoneAPI.IDToRequest;\r\n record: kintoneAPI.rest.RecordToRequest<T>;\r\n revision?: kintoneAPI.rest.Revision;\r\n} & PrimaryKeyToUpdate<T>;\r\nexport type UpdateRecordParams<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> =\r\n WithCommonRequestParams<RecordPutRequest<T>>;\r\n\r\n/**\r\n * レコードを1件更新します。\r\n *\r\n * `id` または `updateKey`(重複禁止フィールド)で更新対象を指定できます。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.id - 更新対象のレコードID(`id` または `updateKey` のどちらか一方を指定)\r\n * @param params.updateKey - 重複禁止フィールドによる更新キー\r\n * @param params.record - 更新内容\r\n * @param params.revision - リビジョン番号(楽観的排他制御)\r\n * @returns 更新後のリビジョン番号\r\n *\r\n * @example\r\n * ```ts\r\n * await updateRecord({\r\n * app: 1,\r\n * id: 100,\r\n * record: { タイトル: { value: '更新済み' } },\r\n * });\r\n * ```\r\n */\r\nexport const updateRecord = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: UpdateRecordParams<T>\r\n): Promise<kintoneAPI.rest.RecordPutResponse> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_RECORD,\r\n method: 'PUT',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type RecordPostRequest<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> = {\r\n app: kintoneAPI.IDToRequest;\r\n record: kintoneAPI.rest.RecordToRequest<T>;\r\n};\r\nexport type AddRecordParams<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> =\r\n WithCommonRequestParams<RecordPostRequest<T>>;\r\n\r\n/**\r\n * レコードを1件追加します。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.record - 追加するレコードデータ\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns 追加されたレコードのIDとリビジョン\r\n *\r\n * @example\r\n * ```ts\r\n * const { id } = await addRecord({\r\n * app: 1,\r\n * record: { タイトル: { value: '新規レコード' } },\r\n * });\r\n * console.log(`作成されたレコードID: ${id}`);\r\n * ```\r\n */\r\nexport const addRecord = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: AddRecordParams<T>\r\n): Promise<kintoneAPI.rest.RecordPostResponse> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_RECORD,\r\n method: 'POST',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * 複数レコードを一度に追加します(最大100件)。\r\n *\r\n * 100件を超える場合は `addAllRecords` を使用してください。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.records - 追加するレコードの配列\r\n * @returns 追加されたレコードのID配列とリビジョン配列\r\n *\r\n * @example\r\n * ```ts\r\n * const { ids } = await addRecords({\r\n * app: 1,\r\n * records: [\r\n * { タイトル: { value: 'レコード1' } },\r\n * { タイトル: { value: 'レコード2' } },\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport const addRecords = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: WithCommonRequestParams<RecordsPostRequest<T>>\r\n): Promise<kintoneAPI.rest.RecordsPostResponse> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_RECORDS,\r\n method: 'POST',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type RecordUpsertRequest<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> = {\r\n app: kintoneAPI.IDToRequest;\r\n record: kintoneAPI.rest.RecordToRequest<T>;\r\n updateKey: UpdateKey<T>;\r\n};\r\nexport type UpsertRecordParams<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> =\r\n WithCommonRequestParams<RecordUpsertRequest<T>>;\r\n/**\r\n * レコードのアップサート(存在すれば更新、なければ追加)を行います。\r\n *\r\n * `updateKey` で指定した重複禁止フィールドの値に基づき、既存レコードを検索して分岐します。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.record - 追加または更新するレコードデータ\r\n * @param params.updateKey - 重複禁止フィールドによるキー\r\n * @returns 追加または更新されたレコードのIDとリビジョン\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await upsertRecord({\r\n * app: 1,\r\n * updateKey: { field: '社員番号', value: 'EMP001' },\r\n * record: { 氏名: { value: '山田太郎' } },\r\n * });\r\n * ```\r\n */\r\nexport const upsertRecord = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: UpsertRecordParams<T>\r\n): Promise<kintoneAPI.rest.RecordPostResponse> => {\r\n const { record, updateKey, app, ...rest } = params;\r\n const { records } = await getRecords<T>({\r\n app,\r\n query: `${updateKey.field as string} = \"${updateKey.value}\"`,\r\n fields: ['$id'],\r\n ...rest,\r\n });\r\n\r\n if (records.length) {\r\n const res = await updateRecord<T>({\r\n app,\r\n record,\r\n id: records[0].$id.value,\r\n ...rest,\r\n });\r\n return { id: records[0].$id.value, revision: res.revision };\r\n }\r\n return addRecord<T>({ app, record, ...rest });\r\n};\r\n\r\nexport type RecordsPutRequest<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> = {\r\n app: kintoneAPI.IDToRequest;\r\n records: ({\r\n record: kintoneAPI.rest.RecordToRequest<T>;\r\n revision?: kintoneAPI.rest.Revision;\r\n } & (\r\n | {\r\n id: kintoneAPI.IDToRequest;\r\n }\r\n | {\r\n updateKey: {\r\n field: keyof T;\r\n value: string | number;\r\n };\r\n }\r\n ))[];\r\n};\r\nexport type UpdateAllRecordsParams<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> =\r\n WithBulkRequestCallback<WithCommonRequestParams<RecordsPutRequest<T>>>;\r\n\r\n/**\r\n * 大量のレコードを一括更新します。\r\n *\r\n * 内部で `bulkRequest` を使用し、API制限ごとに自動分割してリクエストを送信します。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.records - 更新するレコードの配列(`id` または `updateKey` と `record` を含む)\r\n * @param params.onProgress - 進捗コールバック(`{ total, done }` を受け取る)\r\n * @returns 更新されたレコードのIDとリビジョンの配列\r\n *\r\n * @example\r\n * ```ts\r\n * await updateAllRecords({\r\n * app: 1,\r\n * records: [\r\n * { id: 1, record: { ステータス: { value: '完了' } } },\r\n * { id: 2, record: { ステータス: { value: '完了' } } },\r\n * ],\r\n * onProgress: ({ total, done }) => console.log(`${done}/${total}`),\r\n * });\r\n * ```\r\n */\r\nexport const updateAllRecords = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: UpdateAllRecordsParams<T>\r\n): Promise<kintoneAPI.rest.RecordsPutResponse> => {\r\n const { onProgress, debug, guestSpaceId, ...requestParams } = params;\r\n const response: { results: kintoneAPI.rest.RecordsPutResponse[] } = (await bulkRequest<T>({\r\n requests: [{ type: 'updateAllRecords', params: requestParams }],\r\n onProgress,\r\n debug,\r\n guestSpaceId,\r\n })) as any;\r\n\r\n return response.results.reduce<kintoneAPI.rest.RecordsPutResponse>(\r\n (acc, result) => {\r\n return { records: [...acc.records, ...result.records] };\r\n },\r\n { records: [] }\r\n );\r\n};\r\n\r\nexport type RecordsPostRequest<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> = {\r\n app: kintoneAPI.IDToRequest;\r\n records: kintoneAPI.rest.RecordToRequest<T>[];\r\n limit?: number;\r\n};\r\nexport type AddAllRecordsParams<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> =\r\n WithBulkRequestCallback<WithCommonRequestParams<RecordsPostRequest<T>>>;\r\n\r\n/**\r\n * 大量のレコードを一括追加します。\r\n *\r\n * 内部で `bulkRequest` を使用し、API制限ごとに自動分割してリクエストを送信します。\r\n * 空配列を渡した場合は何もせず空の結果を返します。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.records - 追加するレコードの配列\r\n * @param params.limit - 1リクエストあたりのレコード数上限(デフォルト: 100)\r\n * @param params.onProgress - 進捗コールバック\r\n * @returns 追加されたレコードのID配列とリビジョン配列\r\n *\r\n * @example\r\n * ```ts\r\n * const { ids } = await addAllRecords({\r\n * app: 1,\r\n * records: Array.from({ length: 500 }, (_, i) => ({\r\n * タイトル: { value: `レコード${i + 1}` },\r\n * })),\r\n * });\r\n * console.log(`${ids.length}件追加しました`);\r\n * ```\r\n */\r\nexport const addAllRecords = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: AddAllRecordsParams<T>\r\n): Promise<kintoneAPI.rest.RecordsPostResponse> => {\r\n const { onProgress, debug, guestSpaceId, ...requestParams } = params;\r\n\r\n if (requestParams.records.length === 0) {\r\n if (debug) {\r\n console.log('😕 %caddAllRecords: No records to add', 'color: #fbbf24');\r\n }\r\n return { ids: [], revisions: [] };\r\n }\r\n\r\n const responses: { results: kintoneAPI.rest.RecordsPostResponse[] } = (await bulkRequest<T>({\r\n requests: [{ type: 'addAllRecords', params: requestParams }],\r\n onProgress,\r\n debug,\r\n guestSpaceId,\r\n })) as any;\r\n\r\n return responses.results.reduce<kintoneAPI.rest.RecordsPostResponse>(\r\n (acc, result) => {\r\n return {\r\n ids: [...acc.ids, ...result.ids],\r\n revisions: [...acc.revisions, ...result.revisions],\r\n };\r\n },\r\n { ids: [], revisions: [] }\r\n );\r\n};\r\n\r\nexport type RecordsDeleteRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n ids: number[];\r\n revisions?: number[];\r\n};\r\nexport type DeleteAllRecordsParams = WithBulkRequestCallback<\r\n WithCommonRequestParams<RecordsDeleteRequest>\r\n>;\r\n\r\n/**\r\n * 大量のレコードを一括削除します。\r\n *\r\n * 内部で `bulkRequest` を使用し、API制限ごとに自動分割して削除リクエストを送信します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.ids - 削除対象のレコードIDの配列\r\n * @param params.revisions - リビジョン番号の配列(楽観的排他制御、省略可)\r\n * @param params.onProgress - 進捗コールバック\r\n * @returns バルクリクエストの結果\r\n *\r\n * @example\r\n * ```ts\r\n * await deleteAllRecords({\r\n * app: 1,\r\n * ids: [1, 2, 3, 4, 5],\r\n * });\r\n * ```\r\n */\r\nexport const deleteAllRecords = async (\r\n params: DeleteAllRecordsParams\r\n): Promise<{ results: kintoneAPI.rest.RecordsDeleteResponse[] }> => {\r\n const { onProgress, debug, guestSpaceId, ...requestParams } = params;\r\n return bulkRequest({\r\n requests: [{ type: 'deleteRecords', params: requestParams }],\r\n onProgress,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * クエリに一致する全レコードを削除します。\r\n *\r\n * 指定したクエリで全レコードを取得した後、そのIDを使って一括削除を実行します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.query - 削除対象をフィルタリングするクエリ文字列\r\n * @param params.onProgress - 進捗コールバック\r\n * @returns バルクリクエストの結果\r\n *\r\n * @example\r\n * ```ts\r\n * await deleteAllRecordsByQuery({\r\n * app: 1,\r\n * query: 'ステータス in (\"削除済み\")',\r\n * });\r\n * ```\r\n */\r\nexport const deleteAllRecordsByQuery = async (\r\n params: WithBulkRequestCallback<\r\n WithCommonRequestParams<{\r\n app: kintoneAPI.IDToRequest;\r\n query: string;\r\n }>\r\n >\r\n): Promise<{ results: kintoneAPI.rest.RecordsDeleteResponse[] }> => {\r\n const { onProgress, debug, guestSpaceId, app, query } = params;\r\n const fields = ['$id'];\r\n\r\n const records = await getAllRecords({ app, query, fields, debug, guestSpaceId });\r\n\r\n const ids = records.map((record) => Number(record.$id.value));\r\n\r\n return bulkRequest({\r\n requests: [{ type: 'deleteRecords', params: { app, ids } }],\r\n onProgress,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type RecordsGetRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n query?: string;\r\n fields?: string[];\r\n totalCount?: boolean | 'true' | 'false';\r\n};\r\nexport type GetRecordsParams = WithCommonRequestParams<RecordsGetRequest>;\r\nexport type GetAllRecordsParams = WithCommonRequestParams<RecordsGetRequest>;\r\n\r\n/**\r\n * 対象アプリの指定されたクエリに一致するレコードを全件取得します\r\n *\r\n * クエリを解析し、order byが含まれている場合はカーソルAPIを使ってレコードを取得します\r\n *\r\n * order byが含まれていない場合は、レコードIDを使ってレコードを取得します\r\n *\r\n * @returns 取得したレコードの配列\r\n */\r\nexport const getAllRecords = async <T extends Record<string, any> = kintoneAPI.RecordData>(\r\n params: GetAllRecordsParams & { onStep?: OnStep<T> }\r\n) => {\r\n if (params.query && /limit \\d+/.test(params.query)) {\r\n const { records } = await getRecords<T>(params);\r\n return records;\r\n }\r\n if (params.query && params.query.includes('order by')) {\r\n return getAllRecordsWithCursor<T>(params);\r\n }\r\n return getAllRecordsWithId<T>({ ...params, condition: params.query });\r\n};\r\n\r\ntype WithId<T> = T & { $id: kintoneAPI.field.ID };\r\ntype OnStep<T> = (params: {\r\n /**\r\n * その時点で取得が完了した全てのレコード\r\n */\r\n records: T[];\r\n /**\r\n * その時点で取得が完了したレコードのうち、新たに取得されたレコード\r\n */\r\n incremental: T[];\r\n}) => void;\r\n\r\n/**\r\n * 対象アプリの指定されたクエリに一致するレコードを、レコードIDをもとに全件取得します\r\n *\r\n * @param params app: 対象アプリのID, query: 取得するレコードのクエリ, fields: 取得するフィールドコードの配列, onStep: 段階的にレコードを取得する過程で実行される関数\r\n * @returns 取得したレコードの配列\r\n */\r\nexport const getAllRecordsWithId = async <T extends Record<string, any>>(\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.rest.AppIDToRequest;\r\n fields?: string[];\r\n onStep?: OnStep<T>;\r\n condition?: string;\r\n }>\r\n): Promise<WithId<T>[]> => {\r\n const { fields: initFields, condition: initCondition = '', debug } = params;\r\n\r\n const fields = initFields?.length ? [...new Set([...initFields, '$id'])] : undefined;\r\n\r\n // order byは使用できないため、conditionに含まれている場合は除外する\r\n const condition = initCondition.replace(/order by.*/g, '');\r\n\r\n if (debug) {\r\n console.groupCollapsed('📦 %cgetAllRecordsWithId', 'color: #1e40af');\r\n }\r\n try {\r\n const records = await getRecursive<T>({ ...params, fields, condition });\r\n\r\n return records;\r\n } finally {\r\n if (debug) {\r\n console.groupEnd();\r\n }\r\n }\r\n};\r\n\r\nconst getRecursive = async <T extends Record<string, unknown>>(\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.rest.AppIDToRequest;\r\n fields: (keyof T)[] | undefined;\r\n condition: string;\r\n onStep?: OnStep<T>;\r\n id?: string;\r\n stored?: WithId<T>[];\r\n }>\r\n): Promise<WithId<T>[]> => {\r\n const { app, fields, condition, id, debug, guestSpaceId } = params;\r\n\r\n const newCondition = id ? `${condition ? `(${condition}) and ` : ''} $id < ${id}` : condition;\r\n\r\n const query = `${newCondition} order by $id desc limit ${API_LIMIT_GET}`;\r\n\r\n const { records } = await api<kintoneAPI.rest.RecordsGetResponse<WithId<T>>>({\r\n endpointName: API_ENDPOINT_RECORDS,\r\n method: 'GET',\r\n body: { app, fields, query },\r\n debug,\r\n guestSpaceId,\r\n });\r\n if (!records.length) {\r\n return params.stored ?? [];\r\n }\r\n\r\n const stored = [...(params.stored ?? []), ...records];\r\n\r\n if (params.onStep) {\r\n params.onStep({ records: stored, incremental: records });\r\n }\r\n\r\n const lastRecord = stored[stored.length - 1];\r\n const lastId = lastRecord.$id.value;\r\n\r\n return records.length === API_LIMIT_GET\r\n ? getRecursive({ ...params, id: lastId, stored })\r\n : stored;\r\n};\r\n\r\ntype OnTotalGet = (params: { total: number }) => void;\r\n\r\n/**\r\n * 対象アプリの指定されたクエリに一致するレコードを、カーソルAPIを使って全件取得します\r\n *\r\n * @param params app: 対象アプリのID, query: 取得するレコードのクエリ, fields: 取得するフィールドコードの配列, onTotalGet: 取得するレコードの総数を取得した際に実行される関数, onStep: 段階的にレコードを取得する過程で実行される関数\r\n * @returns 取得したレコードの配列\r\n */\r\nexport const getAllRecordsWithCursor = async <T extends kintoneAPI.rest.Frame>(\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.rest.AppIDToRequest;\r\n fields?: string[];\r\n query?: string;\r\n onTotalGet?: OnTotalGet;\r\n onStep?: OnStep<T>;\r\n }>\r\n): Promise<T[]> => {\r\n const {\r\n app,\r\n fields = [],\r\n query = '',\r\n onTotalGet = null,\r\n onStep = null,\r\n debug,\r\n guestSpaceId,\r\n } = params;\r\n\r\n if (debug) {\r\n console.groupCollapsed('📦 %cgetAllRecordsWithCursor', 'color: #1e40af');\r\n }\r\n\r\n try {\r\n const param: kintoneAPI.rest.CursorCreateRequest = { app, fields, size: API_LIMIT_GET, query };\r\n\r\n const cursor = await api<kintoneAPI.rest.CursorCreateResponse>({\r\n endpointName: API_ENDPOINT_CURSOR,\r\n method: 'POST',\r\n body: param,\r\n debug,\r\n guestSpaceId,\r\n });\r\n\r\n if (onTotalGet) {\r\n onTotalGet({\r\n total: Number(cursor.totalCount),\r\n });\r\n }\r\n\r\n const records = await getRecordsByCursorId<T>({ id: cursor.id, onStep, debug, guestSpaceId });\r\n\r\n return records;\r\n } finally {\r\n if (debug) {\r\n console.groupEnd();\r\n }\r\n }\r\n};\r\n\r\nconst getRecordsByCursorId = async <T extends kintoneAPI.rest.Frame>(\r\n params: WithCommonRequestParams<{\r\n id: string;\r\n onStep: OnStep<T> | null;\r\n loadedData?: T[];\r\n }>\r\n): Promise<T[]> => {\r\n const { id, onStep, loadedData = [], debug, guestSpaceId } = params;\r\n const response = await api<kintoneAPI.rest.CursorGetResponse<T>>({\r\n endpointName: API_ENDPOINT_CURSOR,\r\n method: 'GET',\r\n body: { id },\r\n debug,\r\n guestSpaceId,\r\n });\r\n\r\n const newRecords: T[] = [...loadedData, ...(response.records as T[])];\r\n\r\n if (onStep) {\r\n onStep({ records: newRecords, incremental: response.records as T[] });\r\n }\r\n\r\n return response.next ? getRecordsByCursorId({ ...params, loadedData: newRecords }) : newRecords;\r\n};\r\n\r\nexport type RecordAssigneesPutRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n id: kintoneAPI.IDToRequest;\r\n assignees: string[];\r\n revision?: kintoneAPI.IDToRequest;\r\n};\r\nexport type UpdateRecordAssigneesParams = WithCommonRequestParams<RecordAssigneesPutRequest>;\r\n\r\n/**\r\n * レコードの作業者(アサイニー)を更新します。\r\n *\r\n * プロセス管理が有効なアプリで、レコードの作業者を変更する際に使用します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.id - レコードID\r\n * @param params.assignees - 作業者のログイン名の配列\r\n * @param params.revision - リビジョン番号(省略可)\r\n * @returns 更新後のリビジョン情報\r\n *\r\n * @example\r\n * ```ts\r\n * await updateRecordAssignees({\r\n * app: 1,\r\n * id: 100,\r\n * assignees: ['user1', 'user2'],\r\n * });\r\n * ```\r\n */\r\nexport const updateRecordAssignees = async (\r\n params: UpdateRecordAssigneesParams\r\n): Promise<kintoneAPI.rest.RecordAssigneesPutResponse> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api<kintoneAPI.rest.RecordAssigneesPutResponse>({\r\n endpointName: API_ENDPOINT_ASSIGNEES,\r\n method: 'PUT',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type RecordStatusToPut = {\r\n action: string;\r\n assignee?: string;\r\n id: kintoneAPI.IDToRequest;\r\n revision?: kintoneAPI.IDToRequest;\r\n};\r\n\r\nexport type RecordStatusPutRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n} & RecordStatusToPut;\r\nexport type UpdateRecordStatusParams = WithCommonRequestParams<RecordStatusPutRequest>;\r\n\r\n/**\r\n * レコードのプロセスステータスを1件更新します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.action - 実行するアクション名\r\n * @param params.assignee - 次の作業者のログイン名(省略可)\r\n * @param params.id - レコードID\r\n * @param params.revision - リビジョン番号(省略可)\r\n * @returns 更新後のリビジョン情報\r\n *\r\n * @example\r\n * ```ts\r\n * await updateRecordStatus({\r\n * app: 1,\r\n * id: 100,\r\n * action: '承認する',\r\n * assignee: 'manager1',\r\n * });\r\n * ```\r\n */\r\nexport const updateRecordStatus = async (\r\n params: UpdateRecordStatusParams\r\n): Promise<kintoneAPI.rest.RecordStatusPutResponse> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api<kintoneAPI.rest.RecordStatusPutResponse>({\r\n endpointName: API_ENDPOINT_RECORD_STATUS,\r\n method: 'PUT',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type RecordStatusesPutRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n records: RecordStatusToPut[];\r\n};\r\nexport type UpdateAllRecordStatusesParams = WithBulkRequestCallback<\r\n WithCommonRequestParams<RecordStatusesPutRequest>\r\n>;\r\n\r\n/**\r\n * 複数レコードのプロセスステータスを一括更新します。\r\n *\r\n * 内部で `bulkRequest` を使用し、API制限ごとに自動分割してリクエストを送信します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.records - 更新対象のレコード配列(`action`, `id` 等を含む)\r\n * @param params.onProgress - 進捗コールバック\r\n * @returns 更新されたレコードの配列\r\n *\r\n * @example\r\n * ```ts\r\n * await updateAllRecordStatuses({\r\n * app: 1,\r\n * records: [\r\n * { id: 1, action: '承認する' },\r\n * { id: 2, action: '承認する' },\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport const updateAllRecordStatuses = async (\r\n params: UpdateAllRecordStatusesParams\r\n): Promise<kintoneAPI.rest.RecordStatusesPutResponse> => {\r\n const { onProgress, debug, guestSpaceId, ...requestParams } = params;\r\n const responses: { results: kintoneAPI.rest.RecordStatusesPutResponse[] } = (await bulkRequest({\r\n requests: [{ type: 'updateRecordStatuses', params: requestParams }],\r\n onProgress,\r\n debug,\r\n guestSpaceId,\r\n })) as any;\r\n\r\n return responses.results.reduce<kintoneAPI.rest.RecordStatusesPutResponse>(\r\n (acc, result) => {\r\n return {\r\n records: [...acc.records, ...result.records],\r\n };\r\n },\r\n { records: [] }\r\n );\r\n};\r\n\r\nexport type RecordACLEvaluateGetRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n ids: kintoneAPI.IDToRequest[];\r\n};\r\nexport type GetRecordACLEvaluateParams = WithCommonRequestParams<RecordACLEvaluateGetRequest>;\r\n\r\n/**\r\n * レコードのアクセス権を評価します。\r\n *\r\n * 指定したレコードIDに対して、現在のユーザーのアクセス権情報を取得します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.ids - 評価対象のレコードIDの配列\r\n * @returns 各レコードのアクセス権評価結果\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await getRecordACLEvaluate({\r\n * app: 1,\r\n * ids: [1, 2, 3],\r\n * });\r\n * ```\r\n */\r\nexport const getRecordACLEvaluate = async (\r\n params: GetRecordACLEvaluateParams\r\n): Promise<kintoneAPI.rest.RecordACLEvaluateGetResponse> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api<kintoneAPI.rest.RecordACLEvaluateGetResponse>({\r\n endpointName: API_ENDPOINT_ACL_EVALUATE,\r\n method: 'GET',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type OneOfBulkRequest<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> = {\r\n method: kintoneAPI.rest.Method;\r\n api: string;\r\n payload:\r\n | RecordPostRequest<T>\r\n | RecordsPostRequest<T>\r\n | RecordPutRequest<T>\r\n | RecordsPutRequest<T>\r\n | RecordsDeleteRequest\r\n | RecordAssigneesPutRequest\r\n | RecordStatusPutRequest\r\n | RecordStatusesPutRequest;\r\n};\r\n\r\nexport type BulkRequestParams<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> =\r\n WithCommonRequestParams<{\r\n requests: (\r\n | {\r\n type: 'updateRecord';\r\n params: RecordPutRequest<T>;\r\n }\r\n | {\r\n type: 'addRecord';\r\n params: RecordPostRequest<T>;\r\n }\r\n | {\r\n type: 'updateAllRecords';\r\n params: RecordsPutRequest<T>;\r\n }\r\n | {\r\n type: 'addAllRecords';\r\n params: RecordsPostRequest<T>;\r\n }\r\n | {\r\n type: 'deleteRecords';\r\n params: RecordsDeleteRequest;\r\n }\r\n | {\r\n type: 'updateRecordAssignees';\r\n params: RecordAssigneesPutRequest;\r\n }\r\n | {\r\n type: 'updateRecordStatus';\r\n params: RecordStatusPutRequest;\r\n }\r\n | {\r\n type: 'updateRecordStatuses';\r\n params: RecordStatusesPutRequest;\r\n }\r\n )[];\r\n onProgress?: (params: BulkRequestProgressParams) => void;\r\n limit?: number;\r\n }>;\r\n\r\n/**\r\n * 複数のAPIリクエストを一括で実行します(バルクリクエスト)。\r\n *\r\n * API制限ごとにリクエストを自動分割し、チャンクごとに順次実行します。\r\n * レコードの追加・更新・削除・ステータス更新などの操作を混在させることができます。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.requests - 実行するリクエストの配列(type と params を持つ)\r\n * @param params.onProgress - 進捗コールバック\r\n * @param params.limit - 1回のバルクリクエストあたりのリクエスト数上限(デフォルト: 20)\r\n * @returns 全リクエストの実行結果\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await bulkRequest({\r\n * requests: [\r\n * { type: 'addAllRecords', params: { app: 1, records: [...] } },\r\n * { type: 'deleteRecords', params: { app: 2, ids: [1, 2, 3] } },\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport const bulkRequest = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: BulkRequestParams<T>\r\n): Promise<kintoneAPI.rest.BulkResponse> => {\r\n const { requests, debug, guestSpaceId, limit = API_LIMIT_BULK_REQUEST } = params;\r\n if (debug) {\r\n console.groupCollapsed('📦 %cbulkRequest', 'color: #1e40af');\r\n }\r\n\r\n try {\r\n const apiTable: Record<\r\n (typeof requests)[number]['type'],\r\n { endpointName: string; method: kintoneAPI.rest.Method }\r\n > = {\r\n updateRecord: { endpointName: API_ENDPOINT_RECORD, method: 'PUT' },\r\n addRecord: { endpointName: API_ENDPOINT_RECORD, method: 'POST' },\r\n updateAllRecords: { endpointName: API_ENDPOINT_RECORDS, method: 'PUT' },\r\n addAllRecords: { endpointName: API_ENDPOINT_RECORDS, method: 'POST' },\r\n deleteRecords: { endpointName: API_ENDPOINT_RECORDS, method: 'DELETE' },\r\n updateRecordAssignees: { endpointName: API_ENDPOINT_ASSIGNEES, method: 'PUT' },\r\n updateRecordStatus: { endpointName: API_ENDPOINT_RECORD_STATUS, method: 'PUT' },\r\n updateRecordStatuses: { endpointName: API_ENDPOINT_RECORD_STATUSES, method: 'PUT' },\r\n };\r\n\r\n let reshapedRequests: OneOfBulkRequest<T>[] = [];\r\n for (const request of requests) {\r\n const { endpointName, method } = apiTable[request.type];\r\n const api = buildPath({ endpointName, guestSpaceId });\r\n\r\n if (\r\n request.type === 'updateRecord' ||\r\n request.type === 'addRecord' ||\r\n request.type === 'updateRecordAssignees' ||\r\n request.type === 'updateRecordStatus'\r\n ) {\r\n reshapedRequests.push({ method, api, payload: request.params });\r\n } else if (request.type === 'updateAllRecords') {\r\n const { records: allRecords, ...commonRequestParams } = request.params;\r\n const recordChunks = sliceIntoChunks(allRecords, API_LIMIT_PUT);\r\n for (const records of recordChunks) {\r\n reshapedRequests.push({\r\n method,\r\n api,\r\n payload: { ...commonRequestParams, records },\r\n });\r\n }\r\n } else if (request.type === 'addAllRecords') {\r\n const recordChunks = sliceIntoChunks(\r\n request.params.records,\r\n Math.min(request.params.limit ?? API_LIMIT_POST, API_LIMIT_POST)\r\n );\r\n for (const records of recordChunks) {\r\n reshapedRequests.push({ method, api, payload: { ...request.params, records } });\r\n }\r\n } else if (request.type === 'deleteRecords') {\r\n const idChunks = sliceIntoChunks(request.params.ids, API_LIMIT_DELETE);\r\n for (const ids of idChunks) {\r\n reshapedRequests.push({ method, api, payload: { ...request.params, ids } });\r\n }\r\n } else if (request.type === 'updateRecordStatuses') {\r\n const recordChunks = sliceIntoChunks(request.params.records, API_LIMIT_PUT);\r\n for (const records of recordChunks) {\r\n reshapedRequests.push({ method, api, payload: { ...request.params, records } });\r\n }\r\n }\r\n }\r\n\r\n const responses: kintoneAPI.rest.BulkResponse[] = [];\r\n const requestChunks = sliceIntoChunks(\r\n reshapedRequests,\r\n Math.min(limit, API_LIMIT_BULK_REQUEST)\r\n );\r\n let done = 0;\r\n for (const requests of requestChunks) {\r\n const response = await api<kintoneAPI.rest.BulkResponse>({\r\n endpointName: API_ENDPOINT_BULK,\r\n method: 'POST',\r\n body: { requests },\r\n debug,\r\n guestSpaceId,\r\n });\r\n if (debug) {\r\n done += requests.length;\r\n console.log(\r\n `%cbulk request in progress... ${done}/${reshapedRequests.length}`,\r\n 'color: #999'\r\n );\r\n }\r\n responses.push(response);\r\n if (params.onProgress) {\r\n params.onProgress({\r\n total: reshapedRequests.length,\r\n done: responses.reduce((acc, response) => acc + response.results.length, 0),\r\n });\r\n }\r\n }\r\n\r\n return responses.reduce<kintoneAPI.rest.BulkResponse>(\r\n (acc, response) => {\r\n return { results: [...acc.results, ...response.results] };\r\n },\r\n { results: [] }\r\n );\r\n } finally {\r\n if (debug) {\r\n console.groupEnd();\r\n }\r\n }\r\n};\r\n","import { kintoneAPI } from '../types/api';\nimport {\n addAllRecords,\n AddAllRecordsParams,\n addRecord,\n addRecords,\n API_LIMIT_POST,\n} from './record';\n\n/**\n * 🧪 実験的な実装\n *\n * APIクライアントをClassではなく、カリー化した関数で実装することで、ユーザーがAPIクライアントを拡張しやすくする。\n *\n * アプリ情報を事前に指定し、レコード操作時にはアプリ情報の指定を省略できます。\n *\n * @typeParam T - レコードの型\n * @param props.app - アプリID\n * @param props.guestsSpaceId - ゲストスペースID(省略可)\n * @param props.debug - デバッグログを出力する場合は `true`\n * @returns レコード操作用のメソッドを持つオブジェクト\n *\n * @example\n * ```ts\n * const client = useApi({ app: 1 });\n * const result = await client.records.$post({\n * records: [{ タイトル: { value: 'テスト' } }],\n * });\n * console.log(result.ids);\n * ```\n */\nexport const useApi = <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(props: {\n app: kintoneAPI.IDToRequest;\n guestsSpaceId?: string;\n debug?: boolean;\n}) => {\n return {\n records: {\n $post: async (\n params: Omit<AddAllRecordsParams<T>, 'app' | 'guestSpaceId' | 'debug'>\n ): Promise<kintoneAPI.rest.RecordsPostResponse> => {\n const { limit = API_LIMIT_POST, ...requestParams } = params;\n if (requestParams.records.length === 1) {\n return addRecord<T>({ ...props, record: requestParams.records[0] }).then((res) => ({\n ids: [res.id],\n revisions: [res.revision],\n }));\n }\n if (requestParams.records.length <= limit) {\n return addRecords({ ...props, ...params });\n }\n return addAllRecords({ ...props, ...params });\n },\n },\n };\n};\n","import { WithCommonRequestParams, buildPath } from './common';\r\n\r\n/**\r\n * kintoneへファイルをアップロードします。\r\n *\r\n * `FormData` を使用し、`fetch` APIでファイルをアップロードします。\r\n * アップロード成功後、返された `fileKey` をレコードの添付ファイルフィールドの値として使用できます。\r\n *\r\n * @param params.file.name - ファイル名\r\n * @param params.file.data - ファイルデータ(Blob)\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns アップロードされたファイルの `fileKey`\r\n *\r\n * @example\r\n * ```ts\r\n * const blob = new Blob(['テスト内容'], { type: 'text/plain' });\r\n * const { fileKey } = await uploadFile({\r\n * file: { name: 'test.txt', data: blob },\r\n * });\r\n *\r\n * // レコード更新時に使用\r\n * await updateRecord({\r\n * app: 1,\r\n * id: 100,\r\n * record: { 添付ファイル: { value: [{ fileKey }] } },\r\n * });\r\n * ```\r\n */\r\nexport const uploadFile = async (\r\n params: WithCommonRequestParams<{\r\n file: { name: string; data: Blob };\r\n }>\r\n): Promise<{ fileKey: string }> => {\r\n const { file, debug, guestSpaceId } = params;\r\n\r\n const formData = new FormData();\r\n formData.append('__REQUEST_TOKEN__', kintone.getRequestToken());\r\n formData.append('file', file.data, file.name);\r\n\r\n const headers = { 'X-Requested-With': 'XMLHttpRequest' };\r\n const response = await fetch(buildPath({ endpointName: 'file', guestSpaceId }), {\r\n method: 'POST',\r\n headers,\r\n body: formData,\r\n });\r\n return response.json();\r\n};\r\n\r\n/**\r\n * kintoneからファイルをダウンロードします。\r\n *\r\n * `fileKey` を指定して、添付ファイルをBlobとして取得します。\r\n *\r\n * @param params.fileKey - ダウンロード対象のファイルキー\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns ファイルデータ(Blob)\r\n *\r\n * @example\r\n * ```ts\r\n * const blob = await downloadFile({ fileKey: 'xxxx-xxxx-xxxx' });\r\n * const url = URL.createObjectURL(blob);\r\n * ```\r\n */\r\nexport const downloadFile = async (\r\n params: WithCommonRequestParams<{ fileKey: string }>\r\n): Promise<Blob> => {\r\n const { fileKey, debug, guestSpaceId } = params;\r\n\r\n const headers = { 'X-Requested-With': 'XMLHttpRequest' };\r\n const path = buildPath({ endpointName: 'file', guestSpaceId });\r\n const response = await fetch(`${path}?fileKey=${fileKey}`, { method: 'GET', headers });\r\n return response.blob();\r\n};\r\n","import { kintoneAPI } from '../types/api';\r\nimport { api, buildPath } from './common';\r\n\r\nconst API_ENDPOINT_COMMENTS = `record/comments`;\r\nconst API_ENDPOINT_COMMENT = `record/comment`;\r\n\r\nconst API_LIMIT_COMMENT = 10;\r\n\r\n/**\r\n * 指定レコードのコメントを全件取得します。\r\n *\r\n * APIの取得件数上限(10件)を超える場合も、全件自動で再帰的に取得します。\r\n *\r\n * @param props.app - アプリID\r\n * @param props.record - レコードID\r\n * @param props.order - ソート順(`'asc'` | `'desc'`)\r\n * @returns コメントの配列\r\n *\r\n * @example\r\n * ```ts\r\n * const comments = await getRecordComments({\r\n * app: 1,\r\n * record: 100,\r\n * order: 'desc',\r\n * });\r\n * comments.forEach((c) => console.log(c.text));\r\n * ```\r\n */\r\nexport const getRecordComments = (props: kintoneAPI.rest.CommentsGetRequest) => {\r\n return getRecursiveRecordComments(props);\r\n};\r\n\r\nconst getRecursiveRecordComments = async (\r\n requestParams: kintoneAPI.rest.CommentsGetRequest,\r\n stored: kintoneAPI.rest.CommentsGetResponse['comments'] = []\r\n): Promise<kintoneAPI.rest.CommentsGetResponse['comments']> => {\r\n const offset = stored.length;\r\n\r\n const newRequest: kintoneAPI.rest.CommentsGetRequest = {\r\n ...requestParams,\r\n limit: API_LIMIT_COMMENT,\r\n offset,\r\n };\r\n\r\n const response = await api<kintoneAPI.rest.CommentsGetResponse>({\r\n endpointName: API_ENDPOINT_COMMENTS,\r\n method: 'GET',\r\n body: newRequest,\r\n guestSpaceId: requestParams.guestSpaceId,\r\n });\r\n\r\n const comments = [...stored, ...response.comments];\r\n\r\n return response.comments.length === API_LIMIT_COMMENT\r\n ? getRecursiveRecordComments(requestParams, comments)\r\n : comments;\r\n};\r\n\r\n/**\r\n * レコードにコメントを1件追加します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.record - レコードID\r\n * @param params.comment - コメント内容(`text`, `mentions` 等)\r\n * @returns 追加されたコメントのID\r\n *\r\n * @example\r\n * ```ts\r\n * const { id } = await addRecordComment({\r\n * app: 1,\r\n * record: 100,\r\n * comment: { text: '確認しました' },\r\n * });\r\n * ```\r\n */\r\nexport const addRecordComment = (params: kintoneAPI.rest.CommentPostRequest) => {\r\n return api<kintoneAPI.rest.CommentPostResponse>({\r\n endpointName: API_ENDPOINT_COMMENT,\r\n method: 'POST',\r\n body: params,\r\n guestSpaceId: params.guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * レコードのコメントを1件削除します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.record - レコードID\r\n * @param params.comment - 削除するコメントのID\r\n * @returns 空オブジェクト\r\n *\r\n * @example\r\n * ```ts\r\n * await deleteRecordComment({\r\n * app: 1,\r\n * record: 100,\r\n * comment: 5,\r\n * });\r\n * ```\r\n */\r\nexport const deleteRecordComment = (params: kintoneAPI.rest.CommentDeleteRequest) => {\r\n return api<kintoneAPI.rest.CommentDeleteResponse>({\r\n endpointName: API_ENDPOINT_COMMENT,\r\n method: 'DELETE',\r\n body: params,\r\n guestSpaceId: params.guestSpaceId,\r\n });\r\n};\r\n","import { kintoneAPI } from '../types/api';\r\nimport { WithCommonRequestParams, api } from './common';\r\n\r\nconst API_ENDPOINT_REPORTS = 'app/reports';\r\n\r\nexport type AppReportsGetRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n lang?: kintoneAPI.rest.Lang;\r\n};\r\n\r\nexport type GetAppChartsParams = WithCommonRequestParams<AppReportsGetRequest>;\r\n\r\n/**\r\n * 指定アプリのグラフ(レポート)設定を取得します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.lang - 取得する言語(省略可)\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns グラフ設定情報\r\n *\r\n * @example\r\n * ```ts\r\n * const { reports } = await getAppCharts({ app: 1 });\r\n * Object.keys(reports).forEach((name) => {\r\n * console.log(name, reports[name].chartType);\r\n * });\r\n * ```\r\n */\r\nexport const getAppCharts = (\r\n params: GetAppChartsParams\r\n): Promise<kintoneAPI.rest.AppReportsGetResponse> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api<kintoneAPI.rest.AppReportsGetResponse>({\r\n endpointName: API_ENDPOINT_REPORTS,\r\n method: 'GET',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n","import { kintoneAPI } from '../types/api';\r\nimport { WithCommonRequestParams, api } from './common';\r\n\r\nconst API_ENDPOINT_SPACE = 'space';\r\nconst API_ENDPOINT_THREAD = 'space/thread';\r\nconst API_ENDPOINT_MEMBERS = 'space/members';\r\nconst API_ENDPOINT_TEMPLATE = 'template/space';\r\n\r\n/**\r\n * 指定したスペースの情報を取得します。\r\n *\r\n * @param params.id - スペースID\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns スペース情報\r\n *\r\n * @example\r\n * ```ts\r\n * const space = await getSpace({ id: 1 });\r\n * console.log(space.name);\r\n * ```\r\n */\r\nexport const getSpace = (\r\n params: WithCommonRequestParams<kintoneAPI.rest.space.GetSpaceRequest>\r\n) => {\r\n return api<kintoneAPI.rest.space.GetSpaceResponse>({\r\n endpointName: API_ENDPOINT_SPACE,\r\n method: 'GET',\r\n body: params,\r\n ...params,\r\n });\r\n};\r\n\r\nexport type CreateSpaceParams = WithCommonRequestParams<{\r\n id: kintoneAPI.IDToRequest;\r\n name: string;\r\n members: {\r\n entity: { type: kintoneAPI.EntityType; code: string };\r\n isAdmin: boolean;\r\n includeSubs?: boolean;\r\n }[];\r\n isPrivate?: boolean;\r\n isGuest?: boolean;\r\n fixedMember?: boolean;\r\n}>;\r\nexport type CreateSpaceResponse = {\r\n id: string;\r\n};\r\n\r\n/**\r\n * テンプレートからスペースを新規作成します。\r\n *\r\n * @param params.id - スペーステンプレートID\r\n * @param params.name - スペース名\r\n * @param params.members - メンバー情報の配列\r\n * @param params.isPrivate - 非公開スペースにする場合は `true`\r\n * @param params.isGuest - ゲストスペースにする場合は `true`\r\n * @param params.fixedMember - メンバーを固定する場合は `true`\r\n * @returns 作成されたスペースのID\r\n *\r\n * @example\r\n * ```ts\r\n * const { id } = await createSpace({\r\n * id: 10, // テンプレートID\r\n * name: '新規プロジェクト',\r\n * members: [\r\n * { entity: { type: 'USER', code: 'user1' }, isAdmin: true },\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport const createSpace = (params: CreateSpaceParams): Promise<CreateSpaceResponse> => {\r\n const { guestSpaceId, debug, ...body } = params;\r\n return api<CreateSpaceResponse>({\r\n endpointName: API_ENDPOINT_TEMPLATE,\r\n method: 'POST',\r\n body,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type DeleteSpaceParams = WithCommonRequestParams<{\r\n /** 更新するスレッドのスレッドID */\r\n id: kintoneAPI.rest.space.SpaceIdToRequest;\r\n}>;\r\nexport type DeleteSpaceResponse = {};\r\n\r\n/**\r\n * スペースを削除します。\r\n *\r\n * @param params.id - 削除対象のスペースID\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns 空オブジェクト\r\n *\r\n * @example\r\n * ```ts\r\n * await deleteSpace({ id: 1 });\r\n * ```\r\n */\r\nexport const deleteSpace = (params: DeleteSpaceParams): Promise<DeleteSpaceResponse> => {\r\n const { guestSpaceId, debug, ...body } = params;\r\n return api<DeleteSpaceResponse>({\r\n endpointName: API_ENDPOINT_SPACE,\r\n method: 'DELETE',\r\n body,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type UpdateThreadParams = WithCommonRequestParams<{\r\n /** 更新するスレッドのスレッドID */\r\n id: kintoneAPI.IDToRequest;\r\n\r\n /**\r\n * スレッド名\r\n *\r\n * 1文字から128文字まで指定可能。省略した場合は、スレッド名は更新されません。\r\n *\r\n * シングルスレッドスペースのスレッドはスレッド名が存在しないため更新できません。\r\n */\r\n name?: string;\r\n\r\n /**\r\n * スレッドの本文\r\n *\r\n * 65535文字まで指定可能。省略した場合は、本文は更新されません。\r\n *\r\n * 許可されていない属性やタグは自動的に削除されます。\r\n *\r\n * アプリ貼り付け、ファイル添付、絵文字は HTML で指定します。\r\n *\r\n * 宛先を HTML 内で指定しても、その宛先には通知されません。\r\n */\r\n body?: string;\r\n}>;\r\nexport type UpdateThreadResponse = {};\r\n\r\n/**\r\n * スペース内のスレッド情報を更新します。\r\n *\r\n * スレッド名や本文を更新できます。シングルスレッドのスペースではスレッド名の更新はできません。\r\n *\r\n * @param params.id - スレッドID\r\n * @param params.name - スレッド名(1~128文字、省略時は更新なし)\r\n * @param params.body - スレッドの本文(HTML対応、65535文字まで、省略時は更新なし)\r\n * @returns 空オブジェクト\r\n *\r\n * @example\r\n * ```ts\r\n * await updateThread({\r\n * id: 5,\r\n * name: '更新後のスレッド名',\r\n * body: '<b>重要なお知らせ</b>',\r\n * });\r\n * ```\r\n */\r\nexport const updateThread = (params: UpdateThreadParams): Promise<UpdateThreadResponse> => {\r\n const { guestSpaceId, debug, ...body } = params;\r\n return api<UpdateThreadResponse>({\r\n endpointName: API_ENDPOINT_THREAD,\r\n method: 'PUT',\r\n body,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n","import { kintoneAPI } from '../types/api';\r\nimport { getRecords } from './record';\r\n\r\n/**\r\n * APIから取得したフィールド情報から、指定した関数の条件に当てはまるフィールドのみを返却します\r\n *\r\n * @param properties APIから取得したフィールド情報\r\n * @param callback 絞り込み条件\r\n * @returns 条件に当てはまるフィールド\r\n */\r\nexport const filterFieldProperties = (\r\n properties: kintoneAPI.FieldProperties,\r\n callback: (field: kintoneAPI.FieldProperty) => boolean\r\n): kintoneAPI.FieldProperties => {\r\n const filtered = Object.entries(properties).filter(([_, value]) => callback(value!));\r\n\r\n const reduced = filtered.reduce<kintoneAPI.FieldProperties>(\r\n (acc, [key, value]) => ({ ...acc, [key]: value }),\r\n {}\r\n );\r\n\r\n return reduced;\r\n};\r\n\r\n/**\r\n * REST APIでアクセスする先のアプリがゲストスペースに存在するものかどうかのつかない時、\r\n *\r\n * 一度スペースIDを未指定でアクセスし、エラーが返ってきたらスペースIDを指定して再度アクセスする関数です。\r\n */\r\nexport const withSpaceIdFallback = async <T extends (...args: any) => any>(params: {\r\n spaceId?: string;\r\n func: T;\r\n funcParams: Parameters<T>[0];\r\n}): Promise<ReturnType<T>> => {\r\n const { spaceId, func, funcParams } = params;\r\n try {\r\n const response = await func(funcParams);\r\n return response;\r\n } catch (error: any) {\r\n if (['GAIA_IL23', 'GAIA_IL25'].includes(error.code)) {\r\n const response = await func({ ...funcParams, guestSpaceId: spaceId });\r\n return response;\r\n }\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * REST APIでアクセスする先のアプリがゲストスペースに存在するかどうかを判定します。\r\n *\r\n * ゲストスペースIDなしでアクセスし、`GAIA_IL23` エラーが返るかどうかで判定します。\r\n *\r\n * @param appId - 判定対象のアプリID\r\n * @returns ゲストスペースのアプリであれば `true`\r\n *\r\n * @example\r\n * ```ts\r\n * const guest = await isGuestSpace('123');\r\n * if (guest) {\r\n * console.log('ゲストスペースのアプリです');\r\n * }\r\n * ```\r\n */\r\nexport const isGuestSpace = async (appId: string): Promise<boolean> => {\r\n try {\r\n await getRecords({ app: appId });\r\n } catch (error: any) {\r\n return error.code === 'GAIA_IL23';\r\n }\r\n return false;\r\n};\r\n\r\ntype Operator = '=' | '!=' | '>' | '<' | '>=' | '<=' | 'in' | 'not in' | 'like' | 'not like';\r\n\r\ntype OrderBy = 'asc' | 'desc';\r\n\r\n/**\r\n * ソート条件を組み立てます.\r\n *\r\n * ### なぜこの関数が必要?\r\n *\r\n * kintoneでフィールドコードが変更されることを想定してコードを記述する場合、フィールドコードのチェックと、ソート条件の組み立てを1つずつ定義する必要があります.\r\n *\r\n * この関数を使用することで、フィールドコードのチェックと、ソート条件の組み立てを同時に行うことができます.\r\n */\r\nexport const useSorting = <T>(field: keyof T, orderBy: OrderBy) => {\r\n return ` order by ${String(field)} ${orderBy}`;\r\n};\r\n\r\nexport type QueryCondition<T> = {\r\n field: keyof T;\r\n operator: Operator;\r\n value: string;\r\n truth?: 'and' | 'or';\r\n};\r\n\r\n/**\r\n * APIを使用する際のクエリーを組み立てます.\r\n *\r\n * ### なぜこの関数が必要?\r\n *\r\n * kintoneでフィールドコードが変更されることを想定してコードを記述する場合、クエリに使用するフィールドコードを1つずつ定義する必要があります。\r\n *\r\n * この関数を使用することで、フィールドコードのチェックと、クエリの組み立てを同時に行うことができます。\r\n */\r\nexport const useQuery = <T>(\r\n conditions: QueryCondition<T>[],\r\n options?: { debug?: boolean; sort?: { field: keyof T; orderBy: OrderBy } }\r\n) => {\r\n const { sort, debug = false } = options || {};\r\n const mergedCondition = conditions.reduce((acc, condition) => {\r\n const { field, operator, value, truth } = condition;\r\n const isNumber = !isNaN(Number(value));\r\n\r\n const formattedValue = !isNumber && !/^(\"|')/.test(value) ? `\"${value}\"` : value;\r\n\r\n if (acc.length) {\r\n acc += ` ${truth || 'and'} `;\r\n }\r\n return acc + `${String(field)} ${operator} ${formattedValue}`;\r\n }, '');\r\n\r\n if (debug) {\r\n console.log(`🔍 Query: ${mergedCondition}`);\r\n }\r\n if (sort) {\r\n return `${mergedCondition}${useSorting(sort.field, sort.orderBy)}`;\r\n }\r\n return mergedCondition;\r\n};\r\n"]}
1
+ {"version":3,"sources":["../src/character-ime-roman.ts","../src/character-width-conversion.ts","../src/cybozu.ts","../src/cybozu-api/common.ts","../src/cybozu-api/group.ts","../src/cybozu-api/organization.ts","../src/cybozu-api/user.ts","../src/date.ts","../src/decorator.ts","../src/xapp/xapp.ts","../src/xapp/singleton.ts","../src/utilities.ts","../src/event-manager.ts","../src/plugin/config.ts","../src/plugin/local-storage.ts","../src/rest-api/common.ts","../src/rest-api/app.ts","../src/rest-api/record.ts","../src/rest-api/client.ts","../src/rest-api/file.ts","../src/rest-api/record-comment.ts","../src/rest-api/report.ts","../src/rest-api/space.ts","../src/rest-api/utility.ts"],"names":["field","subtable","v","id","buildPath","api","checkBrowser","requests","response"],"mappings":"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A;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAAA;AAAA,IACH,MAAA,EAAG,QAA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","file":"index.js","sourcesContent":["/**\n * IME入力方式に基づく1文字単位のローマ字マッピング\n *\n * ヘボン式(hebonMap)との違い:\n * - 2文字組(きゃ、しゅ等)を使用せず、すべてのひらがな1文字に固定のローマ字を割り当てる\n * - 後続文字に依存する変換が一切ないため、プレフィックスマッチが常に成立する\n */\nconst imeRomanMap: Record<string, string> = {\n あ: 'A',\n い: 'I',\n う: 'U',\n え: 'E',\n お: 'O',\n か: 'KA',\n き: 'KI',\n く: 'KU',\n け: 'KE',\n こ: 'KO',\n さ: 'SA',\n し: 'SI',\n す: 'SU',\n せ: 'SE',\n そ: 'SO',\n た: 'TA',\n ち: 'TI',\n つ: 'TU',\n て: 'TE',\n と: 'TO',\n な: 'NA',\n に: 'NI',\n ぬ: 'NU',\n ね: 'NE',\n の: 'NO',\n は: 'HA',\n ひ: 'HI',\n ふ: 'HU',\n へ: 'HE',\n ほ: 'HO',\n ま: 'MA',\n み: 'MI',\n む: 'MU',\n め: 'ME',\n も: 'MO',\n や: 'YA',\n ゆ: 'YU',\n よ: 'YO',\n ら: 'RA',\n り: 'RI',\n る: 'RU',\n れ: 'RE',\n ろ: 'RO',\n わ: 'WA',\n ゐ: 'WI',\n ゑ: 'WE',\n を: 'WO',\n ん: 'NN',\n が: 'GA',\n ぎ: 'GI',\n ぐ: 'GU',\n げ: 'GE',\n ご: 'GO',\n ざ: 'ZA',\n じ: 'ZI',\n ず: 'ZU',\n ぜ: 'ZE',\n ぞ: 'ZO',\n だ: 'DA',\n ぢ: 'DI',\n づ: 'DU',\n で: 'DE',\n ど: 'DO',\n ば: 'BA',\n び: 'BI',\n ぶ: 'BU',\n べ: 'BE',\n ぼ: 'BO',\n ぱ: 'PA',\n ぴ: 'PI',\n ぷ: 'PU',\n ぺ: 'PE',\n ぽ: 'PO',\n ゔ: 'VU',\n ぁ: 'XA',\n ぃ: 'XI',\n ぅ: 'XU',\n ぇ: 'XE',\n ぉ: 'XO',\n っ: 'XTU',\n ゃ: 'XYA',\n ゅ: 'XYU',\n ょ: 'XYO',\n};\n\n/**\n * IME入力方式でひらがなをローマ字に変換します。\n *\n * 各ひらがな1文字を固定のローマ字に変換するため、後続文字に依存する変換が一切なく、\n * 文字列に文字を追加しても既存部分のローマ字が変化しません。\n * これによりプレフィックスマッチによるインクリメンタル検索が正しく動作します。\n */\nexport function toIMERoman(s: string): string {\n let result = '';\n for (let i = 0; i < s.length; i++) {\n const mapped = imeRomanMap[s[i]];\n result += mapped !== undefined ? mapped : s[i];\n }\n return result;\n}\n","import { toIMERoman } from './character-ime-roman';\r\n\r\n/**\r\n * カタカナをひらがなに変換します。\r\n *\r\n * @param target - 変換対象の文字列\r\n * @returns カタカナがひらがなに変換された文字列\r\n *\r\n * @example\r\n * ```\r\n * convertKatakanaToHiragana(\"カタカナ\") // => \"かたかな\"\r\n * convertKatakanaToHiragana(\"カタカナとひらがな\") // => \"かたかなとひらがな\"\r\n * ```\r\n */\r\nexport const convertKatakanaToHiragana = (target: string) => {\r\n return target.replace(/[\\u30a1-\\u30f6]/g, (match) =>\r\n String.fromCharCode(match.charCodeAt(0) - 0x60)\r\n );\r\n};\r\n\r\n/**\r\n * 全角英数字を半角英数字に変換します。\r\n *\r\n * @param target - 変換対象の文字列\r\n * @returns 全角英数字が半角英数字に変換された文字列\r\n *\r\n * @example\r\n * ```\r\n * convertFullwidthAlphanumericToHalfwidth(\"ABC123\") // => \"ABC123\"\r\n * convertFullwidthAlphanumericToHalfwidth(\"全角英数字\") // => \"全角英数字\"\r\n * ```\r\n */\r\nexport const convertFullwidthAlphanumericToHalfwidth = (target: string) => {\r\n return target.replace(/[A-Za-z0-9]/g, (s) => String.fromCharCode(s.charCodeAt(0) - 0xfee0));\r\n};\r\n\r\n/**\r\n * 半角カタカナを全角カタカナに変換します。\r\n *\r\n * @param target - 変換対象の文字列\r\n * @returns 半角カタカナが全角カタカナに変換された文字列\r\n *\r\n * @example\r\n * ```\r\n * convertHalfwidthKatakanaToFullwidth(\"カタカナ\") // => \"カタカナ\"\r\n * convertHalfwidthKatakanaToFullwidth(\"半角カタカナ\") // => \"半角カタカナ\"\r\n * ```\r\n */\r\nexport const convertHalfwidthKatakanaToFullwidth = (target: string) => {\r\n const KANA_CONVERTION_MAP = {\r\n ガ: 'ガ',\r\n ギ: 'ギ',\r\n グ: 'グ',\r\n ゲ: 'ゲ',\r\n ゴ: 'ゴ',\r\n ザ: 'ザ',\r\n ジ: 'ジ',\r\n ズ: 'ズ',\r\n ゼ: 'ゼ',\r\n ゾ: 'ゾ',\r\n ダ: 'ダ',\r\n ヂ: 'ヂ',\r\n ヅ: 'ヅ',\r\n デ: 'デ',\r\n ド: 'ド',\r\n バ: 'バ',\r\n ビ: 'ビ',\r\n ブ: 'ブ',\r\n ベ: 'ベ',\r\n ボ: 'ボ',\r\n パ: 'パ',\r\n ピ: 'ピ',\r\n プ: 'プ',\r\n ペ: 'ペ',\r\n ポ: 'ポ',\r\n ヴ: 'ヴ',\r\n ヷ: 'ヷ',\r\n ヺ: 'ヺ',\r\n ア: 'ア',\r\n イ: 'イ',\r\n ウ: 'ウ',\r\n エ: 'エ',\r\n オ: 'オ',\r\n カ: 'カ',\r\n キ: 'キ',\r\n ク: 'ク',\r\n ケ: 'ケ',\r\n コ: 'コ',\r\n サ: 'サ',\r\n シ: 'シ',\r\n ス: 'ス',\r\n セ: 'セ',\r\n ソ: 'ソ',\r\n タ: 'タ',\r\n チ: 'チ',\r\n ツ: 'ツ',\r\n テ: 'テ',\r\n ト: 'ト',\r\n ナ: 'ナ',\r\n ニ: 'ニ',\r\n ヌ: 'ヌ',\r\n ネ: 'ネ',\r\n ノ: 'ノ',\r\n ハ: 'ハ',\r\n ヒ: 'ヒ',\r\n フ: 'フ',\r\n ヘ: 'ヘ',\r\n ホ: 'ホ',\r\n マ: 'マ',\r\n ミ: 'ミ',\r\n ム: 'ム',\r\n メ: 'メ',\r\n モ: 'モ',\r\n ヤ: 'ヤ',\r\n ユ: 'ユ',\r\n ヨ: 'ヨ',\r\n ラ: 'ラ',\r\n リ: 'リ',\r\n ル: 'ル',\r\n レ: 'レ',\r\n ロ: 'ロ',\r\n ワ: 'ワ',\r\n ヲ: 'ヲ',\r\n ン: 'ン',\r\n ァ: 'ァ',\r\n ィ: 'ィ',\r\n ゥ: 'ゥ',\r\n ェ: 'ェ',\r\n ォ: 'ォ',\r\n ッ: 'ッ',\r\n ャ: 'ャ',\r\n ュ: 'ュ',\r\n ョ: 'ョ',\r\n '。': '。',\r\n '、': '、',\r\n ー: 'ー',\r\n '「': '「',\r\n '」': '」',\r\n '・': '・',\r\n };\r\n\r\n const regexp = new RegExp(`(${Object.keys(KANA_CONVERTION_MAP).join('|')})`, 'g');\r\n return target\r\n .replace(regexp, (s) => KANA_CONVERTION_MAP[s as keyof typeof KANA_CONVERTION_MAP])\r\n .replace(/゙/g, '゛')\r\n .replace(/゚/g, '゜');\r\n};\r\n\r\nexport type GetYuruCharaOptions = {\r\n isZenkakuEisujiSensitive: boolean;\r\n isCaseSensitive: boolean;\r\n isHankakuKatakanaSensitive: boolean;\r\n isKatakanaSensitive: boolean;\r\n isHebonSensitive: boolean;\r\n isHyphenSensitive: boolean;\r\n};\r\n\r\n/**\r\n * 指定された文字列に以下の変換をかけて返却します\r\n *\r\n * - 全角英数字を半角英数字へ\r\n * - アルファベットを大文字から小文字へ\r\n * - 半角カナを全角カナへ\r\n * - カタカナをひらがなへ\r\n *\r\n * 各変換はオプションによって制御できます\r\n *\r\n * @param target - 変換対象の文字列\r\n * @param options - 変換オプション\r\n * @param options.isZenkakuEisujiSensitive - 全角英数字を半角に変換するかどうか\r\n * @param options.isCaseSensitive - 大文字小文字を区別するかどうか\r\n * @param options.isHankakuKatakanaSensitive - 半角カタカナを全角カタカナに変換するかどうか\r\n * @param options.isKatakanaSensitive - カタカナをひらがなに変換するかどうか\r\n * @param options.isHebonSensitive - ヘボン式ローマ字に変換するかどうか\r\n * @param options.isHyphenSensitive - ハイフン、ダッシュ、長音を統一するかどうか\r\n * @returns 変換後の文字列\r\n *\r\n * @example\r\n * ```ts\r\n * getYuruChara('アイウエオ') // => 'あいうえお'\r\n * getYuruChara('アイウエオ', { isKatakanaSensitive: true }) // => 'アイウエオ'\r\n * getYuruChara('アイウエオ', { isHankakuKatakanaSensitive: true }) // => 'アイウエオ'\r\n * getYuruChara('ABC123') // => 'abc123'\r\n * getYuruChara('ABC123', { isCaseSensitive: true }) // => 'ABC123'\r\n * getYuruChara('ABC123', { isZenkakuEisujiSensitive: true }) // => 'abc123'\r\n * getYuruChara('ABC123', { isCaseSensitive: true, isZenkakuEisujiSensitive: true }) // => 'ABC123'\r\n * ```\r\n */\r\nexport const getYuruChara = (target: string, options?: Partial<GetYuruCharaOptions>) => {\r\n const {\r\n isZenkakuEisujiSensitive = false,\r\n isCaseSensitive = false,\r\n isHankakuKatakanaSensitive = false,\r\n isKatakanaSensitive = false,\r\n isHebonSensitive = false,\r\n isHyphenSensitive = false,\r\n } = options || {};\r\n\r\n let converted = target;\r\n\r\n if (!isZenkakuEisujiSensitive) {\r\n converted = convertFullwidthAlphanumericToHalfwidth(converted);\r\n }\r\n if (!isHankakuKatakanaSensitive) {\r\n converted = convertHalfwidthKatakanaToFullwidth(converted);\r\n }\r\n if (!isKatakanaSensitive) {\r\n converted = convertKatakanaToHiragana(converted);\r\n }\r\n\r\n if (!isHebonSensitive) {\r\n converted = toIMERoman(converted);\r\n }\r\n\r\n if (!isCaseSensitive) {\r\n converted = converted.toLowerCase();\r\n }\r\n\r\n if (!isHyphenSensitive) {\r\n // ハイフン、ダッシュ、長音を統一\r\n // 連続する場合は、1文字にまとめる\r\n converted = converted.replace(\r\n /[\\u002D\\u2010-\\u2015\\u2212\\u301C\\u30FC\\uFF0D\\u005F\\uFF3F\\uFF5E]+/g,\r\n '-'\r\n );\r\n }\r\n\r\n return converted;\r\n};\r\n","export namespace cx {\r\n export type Schema =\r\n | typeof cybozu.data.page.SCHEMA_DATA\r\n | typeof cybozu.data.page.FORM_DATA.schema;\r\n export type Field = (typeof cybozu.data.page.SCHEMA_DATA.table.fieldList)[string];\r\n export type Subtable = (typeof cybozu.data.page.SCHEMA_DATA.subTable)[string];\r\n}\r\n\r\nconst getSchema = (): cx.Schema | null =>\r\n cybozu?.data?.page?.SCHEMA_DATA || cybozu?.data?.page?.FORM_DATA?.schema || null;\r\n\r\n/**\r\n * **この関数は非公式のAPIを使用しています。kintoneのアップデートにより使用できなくなる可能性があります**\r\n *\r\n * 内部的に使用されている、サブテーブルを除くフィールドのメタデータを取得します\r\n *\r\n * @returns サブテーブルを除くフィールドのメタデータ一覧、またはnull\r\n */\r\nexport const getMetaTable_UNSTABLE = (): cx.Field[] | null => {\r\n const schema = getSchema();\r\n const fieldList = schema?.table?.fieldList;\r\n if (!fieldList) {\r\n return null;\r\n }\r\n\r\n return Object.values(fieldList);\r\n};\r\n\r\n/**\r\n * **この関数は非公式のAPIを使用しています。kintoneのアップデートにより使用できなくなる可能性があります**\r\n *\r\n * 内部的に使用されている、サブテーブルのメタデータを取得します\r\n *\r\n * @returns サブテーブルのメタデータ一覧、またはnull\r\n */\r\nexport const getMetaSubtable_UNSTABLE = (): cx.Subtable[] | null => {\r\n const schema = getSchema();\r\n const subtable = schema?.subTable;\r\n if (!subtable) {\r\n return null;\r\n }\r\n\r\n const subtableList = Object.values(subtable);\r\n return subtableList;\r\n};\r\n\r\n/**\r\n * **この関数は非公式のAPIを使用しています。kintoneのアップデートにより使用できなくなる可能性があります**\r\n *\r\n * 内部的に使用されている、フィールドのメタデータを取得します\r\n *\r\n * サブテーブルとそれ以外とで、データの構造が異なります\r\n *\r\n * @returns フィールドのメタデータ一覧、またはnull\r\n */\r\nexport const getMetaFields_UNSTABLE = (): (cx.Field | cx.Subtable)[] | null => {\r\n return [...(getMetaTable_UNSTABLE() || []), ...(getMetaSubtable_UNSTABLE() || [])];\r\n};\r\n\r\n/**\r\n * **この関数は非公式のAPIを使用しています。kintoneのアップデートにより使用できなくなる可能性があります**\r\n *\r\n * フィールドコードから、紐づくフィールドの内部的に使用されている一意なフィールドIDを返却します\r\n *\r\n * @param code フィールドコード\r\n * @returns フィールドID、またはnull\r\n */\r\nexport const getMetaFieldId_UNSTABLE = <T = any>(code: keyof T) => {\r\n const fields = getMetaFields_UNSTABLE();\r\n if (!fields) {\r\n return null;\r\n }\r\n\r\n for (const field of fields) {\r\n if (field?.var === code) {\r\n return field?.id || null;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * **この関数は非公式のAPIを使用しています。kintoneのアップデートにより使用できなくなる可能性があります**\r\n *\r\n * @param subtableCode サブテーブルのフィールドコード\r\n * @returns サブテーブル内に存在するフィールドのメタデータ一覧、またはnull\r\n */\r\nexport const getMetaSubtableFields_UNSTABLE = (subtableCode: string): cx.Field[] | null => {\r\n const schema = getSchema();\r\n const subtable = schema?.subTable;\r\n if (!subtable) {\r\n return null;\r\n }\r\n\r\n const subtableList = Object.values(subtable);\r\n\r\n for (const subtable of subtableList) {\r\n const fieldList = subtable?.fieldList;\r\n if (!fieldList) {\r\n continue;\r\n }\r\n if (subtable?.var === subtableCode) {\r\n return Object.values(fieldList);\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n * **この関数は非公式のAPIを使用しています。kintoneのアップデートにより使用できなくなる可能性があります**\r\n *\r\n * URLのクエリパラメータに含まれる一覧の検索条件を取得します\r\n * クエリパラメータでは、フィールドのキー情報としてフィールドコードの代わりにフィールドID(f + 数字)が使用されます\r\n *\r\n * 保険として、URLのクエリパラメータに含まれるqパラメータも取得します\r\n *\r\n * 取得する手順は以下の通りです\r\n *\r\n * 1. `cybozu.data.page.QUERY_STRING`\r\n * 2. `new URLSearchParams(location.search).get('q')`\r\n * 3. 空文字\r\n *\r\n * @example\r\n * ```ts\r\n * // URL: https://example.cybozu.com/k/1/?f100000=1&f200000=2\r\n * getQueryString_UNSTABLE(); // => 'f100000=1&f200000=2'\r\n * ```\r\n */\r\nexport const getQueryString_UNSTABLE = () => {\r\n return cybozu?.data?.page?.QUERY_STRING ?? new URLSearchParams(location.search).get('q') ?? '';\r\n};\r\n","import { kintoneAPI } from '../types/api';\r\n\r\nconst buildPath = (endpointName: string) => {\r\n return kintone.api.url(`/v1/${endpointName}`);\r\n};\r\n\r\nexport const api = async <T = any>(params: {\r\n endpointName: string;\r\n method: kintoneAPI.rest.Method;\r\n body: any;\r\n debug?: boolean;\r\n}): Promise<T> => {\r\n const { endpointName, method, body, debug } = params;\r\n try {\r\n checkBrowser();\r\n const path = buildPath(endpointName);\r\n if (debug) {\r\n console.groupCollapsed(\r\n `%ckintone REST API %c(${endpointName})`,\r\n 'color: #1e40af;',\r\n 'color: #aaa'\r\n );\r\n console.log(`path: ${path}`);\r\n console.log(`method: ${method}`);\r\n console.log('body', body);\r\n }\r\n const response: T = await kintone.api(path, method, body);\r\n if (debug) {\r\n console.log('response', response);\r\n }\r\n return response;\r\n } catch (error) {\r\n if (debug) {\r\n console.error(error);\r\n }\r\n throw error;\r\n } finally {\r\n if (debug) {\r\n console.groupEnd();\r\n }\r\n }\r\n};\r\n\r\nexport const checkBrowser = () => {\r\n if (typeof window === 'undefined') {\r\n throw new Error('この関数はブラウザでのみ使用できます');\r\n }\r\n if (typeof kintone === 'undefined') {\r\n throw new Error('kintoneオブジェクトが見つかりません');\r\n }\r\n};\r\n\r\nexport const sliceIntoChunks = <T>(array: T[], size: number): T[][] => {\r\n const result = [];\r\n for (let i = 0, j = array.length; i < j; i += size) {\r\n result.push(array.slice(i, i + size));\r\n }\r\n return result;\r\n};\r\n\r\nexport type WithDebug<T> = T & { debug?: boolean };\r\nexport type WithGuestSpaceId<T> = T & { guestSpaceId?: number | string };\r\nexport type WithCommonRequestParams<T> = WithDebug<WithGuestSpaceId<T>>;\r\nexport type TypeOmmited<T extends Record<string, any>> = {\r\n [P in keyof T]: Omit<T[P], 'type'>;\r\n};\r\n\r\nexport type RecordFrame = Record<string, any>;\r\n\r\nexport type RecordToRequest<T extends RecordFrame = kintoneAPI.RecordData> = Partial<\r\n TypeOmmited<T>\r\n>;\r\n","import { api } from './common';\n\n/**\n * サイボウズのグループ情報を取得します。\n *\n * @returns サイボウズAPIから取得したグループ情報のリストを含むPromise\n * @throws APIエラーが発生した場合にエラーをスローします\n *\n * @example\n * ```typescript\n * // グループ情報を取得する\n * const result = await getCybozuGroups();\n * console.log(result.groups); // グループの配列が出力される\n *\n * // エラーハンドリングと組み合わせる\n * try {\n * const { groups } = await getCybozuGroups();\n * groups.forEach(group => {\n * console.log(`グループ名: ${group.name}, ID: ${group.id}`);\n * });\n * } catch (error) {\n * console.error('グループ取得に失敗しました:', error);\n * }\n * ```\n */\nexport function getCybozuGroups(): Promise<{ groups: cybozu.api.Group[] }> {\n return api({ endpointName: 'groups', method: 'GET', body: {} });\n}\n\n/**\n * サイボウズのグループに所属するユーザー一覧を取得します。\n *\n * 詳細は、[サイボウズのAPIドキュメント](https://cybozu.dev/ja/common/docs/user-api/groups/get-groups-users/)を参照してください。\n *\n * @param groupCode - 取得対象のグループコード\n * @returns グループに所属するユーザー一覧を含むPromise\n * @see {@link getCybozuGroups} グループ情報を取得するための関数\n *\n * @example\n * ```typescript\n * // 営業部グループのユーザー一覧を取得\n * const result = await getCybozuGroupUsers('sales');\n * console.log(result.users); // User[]\n *\n * // 開発チームのユーザー一覧を取得\n * const devTeam = await getCybozuGroupUsers('dev-team');\n * devTeam.users.forEach(user => {\n * console.log(`${user.name}: ${user.email}`);\n * });\n * ```\n */\nexport function getCybozuGroupUsers(groupCode: string): Promise<{ users: cybozu.api.User[] }> {\n return api({ endpointName: 'group/users', method: 'GET', body: { code: groupCode } });\n}\n","import { api } from './common';\n\n/**\n * Cybozu組織情報を取得します。\n *\n * @description\n * このメソッドは、Cybozuのorganizations APIエンドポイントにGETリクエストを送信し、\n * 組織の一覧を取得します。\n *\n * @returns {Promise<{ organizations: cybozu.api.Organization[] }>}\n * 組織情報の配列を含むPromiseオブジェクト\n *\n * @example\n * ```typescript\n * // 組織情報を取得する例\n * const result = await getCybozuOrganizations();\n * console.log(result.organizations); // Organization[]\n *\n * // エラーハンドリングを含む例\n * try {\n * const { organizations } = await getCybozuOrganizations();\n * organizations.forEach(org => {\n * console.log(`組織名: ${org.name}, ID: ${org.id}`);\n * });\n * } catch (error) {\n * console.error('組織情報の取得に失敗しました:', error);\n * }\n * ```\n *\n * @throws {Error} APIリクエストが失敗した場合\n *\n * @since 1.0.0\n */\nexport function getCybozuOrganizations(): Promise<{ organizations: cybozu.api.Organization[] }> {\n return api({ endpointName: 'organizations', method: 'GET', body: {} });\n}\n\n/**\n * サイボウズ組織のユーザー一覧を取得します。\n *\n * 指定された組織コードに所属するユーザーの情報を取得するためのAPIを呼び出します。\n *\n * @param organizationCode - 取得対象の組織コード\n * @returns ユーザー一覧を含むPromiseオブジェクト\n *\n * @example\n * ```typescript\n * // 組織コード \"sales\" のユーザー一覧を取得\n * const result = await getCybozuOrganizationUsers(\"sales\");\n * console.log(result.users); // User[]\n *\n * // エラーハンドリングを含む使用例\n * try {\n * const { users } = await getCybozuOrganizationUsers(\"development\");\n * users.forEach(user => {\n * console.log(`ユーザー名: ${user.name}, ID: ${user.id}`);\n * });\n * } catch (error) {\n * console.error(\"ユーザー取得に失敗しました:\", error);\n * }\n * ```\n */\nexport function getCybozuOrganizationUsers(\n organizationCode: string\n): Promise<{ users: cybozu.api.User[] }> {\n return api({\n endpointName: 'organization/users',\n method: 'GET',\n body: { code: organizationCode },\n });\n}\n","import { api } from './common';\n\n/**\n * サイボウズのユーザ情報を返却します\n * @returns サイボウズのユーザ情報\n */\nexport const getCybozuUsers = (): Promise<{ users: cybozu.api.User[] }> => {\n return api({ endpointName: 'users', method: 'GET', body: {} });\n};\n\n/**\n * ユーザーが所属するグループを返却します\n * @param code ユーザーコード\n * @returns ユーザーが所属するグループ\n */\nexport const getCybozuUserGroups = (code: string): Promise<{ groups: cybozu.api.Group[] }> => {\n return api({ endpointName: `user/groups`, method: 'GET', body: { code } });\n};\n\n/**\n * ユーザーが所属する組織を返却します\n * @param code ユーザーコード\n * @returns ユーザーが所属する組織\n */\nexport const getCybozuUserOrganizations = (\n code: string\n): Promise<{ organizations: cybozu.api.Organization[] }> => {\n return api({ endpointName: `user/organizations`, method: 'GET', body: { code } });\n};\n","export const getWareki = (\r\n date: Date,\r\n option?: { era?: 'narrow' | 'short' | 'long' }\r\n): { gengo: string; year: number } => {\r\n const { era = 'narrow' } = option || {};\r\n\r\n const formatter = new Intl.DateTimeFormat('ja-JP-u-ca-japanese', { era });\r\n\r\n const formatted = formatter.format(date);\r\n const matched = formatted.match(/^(.*?)(\\d+).*/);\r\n if (!matched) {\r\n throw new Error('和暦情報のコンバートに失敗しました');\r\n }\r\n\r\n const [_, gengo, year] = matched;\r\n\r\n return { gengo, year: Number(year) };\r\n};\r\n","/**\n * 指定された関数にロギング機能を追加するデコレータ関数。\n *\n * ログはグループ化され、関数名、引数、戻り値、処理時間が表示される。\n *\n * @template T - 関数の型。\n * @param {T} fn - ロギングを追加する対象の関数。\n * @param {string} [name=fn.name] - ログに表示する関数名。デフォルトは関数の名前。\n * @returns {(...args: Parameters<T>) => ReturnType<T>} ロギング機能が追加された新しい関数。\n *\n * @example\n * const add = (a: number, b: number) => a + b;\n * const addWithLogging = withLogging(add);\n * addWithLogging(2, 3); // ログが出力される\n */\nexport const withLogging = <T extends (...args: any[]) => any>(fn: T, name = fn.name) => {\n return (...args: Parameters<T>): ReturnType<T> => {\n try {\n console.groupCollapsed(`🔧 ${name}`);\n console.log('🔧 args', args);\n const now = performance.now();\n const result = fn(...args);\n console.log('✨ result', result);\n console.log(`🕒 took ${performance.now() - now}ms`);\n return result;\n } finally {\n console.groupEnd();\n }\n };\n};\n","import { kintoneAPI } from '../types/api';\r\n\r\n/**\r\n * kintone javascript APIから実行環境を取得し、モバイル端末である場合はTrueを返却します\r\n *\r\n * 引数としてイベントタイプを設定することで、より安全なチェックを行います\r\n *\r\n * 判定の以下の優先順にしたがって実行されます\r\n *\r\n * 1. イベントタイプに指定がある場合はタイプ名から判定\r\n * 2. グローバル変数が存在する場合はそれに従う\r\n * 3. kintone javascript APIから、アプリIDを取得して判定\r\n *\r\n * @param eventType イベントタイプ\r\n * @returns 実行環境がモバイル端末である場合はtrue\r\n */\r\nexport const isMobile = (eventType?: string): boolean => {\r\n if (eventType) {\r\n return /^mobile\\./.test(eventType);\r\n }\r\n return kintone.app.getId() === null;\r\n};\r\n\r\n/**\r\n * kintone javascript APIのルートオブジェクトを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * 引数としてイベントタイプを設定することで、より安全なチェックを行います\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app} デスクトップ用のルートオブジェクト\r\n * @see {@link kintone.mobile.app} モバイル用のルートオブジェクト\r\n *\r\n * @param eventType イベントタイプ\r\n * @returns kintone javascript APIのルートオブジェクト\r\n */\r\nexport const getAppObject = (eventType?: string): typeof kintone.mobile.app | typeof kintone.app =>\r\n isMobile(eventType) ? kintone.mobile.app : kintone.app;\r\n\r\n/**\r\n * kintone javascript APIを使用し、現在のアプリIDを返却します\r\n *\r\n * アプリIDの取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.getId} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.getId} モバイル版の関数\r\n *\r\n * @returns 現在のアプリID、またはnull\r\n */\r\nexport const getAppId = (): number | null => getAppObject().getId();\r\n\r\n/**\r\n * kintone javascript APIを使用し、現在のレコードIDを返却します\r\n *\r\n * レコードIDの取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.record.getId} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.record.getId} モバイル版の関数\r\n *\r\n * @returns 現在のレコードID、またはnull\r\n */\r\nexport const getRecordId = (): number | null => getAppObject().record.getId();\r\n\r\n/**\r\n * kintone javascript APIを使用し、指定されたIDのスペースフィールドを返却します\r\n *\r\n * スペースフィールドの取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.record.getSpaceElement} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.record.getSpaceElement} モバイル版の関数\r\n *\r\n * @returns 指定されたIDのスペースフィールド、またはnull\r\n */\r\nexport const getSpaceElement = (spaceId: string): HTMLElement | null =>\r\n getAppObject().record.getSpaceElement(spaceId);\r\n\r\n/**\r\n * kintone javascript APIを使用し、オプションを含むレコード一覧のクエリ文字列を返却します\r\n *\r\n * クエリ文字列の取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.getQuery} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.getQuery} モバイル版の関数\r\n *\r\n * @returns オプションを含むレコード一覧のクエリ文字列、またはnull\r\n */\r\nexport const getQuery = (): string | null => getAppObject().getQuery();\r\n\r\n/**\r\n * kintone javascript APIを使用し、レコード一覧のクエリ文字列を返却します\r\n *\r\n * クエリ文字列の取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.getQueryCondition} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.getQueryCondition} モバイル版の関数\r\n *\r\n * @returns レコード一覧のクエリ文字列、またはnull\r\n */\r\nexport const getQueryCondition = (): string | null => getAppObject().getQueryCondition();\r\n\r\n/**\r\n * kintone javascript APIを使用し、現在開いてるレコードデータをJSON形式で返却します\r\n *\r\n * レコードデータの取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.record.get} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.record.get} モバイル版の関数\r\n *\r\n * @returns レコードデータ、またはnull\r\n */\r\nexport const getCurrentRecord = <T = kintoneAPI.RecordData>(): { record: T } =>\r\n getAppObject().record.get();\r\n\r\n/**\r\n * kintone javascript APIを使用し、現在開いてるレコードに値をセットします\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * {@link https://developer.cybozu.io/hc/ja/articles/201942014#step4}\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.record.set} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.record.set} モバイル版の関数\r\n */\r\nexport const setCurrentRecord = (record: { record: any }): void =>\r\n getAppObject().record.set(record);\r\n\r\n/**\r\n * kintone javascript APIを使用し、フィールドの表示/非表示を切り替えます\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.record.setFieldShown} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.record.setFieldShown} モバイル版の関数\r\n *\r\n * @param code 対象フィールドのフィールドコード\r\n * @param visible true: フィールドを表示、false: フィールドを非表示\r\n */\r\nexport const setFieldShown = <T = Record<string, unknown>>(code: keyof T, visible: boolean): void =>\r\n getAppObject().record.setFieldShown(String(code), visible);\r\n\r\n/**\r\n * kintone javascript APIを使用し、ツールバー部分を優先してヘッダー要素を返します\r\n *\r\n * ヘッダー要素の取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n *\r\n * @param eventType イベントタイプ\r\n * @returns レコードデータ、またはnull\r\n */\r\nexport const getHeaderSpace = (eventType: string): HTMLElement | null => {\r\n if (isMobile(eventType)) {\r\n kintone.mobile.app.getHeaderSpaceElement();\r\n } else if (!~eventType.indexOf('index')) {\r\n return kintone.app.record.getHeaderMenuSpaceElement();\r\n }\r\n return kintone.app.getHeaderMenuSpaceElement();\r\n};\r\n\r\n/**\r\n * kintone javascript APIを使用し、レコードに対応するフィールド要素を返却します\r\n *\r\n * フィールド要素の取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.record.getFieldElement} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.record.getFieldElement} モバイル版の関数\r\n *\r\n * @param fieldCode 対象フィールドのフィールドコード\r\n * @returns フィールド要素、またはnull\r\n */\r\nexport const getFieldElement = (fieldCode: string): HTMLElement | null => {\r\n return getAppObject().record.getFieldElement(fieldCode);\r\n};\r\n\r\n/**\r\n * kintone javascript APIを使用し、レコード一覧から対応するフィールド要素の配列を返却します\r\n *\r\n * フィールド要素の取得に失敗した場合はnullを返却します\r\n *\r\n * この関数は実行デバイスの影響を受けません\r\n *\r\n * @see {@link isMobile} 実行環境の判定ロジック\r\n * @see {@link kintone.app.getFieldElements} デスクトップ版の関数\r\n * @see {@link kintone.mobile.app.getFieldElements} モバイル版の関数\r\n *\r\n * @param fieldCode 対象フィールドのフィールドコード\r\n * @returns フィールド要素の配列、またはnull\r\n */\r\nexport const getFieldElements = (fieldCode: string): HTMLElement[] | null => {\r\n return getAppObject().getFieldElements(fieldCode);\r\n};\r\n","import { getAppObject } from './xapp';\n\n/**\n * kintone javascript APIのルートオブジェクト\n */\nexport const xapp = getAppObject();\n","import type { kintoneAPI } from './types/api';\r\nimport type { SavedFields } from './utility-types';\r\n\r\n/**\r\n * kintone の数値フィールドの値を指定された形式の文字列として取得します。\r\n *\r\n * @param params - 関数のパラメータオブジェクト\r\n * @param params.field - 数値フィールドの値を含むオブジェクト\r\n * @param params.property - フィールドのプロパティ設定(表示スケール、桁区切り、単位など)\r\n * @param params.locales - ロケール情報(オプション、デフォルトは 'ja')\r\n * @returns フォーマットされた数値の文字列\r\n *\r\n * @example\r\n * ```typescript\r\n * const params = {\r\n * field: { value: \"1234.56\" },\r\n * property: {\r\n * displayScale: \"2\",\r\n * digit: true,\r\n * unit: \"$\",\r\n * unitPosition: \"BEFORE\"\r\n * },\r\n * locales: 'en-US',\r\n * };\r\n * const result = getNumberFieldValueAsString(params);\r\n * // result: \"$1,234.56\"\r\n * ```\r\n */\r\nexport const getNumberFieldValueAsString = (params: {\r\n field: kintoneAPI.field.Number;\r\n property: kintoneAPI.property.Number;\r\n locales?: Intl.LocalesArgument;\r\n}): string => {\r\n const { field, property, locales = 'ja' } = params;\r\n\r\n const casted = Number(field.value);\r\n if (isNaN(casted)) {\r\n return field.value;\r\n }\r\n\r\n const displayScale = property?.displayScale ? Number(property.displayScale) : null;\r\n\r\n const scaled = displayScale\r\n ? Math.round(casted * Math.pow(10, Number(displayScale))) / Math.pow(10, Number(displayScale))\r\n : casted;\r\n\r\n const separated = property?.digit\r\n ? Number(scaled).toLocaleString(locales, {\r\n maximumFractionDigits: displayScale ?? undefined,\r\n minimumFractionDigits: displayScale ?? undefined,\r\n })\r\n : displayScale\r\n ? Number(scaled).toFixed(displayScale)\r\n : scaled;\r\n\r\n if (property?.unit) {\r\n if (property.unitPosition === 'BEFORE') {\r\n return `${property.unit}${separated}`;\r\n } else {\r\n return `${separated}${property.unit}`;\r\n }\r\n }\r\n\r\n return String(separated);\r\n};\r\n\r\n/**\r\n * 各フィールドタイプの値を文字列として返却します\r\n *\r\n * 配列で取得されるような値は区切り文字で連結されます\r\n * @param field\r\n * @param options\r\n * @returns\r\n */\r\nexport const getFieldValueAsString = (\r\n field: kintoneAPI.Field | SavedFields,\r\n options?: {\r\n separator?: string;\r\n ignoresCalculationError?: boolean;\r\n }\r\n): string => {\r\n const { separator = ', ', ignoresCalculationError = false } = options ?? {};\r\n\r\n if (\r\n field.type === 'MULTI_LINE_TEXT' ||\r\n field.type === 'RICH_TEXT' ||\r\n field.type === 'CREATED_TIME' ||\r\n field.type === 'DATE' ||\r\n field.type === 'DATETIME' ||\r\n field.type === 'DROP_DOWN' ||\r\n field.type === 'LINK' ||\r\n field.type === 'RECORD_NUMBER' ||\r\n field.type === 'STATUS' ||\r\n field.type === 'RADIO_BUTTON' ||\r\n field.type === 'TIME' ||\r\n field.type === 'UPDATED_TIME' ||\r\n field.type === '__ID__' ||\r\n field.type === '__REVISION__'\r\n ) {\r\n return field.value ?? '';\r\n } else if (\r\n field.type === 'SINGLE_LINE_TEXT' ||\r\n field.type === 'NUMBER' ||\r\n field.type === 'CALC'\r\n ) {\r\n const value = field.value ?? '';\r\n if (ignoresCalculationError) {\r\n return /^#.*!$/.test(value) ? '' : value;\r\n }\r\n return value;\r\n } else if (\r\n field.type === 'CATEGORY' ||\r\n field.type === 'CHECK_BOX' ||\r\n field.type === 'MULTI_SELECT'\r\n ) {\r\n return field.value.join(separator);\r\n } else if (field.type === 'CREATOR' || field.type === 'MODIFIER') {\r\n return field.value.name;\r\n } else if (\r\n field.type === 'GROUP_SELECT' ||\r\n field.type === 'ORGANIZATION_SELECT' ||\r\n field.type === 'USER_SELECT' ||\r\n field.type === 'STATUS_ASSIGNEE'\r\n ) {\r\n return field.value.map((value) => value.name).join(separator);\r\n } else if (field.type === 'FILE') {\r\n return field.value.map((value) => value.name).join(separator);\r\n } else if (field.type === 'SUBTABLE') {\r\n return field.value\r\n .map((row) =>\r\n Object.values(row.value)\r\n .map((cell) => getFieldValueAsString(cell, { separator }))\r\n .join(separator)\r\n )\r\n .join(separator);\r\n }\r\n return '';\r\n};\r\n\r\n/** 受け取ったフィールドが文字列として管理されるフィールドであれば`true`を返します */\r\nconst isStringField = (\r\n field: kintoneAPI.Field\r\n): field is\r\n | kintoneAPI.field.SingleLineText\r\n | kintoneAPI.field.MultiLineText\r\n | kintoneAPI.field.RichText\r\n | kintoneAPI.field.Dropdown\r\n | kintoneAPI.field.Link\r\n | kintoneAPI.field.RecordNumber\r\n | kintoneAPI.field.Status\r\n | kintoneAPI.field.RadioButton\r\n | kintoneAPI.field.ID\r\n | kintoneAPI.field.Revision => {\r\n return (\r\n field.type === 'SINGLE_LINE_TEXT' ||\r\n field.type === 'MULTI_LINE_TEXT' ||\r\n field.type === 'RICH_TEXT' ||\r\n field.type === 'DROP_DOWN' ||\r\n field.type === 'LINK' ||\r\n field.type === 'RECORD_NUMBER' ||\r\n field.type === 'STATUS' ||\r\n field.type === 'RADIO_BUTTON' ||\r\n field.type === '__ID__' ||\r\n field.type === '__REVISION__'\r\n );\r\n};\r\n\r\n/** 受け取ったフィールドが数値として管理されるフィールドであれば`true`を返します */\r\nconst isNumberField = (\r\n field: kintoneAPI.Field\r\n): field is kintoneAPI.field.Number | kintoneAPI.field.Calc => {\r\n return field.type === 'NUMBER' || field.type === 'CALC';\r\n};\r\n\r\n/** 受け取ったフィールドが日付として管理されるフィールドであれば`true`を返します */\r\nconst isDateField = (\r\n field: kintoneAPI.Field\r\n): field is\r\n | kintoneAPI.field.CreatedTime\r\n | kintoneAPI.field.UpdatedTime\r\n | kintoneAPI.field.Date\r\n | kintoneAPI.field.DateTime => {\r\n return (\r\n field.type === 'CREATED_TIME' ||\r\n field.type === 'UPDATED_TIME' ||\r\n field.type === 'DATE' ||\r\n field.type === 'DATETIME'\r\n );\r\n};\r\n\r\n/** 受け取ったフィールドが時間フィールドであれば`true`を返します */\r\nconst isTimeField = (field: kintoneAPI.Field): field is kintoneAPI.field.Time => {\r\n return field.type === 'TIME';\r\n};\r\n\r\n/**\r\n * 各フィールドのタイプに応じて、ソートを行います\r\n *\r\n * @param aField ソート対象のフィールド\r\n * @param bField ソート対象のフィールド\r\n * @returns aFieldがbFieldより小さい場合は負の整数、aFieldがbFieldより大きい場合は正の整数、等しい場合は0\r\n */\r\nexport const sortField = <T extends kintoneAPI.Field>(aField: T, bField: T): number => {\r\n const aFieldType = aField.type;\r\n const bFieldType = bField.type;\r\n\r\n if (aField.value === null && bField.value === null) {\r\n return 0;\r\n }\r\n if (aField.value === null) {\r\n return 1;\r\n }\r\n if (bField.value === null) {\r\n return -1;\r\n }\r\n\r\n if (aFieldType === 'RECORD_NUMBER' && bFieldType === 'RECORD_NUMBER') {\r\n // レコード番号は文字列だが、`アプリコード-連番`の形式で保存されているため、連番の部分を数値として比較する\r\n const regex = /.*?(\\d+)$/;\r\n const aMatch = aField.value.match(regex);\r\n const bMatch = bField.value.match(regex);\r\n if (aMatch && bMatch) {\r\n const aNumber = Number(aMatch[1]);\r\n const bNumber = Number(bMatch[1]);\r\n if (isNaN(aNumber) && isNaN(bNumber)) {\r\n return 0;\r\n }\r\n return Number(aMatch[1]) - Number(bMatch[1]);\r\n }\r\n return aField.value.localeCompare(bField.value);\r\n } else if (isStringField(aField) && isStringField(bField)) {\r\n return aField.value?.localeCompare(bField.value ?? '') ?? 0;\r\n } else if (isNumberField(aField) && isNumberField(bField)) {\r\n const aNum = Number(aField.value);\r\n const bNum = Number(bField.value);\r\n if (isNaN(aNum) && isNaN(bNum)) {\r\n return 0;\r\n }\r\n if (isNaN(aNum)) {\r\n return 1;\r\n }\r\n if (isNaN(bNum)) {\r\n return -1;\r\n }\r\n return aNum - bNum;\r\n } else if (isDateField(aField) && isDateField(bField)) {\r\n const aDate = new Date(aField.value);\r\n const bDate = new Date(bField.value);\r\n if (isNaN(aDate.getTime()) && isNaN(bDate.getTime())) {\r\n return 0;\r\n }\r\n if (isNaN(aDate.getTime())) {\r\n return 1;\r\n }\r\n if (isNaN(bDate.getTime())) {\r\n return -1;\r\n }\r\n return aDate.getTime() - bDate.getTime();\r\n } else if (isTimeField(aField) && isTimeField(bField)) {\r\n // TIME フィールドは \"HH:mm\" 形式の文字列なので、分に変換して比較する\r\n const parseTime = (value: string): number => {\r\n const [hours, minutes] = value.split(':').map(Number);\r\n if (isNaN(hours) || isNaN(minutes)) {\r\n return NaN;\r\n }\r\n return hours * 60 + minutes;\r\n };\r\n const aTime = parseTime(aField.value);\r\n const bTime = parseTime(bField.value);\r\n if (isNaN(aTime) && isNaN(bTime)) {\r\n return 0;\r\n }\r\n if (isNaN(aTime)) {\r\n return 1;\r\n }\r\n if (isNaN(bTime)) {\r\n return -1;\r\n }\r\n return aTime - bTime;\r\n } else if (\r\n (aFieldType === 'CATEGORY' || aFieldType === 'CHECK_BOX' || aFieldType === 'MULTI_SELECT') &&\r\n (bFieldType === 'CATEGORY' || bFieldType === 'CHECK_BOX' || bFieldType === 'MULTI_SELECT')\r\n ) {\r\n return getFieldValueAsString(aField).localeCompare(getFieldValueAsString(bField));\r\n } else if (\r\n (aFieldType === 'CREATOR' || aFieldType === 'MODIFIER') &&\r\n (bFieldType === 'CREATOR' || bFieldType === 'MODIFIER')\r\n ) {\r\n return aField.value.name.localeCompare(bField.value.name);\r\n } else if (\r\n (aFieldType === 'GROUP_SELECT' ||\r\n aFieldType === 'ORGANIZATION_SELECT' ||\r\n aFieldType === 'USER_SELECT' ||\r\n aFieldType === 'STATUS_ASSIGNEE') &&\r\n (bFieldType === 'GROUP_SELECT' ||\r\n bFieldType === 'ORGANIZATION_SELECT' ||\r\n bFieldType === 'USER_SELECT' ||\r\n bFieldType === 'STATUS_ASSIGNEE')\r\n ) {\r\n return getFieldValueAsString(aField).localeCompare(getFieldValueAsString(bField));\r\n } else if (aFieldType === 'FILE' && bFieldType === 'FILE') {\r\n return getFieldValueAsString(aField).localeCompare(getFieldValueAsString(bField));\r\n } else if (aFieldType === 'SUBTABLE' && bFieldType === 'SUBTABLE') {\r\n return getFieldValueAsString(aField).localeCompare(getFieldValueAsString(bField));\r\n }\r\n return 0;\r\n};\r\n\r\n/**\r\n * 計算フィールドの値と設定情報を基に、画面表示用の値を返却します\r\n */\r\nexport const getCalcFieldValueAsString = (params: {\r\n field: kintoneAPI.field.Calc;\r\n property: kintoneAPI.property.Calc;\r\n}) => {\r\n const { field, property } = params;\r\n const { unit, unitPosition, format } = property;\r\n let fieldValue: string = '';\r\n\r\n switch (format) {\r\n case 'NUMBER_DIGIT':\r\n if (property.displayScale) {\r\n const displayScale = Number(property.displayScale || 0);\r\n const scaled = Math.round(Number(field.value) * 10 ** displayScale) / 10 ** displayScale;\r\n fieldValue = scaled.toLocaleString();\r\n } else {\r\n fieldValue = Number(field.value).toLocaleString();\r\n }\r\n break;\r\n case 'DATE':\r\n fieldValue = new Date(field.value).toLocaleDateString();\r\n break;\r\n case 'TIME':\r\n fieldValue = new Date(field.value).toLocaleTimeString();\r\n break;\r\n case 'DATETIME':\r\n fieldValue = new Date(field.value).toLocaleString();\r\n break;\r\n case 'HOUR_MINUTE':\r\n const [h, m] = field.value.split(':');\r\n fieldValue = `${h}時間${m}分`;\r\n break;\r\n case 'DAY_HOUR_MINUTE':\r\n const [hourString, minute] = field.value.split(':');\r\n const hour = Number(hourString);\r\n const day = Math.floor(hour / 24);\r\n const hourInDay = hour % 24;\r\n fieldValue = `${day}日${hourInDay}時間${minute}分`;\r\n break;\r\n default:\r\n fieldValue = field.value;\r\n }\r\n\r\n if (unit) {\r\n if (unitPosition === 'BEFORE') {\r\n fieldValue = unit + fieldValue;\r\n } else {\r\n fieldValue += unit;\r\n }\r\n }\r\n return fieldValue;\r\n};\r\n\r\n/**\r\n * フィールドのタイプに応じて、空の値を返却します\r\n * @param field クリア対象のフィールド\r\n * @returns クリア後のフィールドの値\r\n */\r\nexport const getEmptyValue = (\r\n params: { type: kintoneAPI.Field['type'] } | { field: kintoneAPI.Field }\r\n): kintoneAPI.Field['value'] => {\r\n let type;\r\n if ('type' in params) {\r\n type = params.type;\r\n } else {\r\n type = params.field.type;\r\n }\r\n switch (type) {\r\n case '__ID__':\r\n case '__REVISION__':\r\n case 'CALC':\r\n case 'CREATED_TIME':\r\n case 'UPDATED_TIME':\r\n case 'CREATOR':\r\n case 'MODIFIER':\r\n if ('field' in params) {\r\n console.warn(\r\n `[kintone-utilities]: ${params.field.type}はクリアできないため、処理をスキップしました`\r\n );\r\n return params.field.value;\r\n }\r\n return null;\r\n case 'SINGLE_LINE_TEXT':\r\n case 'NUMBER':\r\n case 'MULTI_LINE_TEXT':\r\n case 'RICH_TEXT':\r\n case 'DATE':\r\n case 'TIME':\r\n case 'DATETIME':\r\n case 'DROP_DOWN':\r\n case 'LINK':\r\n case 'RECORD_NUMBER':\r\n case 'STATUS':\r\n case 'RADIO_BUTTON':\r\n return '';\r\n case 'CATEGORY':\r\n case 'CHECK_BOX':\r\n case 'MULTI_SELECT':\r\n case 'USER_SELECT':\r\n case 'GROUP_SELECT':\r\n case 'ORGANIZATION_SELECT':\r\n case 'STATUS_ASSIGNEE':\r\n case 'FILE':\r\n return [];\r\n case 'SUBTABLE':\r\n if ('field' in params) {\r\n return (params.field as kintoneAPI.field.Subtable).value.map((row) => ({\r\n ...row,\r\n value: Object.entries(row.value).reduce(\r\n (acc, [key, cell]) => ({ ...acc, [key]: getEmptyValue(cell) }),\r\n {}\r\n ),\r\n }));\r\n }\r\n default:\r\n //@ts-expect-error\r\n throw new Error(`未対応のフィールドタイプです: ${field.type}`);\r\n }\r\n};\r\n\r\nexport const getDefaultValue = (property: kintoneAPI.FieldProperty) => {\r\n switch (property.type) {\r\n case 'SINGLE_LINE_TEXT':\r\n case 'NUMBER':\r\n case 'MULTI_LINE_TEXT':\r\n case 'RICH_TEXT':\r\n case 'DROP_DOWN':\r\n case 'RADIO_BUTTON':\r\n case 'LINK':\r\n return 'defaultValue' in property ? property.defaultValue ?? '' : '';\r\n case 'DATE':\r\n const { defaultValue, defaultNowValue } = property;\r\n if (defaultValue) {\r\n return defaultValue;\r\n }\r\n return defaultNowValue ? new Date().toISOString().split('T')[0] : '';\r\n case 'TIME':\r\n const { defaultNowValue: n, defaultValue: v } = property;\r\n if (v) {\r\n return v;\r\n }\r\n return n ? new Date().toISOString().split('T')[1].split('.')[0] : '';\r\n case 'DATETIME':\r\n const { defaultNowValue: now, defaultValue: value } = property;\r\n if (value) {\r\n return value;\r\n }\r\n return now ? new Date().toISOString() : '';\r\n case 'CHECK_BOX':\r\n case 'MULTI_SELECT':\r\n case 'USER_SELECT':\r\n case 'GROUP_SELECT':\r\n case 'ORGANIZATION_SELECT':\r\n if (!('defaultValue' in property)) {\r\n return [];\r\n }\r\n const { defaultValue: d } = property;\r\n return d.map((v) => {\r\n if (typeof v === 'string') {\r\n return { code: v, name: v };\r\n }\r\n switch (v.type) {\r\n case 'USER':\r\n case 'GROUP':\r\n case 'ORGANIZATION':\r\n return { code: v.code, name: v.code };\r\n case 'FUNCTION':\r\n if (v.code === 'LOGINUSER()') {\r\n const loginUser = kintone.getLoginUser();\r\n return { code: loginUser.code, name: loginUser.name };\r\n }\r\n return [];\r\n default:\r\n return [];\r\n }\r\n });\r\n case 'STATUS':\r\n case 'CATEGORY':\r\n case 'RECORD_NUMBER':\r\n return null;\r\n }\r\n};\r\n\r\nexport const compareField = (\r\n field1: kintoneAPI.Field,\r\n field2: kintoneAPI.Field,\r\n options?: { ignoresType?: boolean }\r\n): boolean => {\r\n const { ignoresType = false } = options ?? {};\r\n\r\n if (!ignoresType && field1.type !== field2.type) {\r\n return false;\r\n }\r\n\r\n const separator = '$';\r\n return (\r\n getFieldValueAsString(field1, { separator }) === getFieldValueAsString(field2, { separator })\r\n );\r\n};\r\n\r\n/**\r\n * デスクトップ版のイベントタイプを基に、モバイル版を追加し返却します\r\n * @param events デスクトップのイベントタイプ\r\n * @returns モバイルを含むイベントタイプ\r\n */\r\nexport const withMobileEvents = (events: string[]): string[] => {\r\n const mobileEvents = events.filter((e) => !/^mobile/.test(e)).map((type) => 'mobile.' + type);\r\n return [...new Set([...events, ...mobileEvents])];\r\n};\r\n\r\n/**\r\n * 現在実行されている環境がゲストスペースかどうかを判定します\r\n *\r\n * ゲストスペースである場合は、ゲストスペースIDを返却します\r\n *\r\n * @returns ゲストスペースID\r\n */\r\nexport const detectGuestSpaceId = (): string | null => {\r\n const match = location.pathname.match(/^\\/k\\/guest\\/(\\d+)\\//);\r\n return match ? match[1] : null;\r\n};\r\n\r\nexport type OnFileLoadOptions = {\r\n encoding?: string;\r\n};\r\n\r\nexport const onFileLoad = (file: File | Blob, options?: OnFileLoadOptions) => {\r\n const { encoding = 'utf-8' } = options ?? {};\r\n\r\n return new Promise<ProgressEvent<FileReader>>((resolve, reject) => {\r\n try {\r\n const reader = new FileReader();\r\n\r\n reader.readAsText(file, encoding);\r\n\r\n reader.onload = (event) => resolve(event);\r\n reader.onerror = (event) => reject(event);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * クエリからソート条件を取得します。\r\n *\r\n * kintone.app.getQuery()の結果を想定しています。\r\n *\r\n * @param query クエリ文字列\r\n * @returns ソート条件の文字列\r\n * @see {@link https://cybozu.dev/ja/kintone/docs/js-api/app/get-record-list-query-with-order-by-limit-offset/ レコード一覧のクエリ文字列を取得する(オプション付き)}\r\n * @example\r\n * ```js\r\n * const query = kintone.app.getQuery(); // \"order by フィールド1 asc, フィールド2 desc limit 100 offset 0\"\r\n * const sort = getSortFromQuery(query); // [{ field: 'フィールド1', order: 'asc' }, { field: 'フィールド2', order: 'desc' }]\r\n * ```\r\n */\r\nexport const getSortFromQuery = (query: string): { field: string; order: 'asc' | 'desc' }[] => {\r\n const sort = query.match(/order by (.*)?(?=( limit | offset|$))/)?.[1];\r\n if (!sort) {\r\n return [];\r\n }\r\n return sort.split(',').map((s) => {\r\n const [field, order] = s.trim().split(' ');\r\n return { field, order: order as 'asc' | 'desc' };\r\n });\r\n};\r\n","import { getHeaderSpace } from './xapp';\r\nimport type { kintoneAPI } from './types/api';\r\nimport { detectGuestSpaceId, withMobileEvents } from './utilities';\r\n\r\ntype ErrorHandler = (error: any, props: { event: kintoneAPI.js.Event }) => kintoneAPI.js.Event;\r\n\r\ntype ConstructorProps = Partial<{\r\n errorHandler: ErrorHandler;\r\n pluginId: string;\r\n logDisabled: boolean;\r\n logPrefix: string;\r\n}>;\r\n\r\ntype CallbackOption = { pluginId?: string; guestSpaceId: string | null };\r\n\r\nexport class KintoneEventManager {\r\n readonly #uid: string = Math.random().toString(36).slice(2);\r\n readonly #pluginId?: string;\r\n readonly #commonErrorHandler: ErrorHandler;\r\n readonly #guestSpaceId: string | null;\r\n #logDisabled: boolean;\r\n #logPrefix: string;\r\n\r\n /**\r\n * 複数の処理を、各イベントに登録することができます\r\n */\r\n public constructor(props?: ConstructorProps) {\r\n const {\r\n errorHandler = (error: any) => {\r\n throw error;\r\n },\r\n pluginId,\r\n logDisabled = false,\r\n logPrefix = '',\r\n } = props ?? {};\r\n\r\n const guestSpaceId = detectGuestSpaceId();\r\n\r\n this.#commonErrorHandler = errorHandler;\r\n this.#pluginId = pluginId;\r\n this.#guestSpaceId = guestSpaceId;\r\n this.#logDisabled = logDisabled;\r\n this.#logPrefix = logPrefix;\r\n }\r\n\r\n /**\r\n * **この関数は`kintone.events.on`の代替関数です. 引数に互換性があります.**\r\n *\r\n * デスクトップ版のイベントを指定することで自動的に対応するモバイル版のイベントが登録されます.\r\n * また、インスタンス作成時に指定したエラーハンドラが、コールバック関数のエラー発生時に実行されます\r\n * @param events\r\n * @param callback\r\n */\r\n public add = <T = kintoneAPI.RecordData>(\r\n events: kintoneAPI.js.EventType[],\r\n callback: (\r\n event: kintoneAPI.js.Event<T>,\r\n options: CallbackOption\r\n ) => kintoneAPI.js.Event<T> | Promise<kintoneAPI.js.Event<T>>\r\n ) => {\r\n kintone.events.on(withMobileEvents(events), async (event) => {\r\n try {\r\n this.initialize(event);\r\n return await callback(event, {\r\n pluginId: this.#pluginId,\r\n guestSpaceId: this.#guestSpaceId,\r\n });\r\n } catch (error) {\r\n return await this.#commonErrorHandler(error, { event });\r\n } finally {\r\n this.tarminate();\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Changeイベントを登録します\r\n *\r\n * ChangeイベントはPromiseオブジェクトを返却することができません\r\n * @param events\r\n * @param callback\r\n */\r\n public addChangeEvents = <T = kintoneAPI.RecordData>(\r\n events: string[],\r\n callback: (event: kintoneAPI.js.Event<T>, options: CallbackOption) => kintoneAPI.js.Event<T>\r\n ) => {\r\n kintone.events.on(withMobileEvents(events), (event) => {\r\n try {\r\n this.initialize(event);\r\n return callback(event, { pluginId: this.#pluginId, guestSpaceId: this.#guestSpaceId });\r\n } catch (error) {\r\n return this.#commonErrorHandler(error, { event });\r\n } finally {\r\n this.tarminate();\r\n }\r\n });\r\n };\r\n\r\n public addHeaderButton(params: {\r\n id: string;\r\n label: string;\r\n color?: 'default' | 'blue' | 'red' | 'yellow';\r\n isButtonHidden?: (event: kintoneAPI.js.Event) => boolean | Promise<boolean>;\r\n onClick: () => void | Promise<void>;\r\n events: kintoneAPI.js.EventType[];\r\n isTolerantToFailure?: boolean;\r\n }) {\r\n const {\r\n id,\r\n label,\r\n color = 'default',\r\n onClick,\r\n isButtonHidden,\r\n events,\r\n isTolerantToFailure = false,\r\n } = params;\r\n\r\n this.addButtonStyle();\r\n\r\n this.add(events, async (event) => {\r\n if (isButtonHidden && (await isButtonHidden(event))) {\r\n return event;\r\n }\r\n\r\n if (document.getElementById(id)) {\r\n return event;\r\n }\r\n const headerSpace = getHeaderSpace(event.type);\r\n if (!headerSpace) {\r\n const message = `ヘッダーにボタンを追加することができませんでした。${event.type}イベントが発生したタイミングには、対象要素が存在しない可能性があります`;\r\n if (!isTolerantToFailure) {\r\n throw new Error(message);\r\n }\r\n console.error(message);\r\n return event;\r\n }\r\n\r\n const root = document.createElement('button');\r\n root.id = id;\r\n root.textContent = label;\r\n root.className = 'rkemb';\r\n root.dataset.color = color;\r\n root.addEventListener('click', onClick);\r\n headerSpace.append(root);\r\n\r\n return event;\r\n });\r\n }\r\n\r\n private addButtonStyle = () => {\r\n if (document.querySelector('style[data-rkem]')) {\r\n return;\r\n }\r\n\r\n const style = document.createElement('style');\r\n style.dataset.rkem = '';\r\n document.head.append(style);\r\n style.textContent = `\r\n\r\n:root {\r\n --rkemb-color-blue-lighter: #57aae1;\r\n --rkemb-color-blue-light: #4ba4df;\r\n --rkemb-color-blue: #3498db;\r\n --rkemb-color-blue-dark: #258bcf;\r\n --rkemb-color-blue-darker: #2383c4;\r\n}\r\n\r\n.rkemb {\r\n font-size: 16px;\r\n font-family: Yu Gothic Meduim, \"游ゴシック Medium\", \"游ゴシック体\", YuGothic, \"游ゴシック\", \"メイリオ\", sans-serif;\r\n display: inline-flex;\r\n justify-content: center;\r\n margin: 0 4px;\r\n padding: 0 16px;\r\n min-width: 160px;\r\n height: 48px;\r\n outline: none;\r\n color: #3498db;\r\n border-radius: 4px;\r\n text-align: center;\r\n line-height: 48px;\r\n transition: all 250ms ease;\r\n border: 0;\r\n border: 1px solid;\r\n}\r\n.rkemb[data-color=\"default\"] {\r\n background-color: #f9fafb;\r\n color: var(--rkemb-color-blue);\r\n border-color: #e5e7eb;\r\n}\r\n.rkemb[data-color=\"default\"]:hover {\r\n background-color: #f3f4f6;\r\n}\r\n.rkemb[data-color=\"default\"]:active {\r\n background-color: #e5e7eb;\r\n color: var(--rkemb-color-blue-darker);\r\n}\r\n.rkemb[data-color=\"default\"]:focus {\r\n box-shadow: 0 0 0 2px #fff, 0 0 0 3px #d1d5db;\r\n}\r\n.rkemb[data-color=\"blue\"] {\r\n background-color: #eff6ff;\r\n color: var(--rkemb-color-blue);\r\n border-color: #bfdbfe;\r\n}\r\n.rkemb[data-color=\"blue\"]:hover {\r\n background-color: #dbeafe;\r\n}\r\n.rkemb[data-color=\"blue\"]:active {\r\n background-color: #bfdbfe;\r\n color: var(--rkemb-color-blue-darker);\r\n}\r\n.rkemb[data-color=\"blue\"]:focus {\r\n box-shadow: 0 0 0 2px #fff, 0 0 0 3px #93c5fd;\r\n}\r\n.rkemb[data-color=\"red\"] {\r\n background-color: #fef2f2;\r\n color: #ef4444;\r\n border-color: #fecaca;\r\n}\r\n.rkemb[data-color=\"red\"]:hover {\r\n background-color: #fee2e2;\r\n}\r\n.rkemb[data-color=\"red\"]:active {\r\n background-color: #fecaca;\r\n color: #dc2626;\r\n}\r\n.rkemb[data-color=\"red\"]:focus {\r\n box-shadow: 0 0 0 2px #fff, 0 0 0 3px #fca5a5;\r\n}\r\n.rkemb[data-color=\"yellow\"] {\r\n background-color: #fffbeb;\r\n color: #f59e0b;\r\n border-color: #fde68a;\r\n}\r\n.rkemb[data-color=\"yellow\"]:hover {\r\n background-color: #fef3c7;\r\n}\r\n.rkemb[data-color=\"yellow\"]:active {\r\n background-color: #fde68a;\r\n color: #d97706;\r\n}\r\n.rkemb[data-color=\"yellow\"]:focus {\r\n box-shadow: 0 0 0 2px #fff, 0 0 0 3px #fcd34d;\r\n}\r\n `;\r\n };\r\n\r\n private initialize = (event: kintoneAPI.js.Event) => {\r\n window.addEventListener('beforeunload', this.beforeunload);\r\n if (!this.#logDisabled) {\r\n console.group(\r\n `${this.#logPrefix}%c${event.type} %c(${this.#uid})`,\r\n 'color: #1e40af;',\r\n 'color: #aaa'\r\n );\r\n }\r\n };\r\n\r\n private tarminate = () => {\r\n window.removeEventListener('beforeunload', this.beforeunload);\r\n if (!this.#logDisabled) {\r\n console.groupEnd();\r\n }\r\n };\r\n\r\n public set logDisabled(value: boolean) {\r\n this.#logDisabled = value;\r\n }\r\n\r\n public set logPrefix(value: string) {\r\n this.#logPrefix = value;\r\n }\r\n\r\n /** JavaScript中にページを離れようとした場合にアラートを表示します */\r\n private beforeunload(event: BeforeUnloadEvent) {\r\n event.preventDefault();\r\n event.returnValue = '';\r\n }\r\n}\r\n\r\n/**\r\n * @deprecated 代わりに`KintoneEventListener`を使用してください\r\n */\r\nexport const KintoneEventListener = KintoneEventManager;\r\n","const META_PROPERTY_KEY = '$meta';\r\n\r\ntype PluginConfigMetadata = {\r\n v: 1;\r\n flat: {\r\n property: string;\r\n ids: string[];\r\n }[];\r\n};\r\n\r\n/**\r\n * アプリにプラグインの設定情報を保存します\r\n * @param target プラグインの設定情報\r\n * @param callback 保存成功後に実行する処理. 省略すると、アプリ設定のプラグインの一覧画面に遷移し、設定完了メッセージを表示します。指定すると、アプリ設定のプラグインの一覧画面には遷移しません。\r\n * @deprecated 代わりに{@link storePluginConfig}を使用してください\r\n */\r\nexport const storeStorage = (target: Record<string, any>, callback?: () => void): void => {\r\n const converted = Object.entries(target)\r\n .filter(([_, v]) => v !== undefined)\r\n .reduce((acc, [key, value]) => ({ ...acc, [key]: JSON.stringify(value) }), {});\r\n\r\n kintone.plugin.app.setConfig(converted, callback);\r\n};\r\n\r\nconst createFlatPropertyKey = (property: string, id: string) => `${property}$${id}`;\r\n\r\n/**\r\n * プラグインがアプリ単位で保存している設定情報を返却します\r\n *\r\n * 設定情報の取得に失敗した場合は、nullを返却します\r\n * @param id プラグインID\r\n * @returns プラグインの設定情報\r\n */\r\nexport const restorePluginConfig = <T = any>(\r\n id: string,\r\n options: {\r\n fallback?: T;\r\n debug?: boolean;\r\n } = {}\r\n): T | null => {\r\n const { fallback, debug = false } = options;\r\n const config: Record<string, string> = kintone.plugin.app.getConfig(id);\r\n\r\n debug && console.log('[config] 📦 stored', config);\r\n\r\n if (!Object.keys(config).length) {\r\n return fallback ?? null;\r\n }\r\n\r\n if (!(META_PROPERTY_KEY in config)) {\r\n debug && console.warn('[config] Meta property is not found. Fallback to normal config.');\r\n return Object.fromEntries(\r\n Object.entries(config).map(([key, value]) => [key, JSON.parse(value)])\r\n ) as T;\r\n }\r\n\r\n const meta: PluginConfigMetadata = JSON.parse(config[META_PROPERTY_KEY]);\r\n\r\n let composed: Record<string, any> = {};\r\n const flatKeys = meta.flat.flatMap(({ ids, property }) =>\r\n ids.map((id) => createFlatPropertyKey(property, id))\r\n );\r\n for (const { property, ids } of meta.flat) {\r\n const properties = ids\r\n .map((id) => ({ id, key: createFlatPropertyKey(property, id) }))\r\n .filter(({ key }) => {\r\n if (!(key in config)) {\r\n console.warn(`[config] Property \"${key}\" is not found.`);\r\n return false;\r\n }\r\n return true;\r\n })\r\n .map(({ id, key }) => {\r\n return { id, ...JSON.parse(config[key]) };\r\n });\r\n composed = { ...composed, [property]: properties };\r\n }\r\n\r\n const rest = Object.entries(config).reduce<Record<string, string>>((acc, [key, value]) => {\r\n if (![META_PROPERTY_KEY, ...flatKeys].includes(key)) {\r\n return { ...acc, [key]: JSON.parse(value) };\r\n }\r\n return acc;\r\n }, {});\r\n\r\n debug && console.log('[config] 📦 Composed:', { ...rest, ...composed });\r\n\r\n return { ...rest, ...composed } as T;\r\n};\r\n\r\n/**\r\n * アプリにプラグインの設定情報を保存します\r\n * @param target プラグインの設定情報\r\n * @param options.flatProperties 分割保存するプロパティ名の配列\r\n * @param options.debug デバッグモードを有効にするかどうか\r\n * @returns 保存完了後に解決されるPromise。callbackを指定しない場合、アプリ設定のプラグインの一覧画面に遷移し、設定完了メッセージを表示します。\r\n */\r\nexport const storePluginConfig = <T extends Record<string, any> = Record<string, any>>(\r\n target: T,\r\n options?: {\r\n flatProperties?: (keyof T)[];\r\n debug?: boolean;\r\n }\r\n): Promise<void> => {\r\n const { flatProperties = [], debug = false } = options || {};\r\n const meta: PluginConfigMetadata = {\r\n v: 1,\r\n flat: [],\r\n };\r\n\r\n let decomposed: Record<string, string> = {};\r\n let appliedProperties: string[] = [];\r\n for (const property of flatProperties) {\r\n if (typeof property !== 'string') {\r\n debug && console.warn('[config] Property name should be a string.');\r\n continue;\r\n }\r\n if (!(property in target) || !Array.isArray(target[property])) {\r\n debug && console.warn(`[config] Property \"${property}\" is not found or not an array.`);\r\n continue;\r\n }\r\n\r\n if (target[property].some((item) => !('id' in item))) {\r\n debug && console.warn(`[config] Property \"${property}\" has an item without \"id\" property.`);\r\n continue;\r\n }\r\n\r\n const ids = target[property].map((item) => item.id);\r\n\r\n const decomposedProperties = target[property].reduce<Record<string, string>>((acc, item) => {\r\n const { id, ...rest } = item;\r\n const key = createFlatPropertyKey(property, id);\r\n return { ...acc, [key]: JSON.stringify(rest) };\r\n }, {});\r\n\r\n meta.flat.push({ property, ids });\r\n decomposed = { ...decomposed, ...decomposedProperties };\r\n appliedProperties.push(property);\r\n }\r\n\r\n const converted = Object.entries(target)\r\n .filter(([key]) => !appliedProperties.includes(key))\r\n .reduce((acc, [key, value]) => ({ ...acc, [key]: JSON.stringify(value) }), {});\r\n\r\n const result = { [META_PROPERTY_KEY]: JSON.stringify(meta), ...converted, ...decomposed };\r\n\r\n debug && console.log('[config] 📦 Converted:', result);\r\n\r\n return new Promise<void>((resolve) => {\r\n kintone.plugin.app.setConfig(result, () => {\r\n resolve();\r\n });\r\n });\r\n};\r\n\r\ntype PrimitiveSetPluginProxyConfig = typeof kintone.plugin.app.setProxyConfig;\r\n\r\ntype PrimitiveSetPluginProxyConfigArgs = Parameters<PrimitiveSetPluginProxyConfig>;\r\n\r\n/**\r\n * `kintone.plugin.app.setProxyConfig`のラッパー関数\r\n *\r\n * 引数の`callback`を省略して、Promiseを返すように変更したものです\r\n *\r\n * @example\r\n * ```ts\r\n * await setPluginProxyConfig('https://example.com', 'POST', { \"Authorization\": \"Bearer XXXXXXXXX\"}, { \"provider\": \"kintone\"});\r\n * ```\r\n */\r\nexport function setPluginProxyConfig(\r\n url: PrimitiveSetPluginProxyConfigArgs[0],\r\n method: PrimitiveSetPluginProxyConfigArgs[1],\r\n headers: PrimitiveSetPluginProxyConfigArgs[2],\r\n data: PrimitiveSetPluginProxyConfigArgs[3]\r\n) {\r\n return new Promise<void>((resolve) => {\r\n kintone.plugin.app.setProxyConfig(url, method, headers, data, () => {\r\n resolve();\r\n });\r\n });\r\n}\r\n","export class PluginLocalStorage {\r\n readonly #key: string;\r\n #storage: Record<string, any>;\r\n\r\n public constructor(key: string) {\r\n this.#key = key;\r\n const stored = localStorage.getItem(this.#key) ?? '{}';\r\n this.#storage = JSON.parse(stored);\r\n }\r\n\r\n private save() {\r\n localStorage.setItem(this.#key, JSON.stringify(this.#storage));\r\n }\r\n\r\n public updateVersion = (currentVersion: string) => {\r\n const latestVersion: string = this.#storage.latestVersion ?? currentVersion;\r\n\r\n this.#storage.version = currentVersion;\r\n\r\n const [latestMajor, latestMinor] = latestVersion.split('.').map((v) => parseInt(v, 10));\r\n const [currentMajor, currentMinor] = currentVersion.split('.').map((v) => parseInt(v, 10));\r\n\r\n this.#storage.hasNewVersion =\r\n latestMajor > currentMajor || (latestMajor === currentMajor && latestMinor > currentMinor);\r\n\r\n this.save();\r\n };\r\n\r\n public get hasNewVersion(): boolean {\r\n return this.#storage.hasNewVersion ?? false;\r\n }\r\n}\r\n","import { kintoneAPI } from '../types/api';\r\n\r\n/**\r\n * kintone REST APIのエンドポイントパスを構築します。\r\n *\r\n * ゲストスペースやプレビュー環境に対応したパスを自動的に生成します。\r\n *\r\n * @param params.endpointName - APIエンドポイント名(例: `'record'`, `'records'`)\r\n * @param params.guestSpaceId - ゲストスペースID(省略時は通常スペース)\r\n * @param params.preview - プレビュー環境のAPIを使用する場合は `true`\r\n * @returns 構築されたAPIパス文字列(例: `'/k/v1/record.json'`)\r\n *\r\n * @example\r\n * ```ts\r\n * buildPath({ endpointName: 'record' });\r\n * // => '/k/v1/record.json'\r\n *\r\n * buildPath({ endpointName: 'record', guestSpaceId: 1, preview: true });\r\n * // => '/k/guest/1/v1/preview/record.json'\r\n * ```\r\n */\r\nexport const buildPath = (params: {\r\n endpointName: string;\r\n guestSpaceId?: number | string;\r\n preview?: boolean;\r\n}) => {\r\n const { endpointName, guestSpaceId, preview } = params;\r\n const guestPath = guestSpaceId !== undefined ? `/guest/${guestSpaceId}` : '';\r\n const previewPath = preview ? '/preview' : '';\r\n return `/k${guestPath}/v1${previewPath}/${endpointName}.json`;\r\n};\r\n\r\n/**\r\n * kintone REST APIへリクエストを送信する汎用関数です。\r\n *\r\n * `kintone.api()` をラップし、パス構築・デバッグログ・エラーハンドリングを統合しています。\r\n *\r\n * @typeParam T - レスポンスの型\r\n * @param params.endpointName - APIエンドポイント名\r\n * @param params.method - HTTPメソッド(`'GET'` | `'POST'` | `'PUT'` | `'DELETE'`)\r\n * @param params.body - リクエストボディ\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.preview - プレビュー環境を使用する場合は `true`\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns APIレスポンス\r\n * @throws ブラウザ環境でない場合、または `kintone` オブジェクトが存在しない場合にエラー\r\n */\r\nexport const api = async <T = any>(params: {\r\n endpointName: string;\r\n method: kintoneAPI.rest.Method;\r\n body: any;\r\n guestSpaceId?: number | string;\r\n preview?: boolean;\r\n debug?: boolean;\r\n}): Promise<T> => {\r\n const { endpointName, method, body, guestSpaceId, preview, debug } = params;\r\n try {\r\n checkBrowser();\r\n const path = buildPath({ endpointName, guestSpaceId, preview });\r\n if (debug) {\r\n console.log(`%ckintone REST API %c(${endpointName})`, 'color: #1e40af;', 'color: #aaa', {\r\n path,\r\n method,\r\n body,\r\n });\r\n }\r\n const response: T = await kintone.api(path, method, body);\r\n if (debug) {\r\n console.log('response', response);\r\n }\r\n return response;\r\n } catch (error) {\r\n if (debug) {\r\n console.error(error);\r\n }\r\n throw error;\r\n } finally {\r\n if (debug) {\r\n console.groupEnd();\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * 現在の実行環境がkintoneのブラウザ環境であることを検証します。\r\n *\r\n * `window` オブジェクトまたは `kintone` オブジェクトが存在しない場合にエラーをスローします。\r\n *\r\n * @throws {Error} ブラウザ環境でない場合\r\n * @throws {Error} `kintone` オブジェクトが見つからない場合\r\n */\r\nexport const checkBrowser = () => {\r\n if (typeof window === 'undefined') {\r\n throw new Error('この関数はブラウザでのみ使用できます');\r\n }\r\n if (typeof kintone === 'undefined') {\r\n throw new Error('kintoneオブジェクトが見つかりません');\r\n }\r\n};\r\n\r\n/**\r\n * 配列を指定したサイズごとのチャンクに分割します。\r\n *\r\n * REST APIの一括処理で、API制限数ごとにリクエストを分割する際に使用します。\r\n *\r\n * @typeParam T - 配列要素の型\r\n * @param array - 分割対象の配列\r\n * @param size - 1チャンクあたりの要素数\r\n * @returns 分割された二次元配列\r\n *\r\n * @example\r\n * ```ts\r\n * sliceIntoChunks([1, 2, 3, 4, 5], 2);\r\n * // => [[1, 2], [3, 4], [5]]\r\n * ```\r\n */\r\nexport const sliceIntoChunks = <T>(array: T[], size: number): T[][] => {\r\n const result = [];\r\n for (let i = 0, j = array.length; i < j; i += size) {\r\n result.push(array.slice(i, i + size));\r\n }\r\n return result;\r\n};\r\n\r\n/** デバッグオプションを付与するユーティリティ型 */\r\nexport type WithDebug<T> = T & { debug?: boolean };\r\n/** ゲストスペースIDオプションを付与するユーティリティ型 */\r\nexport type WithGuestSpaceId<T> = T & { guestSpaceId?: number | string };\r\n/** デバッグ・ゲストスペースIDの共通リクエストパラメータを付与するユーティリティ型 */\r\nexport type WithCommonRequestParams<T> = WithDebug<WithGuestSpaceId<T>>;\r\n/** レコードデータから各フィールドの `type` プロパティを除外するユーティリティ型 */\r\nexport type TypeOmmited<T extends Record<string, any>> = {\r\n [P in keyof T]: Omit<T[P], 'type'>;\r\n};\r\n\r\n/** レコードデータのベースとなるフレーム型 */\r\nexport type RecordFrame = Record<string, any>;\r\n\r\n/** REST APIへのレコード送信時に使用する型。各フィールドから `type` を除外し、全フィールドをオプショナルにします。 */\r\nexport type RecordToRequest<T extends RecordFrame = kintoneAPI.RecordData> = Partial<\r\n TypeOmmited<T>\r\n>;\r\n","import { kintoneAPI } from '../types/api';\r\nimport { WithCommonRequestParams, api } from './common';\r\n\r\nconst API_LIMIT_APP = 100;\r\n\r\nconst API_ENDPOINT_APP = `app`;\r\nconst API_ENDPOINT_APPS = `apps`;\r\nconst API_ENDPOINT_VIEWS = 'app/views';\r\nconst API_ENDPOINT_FORM_FIELDS = 'app/form/fields';\r\nconst API_ENDPOINT_FORM_LAYOUT = 'app/form/layout';\r\nconst API_ENDPOINT_APP_SETTINGS = 'app/settings';\r\nconst API_ENDPOINT_STATUS = 'app/status';\r\n\r\n/**\r\n * 指定したIDのアプリ情報を1件取得します。\r\n *\r\n * @param params.id - 取得対象のアプリID\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns アプリ情報オブジェクト\r\n *\r\n * @example\r\n * ```ts\r\n * const app = await getApp({ id: 1 });\r\n * console.log(app.name); // アプリ名\r\n * ```\r\n */\r\nexport const getApp = async (\r\n params: WithCommonRequestParams<{ id: kintoneAPI.IDToRequest }>\r\n): Promise<kintoneAPI.App> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_APP,\r\n method: 'GET',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * アプリ一覧を取得します(内部使用)。\r\n *\r\n * @param params.limit - 取得件数の上限\r\n * @param params.offset - 取得開始位置\r\n * @returns アプリの配列を含むオブジェクト\r\n */\r\nconst getApps = async (\r\n params: WithCommonRequestParams<{\r\n limit: number;\r\n offset: number;\r\n }>\r\n): Promise<{ apps: kintoneAPI.App[] }> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_APPS,\r\n method: 'GET',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * kintone環境内の全アプリ情報を再帰的に取得します。\r\n *\r\n * APIの取得件数上限(100件)を超える場合も、全件自動で取得します。\r\n *\r\n * @param params.offset - 取得開始位置(デフォルト: `0`)\r\n * @param params._apps - 内部用の蓄積配列(外部からの指定不要)\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns 全アプリ情報の配列\r\n *\r\n * @example\r\n * ```ts\r\n * const apps = await getAllApps();\r\n * console.log(`アプリ数: ${apps.length}`);\r\n * ```\r\n */\r\nexport const getAllApps = async (\r\n params: WithCommonRequestParams<{\r\n offset?: number;\r\n _apps?: kintoneAPI.App[];\r\n }> = {}\r\n): Promise<kintoneAPI.App[]> => {\r\n const { offset = 0, _apps = [], debug, guestSpaceId } = params;\r\n const { apps } = await getApps({ limit: API_LIMIT_APP, offset, debug, guestSpaceId });\r\n\r\n const allApps = [..._apps, ...apps];\r\n\r\n return apps.length === API_LIMIT_APP\r\n ? getAllApps({ offset: offset + API_LIMIT_APP, _apps: allApps, debug, guestSpaceId })\r\n : allApps;\r\n};\r\n\r\n/**\r\n * 指定アプリの一覧(ビュー)情報を取得します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.lang - 取得する言語(デフォルト: `'default'`)\r\n * @param params.preview - プレビュー環境のビューを取得する場合は `true`\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns ビュー情報のオブジェクトとリビジョン番号\r\n *\r\n * @example\r\n * ```ts\r\n * const { views, revision } = await getViews({ app: 1 });\r\n * Object.keys(views).forEach((viewName) => {\r\n * console.log(viewName, views[viewName]);\r\n * });\r\n * ```\r\n */\r\nexport const getViews = async (\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.IDToRequest;\r\n lang?: kintoneAPI.rest.Lang;\r\n preview?: boolean;\r\n }>\r\n): Promise<{ views: Record<string, kintoneAPI.view.Response>; revision: string }> => {\r\n const { app, preview = false, lang = 'default', debug, guestSpaceId } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_VIEWS,\r\n method: 'GET',\r\n body: { app, lang },\r\n preview,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * 指定アプリの一覧(ビュー)設定を更新します。\r\n *\r\n * …※ プレビュー環境に対して更新されます。運用環境への反映には別途デプロイが必要です。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.views - 更新するビュー情報のオブジェクト\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns 更新後のリビジョン情報\r\n *\r\n * @example\r\n * ```ts\r\n * await updateViews({\r\n * app: 1,\r\n * views: {\r\n * '一覧': { type: 'LIST', name: '一覧', fields: ['フィールドA'], index: 0 },\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport const updateViews = async (\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.IDToRequest;\r\n views: Record<string, kintoneAPI.view.Parameter>;\r\n }>\r\n) => {\r\n const { app, views, debug, guestSpaceId } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_VIEWS,\r\n method: 'PUT',\r\n body: { app, views },\r\n preview: true,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * 指定アプリのフォームフィールド情報を取得します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.preview - プレビュー環境のフィールドを取得する場合は `true`\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns フィールドプロパティとリビジョン番号\r\n *\r\n * @example\r\n * ```ts\r\n * const { properties, revision } = await getFormFields({ app: 1 });\r\n * Object.entries(properties).forEach(([code, field]) => {\r\n * console.log(`${code}: ${field.type}`);\r\n * });\r\n * ```\r\n */\r\nexport const getFormFields = async (\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.IDToRequest;\r\n preview?: boolean;\r\n }>\r\n): Promise<{ properties: kintoneAPI.FieldProperties; revision: string }> => {\r\n const { app, preview = false, debug, guestSpaceId } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_FORM_FIELDS,\r\n method: 'GET',\r\n body: { app },\r\n preview,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * 指定アプリのフォームレイアウト情報を取得します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.preview - プレビュー環境のレイアウトを取得する場合は `true`\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns レイアウト情報とリビジョン番号\r\n *\r\n * @example\r\n * ```ts\r\n * const { layout } = await getFormLayout({ app: 1 });\r\n * layout.forEach((row) => console.log(row.type));\r\n * ```\r\n */\r\nexport const getFormLayout = async (\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.IDToRequest;\r\n preview?: boolean;\r\n }>\r\n): Promise<{ layout: kintoneAPI.Layout; revision: string }> => {\r\n const { app, preview = false, debug, guestSpaceId } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_FORM_LAYOUT,\r\n method: 'GET',\r\n body: { app },\r\n preview,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * 指定アプリのアプリ設定(アイコン、テーマなど)を取得します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.preview - プレビュー環境の設定を取得する場合は `true`\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns アプリ設定オブジェクト\r\n *\r\n * @example\r\n * ```ts\r\n * const settings = await getAppSettings({ app: 1 });\r\n * console.log(settings.name, settings.icon);\r\n * ```\r\n */\r\nexport const getAppSettings = async (\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.IDToRequest;\r\n preview?: boolean;\r\n }>\r\n): Promise<kintoneAPI.AppSettings> => {\r\n const { app, preview = false, debug, guestSpaceId } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_APP_SETTINGS,\r\n method: 'GET',\r\n body: { app },\r\n preview,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * 指定アプリのプロセス管理設定を取得します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.lang - 取得する言語(デフォルト: `'default'`)\r\n * @param params.preview - プレビュー環境の設定を取得する場合は `true`\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns プロセス管理設定オブジェクト(有効フラグ、ステータス一覧、アクション一覧)\r\n *\r\n * @example\r\n * ```ts\r\n * const status = await getAppStatus({ app: 1 });\r\n * if (status.enable) {\r\n * console.log(Object.keys(status.states ?? {})); // ステータス名一覧\r\n * status.actions?.forEach((action) => console.log(action.name));\r\n * }\r\n * ```\r\n */\r\nexport const getAppStatus = async (\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.IDToRequest;\r\n lang?: kintoneAPI.rest.Lang;\r\n preview?: boolean;\r\n }>\r\n): Promise<kintoneAPI.AppStatus> => {\r\n const { app, lang = 'default', preview = false, debug, guestSpaceId } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_STATUS,\r\n method: 'GET',\r\n body: { app, lang },\r\n preview,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n","import { kintoneAPI } from '../types/api';\r\nimport { WithCommonRequestParams, api, buildPath, checkBrowser, sliceIntoChunks } from './common';\r\n\r\nconst API_ENDPOINT_RECORD = `record`;\r\nconst API_ENDPOINT_RECORDS = `records`;\r\nconst API_ENDPOINT_CURSOR = `records/cursor`;\r\nconst API_ENDPOINT_ASSIGNEES = `record/assignees`;\r\nconst API_ENDPOINT_RECORD_STATUS = `record/status`;\r\nconst API_ENDPOINT_RECORD_STATUSES = `records/status`;\r\nconst API_ENDPOINT_ACL_EVALUATE = `records/acl/evaluate`;\r\nconst API_ENDPOINT_BULK = `bulkRequest`;\r\nconst API_LIMIT_GET = 500;\r\nconst API_LIMIT_PUT = 100;\r\nexport const API_LIMIT_POST = 100;\r\nconst API_LIMIT_DELETE = 100;\r\nconst API_LIMIT_STATUS_PUT = 100;\r\nconst API_LIMIT_BULK_REQUEST = 20;\r\n\r\ntype BulkRequestProgressParams = { total: number; done: number };\r\ntype WithBulkRequestCallback<T> = T & { onProgress?: (params: BulkRequestProgressParams) => void };\r\n\r\n/**\r\n * バックドア(プロキシ経由)でkintone REST APIを呼び出します。\r\n *\r\n * APIトークン認証を使い、`kintone.proxy()` を通じてリクエストを送信します。\r\n * アプリAのカスタマイズからアプリBのレコードを操作するようなケースで使用します。\r\n *\r\n * @param params.apiToken - APIトークン\r\n * @param params.method - HTTPメソッド\r\n * @param params.path - APIエンドポイントのパス\r\n * @param params.body - リクエストボディ(省略可)\r\n * @returns APIレスポンス(JSONパース済み)\r\n * @throws レスポンスのステータスコードが200でない場合\r\n *\r\n * @example\r\n * ```ts\r\n * const record = await backdoor({\r\n * apiToken: 'YOUR_API_TOKEN',\r\n * method: 'GET',\r\n * path: 'record',\r\n * body: { app: 1, id: 100 },\r\n * });\r\n * ```\r\n */\r\nexport const backdoor = async (params: {\r\n apiToken: string;\r\n method: kintoneAPI.rest.Method;\r\n path: string;\r\n body?: any;\r\n}): Promise<any> => {\r\n checkBrowser();\r\n const { apiToken, method, path, body } = params;\r\n\r\n const header: Record<string, string> = {\r\n 'X-Cybozu-API-Token': apiToken,\r\n };\r\n if (method !== 'GET') {\r\n header['Content-Type'] = 'application/json';\r\n }\r\n\r\n const uri = kintone.api.url(path, true);\r\n\r\n const response = await kintone.proxy(uri, method, header, body);\r\n\r\n if (response[1] !== 200) {\r\n throw new Error(`Backdoor API Error: ${response[1]} ${response[0]}`);\r\n }\r\n\r\n return JSON.parse(response[0]);\r\n};\r\n\r\nexport type RecordGetRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n id: kintoneAPI.IDToRequest;\r\n};\r\ntype GetRecordParams = WithCommonRequestParams<RecordGetRequest>;\r\n\r\n/**\r\n * 指定したIDのレコードを1件取得します。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.id - レコードID\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns レコードデータ\r\n *\r\n * @example\r\n * ```ts\r\n * const record = await getRecord({ app: 1, id: 100 });\r\n * console.log(record['フィールドコード'].value);\r\n * ```\r\n */\r\nexport const getRecord = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: GetRecordParams\r\n): Promise<T> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n const { record } = await api<kintoneAPI.rest.RecordGetResponse<T>>({\r\n endpointName: API_ENDPOINT_RECORD,\r\n method: 'GET',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n return record;\r\n};\r\n/**\r\n * バックドア(APIトークン認証)を使用してレコードを1件取得します。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.id - レコードID\r\n * @param params.apiToken - APIトークン\r\n * @returns レコードデータ\r\n *\r\n * @example\r\n * ```ts\r\n * const record = await backdoorGetRecord({\r\n * app: 1,\r\n * id: 100,\r\n * apiToken: 'YOUR_API_TOKEN',\r\n * });\r\n * ```\r\n */\r\nexport const backdoorGetRecord = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: RecordGetRequest & { apiToken: string }\r\n): Promise<T> => {\r\n const { app, id, apiToken } = params;\r\n const { record } = await backdoor({\r\n apiToken,\r\n method: 'GET',\r\n path: API_ENDPOINT_RECORD,\r\n body: { app, id },\r\n });\r\n return record;\r\n};\r\n\r\n/**\r\n * 複数のレコードを一度に取得します(最大500件)。\r\n *\r\n * クエリでフィルタリングやソートが可能です。500件を超える場合は `getAllRecords` を使用してください。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.query - クエリ文字列(省略可)\r\n * @param params.fields - 取得するフィールドコードの配列(省略可)\r\n * @param params.totalCount - トータルカウントを取得する場合は `true`\r\n * @returns レコード配列とトータルカウント\r\n *\r\n * @example\r\n * ```ts\r\n * const { records, totalCount } = await getRecords({\r\n * app: 1,\r\n * query: 'ステータス in (\"未処理\")',\r\n * fields: ['$id', 'タイトル'],\r\n * totalCount: true,\r\n * });\r\n * ```\r\n */\r\nexport const getRecords = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: GetRecordsParams\r\n): Promise<kintoneAPI.rest.RecordsGetResponse<T>> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return await api<kintoneAPI.rest.RecordsGetResponse<T>>({\r\n endpointName: API_ENDPOINT_RECORDS,\r\n method: 'GET',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type UpdateKey<T extends kintoneAPI.rest.Frame> = {\r\n field: keyof T;\r\n value: string | number;\r\n};\r\n\r\nexport type PrimaryKeyToUpdate<T extends kintoneAPI.rest.Frame> =\r\n | { id: kintoneAPI.IDToRequest }\r\n | { updateKey: UpdateKey<T> };\r\n\r\nexport type RecordPutRequest<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> = {\r\n app: kintoneAPI.IDToRequest;\r\n record: kintoneAPI.rest.RecordToRequest<T>;\r\n revision?: kintoneAPI.rest.Revision;\r\n} & PrimaryKeyToUpdate<T>;\r\nexport type UpdateRecordParams<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> =\r\n WithCommonRequestParams<RecordPutRequest<T>>;\r\n\r\n/**\r\n * レコードを1件更新します。\r\n *\r\n * `id` または `updateKey`(重複禁止フィールド)で更新対象を指定できます。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.id - 更新対象のレコードID(`id` または `updateKey` のどちらか一方を指定)\r\n * @param params.updateKey - 重複禁止フィールドによる更新キー\r\n * @param params.record - 更新内容\r\n * @param params.revision - リビジョン番号(楽観的排他制御)\r\n * @returns 更新後のリビジョン番号\r\n *\r\n * @example\r\n * ```ts\r\n * await updateRecord({\r\n * app: 1,\r\n * id: 100,\r\n * record: { タイトル: { value: '更新済み' } },\r\n * });\r\n * ```\r\n */\r\nexport const updateRecord = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: UpdateRecordParams<T>\r\n): Promise<kintoneAPI.rest.RecordPutResponse> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_RECORD,\r\n method: 'PUT',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type RecordPostRequest<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> = {\r\n app: kintoneAPI.IDToRequest;\r\n record: kintoneAPI.rest.RecordToRequest<T>;\r\n};\r\nexport type AddRecordParams<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> =\r\n WithCommonRequestParams<RecordPostRequest<T>>;\r\n\r\n/**\r\n * レコードを1件追加します。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.record - 追加するレコードデータ\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns 追加されたレコードのIDとリビジョン\r\n *\r\n * @example\r\n * ```ts\r\n * const { id } = await addRecord({\r\n * app: 1,\r\n * record: { タイトル: { value: '新規レコード' } },\r\n * });\r\n * console.log(`作成されたレコードID: ${id}`);\r\n * ```\r\n */\r\nexport const addRecord = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: AddRecordParams<T>\r\n): Promise<kintoneAPI.rest.RecordPostResponse> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_RECORD,\r\n method: 'POST',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * 複数レコードを一度に追加します(最大100件)。\r\n *\r\n * 100件を超える場合は `addAllRecords` を使用してください。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.records - 追加するレコードの配列\r\n * @returns 追加されたレコードのID配列とリビジョン配列\r\n *\r\n * @example\r\n * ```ts\r\n * const { ids } = await addRecords({\r\n * app: 1,\r\n * records: [\r\n * { タイトル: { value: 'レコード1' } },\r\n * { タイトル: { value: 'レコード2' } },\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport const addRecords = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: WithCommonRequestParams<RecordsPostRequest<T>>\r\n): Promise<kintoneAPI.rest.RecordsPostResponse> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api({\r\n endpointName: API_ENDPOINT_RECORDS,\r\n method: 'POST',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type RecordUpsertRequest<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> = {\r\n app: kintoneAPI.IDToRequest;\r\n record: kintoneAPI.rest.RecordToRequest<T>;\r\n updateKey: UpdateKey<T>;\r\n};\r\nexport type UpsertRecordParams<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> =\r\n WithCommonRequestParams<RecordUpsertRequest<T>>;\r\n/**\r\n * レコードのアップサート(存在すれば更新、なければ追加)を行います。\r\n *\r\n * `updateKey` で指定した重複禁止フィールドの値に基づき、既存レコードを検索して分岐します。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.record - 追加または更新するレコードデータ\r\n * @param params.updateKey - 重複禁止フィールドによるキー\r\n * @returns 追加または更新されたレコードのIDとリビジョン\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await upsertRecord({\r\n * app: 1,\r\n * updateKey: { field: '社員番号', value: 'EMP001' },\r\n * record: { 氏名: { value: '山田太郎' } },\r\n * });\r\n * ```\r\n */\r\nexport const upsertRecord = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: UpsertRecordParams<T>\r\n): Promise<kintoneAPI.rest.RecordPostResponse> => {\r\n const { record, updateKey, app, ...rest } = params;\r\n const { records } = await getRecords<T>({\r\n app,\r\n query: `${updateKey.field as string} = \"${updateKey.value}\"`,\r\n fields: ['$id'],\r\n ...rest,\r\n });\r\n\r\n if (records.length) {\r\n const res = await updateRecord<T>({\r\n app,\r\n record,\r\n id: records[0].$id.value,\r\n ...rest,\r\n });\r\n return { id: records[0].$id.value, revision: res.revision };\r\n }\r\n return addRecord<T>({ app, record, ...rest });\r\n};\r\n\r\nexport type RecordsPutRequest<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> = {\r\n app: kintoneAPI.IDToRequest;\r\n records: ({\r\n record: kintoneAPI.rest.RecordToRequest<T>;\r\n revision?: kintoneAPI.rest.Revision;\r\n } & (\r\n | {\r\n id: kintoneAPI.IDToRequest;\r\n }\r\n | {\r\n updateKey: {\r\n field: keyof T;\r\n value: string | number;\r\n };\r\n }\r\n ))[];\r\n};\r\nexport type UpdateAllRecordsParams<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> =\r\n WithBulkRequestCallback<WithCommonRequestParams<RecordsPutRequest<T>>>;\r\n\r\n/**\r\n * 大量のレコードを一括更新します。\r\n *\r\n * 内部で `bulkRequest` を使用し、API制限ごとに自動分割してリクエストを送信します。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.records - 更新するレコードの配列(`id` または `updateKey` と `record` を含む)\r\n * @param params.onProgress - 進捗コールバック(`{ total, done }` を受け取る)\r\n * @returns 更新されたレコードのIDとリビジョンの配列\r\n *\r\n * @example\r\n * ```ts\r\n * await updateAllRecords({\r\n * app: 1,\r\n * records: [\r\n * { id: 1, record: { ステータス: { value: '完了' } } },\r\n * { id: 2, record: { ステータス: { value: '完了' } } },\r\n * ],\r\n * onProgress: ({ total, done }) => console.log(`${done}/${total}`),\r\n * });\r\n * ```\r\n */\r\nexport const updateAllRecords = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: UpdateAllRecordsParams<T>\r\n): Promise<kintoneAPI.rest.RecordsPutResponse> => {\r\n const { onProgress, debug, guestSpaceId, ...requestParams } = params;\r\n const response: { results: kintoneAPI.rest.RecordsPutResponse[] } = (await bulkRequest<T>({\r\n requests: [{ type: 'updateAllRecords', params: requestParams }],\r\n onProgress,\r\n debug,\r\n guestSpaceId,\r\n })) as any;\r\n\r\n return response.results.reduce<kintoneAPI.rest.RecordsPutResponse>(\r\n (acc, result) => {\r\n return { records: [...acc.records, ...result.records] };\r\n },\r\n { records: [] }\r\n );\r\n};\r\n\r\nexport type RecordsPostRequest<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> = {\r\n app: kintoneAPI.IDToRequest;\r\n records: kintoneAPI.rest.RecordToRequest<T>[];\r\n limit?: number;\r\n};\r\nexport type AddAllRecordsParams<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> =\r\n WithBulkRequestCallback<WithCommonRequestParams<RecordsPostRequest<T>>>;\r\n\r\n/**\r\n * 大量のレコードを一括追加します。\r\n *\r\n * 内部で `bulkRequest` を使用し、API制限ごとに自動分割してリクエストを送信します。\r\n * 空配列を渡した場合は何もせず空の結果を返します。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.app - アプリID\r\n * @param params.records - 追加するレコードの配列\r\n * @param params.limit - 1リクエストあたりのレコード数上限(デフォルト: 100)\r\n * @param params.onProgress - 進捗コールバック\r\n * @returns 追加されたレコードのID配列とリビジョン配列\r\n *\r\n * @example\r\n * ```ts\r\n * const { ids } = await addAllRecords({\r\n * app: 1,\r\n * records: Array.from({ length: 500 }, (_, i) => ({\r\n * タイトル: { value: `レコード${i + 1}` },\r\n * })),\r\n * });\r\n * console.log(`${ids.length}件追加しました`);\r\n * ```\r\n */\r\nexport const addAllRecords = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: AddAllRecordsParams<T>\r\n): Promise<kintoneAPI.rest.RecordsPostResponse> => {\r\n const { onProgress, debug, guestSpaceId, ...requestParams } = params;\r\n\r\n if (requestParams.records.length === 0) {\r\n if (debug) {\r\n console.log('😕 %caddAllRecords: No records to add', 'color: #fbbf24');\r\n }\r\n return { ids: [], revisions: [] };\r\n }\r\n\r\n const responses: { results: kintoneAPI.rest.RecordsPostResponse[] } = (await bulkRequest<T>({\r\n requests: [{ type: 'addAllRecords', params: requestParams }],\r\n onProgress,\r\n debug,\r\n guestSpaceId,\r\n })) as any;\r\n\r\n return responses.results.reduce<kintoneAPI.rest.RecordsPostResponse>(\r\n (acc, result) => {\r\n return {\r\n ids: [...acc.ids, ...result.ids],\r\n revisions: [...acc.revisions, ...result.revisions],\r\n };\r\n },\r\n { ids: [], revisions: [] }\r\n );\r\n};\r\n\r\nexport type RecordsDeleteRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n ids: number[];\r\n revisions?: number[];\r\n};\r\nexport type DeleteAllRecordsParams = WithBulkRequestCallback<\r\n WithCommonRequestParams<RecordsDeleteRequest>\r\n>;\r\n\r\n/**\r\n * 大量のレコードを一括削除します。\r\n *\r\n * 内部で `bulkRequest` を使用し、API制限ごとに自動分割して削除リクエストを送信します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.ids - 削除対象のレコードIDの配列\r\n * @param params.revisions - リビジョン番号の配列(楽観的排他制御、省略可)\r\n * @param params.onProgress - 進捗コールバック\r\n * @returns バルクリクエストの結果\r\n *\r\n * @example\r\n * ```ts\r\n * await deleteAllRecords({\r\n * app: 1,\r\n * ids: [1, 2, 3, 4, 5],\r\n * });\r\n * ```\r\n */\r\nexport const deleteAllRecords = async (\r\n params: DeleteAllRecordsParams\r\n): Promise<{ results: kintoneAPI.rest.RecordsDeleteResponse[] }> => {\r\n const { onProgress, debug, guestSpaceId, ...requestParams } = params;\r\n return bulkRequest({\r\n requests: [{ type: 'deleteRecords', params: requestParams }],\r\n onProgress,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * クエリに一致する全レコードを削除します。\r\n *\r\n * 指定したクエリで全レコードを取得した後、そのIDを使って一括削除を実行します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.query - 削除対象をフィルタリングするクエリ文字列\r\n * @param params.onProgress - 進捗コールバック\r\n * @returns バルクリクエストの結果\r\n *\r\n * @example\r\n * ```ts\r\n * await deleteAllRecordsByQuery({\r\n * app: 1,\r\n * query: 'ステータス in (\"削除済み\")',\r\n * });\r\n * ```\r\n */\r\nexport const deleteAllRecordsByQuery = async (\r\n params: WithBulkRequestCallback<\r\n WithCommonRequestParams<{\r\n app: kintoneAPI.IDToRequest;\r\n query: string;\r\n }>\r\n >\r\n): Promise<{ results: kintoneAPI.rest.RecordsDeleteResponse[] }> => {\r\n const { onProgress, debug, guestSpaceId, app, query } = params;\r\n const fields = ['$id'];\r\n\r\n const records = await getAllRecords({ app, query, fields, debug, guestSpaceId });\r\n\r\n const ids = records.map((record) => Number(record.$id.value));\r\n\r\n return bulkRequest({\r\n requests: [{ type: 'deleteRecords', params: { app, ids } }],\r\n onProgress,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type RecordsGetRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n query?: string;\r\n fields?: string[];\r\n totalCount?: boolean | 'true' | 'false';\r\n};\r\nexport type GetRecordsParams = WithCommonRequestParams<RecordsGetRequest>;\r\nexport type GetAllRecordsParams = WithCommonRequestParams<RecordsGetRequest>;\r\n\r\n/**\r\n * 対象アプリの指定されたクエリに一致するレコードを全件取得します\r\n *\r\n * クエリを解析し、order byが含まれている場合はカーソルAPIを使ってレコードを取得します\r\n *\r\n * order byが含まれていない場合は、レコードIDを使ってレコードを取得します\r\n *\r\n * @returns 取得したレコードの配列\r\n */\r\nexport const getAllRecords = async <T extends Record<string, any> = kintoneAPI.RecordData>(\r\n params: GetAllRecordsParams & { onStep?: OnStep<T> }\r\n) => {\r\n if (params.query && /limit \\d+/.test(params.query)) {\r\n const { records } = await getRecords<T>(params);\r\n return records;\r\n }\r\n if (params.query && params.query.includes('order by')) {\r\n return getAllRecordsWithCursor<T>(params);\r\n }\r\n return getAllRecordsWithId<T>({ ...params, condition: params.query });\r\n};\r\n\r\ntype WithId<T> = T & { $id: kintoneAPI.field.ID };\r\ntype OnStep<T> = (params: {\r\n /**\r\n * その時点で取得が完了した全てのレコード\r\n */\r\n records: T[];\r\n /**\r\n * その時点で取得が完了したレコードのうち、新たに取得されたレコード\r\n */\r\n incremental: T[];\r\n}) => void;\r\n\r\n/**\r\n * 対象アプリの指定されたクエリに一致するレコードを、レコードIDをもとに全件取得します\r\n *\r\n * @param params app: 対象アプリのID, query: 取得するレコードのクエリ, fields: 取得するフィールドコードの配列, onStep: 段階的にレコードを取得する過程で実行される関数\r\n * @returns 取得したレコードの配列\r\n */\r\nexport const getAllRecordsWithId = async <T extends Record<string, any>>(\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.rest.AppIDToRequest;\r\n fields?: string[];\r\n onStep?: OnStep<T>;\r\n condition?: string;\r\n }>\r\n): Promise<WithId<T>[]> => {\r\n const { fields: initFields, condition: initCondition = '', debug } = params;\r\n\r\n const fields = initFields?.length ? [...new Set([...initFields, '$id'])] : undefined;\r\n\r\n // order byは使用できないため、conditionに含まれている場合は除外する\r\n const condition = initCondition.replace(/order by.*/g, '');\r\n\r\n if (debug) {\r\n console.groupCollapsed('📦 %cgetAllRecordsWithId', 'color: #1e40af');\r\n }\r\n try {\r\n const records = await getRecursive<T>({ ...params, fields, condition });\r\n\r\n return records;\r\n } finally {\r\n if (debug) {\r\n console.groupEnd();\r\n }\r\n }\r\n};\r\n\r\nconst getRecursive = async <T extends Record<string, unknown>>(\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.rest.AppIDToRequest;\r\n fields: (keyof T)[] | undefined;\r\n condition: string;\r\n onStep?: OnStep<T>;\r\n id?: string;\r\n stored?: WithId<T>[];\r\n }>\r\n): Promise<WithId<T>[]> => {\r\n const { app, fields, condition, id, debug, guestSpaceId } = params;\r\n\r\n const newCondition = id ? `${condition ? `(${condition}) and ` : ''} $id < ${id}` : condition;\r\n\r\n const query = `${newCondition} order by $id desc limit ${API_LIMIT_GET}`;\r\n\r\n const { records } = await api<kintoneAPI.rest.RecordsGetResponse<WithId<T>>>({\r\n endpointName: API_ENDPOINT_RECORDS,\r\n method: 'GET',\r\n body: { app, fields, query },\r\n debug,\r\n guestSpaceId,\r\n });\r\n if (!records.length) {\r\n return params.stored ?? [];\r\n }\r\n\r\n const stored = [...(params.stored ?? []), ...records];\r\n\r\n if (params.onStep) {\r\n params.onStep({ records: stored, incremental: records });\r\n }\r\n\r\n const lastRecord = stored[stored.length - 1];\r\n const lastId = lastRecord.$id.value;\r\n\r\n return records.length === API_LIMIT_GET\r\n ? getRecursive({ ...params, id: lastId, stored })\r\n : stored;\r\n};\r\n\r\ntype OnTotalGet = (params: { total: number }) => void;\r\n\r\n/**\r\n * 対象アプリの指定されたクエリに一致するレコードを、カーソルAPIを使って全件取得します\r\n *\r\n * @param params app: 対象アプリのID, query: 取得するレコードのクエリ, fields: 取得するフィールドコードの配列, onTotalGet: 取得するレコードの総数を取得した際に実行される関数, onStep: 段階的にレコードを取得する過程で実行される関数\r\n * @returns 取得したレコードの配列\r\n */\r\nexport const getAllRecordsWithCursor = async <T extends kintoneAPI.rest.Frame>(\r\n params: WithCommonRequestParams<{\r\n app: kintoneAPI.rest.AppIDToRequest;\r\n fields?: string[];\r\n query?: string;\r\n onTotalGet?: OnTotalGet;\r\n onStep?: OnStep<T>;\r\n }>\r\n): Promise<T[]> => {\r\n const {\r\n app,\r\n fields = [],\r\n query = '',\r\n onTotalGet = null,\r\n onStep = null,\r\n debug,\r\n guestSpaceId,\r\n } = params;\r\n\r\n if (debug) {\r\n console.groupCollapsed('📦 %cgetAllRecordsWithCursor', 'color: #1e40af');\r\n }\r\n\r\n try {\r\n const param: kintoneAPI.rest.CursorCreateRequest = { app, fields, size: API_LIMIT_GET, query };\r\n\r\n const cursor = await api<kintoneAPI.rest.CursorCreateResponse>({\r\n endpointName: API_ENDPOINT_CURSOR,\r\n method: 'POST',\r\n body: param,\r\n debug,\r\n guestSpaceId,\r\n });\r\n\r\n if (onTotalGet) {\r\n onTotalGet({\r\n total: Number(cursor.totalCount),\r\n });\r\n }\r\n\r\n const records = await getRecordsByCursorId<T>({ id: cursor.id, onStep, debug, guestSpaceId });\r\n\r\n return records;\r\n } finally {\r\n if (debug) {\r\n console.groupEnd();\r\n }\r\n }\r\n};\r\n\r\nconst getRecordsByCursorId = async <T extends kintoneAPI.rest.Frame>(\r\n params: WithCommonRequestParams<{\r\n id: string;\r\n onStep: OnStep<T> | null;\r\n loadedData?: T[];\r\n }>\r\n): Promise<T[]> => {\r\n const { id, onStep, loadedData = [], debug, guestSpaceId } = params;\r\n const response = await api<kintoneAPI.rest.CursorGetResponse<T>>({\r\n endpointName: API_ENDPOINT_CURSOR,\r\n method: 'GET',\r\n body: { id },\r\n debug,\r\n guestSpaceId,\r\n });\r\n\r\n const newRecords: T[] = [...loadedData, ...(response.records as T[])];\r\n\r\n if (onStep) {\r\n onStep({ records: newRecords, incremental: response.records as T[] });\r\n }\r\n\r\n return response.next ? getRecordsByCursorId({ ...params, loadedData: newRecords }) : newRecords;\r\n};\r\n\r\nexport type RecordAssigneesPutRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n id: kintoneAPI.IDToRequest;\r\n assignees: string[];\r\n revision?: kintoneAPI.IDToRequest;\r\n};\r\nexport type UpdateRecordAssigneesParams = WithCommonRequestParams<RecordAssigneesPutRequest>;\r\n\r\n/**\r\n * レコードの作業者(アサイニー)を更新します。\r\n *\r\n * プロセス管理が有効なアプリで、レコードの作業者を変更する際に使用します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.id - レコードID\r\n * @param params.assignees - 作業者のログイン名の配列\r\n * @param params.revision - リビジョン番号(省略可)\r\n * @returns 更新後のリビジョン情報\r\n *\r\n * @example\r\n * ```ts\r\n * await updateRecordAssignees({\r\n * app: 1,\r\n * id: 100,\r\n * assignees: ['user1', 'user2'],\r\n * });\r\n * ```\r\n */\r\nexport const updateRecordAssignees = async (\r\n params: UpdateRecordAssigneesParams\r\n): Promise<kintoneAPI.rest.RecordAssigneesPutResponse> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api<kintoneAPI.rest.RecordAssigneesPutResponse>({\r\n endpointName: API_ENDPOINT_ASSIGNEES,\r\n method: 'PUT',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type RecordStatusToPut = {\r\n action: string;\r\n assignee?: string;\r\n id: kintoneAPI.IDToRequest;\r\n revision?: kintoneAPI.IDToRequest;\r\n};\r\n\r\nexport type RecordStatusPutRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n} & RecordStatusToPut;\r\nexport type UpdateRecordStatusParams = WithCommonRequestParams<RecordStatusPutRequest>;\r\n\r\n/**\r\n * レコードのプロセスステータスを1件更新します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.action - 実行するアクション名\r\n * @param params.assignee - 次の作業者のログイン名(省略可)\r\n * @param params.id - レコードID\r\n * @param params.revision - リビジョン番号(省略可)\r\n * @returns 更新後のリビジョン情報\r\n *\r\n * @example\r\n * ```ts\r\n * await updateRecordStatus({\r\n * app: 1,\r\n * id: 100,\r\n * action: '承認する',\r\n * assignee: 'manager1',\r\n * });\r\n * ```\r\n */\r\nexport const updateRecordStatus = async (\r\n params: UpdateRecordStatusParams\r\n): Promise<kintoneAPI.rest.RecordStatusPutResponse> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api<kintoneAPI.rest.RecordStatusPutResponse>({\r\n endpointName: API_ENDPOINT_RECORD_STATUS,\r\n method: 'PUT',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type RecordStatusesPutRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n records: RecordStatusToPut[];\r\n};\r\nexport type UpdateAllRecordStatusesParams = WithBulkRequestCallback<\r\n WithCommonRequestParams<RecordStatusesPutRequest>\r\n>;\r\n\r\n/**\r\n * 複数レコードのプロセスステータスを一括更新します。\r\n *\r\n * 内部で `bulkRequest` を使用し、API制限ごとに自動分割してリクエストを送信します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.records - 更新対象のレコード配列(`action`, `id` 等を含む)\r\n * @param params.onProgress - 進捗コールバック\r\n * @returns 更新されたレコードの配列\r\n *\r\n * @example\r\n * ```ts\r\n * await updateAllRecordStatuses({\r\n * app: 1,\r\n * records: [\r\n * { id: 1, action: '承認する' },\r\n * { id: 2, action: '承認する' },\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport const updateAllRecordStatuses = async (\r\n params: UpdateAllRecordStatusesParams\r\n): Promise<kintoneAPI.rest.RecordStatusesPutResponse> => {\r\n const { onProgress, debug, guestSpaceId, ...requestParams } = params;\r\n const responses: { results: kintoneAPI.rest.RecordStatusesPutResponse[] } = (await bulkRequest({\r\n requests: [{ type: 'updateRecordStatuses', params: requestParams }],\r\n onProgress,\r\n debug,\r\n guestSpaceId,\r\n })) as any;\r\n\r\n return responses.results.reduce<kintoneAPI.rest.RecordStatusesPutResponse>(\r\n (acc, result) => {\r\n return {\r\n records: [...acc.records, ...result.records],\r\n };\r\n },\r\n { records: [] }\r\n );\r\n};\r\n\r\nexport type RecordACLEvaluateGetRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n ids: kintoneAPI.IDToRequest[];\r\n};\r\nexport type GetRecordACLEvaluateParams = WithCommonRequestParams<RecordACLEvaluateGetRequest>;\r\n\r\n/**\r\n * レコードのアクセス権を評価します。\r\n *\r\n * 指定したレコードIDに対して、現在のユーザーのアクセス権情報を取得します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.ids - 評価対象のレコードIDの配列\r\n * @returns 各レコードのアクセス権評価結果\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await getRecordACLEvaluate({\r\n * app: 1,\r\n * ids: [1, 2, 3],\r\n * });\r\n * ```\r\n */\r\nexport const getRecordACLEvaluate = async (\r\n params: GetRecordACLEvaluateParams\r\n): Promise<kintoneAPI.rest.RecordACLEvaluateGetResponse> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api<kintoneAPI.rest.RecordACLEvaluateGetResponse>({\r\n endpointName: API_ENDPOINT_ACL_EVALUATE,\r\n method: 'GET',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type OneOfBulkRequest<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> = {\r\n method: kintoneAPI.rest.Method;\r\n api: string;\r\n payload:\r\n | RecordPostRequest<T>\r\n | RecordsPostRequest<T>\r\n | RecordPutRequest<T>\r\n | RecordsPutRequest<T>\r\n | RecordsDeleteRequest\r\n | RecordAssigneesPutRequest\r\n | RecordStatusPutRequest\r\n | RecordStatusesPutRequest;\r\n};\r\n\r\nexport type BulkRequestParams<T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData> =\r\n WithCommonRequestParams<{\r\n requests: (\r\n | {\r\n type: 'updateRecord';\r\n params: RecordPutRequest<T>;\r\n }\r\n | {\r\n type: 'addRecord';\r\n params: RecordPostRequest<T>;\r\n }\r\n | {\r\n type: 'updateAllRecords';\r\n params: RecordsPutRequest<T>;\r\n }\r\n | {\r\n type: 'addAllRecords';\r\n params: RecordsPostRequest<T>;\r\n }\r\n | {\r\n type: 'deleteRecords';\r\n params: RecordsDeleteRequest;\r\n }\r\n | {\r\n type: 'updateRecordAssignees';\r\n params: RecordAssigneesPutRequest;\r\n }\r\n | {\r\n type: 'updateRecordStatus';\r\n params: RecordStatusPutRequest;\r\n }\r\n | {\r\n type: 'updateRecordStatuses';\r\n params: RecordStatusesPutRequest;\r\n }\r\n )[];\r\n onProgress?: (params: BulkRequestProgressParams) => void;\r\n limit?: number;\r\n }>;\r\n\r\n/**\r\n * 複数のAPIリクエストを一括で実行します(バルクリクエスト)。\r\n *\r\n * API制限ごとにリクエストを自動分割し、チャンクごとに順次実行します。\r\n * レコードの追加・更新・削除・ステータス更新などの操作を混在させることができます。\r\n *\r\n * @typeParam T - レコードの型\r\n * @param params.requests - 実行するリクエストの配列(type と params を持つ)\r\n * @param params.onProgress - 進捗コールバック\r\n * @param params.limit - 1回のバルクリクエストあたりのリクエスト数上限(デフォルト: 20)\r\n * @returns 全リクエストの実行結果\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await bulkRequest({\r\n * requests: [\r\n * { type: 'addAllRecords', params: { app: 1, records: [...] } },\r\n * { type: 'deleteRecords', params: { app: 2, ids: [1, 2, 3] } },\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport const bulkRequest = async <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(\r\n params: BulkRequestParams<T>\r\n): Promise<kintoneAPI.rest.BulkResponse> => {\r\n const { requests, debug, guestSpaceId, limit = API_LIMIT_BULK_REQUEST } = params;\r\n if (debug) {\r\n console.groupCollapsed('📦 %cbulkRequest', 'color: #1e40af');\r\n }\r\n\r\n try {\r\n const apiTable: Record<\r\n (typeof requests)[number]['type'],\r\n { endpointName: string; method: kintoneAPI.rest.Method }\r\n > = {\r\n updateRecord: { endpointName: API_ENDPOINT_RECORD, method: 'PUT' },\r\n addRecord: { endpointName: API_ENDPOINT_RECORD, method: 'POST' },\r\n updateAllRecords: { endpointName: API_ENDPOINT_RECORDS, method: 'PUT' },\r\n addAllRecords: { endpointName: API_ENDPOINT_RECORDS, method: 'POST' },\r\n deleteRecords: { endpointName: API_ENDPOINT_RECORDS, method: 'DELETE' },\r\n updateRecordAssignees: { endpointName: API_ENDPOINT_ASSIGNEES, method: 'PUT' },\r\n updateRecordStatus: { endpointName: API_ENDPOINT_RECORD_STATUS, method: 'PUT' },\r\n updateRecordStatuses: { endpointName: API_ENDPOINT_RECORD_STATUSES, method: 'PUT' },\r\n };\r\n\r\n let reshapedRequests: OneOfBulkRequest<T>[] = [];\r\n for (const request of requests) {\r\n const { endpointName, method } = apiTable[request.type];\r\n const api = buildPath({ endpointName, guestSpaceId });\r\n\r\n if (\r\n request.type === 'updateRecord' ||\r\n request.type === 'addRecord' ||\r\n request.type === 'updateRecordAssignees' ||\r\n request.type === 'updateRecordStatus'\r\n ) {\r\n reshapedRequests.push({ method, api, payload: request.params });\r\n } else if (request.type === 'updateAllRecords') {\r\n const { records: allRecords, ...commonRequestParams } = request.params;\r\n const recordChunks = sliceIntoChunks(allRecords, API_LIMIT_PUT);\r\n for (const records of recordChunks) {\r\n reshapedRequests.push({\r\n method,\r\n api,\r\n payload: { ...commonRequestParams, records },\r\n });\r\n }\r\n } else if (request.type === 'addAllRecords') {\r\n const recordChunks = sliceIntoChunks(\r\n request.params.records,\r\n Math.min(request.params.limit ?? API_LIMIT_POST, API_LIMIT_POST)\r\n );\r\n for (const records of recordChunks) {\r\n reshapedRequests.push({ method, api, payload: { ...request.params, records } });\r\n }\r\n } else if (request.type === 'deleteRecords') {\r\n const idChunks = sliceIntoChunks(request.params.ids, API_LIMIT_DELETE);\r\n for (const ids of idChunks) {\r\n reshapedRequests.push({ method, api, payload: { ...request.params, ids } });\r\n }\r\n } else if (request.type === 'updateRecordStatuses') {\r\n const recordChunks = sliceIntoChunks(request.params.records, API_LIMIT_PUT);\r\n for (const records of recordChunks) {\r\n reshapedRequests.push({ method, api, payload: { ...request.params, records } });\r\n }\r\n }\r\n }\r\n\r\n const responses: kintoneAPI.rest.BulkResponse[] = [];\r\n const requestChunks = sliceIntoChunks(\r\n reshapedRequests,\r\n Math.min(limit, API_LIMIT_BULK_REQUEST)\r\n );\r\n let done = 0;\r\n for (const requests of requestChunks) {\r\n const response = await api<kintoneAPI.rest.BulkResponse>({\r\n endpointName: API_ENDPOINT_BULK,\r\n method: 'POST',\r\n body: { requests },\r\n debug,\r\n guestSpaceId,\r\n });\r\n if (debug) {\r\n done += requests.length;\r\n console.log(\r\n `%cbulk request in progress... ${done}/${reshapedRequests.length}`,\r\n 'color: #999'\r\n );\r\n }\r\n responses.push(response);\r\n if (params.onProgress) {\r\n params.onProgress({\r\n total: reshapedRequests.length,\r\n done: responses.reduce((acc, response) => acc + response.results.length, 0),\r\n });\r\n }\r\n }\r\n\r\n return responses.reduce<kintoneAPI.rest.BulkResponse>(\r\n (acc, response) => {\r\n return { results: [...acc.results, ...response.results] };\r\n },\r\n { results: [] }\r\n );\r\n } finally {\r\n if (debug) {\r\n console.groupEnd();\r\n }\r\n }\r\n};\r\n","import { kintoneAPI } from '../types/api';\nimport {\n addAllRecords,\n AddAllRecordsParams,\n addRecord,\n addRecords,\n API_LIMIT_POST,\n} from './record';\n\n/**\n * 🧪 実験的な実装\n *\n * APIクライアントをClassではなく、カリー化した関数で実装することで、ユーザーがAPIクライアントを拡張しやすくする。\n *\n * アプリ情報を事前に指定し、レコード操作時にはアプリ情報の指定を省略できます。\n *\n * @typeParam T - レコードの型\n * @param props.app - アプリID\n * @param props.guestsSpaceId - ゲストスペースID(省略可)\n * @param props.debug - デバッグログを出力する場合は `true`\n * @returns レコード操作用のメソッドを持つオブジェクト\n *\n * @example\n * ```ts\n * const client = useApi({ app: 1 });\n * const result = await client.records.$post({\n * records: [{ タイトル: { value: 'テスト' } }],\n * });\n * console.log(result.ids);\n * ```\n */\nexport const useApi = <T extends kintoneAPI.rest.Frame = kintoneAPI.RecordData>(props: {\n app: kintoneAPI.IDToRequest;\n guestsSpaceId?: string;\n debug?: boolean;\n}) => {\n return {\n records: {\n $post: async (\n params: Omit<AddAllRecordsParams<T>, 'app' | 'guestSpaceId' | 'debug'>\n ): Promise<kintoneAPI.rest.RecordsPostResponse> => {\n const { limit = API_LIMIT_POST, ...requestParams } = params;\n if (requestParams.records.length === 1) {\n return addRecord<T>({ ...props, record: requestParams.records[0] }).then((res) => ({\n ids: [res.id],\n revisions: [res.revision],\n }));\n }\n if (requestParams.records.length <= limit) {\n return addRecords({ ...props, ...params });\n }\n return addAllRecords({ ...props, ...params });\n },\n },\n };\n};\n","import { WithCommonRequestParams, buildPath } from './common';\r\n\r\n/**\r\n * kintoneへファイルをアップロードします。\r\n *\r\n * `FormData` を使用し、`fetch` APIでファイルをアップロードします。\r\n * アップロード成功後、返された `fileKey` をレコードの添付ファイルフィールドの値として使用できます。\r\n *\r\n * @param params.file.name - ファイル名\r\n * @param params.file.data - ファイルデータ(Blob)\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns アップロードされたファイルの `fileKey`\r\n *\r\n * @example\r\n * ```ts\r\n * const blob = new Blob(['テスト内容'], { type: 'text/plain' });\r\n * const { fileKey } = await uploadFile({\r\n * file: { name: 'test.txt', data: blob },\r\n * });\r\n *\r\n * // レコード更新時に使用\r\n * await updateRecord({\r\n * app: 1,\r\n * id: 100,\r\n * record: { 添付ファイル: { value: [{ fileKey }] } },\r\n * });\r\n * ```\r\n */\r\nexport const uploadFile = async (\r\n params: WithCommonRequestParams<{\r\n file: { name: string; data: Blob };\r\n }>\r\n): Promise<{ fileKey: string }> => {\r\n const { file, debug, guestSpaceId } = params;\r\n\r\n const formData = new FormData();\r\n formData.append('__REQUEST_TOKEN__', kintone.getRequestToken());\r\n formData.append('file', file.data, file.name);\r\n\r\n const headers = { 'X-Requested-With': 'XMLHttpRequest' };\r\n const response = await fetch(buildPath({ endpointName: 'file', guestSpaceId }), {\r\n method: 'POST',\r\n headers,\r\n body: formData,\r\n });\r\n return response.json();\r\n};\r\n\r\n/**\r\n * kintoneからファイルをダウンロードします。\r\n *\r\n * `fileKey` を指定して、添付ファイルをBlobとして取得します。\r\n *\r\n * @param params.fileKey - ダウンロード対象のファイルキー\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns ファイルデータ(Blob)\r\n *\r\n * @example\r\n * ```ts\r\n * const blob = await downloadFile({ fileKey: 'xxxx-xxxx-xxxx' });\r\n * const url = URL.createObjectURL(blob);\r\n * ```\r\n */\r\nexport const downloadFile = async (\r\n params: WithCommonRequestParams<{ fileKey: string }>\r\n): Promise<Blob> => {\r\n const { fileKey, debug, guestSpaceId } = params;\r\n\r\n const headers = { 'X-Requested-With': 'XMLHttpRequest' };\r\n const path = buildPath({ endpointName: 'file', guestSpaceId });\r\n const response = await fetch(`${path}?fileKey=${fileKey}`, { method: 'GET', headers });\r\n return response.blob();\r\n};\r\n","import { kintoneAPI } from '../types/api';\r\nimport { api, buildPath } from './common';\r\n\r\nconst API_ENDPOINT_COMMENTS = `record/comments`;\r\nconst API_ENDPOINT_COMMENT = `record/comment`;\r\n\r\nconst API_LIMIT_COMMENT = 10;\r\n\r\n/**\r\n * 指定レコードのコメントを全件取得します。\r\n *\r\n * APIの取得件数上限(10件)を超える場合も、全件自動で再帰的に取得します。\r\n *\r\n * @param props.app - アプリID\r\n * @param props.record - レコードID\r\n * @param props.order - ソート順(`'asc'` | `'desc'`)\r\n * @returns コメントの配列\r\n *\r\n * @example\r\n * ```ts\r\n * const comments = await getRecordComments({\r\n * app: 1,\r\n * record: 100,\r\n * order: 'desc',\r\n * });\r\n * comments.forEach((c) => console.log(c.text));\r\n * ```\r\n */\r\nexport const getRecordComments = (props: kintoneAPI.rest.CommentsGetRequest) => {\r\n return getRecursiveRecordComments(props);\r\n};\r\n\r\nconst getRecursiveRecordComments = async (\r\n requestParams: kintoneAPI.rest.CommentsGetRequest,\r\n stored: kintoneAPI.rest.CommentsGetResponse['comments'] = []\r\n): Promise<kintoneAPI.rest.CommentsGetResponse['comments']> => {\r\n const offset = stored.length;\r\n\r\n const newRequest: kintoneAPI.rest.CommentsGetRequest = {\r\n ...requestParams,\r\n limit: API_LIMIT_COMMENT,\r\n offset,\r\n };\r\n\r\n const response = await api<kintoneAPI.rest.CommentsGetResponse>({\r\n endpointName: API_ENDPOINT_COMMENTS,\r\n method: 'GET',\r\n body: newRequest,\r\n guestSpaceId: requestParams.guestSpaceId,\r\n });\r\n\r\n const comments = [...stored, ...response.comments];\r\n\r\n return response.comments.length === API_LIMIT_COMMENT\r\n ? getRecursiveRecordComments(requestParams, comments)\r\n : comments;\r\n};\r\n\r\n/**\r\n * レコードにコメントを1件追加します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.record - レコードID\r\n * @param params.comment - コメント内容(`text`, `mentions` 等)\r\n * @returns 追加されたコメントのID\r\n *\r\n * @example\r\n * ```ts\r\n * const { id } = await addRecordComment({\r\n * app: 1,\r\n * record: 100,\r\n * comment: { text: '確認しました' },\r\n * });\r\n * ```\r\n */\r\nexport const addRecordComment = (params: kintoneAPI.rest.CommentPostRequest) => {\r\n return api<kintoneAPI.rest.CommentPostResponse>({\r\n endpointName: API_ENDPOINT_COMMENT,\r\n method: 'POST',\r\n body: params,\r\n guestSpaceId: params.guestSpaceId,\r\n });\r\n};\r\n\r\n/**\r\n * レコードのコメントを1件削除します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.record - レコードID\r\n * @param params.comment - 削除するコメントのID\r\n * @returns 空オブジェクト\r\n *\r\n * @example\r\n * ```ts\r\n * await deleteRecordComment({\r\n * app: 1,\r\n * record: 100,\r\n * comment: 5,\r\n * });\r\n * ```\r\n */\r\nexport const deleteRecordComment = (params: kintoneAPI.rest.CommentDeleteRequest) => {\r\n return api<kintoneAPI.rest.CommentDeleteResponse>({\r\n endpointName: API_ENDPOINT_COMMENT,\r\n method: 'DELETE',\r\n body: params,\r\n guestSpaceId: params.guestSpaceId,\r\n });\r\n};\r\n","import { kintoneAPI } from '../types/api';\r\nimport { WithCommonRequestParams, api } from './common';\r\n\r\nconst API_ENDPOINT_REPORTS = 'app/reports';\r\n\r\nexport type AppReportsGetRequest = {\r\n app: kintoneAPI.IDToRequest;\r\n lang?: kintoneAPI.rest.Lang;\r\n};\r\n\r\nexport type GetAppChartsParams = WithCommonRequestParams<AppReportsGetRequest>;\r\n\r\n/**\r\n * 指定アプリのグラフ(レポート)設定を取得します。\r\n *\r\n * @param params.app - アプリID\r\n * @param params.lang - 取得する言語(省略可)\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns グラフ設定情報\r\n *\r\n * @example\r\n * ```ts\r\n * const { reports } = await getAppCharts({ app: 1 });\r\n * Object.keys(reports).forEach((name) => {\r\n * console.log(name, reports[name].chartType);\r\n * });\r\n * ```\r\n */\r\nexport const getAppCharts = (\r\n params: GetAppChartsParams\r\n): Promise<kintoneAPI.rest.AppReportsGetResponse> => {\r\n const { debug, guestSpaceId, ...requestParams } = params;\r\n return api<kintoneAPI.rest.AppReportsGetResponse>({\r\n endpointName: API_ENDPOINT_REPORTS,\r\n method: 'GET',\r\n body: requestParams,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n","import { kintoneAPI } from '../types/api';\r\nimport { WithCommonRequestParams, api } from './common';\r\n\r\nconst API_ENDPOINT_SPACE = 'space';\r\nconst API_ENDPOINT_THREAD = 'space/thread';\r\nconst API_ENDPOINT_MEMBERS = 'space/members';\r\nconst API_ENDPOINT_TEMPLATE = 'template/space';\r\n\r\n/**\r\n * 指定したスペースの情報を取得します。\r\n *\r\n * @param params.id - スペースID\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns スペース情報\r\n *\r\n * @example\r\n * ```ts\r\n * const space = await getSpace({ id: 1 });\r\n * console.log(space.name);\r\n * ```\r\n */\r\nexport const getSpace = (\r\n params: WithCommonRequestParams<kintoneAPI.rest.space.GetSpaceRequest>\r\n) => {\r\n return api<kintoneAPI.rest.space.GetSpaceResponse>({\r\n endpointName: API_ENDPOINT_SPACE,\r\n method: 'GET',\r\n body: params,\r\n ...params,\r\n });\r\n};\r\n\r\nexport type CreateSpaceParams = WithCommonRequestParams<{\r\n id: kintoneAPI.IDToRequest;\r\n name: string;\r\n members: {\r\n entity: { type: kintoneAPI.EntityType; code: string };\r\n isAdmin: boolean;\r\n includeSubs?: boolean;\r\n }[];\r\n isPrivate?: boolean;\r\n isGuest?: boolean;\r\n fixedMember?: boolean;\r\n}>;\r\nexport type CreateSpaceResponse = {\r\n id: string;\r\n};\r\n\r\n/**\r\n * テンプレートからスペースを新規作成します。\r\n *\r\n * @param params.id - スペーステンプレートID\r\n * @param params.name - スペース名\r\n * @param params.members - メンバー情報の配列\r\n * @param params.isPrivate - 非公開スペースにする場合は `true`\r\n * @param params.isGuest - ゲストスペースにする場合は `true`\r\n * @param params.fixedMember - メンバーを固定する場合は `true`\r\n * @returns 作成されたスペースのID\r\n *\r\n * @example\r\n * ```ts\r\n * const { id } = await createSpace({\r\n * id: 10, // テンプレートID\r\n * name: '新規プロジェクト',\r\n * members: [\r\n * { entity: { type: 'USER', code: 'user1' }, isAdmin: true },\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport const createSpace = (params: CreateSpaceParams): Promise<CreateSpaceResponse> => {\r\n const { guestSpaceId, debug, ...body } = params;\r\n return api<CreateSpaceResponse>({\r\n endpointName: API_ENDPOINT_TEMPLATE,\r\n method: 'POST',\r\n body,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type DeleteSpaceParams = WithCommonRequestParams<{\r\n /** 更新するスレッドのスレッドID */\r\n id: kintoneAPI.rest.space.SpaceIdToRequest;\r\n}>;\r\nexport type DeleteSpaceResponse = {};\r\n\r\n/**\r\n * スペースを削除します。\r\n *\r\n * @param params.id - 削除対象のスペースID\r\n * @param params.guestSpaceId - ゲストスペースID(省略可)\r\n * @param params.debug - デバッグログを出力する場合は `true`\r\n * @returns 空オブジェクト\r\n *\r\n * @example\r\n * ```ts\r\n * await deleteSpace({ id: 1 });\r\n * ```\r\n */\r\nexport const deleteSpace = (params: DeleteSpaceParams): Promise<DeleteSpaceResponse> => {\r\n const { guestSpaceId, debug, ...body } = params;\r\n return api<DeleteSpaceResponse>({\r\n endpointName: API_ENDPOINT_SPACE,\r\n method: 'DELETE',\r\n body,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n\r\nexport type UpdateThreadParams = WithCommonRequestParams<{\r\n /** 更新するスレッドのスレッドID */\r\n id: kintoneAPI.IDToRequest;\r\n\r\n /**\r\n * スレッド名\r\n *\r\n * 1文字から128文字まで指定可能。省略した場合は、スレッド名は更新されません。\r\n *\r\n * シングルスレッドスペースのスレッドはスレッド名が存在しないため更新できません。\r\n */\r\n name?: string;\r\n\r\n /**\r\n * スレッドの本文\r\n *\r\n * 65535文字まで指定可能。省略した場合は、本文は更新されません。\r\n *\r\n * 許可されていない属性やタグは自動的に削除されます。\r\n *\r\n * アプリ貼り付け、ファイル添付、絵文字は HTML で指定します。\r\n *\r\n * 宛先を HTML 内で指定しても、その宛先には通知されません。\r\n */\r\n body?: string;\r\n}>;\r\nexport type UpdateThreadResponse = {};\r\n\r\n/**\r\n * スペース内のスレッド情報を更新します。\r\n *\r\n * スレッド名や本文を更新できます。シングルスレッドのスペースではスレッド名の更新はできません。\r\n *\r\n * @param params.id - スレッドID\r\n * @param params.name - スレッド名(1~128文字、省略時は更新なし)\r\n * @param params.body - スレッドの本文(HTML対応、65535文字まで、省略時は更新なし)\r\n * @returns 空オブジェクト\r\n *\r\n * @example\r\n * ```ts\r\n * await updateThread({\r\n * id: 5,\r\n * name: '更新後のスレッド名',\r\n * body: '<b>重要なお知らせ</b>',\r\n * });\r\n * ```\r\n */\r\nexport const updateThread = (params: UpdateThreadParams): Promise<UpdateThreadResponse> => {\r\n const { guestSpaceId, debug, ...body } = params;\r\n return api<UpdateThreadResponse>({\r\n endpointName: API_ENDPOINT_THREAD,\r\n method: 'PUT',\r\n body,\r\n debug,\r\n guestSpaceId,\r\n });\r\n};\r\n","import { kintoneAPI } from '../types/api';\r\nimport { getRecords } from './record';\r\n\r\n/**\r\n * APIから取得したフィールド情報から、指定した関数の条件に当てはまるフィールドのみを返却します\r\n *\r\n * @param properties APIから取得したフィールド情報\r\n * @param callback 絞り込み条件\r\n * @returns 条件に当てはまるフィールド\r\n */\r\nexport const filterFieldProperties = (\r\n properties: kintoneAPI.FieldProperties,\r\n callback: (field: kintoneAPI.FieldProperty) => boolean\r\n): kintoneAPI.FieldProperties => {\r\n const filtered = Object.entries(properties).filter(([_, value]) => callback(value!));\r\n\r\n const reduced = filtered.reduce<kintoneAPI.FieldProperties>(\r\n (acc, [key, value]) => ({ ...acc, [key]: value }),\r\n {}\r\n );\r\n\r\n return reduced;\r\n};\r\n\r\n/**\r\n * REST APIでアクセスする先のアプリがゲストスペースに存在するものかどうかのつかない時、\r\n *\r\n * 一度スペースIDを未指定でアクセスし、エラーが返ってきたらスペースIDを指定して再度アクセスする関数です。\r\n */\r\nexport const withSpaceIdFallback = async <T extends (...args: any) => any>(params: {\r\n spaceId?: string;\r\n func: T;\r\n funcParams: Parameters<T>[0];\r\n}): Promise<ReturnType<T>> => {\r\n const { spaceId, func, funcParams } = params;\r\n try {\r\n const response = await func(funcParams);\r\n return response;\r\n } catch (error: any) {\r\n if (['GAIA_IL23', 'GAIA_IL25'].includes(error.code)) {\r\n const response = await func({ ...funcParams, guestSpaceId: spaceId });\r\n return response;\r\n }\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * REST APIでアクセスする先のアプリがゲストスペースに存在するかどうかを判定します。\r\n *\r\n * ゲストスペースIDなしでアクセスし、`GAIA_IL23` エラーが返るかどうかで判定します。\r\n *\r\n * @param appId - 判定対象のアプリID\r\n * @returns ゲストスペースのアプリであれば `true`\r\n *\r\n * @example\r\n * ```ts\r\n * const guest = await isGuestSpace('123');\r\n * if (guest) {\r\n * console.log('ゲストスペースのアプリです');\r\n * }\r\n * ```\r\n */\r\nexport const isGuestSpace = async (appId: string): Promise<boolean> => {\r\n try {\r\n await getRecords({ app: appId });\r\n } catch (error: any) {\r\n return error.code === 'GAIA_IL23';\r\n }\r\n return false;\r\n};\r\n\r\ntype Operator = '=' | '!=' | '>' | '<' | '>=' | '<=' | 'in' | 'not in' | 'like' | 'not like';\r\n\r\ntype OrderBy = 'asc' | 'desc';\r\n\r\n/**\r\n * ソート条件を組み立てます.\r\n *\r\n * ### なぜこの関数が必要?\r\n *\r\n * kintoneでフィールドコードが変更されることを想定してコードを記述する場合、フィールドコードのチェックと、ソート条件の組み立てを1つずつ定義する必要があります.\r\n *\r\n * この関数を使用することで、フィールドコードのチェックと、ソート条件の組み立てを同時に行うことができます.\r\n */\r\nexport const useSorting = <T>(field: keyof T, orderBy: OrderBy) => {\r\n return ` order by ${String(field)} ${orderBy}`;\r\n};\r\n\r\nexport type QueryCondition<T> = {\r\n field: keyof T;\r\n operator: Operator;\r\n value: string;\r\n truth?: 'and' | 'or';\r\n};\r\n\r\n/**\r\n * APIを使用する際のクエリーを組み立てます.\r\n *\r\n * ### なぜこの関数が必要?\r\n *\r\n * kintoneでフィールドコードが変更されることを想定してコードを記述する場合、クエリに使用するフィールドコードを1つずつ定義する必要があります。\r\n *\r\n * この関数を使用することで、フィールドコードのチェックと、クエリの組み立てを同時に行うことができます。\r\n */\r\nexport const useQuery = <T>(\r\n conditions: QueryCondition<T>[],\r\n options?: { debug?: boolean; sort?: { field: keyof T; orderBy: OrderBy } }\r\n) => {\r\n const { sort, debug = false } = options || {};\r\n const mergedCondition = conditions.reduce((acc, condition) => {\r\n const { field, operator, value, truth } = condition;\r\n const isNumber = !isNaN(Number(value));\r\n\r\n const formattedValue = !isNumber && !/^(\"|')/.test(value) ? `\"${value}\"` : value;\r\n\r\n if (acc.length) {\r\n acc += ` ${truth || 'and'} `;\r\n }\r\n return acc + `${String(field)} ${operator} ${formattedValue}`;\r\n }, '');\r\n\r\n if (debug) {\r\n console.log(`🔍 Query: ${mergedCondition}`);\r\n }\r\n if (sort) {\r\n return `${mergedCondition}${useSorting(sort.field, sort.orderBy)}`;\r\n }\r\n return mergedCondition;\r\n};\r\n"]}