@willbooster/wb 22.9.0 → 22.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -20,11 +20,14 @@ Commands:
20
20
  environments with this command to fail fast on
21
21
  missing secrets.
22
22
  wb concurrently <commands...> Run commands concurrently
23
- wb deploy Deploy a Cloudflare Workers app (vinext or
24
- plain Worker) to the WB_ENV environment:
25
- validate secrets, build, apply remote D1
26
- migrations, then deploy code and secrets
27
- atomically.
23
+ wb deploy Deploy to the WB_ENV environment. A Cloudflare
24
+ Workers app (vinext or plain Worker): validate
25
+ secrets, build, apply remote D1 migrations,
26
+ then deploy code and secrets atomically. A
27
+ Railway service (.railway/railway.ts): check
28
+ the IaC plan, sync fnox variables, apply the
29
+ plan, then railway up; --dry-run only checks
30
+ the plan of every environment.
28
31
  wb dotenv [args..] Load environment variables from fnox and run a
29
32
  command.
30
33
  wb gen-code Generate code for the current project
@@ -195,7 +198,7 @@ the working directory (or `--working-dir`). Page selection within a deck is not
195
198
  decks before running tests, without applying fixes.
196
199
 
197
200
  The bundled textlint rules check half-width kana, invalid control characters,
198
- and zero-width spaces (U+200B). Numeric inch marks, sentence fragments, omitted final punctuation, long technical terms,
201
+ zero-width spaces (U+200B), and Chinese or Korean text mixed into Japanese. Numeric inch marks, sentence fragments, omitted final punctuation, long technical terms,
199
202
  polite/plain style, sentence length, and cautious wording are allowed. No local
200
203
  textlint configuration or extra textlint installation is needed; repository
201
204
  `.textlintrc` files do not affect these slide checks.
@@ -206,7 +209,8 @@ lines, columns, and rule names. Slidev's parser rejects import paths outside tho
206
209
  roots before reading them. This check compares paths without resolving symlink
207
210
  targets. Slidev frontmatter,
208
211
  comments/speaker notes, and code are excluded. Parsing uses the standard Markdown
209
- textlint plugin; raw HTML blocks and HTML tag attributes are not checked. Slidev-specific
212
+ textlint plugin; raw HTML blocks and HTML tag attributes are checked only for Chinese
213
+ or Korean text, excluding `<code>`, `<pre>`, `<script>`, and `<style>` elements. Slidev-specific
210
214
  syntax is not interpreted: Vue expressions and MDC attributes may be checked
211
215
  when the Markdown parser treats their source as prose (for example,
212
216
  `{{ "テスト" }}` or `[visible]{title="テスト"}`). Half-width kana is checked in plain paragraph and list text, but not in headings
@@ -0,0 +1,4 @@
1
+ export function railwayVariables<T, V = string>(
2
+ preserve: () => T,
3
+ railwayOnlyVariables?: Record<string, V>
4
+ ): Record<string, T | V>;
package/bin/railway.js ADDED
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Build the `env` of a Railway service in `.railway/railway.ts`, evaluated through `wb deploy`.
3
+ * Call it inside the default-exported function that only the Railway CLI evaluates (e.g. the callback
4
+ * of `railway/iac`'s `defineRailway`), never at module scope: `wb` imports the file for
5
+ * `railwayTarget` before it passes the variable names.
6
+ *
7
+ * Every variable `wb deploy` syncs from fnox is declared with `preserve()`, so Railway keeps the
8
+ * value `wb deploy` pushed and plans a deletion for any variable neither here nor in fnox.
9
+ * `railwayOnlyVariables` adds values Railway supplies: literals that only Railway reads, or
10
+ * `railway/iac` references such as a linked database's `DATABASE_URL`. Such a key must not be
11
+ * exported by the deployed fnox profile (e.g. `KEY = { env = false }` in its profile table).
12
+ *
13
+ * @param {() => unknown} preserve `preserve` from `railway/iac`.
14
+ * @param {Record<string, unknown>} [railwayOnlyVariables]
15
+ * @returns {Record<string, unknown>}
16
+ */
17
+ export function railwayVariables(preserve, railwayOnlyVariables = {}) {
18
+ const namesJson = process.env.WB_RAILWAY_VARIABLE_NAMES;
19
+ if (namesJson === undefined) {
20
+ throw new Error(
21
+ 'railwayVariables() needs the fnox variable names that `wb deploy` passes to the Railway CLI: call it inside the default-exported function (e.g. the callback of defineRailway), not at module scope, and plan through `wb deploy`.'
22
+ );
23
+ }
24
+ const names = JSON.parse(namesJson);
25
+ const duplicatedNames = names.filter((name) => Object.hasOwn(railwayOnlyVariables, name));
26
+ if (duplicatedNames.length > 0) {
27
+ throw new Error(`Declare each variable in either fnox or railway.ts, not both: ${duplicatedNames.join(', ')}`);
28
+ }
29
+ return { ...Object.fromEntries(names.map((name) => [name, preserve()])), ...railwayOnlyVariables };
30
+ }
@@ -0,0 +1,2 @@
1
+ function e(e,t){return n(()=>e instanceof Error?e.message:t??String(e))??t??n(()=>Object.prototype.toString.call(e))??`Unknown error`}function t(e,t){return typeof e==`object`&&!!e&&`code`in e&&e.code===t}function n(e){try{return e()}catch{}}async function r(e){try{return await e()}catch(e){if(t(e,`ENOENT`))return;throw e}}export{t as n,r,e as t};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItQ0JzdkQ4VEkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICAvLyBgSlNPTi5zdHJpbmdpZnlgIGFuc3dlcnMgYHVuZGVmaW5lZGAgZm9yIGB1bmRlZmluZWRgLCBhIHN5bWJvbCBhbmQgYSBmdW5jdGlvbiwgYW5kIHRocm93c1xuICAvLyBvbiBhIGJpZ2ludCBvciBhIGN5Y2xlOyBgbmV3IEVycm9yKHVuZGVmaW5lZClgIGhhcyBhbiBlbXB0eSBtZXNzYWdlLCB3aGljaCB3b3VsZCBkcm9wIHRoZVxuICAvLyBvbmx5IGRpYWdub3N0aWMgYSBjYWxsZXIgaGFzIGFib3V0IHN1Y2ggYSB0aHJvd24gdmFsdWUuIE5laXRoZXIgcmVwcmVzZW50YXRpb24gbWF5IHRocm93XG4gIC8vIG91dCBvZiBoZXJlOiB0aGlzIHJ1bnMgaW4gYSBjYXRjaCBibG9jaywgd2hlcmUgaXQgd291bGQgcmVwbGFjZSB0aGUgZXJyb3IgaXQgY29udmVydHMuXG4gIHJldHVybiBuZXcgRXJyb3IoaWdub3JlRXJyb3IoKCkgPT4gSlNPTi5zdHJpbmdpZnkob2JqKSkgPz8gaWdub3JlRXJyb3IoKCkgPT4gU3RyaW5nKG9iaikpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtZXNzYWdlIG9mIGEgdGhyb3duIGBFcnJvcmA7IGZvciBhbnkgb3RoZXIgdGhyb3duIHZhbHVlLCBgZmFsbGJhY2tgIGlmIGdpdmVuLCBvciBlbHNlIGl0cyBzdHJpbmcgZm9ybS5cbiAqIGBmYWxsYmFja2AgaXMgYWxzbyByZXR1cm5lZCB3aGVuIHJlYWRpbmcgdGhlIG1lc3NhZ2UgdGhyb3dzLiBOZXZlciB0aHJvd3MsIHNvIGl0IGlzIHNhZmUgdG8gY2FsbCBpbiBhIGNhdGNoIGJsb2NrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duLCBmYWxsYmFjaz86IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGBTdHJpbmdgIHRocm93cyBmb3IgYW4gb2JqZWN0IHdpdGhvdXQgYSBwcm90b3R5cGUsIGFuZCBldmVuIGBpbnN0YW5jZW9mYCwgYSBgbWVzc2FnZWAgZ2V0dGVyLCBhbmRcbiAgLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIHRocm93IGZvciBhIHByb3h5IG9yIG9iamVjdCB3aG9zZSB0cmFwcyBvciBnZXR0ZXJzIHRocm93LlxuICByZXR1cm4gKFxuICAgIGlnbm9yZUVycm9yKCgpID0+IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IChmYWxsYmFjayA/PyBTdHJpbmcoZXJyb3IpKSkpID8/XG4gICAgZmFsbGJhY2sgPz9cbiAgICBpZ25vcmVFcnJvcigoKSA9PiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZXJyb3IpKSA/P1xuICAgICdVbmtub3duIGVycm9yJ1xuICApO1xufVxuXG4vKiogV2hldGhlciBhIHRocm93biB2YWx1ZSBjYXJyaWVzIHRoZSBnaXZlbiBgY29kZWAsIHN1Y2ggYXMgYSBOb2RlLmpzIGVycm5vIGNvZGUgKGBFTk9FTlRgLCBgRUVYSVNUYCwgLi4uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFcnJvckNvZGU8QyBleHRlbmRzIHN0cmluZz4oZXJyb3I6IHVua25vd24sIGNvZGU6IEMpOiBlcnJvciBpcyB7IGNvZGU6IEMgfSB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBjb2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaGFzRXJyb3JDb2RlKGVycm9yLCAnRU5PRU5UJykpIHJldHVybjtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGhhc0Vycm9yQ29kZShlcnJvciwgJ0VOT0VOVCcpKSByZXR1cm47XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBEZWNpZGVzIGhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGFmdGVyIGBlcnJvcmAsIGdpdmVuIHRoZSBiYWNrb2ZmIGBzbGVlcE1pbGxpc2Vjb25kc2AgaXQgd291bGQgb3RoZXJ3aXNlIHdhaXQsXG4gICAqIGUuZy4gYChlcnJvciwgbXMpID0+IE1hdGgubWF4KG1zLCByZXRyeUF0T2YoZXJyb3IpIC0gRGF0ZS5ub3coKSlgIHRvIGhvbm9yIGEgcmV0cnkgdGltZSBzZW50IGJ5IGEgc2VydmVyLlxuICAgKiBJdCBkb2VzIG5vdCBhZmZlY3QgdGhlIGJhY2tvZmYgdGhhdCBgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHNgIGFkdmFuY2VzLlxuICAgKi9cbiAgZ2V0U2xlZXBNaWxsaXNlY29uZHM/OiAoZXJyb3I6IHVua25vd24sIHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBnZXRTbGVlcE1pbGxpc2Vjb25kcyxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50U2xlZXBNaWxsaXNlY29uZHMgPSBnZXRTbGVlcE1pbGxpc2Vjb25kcz8uKGVycm9yLCBzbGVlcE1pbGxpc2Vjb25kcykgPz8gc2xlZXBNaWxsaXNlY29uZHM7XG4gICAgICBpZiAoY3VycmVudFNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChjdXJyZW50U2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBb0JBLFNBQWdCLEVBQWdCLEVBQWdCLEVBQTJCLENBR3pFLE9BQ0UsTUFBbUIsYUFBaUIsTUFBUSxFQUFNLFFBQVcsR0FBWSxPQUFPLENBQUssQ0FBRyxHQUN4RixHQUNBLE1BQWtCLE9BQU8sVUFBVSxTQUFTLEtBQUssQ0FBSyxDQUFDLEdBQ3ZELGVBRUosQ0FHQSxTQUFnQixFQUErQixFQUFnQixFQUErQixDQUM1RixPQUFPLE9BQU8sR0FBVSxZQUFZLEdBQWtCLFNBQVUsR0FBUyxFQUFNLE9BQVMsQ0FDMUYsQ0FFQSxTQUFnQixFQUFlLEVBQTRCLENBQ3pELEdBQUksQ0FDRixPQUFPLEVBQUcsQ0FDWixNQUFRLENBRVIsQ0FDRixDQW1CQSxlQUFzQixFQUFxQixFQUE4QyxDQUN2RixHQUFJLENBQ0YsT0FBTyxNQUFNLEVBQUcsQ0FDbEIsT0FBUyxFQUFPLENBQ2QsR0FBSSxFQUFhLEVBQU8sUUFBUSxFQUFHLE9BQ25DLE1BQU0sQ0FDUixDQUNGIn0=