@wcstack/state 1.15.0 → 1.16.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.d.ts +79 -2
- package/dist/index.esm.js +165 -13
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +1 -1
- package/dist/index.esm.min.js.map +1 -1
- package/dist/manifest.d.ts +74 -0
- package/dist/manifest.esm.js +925 -0
- package/dist/wcs-manifest.json +533 -0
- package/package.json +8 -3
package/dist/index.d.ts
CHANGED
|
@@ -20,6 +20,14 @@ interface IConfig {
|
|
|
20
20
|
readonly locale: string;
|
|
21
21
|
readonly debug: boolean;
|
|
22
22
|
readonly enableMustache: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* 同値ガード(**既定 true**・標準的リアクティブ挙動・`setConfig({ sameValueGuard: false })` で opt-out 可)。
|
|
25
|
+
* primitive 値の set で `Object.is` 同値なら更新を no-op にする
|
|
26
|
+
* (enqueue / 依存 walk / DOM 適用 / $updatedCallback / DCC イベントを発火しない)。
|
|
27
|
+
* 参照型(object/array)は in-place mutation 取りこぼし防止のため素通し。
|
|
28
|
+
* 同値 set に副作用(同値時の $updatedCallback 等)を期待する場合は false にする。
|
|
29
|
+
*/
|
|
30
|
+
readonly sameValueGuard: boolean;
|
|
23
31
|
}
|
|
24
32
|
interface IWritableConfig {
|
|
25
33
|
bindAttributeName?: string;
|
|
@@ -32,6 +40,7 @@ interface IWritableConfig {
|
|
|
32
40
|
locale?: string;
|
|
33
41
|
debug?: boolean;
|
|
34
42
|
enableMustache?: boolean;
|
|
43
|
+
sameValueGuard?: boolean;
|
|
35
44
|
}
|
|
36
45
|
|
|
37
46
|
declare function bootstrapState(config?: IWritableConfig): void;
|
|
@@ -330,5 +339,73 @@ declare function defineState<T extends Record<string, any>>(definition: T & This
|
|
|
330
339
|
|
|
331
340
|
declare const VERSION: string;
|
|
332
341
|
|
|
333
|
-
|
|
334
|
-
|
|
342
|
+
/**
|
|
343
|
+
* filterMeta.ts — 組み込みフィルタの構造化メタデータ(単一正本・route-a A2-1)。
|
|
344
|
+
*
|
|
345
|
+
* これまで vscode-wcs(completionData.ts BUILTIN_FILTERS)が手で持っていたフィルタの
|
|
346
|
+
* 引数仕様・型・説明を、実装側(@wcstack/state)に**正本として移設**したもの。
|
|
347
|
+
* manifest.ts がこれを公開し、vscode-wcs はそれを消費して手リストを撤去できる。
|
|
348
|
+
*
|
|
349
|
+
* 完全性は __tests__/manifest.test.ts のドリフト検出が保証する
|
|
350
|
+
* (filterMeta のキー集合 == builtinFilters のキー集合)。フィルタを追加して meta を
|
|
351
|
+
* 書き忘れると CI が落ちる。
|
|
352
|
+
*/
|
|
353
|
+
type FilterResultType = "boolean" | "number" | "string" | "passthrough";
|
|
354
|
+
type FilterArgType = "number" | "string" | "any";
|
|
355
|
+
interface IFilterMeta {
|
|
356
|
+
/** 説明(補完・ホバー用) */
|
|
357
|
+
description: string;
|
|
358
|
+
/** 引数を取るか */
|
|
359
|
+
hasArgs: boolean;
|
|
360
|
+
/** 適用後の結果型(passthrough は入力型をそのまま返す) */
|
|
361
|
+
resultType: FilterResultType;
|
|
362
|
+
/** 受け入れ可能な入力型('any' は任意) */
|
|
363
|
+
acceptTypes: "any" | readonly string[];
|
|
364
|
+
/** 引数の最小数 */
|
|
365
|
+
minArgs: number;
|
|
366
|
+
/** 引数の最大数 */
|
|
367
|
+
maxArgs: number;
|
|
368
|
+
/** 各引数の期待型(省略時はチェックしない) */
|
|
369
|
+
argTypes?: readonly FilterArgType[];
|
|
370
|
+
}
|
|
371
|
+
/** 組み込みフィルタ名 → 構造化メタデータ。キー集合は builtinFilters と一致しなければならない。 */
|
|
372
|
+
declare const builtinFilterMeta: Record<string, IFilterMeta>;
|
|
373
|
+
|
|
374
|
+
/** マニフェストのバージョン(構造を変えたら上げる)。 */
|
|
375
|
+
declare const WCS_MANIFEST_VERSION = 1;
|
|
376
|
+
interface IWcsManifest {
|
|
377
|
+
version: number;
|
|
378
|
+
syntax: {
|
|
379
|
+
/** バインド属性名(既定 data-wcs) */
|
|
380
|
+
bindAttribute: string;
|
|
381
|
+
/** タグ名(既定 wcs-state) */
|
|
382
|
+
tagName: string;
|
|
383
|
+
/** パス区切り(`.`) */
|
|
384
|
+
pathDelimiter: string;
|
|
385
|
+
/** ワイルドカード(`*`) */
|
|
386
|
+
wildcard: string;
|
|
387
|
+
/** バインディング構文 `[prop][#mod]: [path][@state][|filter...]` の区切り文字 */
|
|
388
|
+
delimiters: {
|
|
389
|
+
binding: string;
|
|
390
|
+
propValue: string;
|
|
391
|
+
modifier: string;
|
|
392
|
+
stateName: string;
|
|
393
|
+
filter: string;
|
|
394
|
+
};
|
|
395
|
+
/** 構造ディレクティブ(`<template data-wcs="for: ...">` 等) */
|
|
396
|
+
structuralDirectives: readonly string[];
|
|
397
|
+
};
|
|
398
|
+
/** 組み込みフィルタ名(builtinFilters から自動導出=実装が正本) */
|
|
399
|
+
filters: string[];
|
|
400
|
+
/** 組み込みフィルタの構造化メタデータ(説明・引数仕様・型)。vscode-wcs の手リスト撤去用。 */
|
|
401
|
+
filterMeta: Record<string, IFilterMeta>;
|
|
402
|
+
/** 予約ライフサイクルフック名 */
|
|
403
|
+
reservedLifecycle: readonly string[];
|
|
404
|
+
/** 予約 state API(プロトコル系の `$` 名前空間) */
|
|
405
|
+
reservedStateApi: readonly string[];
|
|
406
|
+
}
|
|
407
|
+
/** 機械可読な単一正本を返す。vscode-wcs はこれを消費する想定。 */
|
|
408
|
+
declare function getWcsManifest(): IWcsManifest;
|
|
409
|
+
|
|
410
|
+
export { Ssr, VERSION, WCS_MANIFEST_VERSION, bootstrapState, buildBindings, builtinFilterMeta, defineState, getBindingsReady, getConfig, getWcsManifest };
|
|
411
|
+
export type { FilterArgType, FilterResultType, IFilterMeta, ISsrElement, IWcsManifest, IWritableConfig, IWritableTagNames, WcsPathValue, WcsPaths, WcsStateApi, WcsThis };
|
package/dist/index.esm.js
CHANGED
|
@@ -20,6 +20,7 @@ const _config = {
|
|
|
20
20
|
locale: 'en',
|
|
21
21
|
debug: false,
|
|
22
22
|
enableMustache: true,
|
|
23
|
+
sameValueGuard: true,
|
|
23
24
|
};
|
|
24
25
|
// backward compatible export (read-only usage)
|
|
25
26
|
const config = _config;
|
|
@@ -57,9 +58,12 @@ function setConfig(partialConfig) {
|
|
|
57
58
|
if (typeof partialConfig.enableMustache === "boolean") {
|
|
58
59
|
_config.enableMustache = partialConfig.enableMustache;
|
|
59
60
|
}
|
|
61
|
+
if (typeof partialConfig.sameValueGuard === "boolean") {
|
|
62
|
+
_config.sameValueGuard = partialConfig.sameValueGuard;
|
|
63
|
+
}
|
|
60
64
|
}
|
|
61
65
|
|
|
62
|
-
var version$1 = "1.
|
|
66
|
+
var version$1 = "1.16.0";
|
|
63
67
|
var pkg = {
|
|
64
68
|
version: version$1};
|
|
65
69
|
|
|
@@ -114,6 +118,13 @@ const DELIMITER = '.';
|
|
|
114
118
|
const WILDCARD = '*';
|
|
115
119
|
const MAX_WILDCARD_DEPTH = 128;
|
|
116
120
|
const MAX_LOOP_DEPTH = 128;
|
|
121
|
+
// data-wcs バインディング構文 `[prop][#mod]: [path][@state][|filter...]` の区切り文字(単一正本)。
|
|
122
|
+
// これらは「死守の壁(構文契約)」であり値は不変。manifest.syntax.delimiters で公開される。
|
|
123
|
+
const BINDING_SEPARATOR = ';'; // 複数バインディングの区切り
|
|
124
|
+
const PROP_VALUE_SEPARATOR = ':'; // 左辺(prop)と右辺(path)の区切り
|
|
125
|
+
const MODIFIER_SEPARATOR = '#'; // prop と修飾子の区切り
|
|
126
|
+
const STATE_NAME_SEPARATOR = '@'; // path と @stateName の区切り
|
|
127
|
+
const FILTER_SEPARATOR = '|'; // フィルタパイプの区切り
|
|
117
128
|
/**
|
|
118
129
|
* stackIndexByIndexName
|
|
119
130
|
* インデックス名からスタックインデックスへのマッピング
|
|
@@ -1352,7 +1363,7 @@ const cacheFilterInfos$1 = new Map();
|
|
|
1352
1363
|
// 'class.className' for class names (e.g., class.active, class.hidden)
|
|
1353
1364
|
// 'onclick', 'onchange' etc. for event listeners
|
|
1354
1365
|
function parsePropPart(propPart) {
|
|
1355
|
-
const pos = propPart.indexOf(
|
|
1366
|
+
const pos = propPart.indexOf(FILTER_SEPARATOR);
|
|
1356
1367
|
let propText = '';
|
|
1357
1368
|
let filterTexts = [];
|
|
1358
1369
|
let filtersText = '';
|
|
@@ -1364,7 +1375,7 @@ function parsePropPart(propPart) {
|
|
|
1364
1375
|
filters = cacheFilterInfos$1.get(filtersText);
|
|
1365
1376
|
}
|
|
1366
1377
|
else {
|
|
1367
|
-
filterTexts = filtersText.split(
|
|
1378
|
+
filterTexts = filtersText.split(FILTER_SEPARATOR).map(trimFn);
|
|
1368
1379
|
filters = parseFilters(filterTexts, "input");
|
|
1369
1380
|
cacheFilterInfos$1.set(filtersText, filters);
|
|
1370
1381
|
}
|
|
@@ -1372,8 +1383,8 @@ function parsePropPart(propPart) {
|
|
|
1372
1383
|
else {
|
|
1373
1384
|
propText = propPart.trim();
|
|
1374
1385
|
}
|
|
1375
|
-
const [propName, propModifiersText] = propText.split(
|
|
1376
|
-
const propSegments = propName.split(
|
|
1386
|
+
const [propName, propModifiersText] = propText.split(MODIFIER_SEPARATOR).map(trimFn);
|
|
1387
|
+
const propSegments = propName.split(DELIMITER).map(trimFn);
|
|
1377
1388
|
const propModifiers = propModifiersText
|
|
1378
1389
|
? propModifiersText.split(',').map(trimFn)
|
|
1379
1390
|
: [];
|
|
@@ -1391,7 +1402,7 @@ const cacheFilterInfos = new Map();
|
|
|
1391
1402
|
// stateName: optional, default is 'default'
|
|
1392
1403
|
// filters-format: filterName or filterName(arg1,arg2)
|
|
1393
1404
|
function parseStatePart(statePart) {
|
|
1394
|
-
const pos = statePart.indexOf(
|
|
1405
|
+
const pos = statePart.indexOf(FILTER_SEPARATOR);
|
|
1395
1406
|
let stateAndPath = '';
|
|
1396
1407
|
let filterTexts = [];
|
|
1397
1408
|
let filtersText = '';
|
|
@@ -1403,7 +1414,7 @@ function parseStatePart(statePart) {
|
|
|
1403
1414
|
filters = cacheFilterInfos.get(filtersText);
|
|
1404
1415
|
}
|
|
1405
1416
|
else {
|
|
1406
|
-
filterTexts = filtersText.split(
|
|
1417
|
+
filterTexts = filtersText.split(FILTER_SEPARATOR).map(trimFn);
|
|
1407
1418
|
filters = parseFilters(filterTexts, "output");
|
|
1408
1419
|
cacheFilterInfos.set(filtersText, filters);
|
|
1409
1420
|
}
|
|
@@ -1411,7 +1422,7 @@ function parseStatePart(statePart) {
|
|
|
1411
1422
|
else {
|
|
1412
1423
|
stateAndPath = statePart.trim();
|
|
1413
1424
|
}
|
|
1414
|
-
const [statePathName, stateName = 'default'] = stateAndPath.split(
|
|
1425
|
+
const [statePathName, stateName = 'default'] = stateAndPath.split(STATE_NAME_SEPARATOR).map(trimFn);
|
|
1415
1426
|
const pathInfo = getPathInfo(statePathName);
|
|
1416
1427
|
return {
|
|
1417
1428
|
stateName,
|
|
@@ -1430,9 +1441,9 @@ function parseStatePart(statePart) {
|
|
|
1430
1441
|
// onclick: statePart, onchange: statePart etc. (event listeners)
|
|
1431
1442
|
// ...: statePart (spread — expand wcBindable properties+inputs of target object)
|
|
1432
1443
|
function parseBindTextsForElement(bindText) {
|
|
1433
|
-
const [...bindTexts] = bindText.split(
|
|
1444
|
+
const [...bindTexts] = bindText.split(BINDING_SEPARATOR).map(trimFn).filter(s => s.length > 0);
|
|
1434
1445
|
const results = bindTexts.map((bindText) => {
|
|
1435
|
-
const separatorIndex = bindText.indexOf(
|
|
1446
|
+
const separatorIndex = bindText.indexOf(PROP_VALUE_SEPARATOR);
|
|
1436
1447
|
if (separatorIndex === -1) {
|
|
1437
1448
|
raiseError(`Invalid bindText: "${bindText}". Missing ':' separator between propPart and statePart.`);
|
|
1438
1449
|
}
|
|
@@ -4988,6 +4999,21 @@ const SSR_PLACEHOLDER_COMMENT = /^@@wcs-(?:for|if|elseif|else):[^-]/;
|
|
|
4988
4999
|
const SSR_BLOCK_START = /^@@wcs-(for|if|elseif|else)-start:(.+)$/;
|
|
4989
5000
|
const SSR_BLOCK_END = /^@@wcs-(for|if|elseif|else)-end:(.+)$/;
|
|
4990
5001
|
const SSR_TEXT_START = /^@@wcs-text-start:(.+)$/;
|
|
5002
|
+
/**
|
|
5003
|
+
* script 要素へ埋め込む JSON を HTML パーサから保護する。
|
|
5004
|
+
* HTML 直列化時、script の中身は生のまま出力されるため、state 値に
|
|
5005
|
+
* "</script>" や "<!--" を含む文字列があると script を脱出できてしまう。
|
|
5006
|
+
* "<" ">" "&" と U+2028/U+2029 を JSON の \uXXXX エスケープへ置換する
|
|
5007
|
+
* (JSON.parse では元の文字列と等価に復元される)。
|
|
5008
|
+
*/
|
|
5009
|
+
function escapeJsonForScript(json) {
|
|
5010
|
+
return json
|
|
5011
|
+
.replace(/</g, '\\u003c')
|
|
5012
|
+
.replace(/>/g, '\\u003e')
|
|
5013
|
+
.replace(/&/g, '\\u0026')
|
|
5014
|
+
.replace(/\u2028/g, '\\u2028')
|
|
5015
|
+
.replace(/\u2029/g, '\\u2029');
|
|
5016
|
+
}
|
|
4991
5017
|
class Ssr extends HTMLElement {
|
|
4992
5018
|
_stateData = null;
|
|
4993
5019
|
_templates = null;
|
|
@@ -5107,7 +5133,7 @@ class Ssr extends HTMLElement {
|
|
|
5107
5133
|
// 初期データ JSON
|
|
5108
5134
|
const jsonScript = document.createElement('script');
|
|
5109
5135
|
jsonScript.setAttribute('type', 'application/json');
|
|
5110
|
-
jsonScript.textContent = JSON.stringify(stateData);
|
|
5136
|
+
jsonScript.textContent = escapeJsonForScript(JSON.stringify(stateData));
|
|
5111
5137
|
ssrEl.appendChild(jsonScript);
|
|
5112
5138
|
// UUID で管理されているテンプレートを復元して格納
|
|
5113
5139
|
const uuids = getAllFragmentUUIDs();
|
|
@@ -5147,7 +5173,7 @@ class Ssr extends HTMLElement {
|
|
|
5147
5173
|
const propsScript = document.createElement('script');
|
|
5148
5174
|
propsScript.setAttribute('type', 'application/json');
|
|
5149
5175
|
propsScript.setAttribute('data-wcs-ssr-props', '');
|
|
5150
|
-
propsScript.textContent = JSON.stringify(propsData);
|
|
5176
|
+
propsScript.textContent = escapeJsonForScript(JSON.stringify(propsData));
|
|
5151
5177
|
ssrEl.appendChild(propsScript);
|
|
5152
5178
|
}
|
|
5153
5179
|
}
|
|
@@ -6393,6 +6419,17 @@ function _setByAddressWithSwap(target, address, absAddress, value, receiver, han
|
|
|
6393
6419
|
}
|
|
6394
6420
|
function setByAddress(target, address, value, receiver, handler) {
|
|
6395
6421
|
const stateElement = handler.stateElement;
|
|
6422
|
+
// --- same-value guard (config.sameValueGuard・既定 ON) ---
|
|
6423
|
+
// primitive 値かつ Object.is 同値なら、set / enqueue / walkDependency / DOM 適用 /
|
|
6424
|
+
// $updatedCallback / DCC イベントを丸ごとスキップ(標準的なリアクティブ no-op)。
|
|
6425
|
+
// 参照型(object/array)は in-place mutation 取りこぼし防止のため素通し(ガードしない)。
|
|
6426
|
+
if (config.sameValueGuard && (value === null || typeof value !== "object")) {
|
|
6427
|
+
const oldValue = getByAddress(target, address, receiver, handler);
|
|
6428
|
+
if (Object.is(oldValue, value)) {
|
|
6429
|
+
return true;
|
|
6430
|
+
}
|
|
6431
|
+
}
|
|
6432
|
+
// --- end same-value guard ---
|
|
6396
6433
|
const isSwappable = stateElement.elementPaths.has(address.pathInfo.path);
|
|
6397
6434
|
const cacheable = address.pathInfo.wildcardCount > 0 ||
|
|
6398
6435
|
stateElement.getterPaths.has(address.pathInfo.path);
|
|
@@ -7920,5 +7957,120 @@ function defineState(definition) {
|
|
|
7920
7957
|
return definition;
|
|
7921
7958
|
}
|
|
7922
7959
|
|
|
7923
|
-
|
|
7960
|
+
/**
|
|
7961
|
+
* filterMeta.ts — 組み込みフィルタの構造化メタデータ(単一正本・route-a A2-1)。
|
|
7962
|
+
*
|
|
7963
|
+
* これまで vscode-wcs(completionData.ts BUILTIN_FILTERS)が手で持っていたフィルタの
|
|
7964
|
+
* 引数仕様・型・説明を、実装側(@wcstack/state)に**正本として移設**したもの。
|
|
7965
|
+
* manifest.ts がこれを公開し、vscode-wcs はそれを消費して手リストを撤去できる。
|
|
7966
|
+
*
|
|
7967
|
+
* 完全性は __tests__/manifest.test.ts のドリフト検出が保証する
|
|
7968
|
+
* (filterMeta のキー集合 == builtinFilters のキー集合)。フィルタを追加して meta を
|
|
7969
|
+
* 書き忘れると CI が落ちる。
|
|
7970
|
+
*/
|
|
7971
|
+
/** 組み込みフィルタ名 → 構造化メタデータ。キー集合は builtinFilters と一致しなければならない。 */
|
|
7972
|
+
const builtinFilterMeta = {
|
|
7973
|
+
// 比較・論理
|
|
7974
|
+
eq: { description: "等しいか比較", hasArgs: true, resultType: "boolean", acceptTypes: "any", minArgs: 1, maxArgs: 1, argTypes: ["any"] },
|
|
7975
|
+
ne: { description: "異なるか比較", hasArgs: true, resultType: "boolean", acceptTypes: "any", minArgs: 1, maxArgs: 1, argTypes: ["any"] },
|
|
7976
|
+
not: { description: "ブール値を反転", hasArgs: false, resultType: "boolean", acceptTypes: ["boolean"], minArgs: 0, maxArgs: 0 },
|
|
7977
|
+
lt: { description: "より小さいか", hasArgs: true, resultType: "boolean", acceptTypes: ["number", "string"], minArgs: 1, maxArgs: 1, argTypes: ["number"] },
|
|
7978
|
+
le: { description: "以下か", hasArgs: true, resultType: "boolean", acceptTypes: ["number", "string"], minArgs: 1, maxArgs: 1, argTypes: ["number"] },
|
|
7979
|
+
gt: { description: "より大きいか", hasArgs: true, resultType: "boolean", acceptTypes: ["number", "string"], minArgs: 1, maxArgs: 1, argTypes: ["number"] },
|
|
7980
|
+
ge: { description: "以上か", hasArgs: true, resultType: "boolean", acceptTypes: ["number", "string"], minArgs: 1, maxArgs: 1, argTypes: ["number"] },
|
|
7981
|
+
// 算術
|
|
7982
|
+
inc: { description: "加算", hasArgs: true, resultType: "number", acceptTypes: ["number"], minArgs: 0, maxArgs: 1, argTypes: ["number"] },
|
|
7983
|
+
dec: { description: "減算", hasArgs: true, resultType: "number", acceptTypes: ["number"], minArgs: 0, maxArgs: 1, argTypes: ["number"] },
|
|
7984
|
+
mul: { description: "乗算", hasArgs: true, resultType: "number", acceptTypes: ["number"], minArgs: 1, maxArgs: 1, argTypes: ["number"] },
|
|
7985
|
+
div: { description: "除算", hasArgs: true, resultType: "number", acceptTypes: ["number"], minArgs: 1, maxArgs: 1, argTypes: ["number"] },
|
|
7986
|
+
mod: { description: "剰余", hasArgs: true, resultType: "number", acceptTypes: ["number"], minArgs: 1, maxArgs: 1, argTypes: ["number"] },
|
|
7987
|
+
// 数値フォーマット
|
|
7988
|
+
fix: { description: "固定小数点表記", hasArgs: true, resultType: "string", acceptTypes: ["number"], minArgs: 0, maxArgs: 1, argTypes: ["number"] },
|
|
7989
|
+
locale: { description: "ロケール形式で数値フォーマット", hasArgs: true, resultType: "string", acceptTypes: ["number"], minArgs: 0, maxArgs: 1, argTypes: ["string"] },
|
|
7990
|
+
// 文字列
|
|
7991
|
+
uc: { description: "大文字に変換", hasArgs: false, resultType: "string", acceptTypes: ["string"], minArgs: 0, maxArgs: 0 },
|
|
7992
|
+
lc: { description: "小文字に変換", hasArgs: false, resultType: "string", acceptTypes: ["string"], minArgs: 0, maxArgs: 0 },
|
|
7993
|
+
cap: { description: "先頭文字を大文字に", hasArgs: false, resultType: "string", acceptTypes: ["string"], minArgs: 0, maxArgs: 0 },
|
|
7994
|
+
trim: { description: "前後の空白を削除", hasArgs: false, resultType: "string", acceptTypes: ["string"], minArgs: 0, maxArgs: 0 },
|
|
7995
|
+
slice: { description: "部分文字列 (start[,end])", hasArgs: true, resultType: "string", acceptTypes: ["string"], minArgs: 1, maxArgs: 2, argTypes: ["number", "number"] },
|
|
7996
|
+
substr: { description: "部分文字列 (pos,len)", hasArgs: true, resultType: "string", acceptTypes: ["string"], minArgs: 1, maxArgs: 2, argTypes: ["number", "number"] },
|
|
7997
|
+
pad: { description: "パディング (length[,char])", hasArgs: true, resultType: "string", acceptTypes: ["string"], minArgs: 1, maxArgs: 2, argTypes: ["number", "string"] },
|
|
7998
|
+
rep: { description: "繰り返し (count)", hasArgs: true, resultType: "string", acceptTypes: ["string"], minArgs: 1, maxArgs: 1, argTypes: ["number"] },
|
|
7999
|
+
rev: { description: "文字順を反転", hasArgs: false, resultType: "string", acceptTypes: ["string"], minArgs: 0, maxArgs: 0 },
|
|
8000
|
+
// 数値パース・丸め
|
|
8001
|
+
int: { description: "整数にパース", hasArgs: false, resultType: "number", acceptTypes: ["string", "number"], minArgs: 0, maxArgs: 0 },
|
|
8002
|
+
float: { description: "浮動小数点数にパース", hasArgs: false, resultType: "number", acceptTypes: ["string", "number"], minArgs: 0, maxArgs: 0 },
|
|
8003
|
+
round: { description: "四捨五入", hasArgs: true, resultType: "number", acceptTypes: ["number"], minArgs: 0, maxArgs: 1, argTypes: ["number"] },
|
|
8004
|
+
floor: { description: "切り下げ", hasArgs: true, resultType: "number", acceptTypes: ["number"], minArgs: 0, maxArgs: 1, argTypes: ["number"] },
|
|
8005
|
+
ceil: { description: "切り上げ", hasArgs: true, resultType: "number", acceptTypes: ["number"], minArgs: 0, maxArgs: 1, argTypes: ["number"] },
|
|
8006
|
+
percent: { description: "パーセンテージ形式", hasArgs: true, resultType: "string", acceptTypes: ["number"], minArgs: 0, maxArgs: 1, argTypes: ["number"] },
|
|
8007
|
+
// 日付・時刻
|
|
8008
|
+
date: { description: "ロケール形式の日付", hasArgs: false, resultType: "string", acceptTypes: "any", minArgs: 0, maxArgs: 0 },
|
|
8009
|
+
time: { description: "ロケール形式の時刻", hasArgs: false, resultType: "string", acceptTypes: "any", minArgs: 0, maxArgs: 0 },
|
|
8010
|
+
datetime: { description: "ロケール形式の日時", hasArgs: false, resultType: "string", acceptTypes: "any", minArgs: 0, maxArgs: 0 },
|
|
8011
|
+
ymd: { description: "YYYY-MM-DD 形式", hasArgs: true, resultType: "string", acceptTypes: "any", minArgs: 0, maxArgs: 1, argTypes: ["string"] },
|
|
8012
|
+
// 真偽値・変換
|
|
8013
|
+
falsy: { description: "偽値か判定", hasArgs: false, resultType: "boolean", acceptTypes: "any", minArgs: 0, maxArgs: 0 },
|
|
8014
|
+
truthy: { description: "真値か判定", hasArgs: false, resultType: "boolean", acceptTypes: "any", minArgs: 0, maxArgs: 0 },
|
|
8015
|
+
defaults: { description: "偽値の場合デフォルト値", hasArgs: true, resultType: "passthrough", acceptTypes: "any", minArgs: 1, maxArgs: 1, argTypes: ["any"] },
|
|
8016
|
+
boolean: { description: "ブール値に変換", hasArgs: false, resultType: "boolean", acceptTypes: "any", minArgs: 0, maxArgs: 0 },
|
|
8017
|
+
number: { description: "数値に変換", hasArgs: false, resultType: "number", acceptTypes: "any", minArgs: 0, maxArgs: 0 },
|
|
8018
|
+
string: { description: "文字列に変換", hasArgs: false, resultType: "string", acceptTypes: "any", minArgs: 0, maxArgs: 0 },
|
|
8019
|
+
null: { description: "空文字列をnullに変換", hasArgs: false, resultType: "passthrough", acceptTypes: ["string"], minArgs: 0, maxArgs: 0 },
|
|
8020
|
+
};
|
|
8021
|
+
|
|
8022
|
+
/**
|
|
8023
|
+
* manifest.ts — `<wcs-state>` の構文・フィルタ・予約名を機械可読な単一正本として公開する。
|
|
8024
|
+
*
|
|
8025
|
+
* 目的(route-a A2-1): vscode-wcs(wcstack-intellisense)が現在ハードコードで二重実装している
|
|
8026
|
+
* 「フィルタ一覧・構文区切り・予約名」を、state 側の実装から導出した manifest に一本化し、
|
|
8027
|
+
* 手作業同期によるドリフトを構造的に断つための土台。
|
|
8028
|
+
*
|
|
8029
|
+
* 設計:
|
|
8030
|
+
* - `filters` は実装(builtinFilters の Record キー)から **自動導出**=実装が唯一の正本。
|
|
8031
|
+
* - 構文・予約名は config / define.ts の定数から導出。
|
|
8032
|
+
* - 将来 `dist/wcs-manifest.json` としてビルド時に書き出し、vscode-wcs がそれを読む形に発展させる。
|
|
8033
|
+
* - ドリフト検出テスト(__tests__/manifest.test.ts)が、フィルタ集合の golden と実装の一致を CI で保証する。
|
|
8034
|
+
*/
|
|
8035
|
+
/** マニフェストのバージョン(構造を変えたら上げる)。 */
|
|
8036
|
+
const WCS_MANIFEST_VERSION = 1;
|
|
8037
|
+
/** 機械可読な単一正本を返す。vscode-wcs はこれを消費する想定。 */
|
|
8038
|
+
function getWcsManifest() {
|
|
8039
|
+
return {
|
|
8040
|
+
version: WCS_MANIFEST_VERSION,
|
|
8041
|
+
syntax: {
|
|
8042
|
+
bindAttribute: config.bindAttributeName,
|
|
8043
|
+
tagName: config.tagNames.state,
|
|
8044
|
+
pathDelimiter: DELIMITER,
|
|
8045
|
+
wildcard: WILDCARD,
|
|
8046
|
+
delimiters: {
|
|
8047
|
+
binding: BINDING_SEPARATOR,
|
|
8048
|
+
propValue: PROP_VALUE_SEPARATOR,
|
|
8049
|
+
modifier: MODIFIER_SEPARATOR,
|
|
8050
|
+
stateName: STATE_NAME_SEPARATOR,
|
|
8051
|
+
filter: FILTER_SEPARATOR,
|
|
8052
|
+
},
|
|
8053
|
+
// 正本 STRUCTURAL_BINDING_TYPE_SET から導出(手書きの二重定義を排除)。
|
|
8054
|
+
structuralDirectives: Array.from(STRUCTURAL_BINDING_TYPE_SET),
|
|
8055
|
+
},
|
|
8056
|
+
// 実装(Record のキー)から自動導出。手リストを持たない=ドリフトの構造的排除。
|
|
8057
|
+
filters: Object.keys(outputBuiltinFilters),
|
|
8058
|
+
filterMeta: builtinFilterMeta,
|
|
8059
|
+
reservedLifecycle: [
|
|
8060
|
+
STATE_CONNECTED_CALLBACK_NAME,
|
|
8061
|
+
STATE_DISCONNECTED_CALLBACK_NAME,
|
|
8062
|
+
STATE_UPDATED_CALLBACK_NAME,
|
|
8063
|
+
WEBCOMPONENT_STATE_READY_CALLBACK_NAME,
|
|
8064
|
+
],
|
|
8065
|
+
reservedStateApi: [
|
|
8066
|
+
STATE_BINDABLES_NAME,
|
|
8067
|
+
STATE_COMMAND_TOKENS_NAME,
|
|
8068
|
+
STATE_COMMAND_NAMESPACE_NAME,
|
|
8069
|
+
STATE_EVENT_TOKENS_NAME,
|
|
8070
|
+
STATE_ON_NAME,
|
|
8071
|
+
],
|
|
8072
|
+
};
|
|
8073
|
+
}
|
|
8074
|
+
|
|
8075
|
+
export { Ssr, VERSION, WCS_MANIFEST_VERSION, bootstrapState, buildBindings, builtinFilterMeta, defineState, getBindingsReady, getConfig, getWcsManifest };
|
|
7924
8076
|
//# sourceMappingURL=index.esm.js.map
|