nadesiko3 3.2.42 → 3.2.45

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.
@@ -250,6 +250,10 @@
250
250
  !*** ./node_modules/core-js/internals/to-string.js ***!
251
251
  \*****************************************************/
252
252
 
253
+ /*!*****************************************************!*\
254
+ !*** ./node_modules/regenerator-runtime/runtime.js ***!
255
+ \*****************************************************/
256
+
253
257
  /*!*****************************************************!*\
254
258
  !*** ./node_modules/whatwg-fetch/dist/fetch.umd.js ***!
255
259
  \*****************************************************/
package/src/nako3.js CHANGED
@@ -666,7 +666,7 @@ class NakoCompiler {
666
666
  }
667
667
  try {
668
668
  // eslint-disable-next-line no-new-func
669
- new Function(out.runtimeEnv).apply(nakoGlobal)
669
+ new Function(out.runtimeEnv).apply(nakoGlobal);
670
670
  return nakoGlobal
671
671
  } catch (e) {
672
672
  let err = e
package/src/nako_gen.js CHANGED
@@ -37,6 +37,19 @@ class NakoGen {
37
37
  if (js && isTest) {
38
38
  js += '\n__self._runTests(__tests);\n'
39
39
  }
40
+ // async method
41
+ if (gen.numAsyncFn > 0) {
42
+ let canAsync = true
43
+ if (window && window.navigator && window.navigator.userAgent) {
44
+ const ua = window.navigator.userAgent
45
+ canAsync = (ua.indexOf('MSIE') === -1)
46
+ }
47
+ if (canAsync) {
48
+ js = '// <nadesiko3::gen::async>\n' +
49
+ `(async () => {\n${js}\n})();\n` +
50
+ '// </nadesiko3::gen::async>\n'
51
+ }
52
+ }
40
53
 
41
54
  // デバッグメッセージ
42
55
  com.logger.trace('--- generate ---\n' + js)
@@ -103,6 +116,12 @@ try {
103
116
  */
104
117
  this.loop_id = 1
105
118
 
119
+ /**
120
+ * 非同関数を何回使ったか
121
+ * @type {number}
122
+ */
123
+ this.numAsyncFn = 0
124
+
106
125
  /**
107
126
  * 変換中の処理が、ループの中かどうかを判定する
108
127
  * @type {boolean}
@@ -1272,7 +1291,10 @@ try {
1272
1291
  }
1273
1292
 
1274
1293
  let funcCall = `${res.js}(${argsCode})`
1275
-
1294
+ if (func.asyncFn) {
1295
+ funcCall = `await ${funcCall}`
1296
+ this.numAsyncFn++
1297
+ }
1276
1298
  if (res.i === 0 && this.performanceMonitor.systemFunctionBody !== 0) {
1277
1299
  let key = funcName
1278
1300
  if (!key) {
@@ -1409,11 +1431,16 @@ try {
1409
1431
  }
1410
1432
  // 変数名
1411
1433
  const name = node.name.value
1412
- const res = this.findVar(name)
1434
+ let res = this.findVar(name)
1413
1435
  let code = ''
1414
- if (res === null) { this.varsSet.names.add(name) }
1415
- code += `if (typeof(${this.varname(name)}) === 'undefined') { ${this.varname(name)} = 0; }`
1416
- code += `${this.varname(name)} += ${value}`
1436
+ if (res === null) {
1437
+ this.varsSet.names.add(name)
1438
+ res = this.findVar(name)
1439
+ }
1440
+ const jsName = res.js
1441
+ // 自動初期化するか
1442
+ code += `if (typeof(${jsName}) === 'undefined') { ${jsName} = 0; }`
1443
+ code += `${jsName} += ${value}`
1417
1444
  return ';' + this.convLineno(node, false) + code + '\n'
1418
1445
  }
1419
1446
 
@@ -1,8 +1,8 @@
1
1
  // なでしこバージョン
2
2
  const nakoVersion = {
3
- version: '3.2.42',
3
+ version: '3.2.45',
4
4
  major: 3,
5
5
  minor: 2,
6
- patch: 42
6
+ patch: 45
7
7
  }
8
8
  module.exports = nakoVersion
@@ -68,7 +68,7 @@ module.exports = {
68
68
  },
69
69
  return_none: true
70
70
  },
71
- 'POSTデータ生成': { // @連想配列をkey=value&key=value...の形式に変換する // @POSTでーたせいせい
71
+ 'POSTデータ生成': { // @辞書形式のデータPARAMSをkey=value&key=value...の形式に変換する // @POSTでーたせいせい
72
72
  type: 'func',
73
73
  josi: [['の', 'を']],
74
74
  pure: true,
@@ -136,7 +136,7 @@ module.exports = {
136
136
  }
137
137
  },
138
138
  'AJAXオプション': { type: 'const', value: '' }, // @AJAXおぷしょん
139
- 'AJAXオプション設定': { // @Ajax命令でオプションを設定 // @AJAXおぷしょんせってい
139
+ 'AJAXオプション設定': { // @AJAX命令でオプションを設定 // @AJAXおぷしょんせってい
140
140
  type: 'func',
141
141
  josi: [['に', 'へ', 'と']],
142
142
  pure: true,
@@ -145,6 +145,23 @@ module.exports = {
145
145
  },
146
146
  return_none: true
147
147
  },
148
+ 'AJAXオプションPOST設定': { // @AJAXオプションにPOSTメソッドとパラメータPARAMSを設定 // @AJAXおぷしょんPOSTせってい
149
+ type: 'func',
150
+ josi: [['を', 'で']],
151
+ pure: true,
152
+ fn: function (params, sys) {
153
+ const bodyData = sys.__exec('POSTデータ生成', [params, sys])
154
+ const options = {
155
+ method: 'POST',
156
+ headers: {
157
+ 'Content-Type': 'application/x-www-form-urlencoded'
158
+ },
159
+ body: bodyData
160
+ }
161
+ sys.__v0['AJAXオプション'] = options
162
+ },
163
+ return_none: true
164
+ },
148
165
  'AJAX送信': { // @逐次実行構文にて、非同期通信(Ajax)でURLにデータを送信する。成功すると『対象』にデータが代入される。 // @AJAXそうしん
149
166
  type: 'func',
150
167
  josi: [['まで', 'へ', 'に']],
@@ -349,5 +366,34 @@ module.exports = {
349
366
  return res.body()
350
367
  },
351
368
  return_none: false
352
- }
369
+ },
370
+ // @新AJAX
371
+ 'AJAXテキスト取得': { // @AJAXでURLにアクセスしテキスト形式で結果を得る。送信時AJAXオプションの値を参照。 // @AJAXてきすとしゅとく
372
+ type: 'func',
373
+ josi: [['から']],
374
+ pure: true,
375
+ asyncFn: true,
376
+ fn: async function (url, sys) {
377
+ let options = sys.__v0['AJAXオプション']
378
+ if (options === '') { options = { method: 'GET' } }
379
+ const res = await fetch(url, options)
380
+ const txt = await res.text()
381
+ return txt
382
+ },
383
+ return_none: true
384
+ },
385
+ 'AJAX_JSON取得': { // @AJAXでURLにアクセスしJSONの結果を得て、送信時AJAXオプションの値を参照。 // @AJAX_JSONしゅとく
386
+ type: 'func',
387
+ josi: [['から']],
388
+ pure: true,
389
+ asyncFn: true,
390
+ fn: async function (url, sys) {
391
+ let options = sys.__v0['AJAXオプション']
392
+ if (options === '') { options = { method: 'GET' } }
393
+ const res = await fetch(url, options)
394
+ const txt = await res.json()
395
+ return txt
396
+ },
397
+ return_none: true
398
+ },
353
399
  }
@@ -385,7 +385,7 @@ module.exports = {
385
385
  td.style.backgroundColor = (rowNo == 0) ? bgHead : bgColor[rowNo % 2]
386
386
  td.style.color = (rowNo == 0) ? 'white' : 'black'
387
387
  }
388
- if (col.match(/^\d+$/)) { // number?
388
+ if (col.match(/^(\+|\-)?\d+(\.\d+)?$/)) { // number?
389
389
  td.style.textAlign = 'right'
390
390
  }
391
391
  tr.appendChild(td)
@@ -1950,20 +1950,34 @@ const PluginSystem = {
1950
1950
  }
1951
1951
  },
1952
1952
  // @タイマー
1953
+ '秒待': { // @ N秒の間待機する // @びょうまつ
1954
+ type: 'func',
1955
+ josi: [['']],
1956
+ pure: true,
1957
+ asyncFn: true,
1958
+ fn: function (n, sys) {
1959
+ return new Promise((resolve, reject) => {
1960
+ setTimeout(()=>{ resolve() }, n * 1000)
1961
+ })
1962
+ },
1963
+ return_none: true
1964
+ },
1953
1965
  '秒待機': { // @ 「!非同期モード」または「逐次実行構文」にて、N秒の間待機する // @びょうたいき
1954
1966
  type: 'func',
1955
1967
  josi: [['']],
1956
- pure: false,
1968
+ pure: true,
1957
1969
  fn: function (n, sys) {
1958
1970
  if (sys.__genMode === '非同期モード') {
1959
1971
  const sysenv = sys.setAsync(sys)
1960
1972
  setTimeout(() => {
1961
1973
  sys.compAsync(sys, sysenv)
1962
1974
  }, n * 1000)
1963
- } else {
1964
- if (sys.resolve === undefined) { throw new Error('『秒待機』命令は『!非同期モード』で使ってください。') }
1965
- sys.__exec('秒逐次待機', [n, sys])
1975
+ return
1966
1976
  }
1977
+ if (sys.resolve === undefined) {
1978
+ throw new Error('『秒待機』命令は『!非同期モード』で使ってください。')
1979
+ }
1980
+ sys.__exec('秒逐次待機', [n, sys])
1967
1981
  },
1968
1982
  return_none: true
1969
1983
  },
@@ -2116,7 +2130,7 @@ const PluginSystem = {
2116
2130
  '今日': { // @今日の日付を「YYYY/MM/DD」の形式で返す // @きょう
2117
2131
  type: 'func',
2118
2132
  josi: [],
2119
- pure: false,
2133
+ pure: true,
2120
2134
  fn: function (sys) {
2121
2135
  return sys.__formatDate(new Date())
2122
2136
  }
@@ -2124,7 +2138,7 @@ const PluginSystem = {
2124
2138
  '明日': { // @明日の日付を「YYYY/MM/DD」の形式で返す // @あした
2125
2139
  type: 'func',
2126
2140
  josi: [],
2127
- pure: false,
2141
+ pure: true,
2128
2142
  fn: function (sys) {
2129
2143
  const t = Date.now() + (24 * 60 * 60 * 1000)
2130
2144
  return sys.__formatDate(new Date(t))
@@ -2133,7 +2147,7 @@ const PluginSystem = {
2133
2147
  '昨日': { // @昨日の日付を「YYYY/MM/DD」の形式で返す // @きのう
2134
2148
  type: 'func',
2135
2149
  josi: [],
2136
- pure: false,
2150
+ pure: true,
2137
2151
  fn: function (sys) {
2138
2152
  const t = Date.now() - (24 * 60 * 60 * 1000)
2139
2153
  return sys.__formatDate(new Date(t))
@@ -2190,7 +2204,7 @@ const PluginSystem = {
2190
2204
  '曜日': { // @Sに指定した日付の曜日をで返す。不正な日付の場合は今日の曜日番号を返す。 // @ようび
2191
2205
  type: 'func',
2192
2206
  josi: [['の']],
2193
- pure: false,
2207
+ pure: true,
2194
2208
  fn: function (s, sys) {
2195
2209
  const d = sys.__str2date(s)
2196
2210
  return '日月火水木金土'.charAt(d.getDay() % 7)
@@ -2209,7 +2223,7 @@ const PluginSystem = {
2209
2223
  'UNIXTIME変換': { // @日時SをUNIX時間 (UTC(1970/1/1)からの経過秒数) に変換して返す(v1非互換) // @UNIXTIMEへんかん
2210
2224
  type: 'func',
2211
2225
  josi: [['の','を','から']],
2212
- pure: false,
2226
+ pure: true,
2213
2227
  fn: function (s, sys) {
2214
2228
  const d = sys.__str2date(s)
2215
2229
  return d.getTime() / 1000;
@@ -2218,7 +2232,7 @@ const PluginSystem = {
2218
2232
  'UNIX時間変換': { // @日時SをUNIX時間 (UTC(1970/1/1)からの経過秒数) に変換して返す(v1非互換) // @UNIXじかんへんかん
2219
2233
  type: 'func',
2220
2234
  josi: [['の','を','から']],
2221
- pure: false,
2235
+ pure: true,
2222
2236
  fn: function (s, sys) {
2223
2237
  const d = sys.__str2date(s)
2224
2238
  return d.getTime() / 1000;
@@ -2227,7 +2241,7 @@ const PluginSystem = {
2227
2241
  '日時変換': { // @UNIX時間 (UTC(1970/1/1)からの経過秒数) を「YYYY/MM/DD HH:mm:ss」の形式に変換 // @にちじへんかん
2228
2242
  type: 'func',
2229
2243
  josi: [['を', 'から']],
2230
- pure: false,
2244
+ pure: true,
2231
2245
  fn: function (tm, sys) {
2232
2246
  const t = tm * 1000
2233
2247
  return sys.__formatDateTime(new Date(t), '2022/01/01 00:00:00')
@@ -2236,7 +2250,7 @@ const PluginSystem = {
2236
2250
  '日時書式変換': { // @UNIX時間TM(または日付文字列)を「YYYY/MM/DD HH:mm:ss」または「YY-M-D H:m:s」その他、W:曜日、WWW:曜日英、MMM:月英、ccc:ミリ秒の書式に変換 // @にちじしょしきへんかん
2237
2251
  type: 'func',
2238
2252
  josi: [['を'], ['で']],
2239
- pure: false,
2253
+ pure: true,
2240
2254
  fn: function (tm, fmt, sys) {
2241
2255
  const t = sys.__str2date(tm)
2242
2256
  fmt = fmt.replace(/(YYYY|ccc|WWW|MMM|YY|MM|DD|HH|mm|ss|[MDHmsW])/g, (m) => {
@@ -2266,7 +2280,7 @@ const PluginSystem = {
2266
2280
  '和暦変換': { // @Sを和暦に変換する。Sは明治以降の日付が有効。 // @われきへんかん
2267
2281
  type: 'func',
2268
2282
  josi: [['を']],
2269
- pure: false,
2283
+ pure: true,
2270
2284
  fn: function (s, sys) {
2271
2285
  const d = sys.__str2date(s)
2272
2286
  const t = d.getTime()
@@ -2286,7 +2300,7 @@ const PluginSystem = {
2286
2300
  '年数差': { // @日付AとBの差を年数で求めて返す。A<Bなら正の数、そうでないなら負の数を返す (v1非互換)。 // @ねんすうさ
2287
2301
  type: 'func',
2288
2302
  josi: [['と', 'から'], ['の', 'までの']],
2289
- pure: false,
2303
+ pure: true,
2290
2304
  fn: function (a, b, sys) {
2291
2305
  const t1 = sys.__str2date(a)
2292
2306
  const t2 = sys.__str2date(b)
@@ -2296,7 +2310,7 @@ const PluginSystem = {
2296
2310
  '月数差': { // @日付AとBの差を月数で求めて返す。A<Bなら正の数、そうでないなら負の数を返す (v1非互換)。 // @げっすうさ
2297
2311
  type: 'func',
2298
2312
  josi: [['と', 'から'], ['の', 'までの']],
2299
- pure: false,
2313
+ pure: true,
2300
2314
  fn: function (a, b, sys) {
2301
2315
  const t1 = sys.__str2date(a)
2302
2316
  const t2 = sys.__str2date(b)
@@ -2307,7 +2321,7 @@ const PluginSystem = {
2307
2321
  '日数差': { // @日付AとBの差を日数で求めて返す。A<Bなら正の数、そうでないなら負の数を返す。 // @にっすうさ
2308
2322
  type: 'func',
2309
2323
  josi: [['と', 'から'], ['の', 'までの']],
2310
- pure: false,
2324
+ pure: true,
2311
2325
  fn: function (a, b, sys) {
2312
2326
  const t1 = Math.ceil(sys.__str2date(a).getTime() / 1000)
2313
2327
  const t2 = Math.ceil(sys.__str2date(b).getTime() / 1000)
@@ -2318,7 +2332,7 @@ const PluginSystem = {
2318
2332
  '時間差': { // @時間AとBの時間の差を求めて返す。A<Bなら正の数、そうでないなら負の数を返す。 // @じかんさ
2319
2333
  type: 'func',
2320
2334
  josi: [['と', 'から'], ['の', 'までの']],
2321
- pure: false,
2335
+ pure: true,
2322
2336
  fn: function (a, b, sys) {
2323
2337
  const t1 = Math.ceil(sys.__str2date(a).getTime() / 1000)
2324
2338
  const t2 = Math.ceil(sys.__str2date(b).getTime() / 1000)
@@ -2329,7 +2343,7 @@ const PluginSystem = {
2329
2343
  '分差': { // @時間AとBの分数の差を求めて返す。A<Bなら正の数、そうでないなら負の数を返す。 // @ふんさ
2330
2344
  type: 'func',
2331
2345
  josi: [['と', 'から'], ['の', 'までの']],
2332
- pure: false,
2346
+ pure: true,
2333
2347
  fn: function (a, b, sys) {
2334
2348
  const t1 = Math.ceil(sys.__str2date(a).getTime() / 1000)
2335
2349
  const t2 = Math.ceil(sys.__str2date(b).getTime() / 1000)
@@ -2340,7 +2354,7 @@ const PluginSystem = {
2340
2354
  '秒差': { // @時間AとBの差を秒差で求めて返す。A<Bなら正の数、そうでないなら負の数を返す。 // @びょうさ
2341
2355
  type: 'func',
2342
2356
  josi: [['と', 'から'], ['の', 'までの']],
2343
- pure: false,
2357
+ pure: true,
2344
2358
  fn: function (a, b, sys) {
2345
2359
  const t1 = Math.ceil(sys.__str2date(a).getTime() / 1000)
2346
2360
  const t2 = Math.ceil(sys.__str2date(b).getTime() / 1000)
@@ -2351,7 +2365,7 @@ const PluginSystem = {
2351
2365
  '日時差': { // @日時AとBの差を種類unitで返す。A<Bなら正の数、そうでないなら負の数を返す (v1非互換)。 // @にちじさ
2352
2366
  type: 'func',
2353
2367
  josi: [['と', 'から'], ['の', 'までの'], ['による']],
2354
- pure: false,
2368
+ pure: true,
2355
2369
  fn: function (a, b, unit, sys) {
2356
2370
  switch (unit) {
2357
2371
  case '年': return sys.__exec('年数差', [a, b, sys])
@@ -2367,7 +2381,7 @@ const PluginSystem = {
2367
2381
  '時間加算': { // @時間SにAを加えて返す。Aには「(+|-)hh:nn:dd」で指定する。 // @じかんかさん
2368
2382
  type: 'func',
2369
2383
  josi: [['に'], ['を']],
2370
- pure: false,
2384
+ pure: true,
2371
2385
  fn: function (s, a, sys) {
2372
2386
  let op = a.charAt(0)
2373
2387
  if (op === '-' || op === '+') {
@@ -2386,7 +2400,7 @@ const PluginSystem = {
2386
2400
  '日付加算': { // @日付SにAを加えて返す。Aには「(+|-)yyyy/mm/dd」で指定する。 // @ひづけかさん
2387
2401
  type: 'func',
2388
2402
  josi: [['に'], ['を']],
2389
- pure: false,
2403
+ pure: true,
2390
2404
  fn: function (s, a, sys) {
2391
2405
  let op = 1
2392
2406
  let opc = a.charAt(0)
@@ -2408,7 +2422,7 @@ const PluginSystem = {
2408
2422
  '日時加算': { // @日時SにAを加えて返す。Aは「(+|-)1(年|ヶ月|日|週|時間|分|秒)」のように指定する (v1非互換)。 // @にちじかさん
2409
2423
  type: 'func',
2410
2424
  josi: [['に'], ['を']],
2411
- pure: false,
2425
+ pure: true,
2412
2426
  fn: function (s, a, sys) {
2413
2427
  const r = ('' + a).match(/([+|-]?)(\d+)(年|ヶ月|日|週間|時間|分|秒)$/)
2414
2428
  if (!r) {throw new Error('『日付加算』は『(+|-)1(年|ヶ月|日|時間|分|秒)』の書式で指定します。')}
@@ -2517,7 +2531,7 @@ const PluginSystem = {
2517
2531
  'プラグイン名設定': { // @プラグイン名をSに変更する // @プラグインめいせってい
2518
2532
  type: 'func',
2519
2533
  josi: [['に', 'へ']],
2520
- pure: false,
2534
+ pure: true,
2521
2535
  fn: function (s, sys) {
2522
2536
  sys.__v0['プラグイン名'] = s
2523
2537
  },
@@ -2544,7 +2558,7 @@ const PluginSystem = {
2544
2558
  'URLパラメータ解析': { // @URLパラメータを解析してハッシュで返す // @URLぱらめーたかいせき
2545
2559
  type: 'func',
2546
2560
  josi: [['を', 'の', 'から']],
2547
- pure: false,
2561
+ pure: true,
2548
2562
  fn: function (url, sys) {
2549
2563
  const res = {}
2550
2564
  if (typeof url !== 'string') {