rajt 0.0.107 → 0.20260702.1

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rajt",
3
3
  "description": "A serverless bundler layer, fully typed for AWS Lambda (Node.js and LLRT) and Cloudflare Workers.",
4
- "version": "0.0.107",
4
+ "version": "0.20260702.1",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
7
7
  "files": ["bin", "src"],
@@ -53,7 +53,7 @@
53
53
  "miniflare": "^4.20260312.0",
54
54
  "pathe": "^2.0",
55
55
  "quansync": "^0.2.11",
56
- "t0n": "^0.1.17",
56
+ "t0n": "^0.20260702.0",
57
57
  "tiny-glob": "^0.2",
58
58
  "tsx": "^4.19.4",
59
59
  "wrangler": "^4.61.0",
@@ -66,7 +66,7 @@
66
66
  "bun-types": "^1.3.8",
67
67
  "typescript": "^5.9.3"
68
68
  },
69
- "packageManager": "bun@1.3.10",
69
+ "packageManager": "bun@1.3.14",
70
70
  "engines": {
71
71
  "node": ">=18.0.0"
72
72
  },
@@ -1,7 +1,7 @@
1
1
  import { defineCommand } from 'citty'
2
2
  import { gray } from 't0n/color'
3
+ import { wait, error, rn } from 't0n/log'
3
4
  import { build, normalizePlatform, platformError } from '../utils'
4
- import { wait, error, rn } from '../../utils/log'
5
5
 
6
6
  import { platforms } from '../constants'
7
7
 
@@ -1,8 +1,10 @@
1
1
  import { spawn } from 'node:child_process'
2
2
  import { defineCommand } from 'citty'
3
3
 
4
- import { normalizePlatform, platformError, getRuntime } from '../utils'
5
- import { error } from '../../utils/log'
4
+ import { error } from 't0n/log'
5
+ import { getRuntime } from 't0n/cli'
6
+
7
+ import { normalizePlatform, platformError } from '../utils'
6
8
  import { _root } from '../../utils/paths'
7
9
  import { platforms } from '../constants'
8
10
 
@@ -3,17 +3,19 @@ import { spawn, type ChildProcess } from 'node:child_process'
3
3
 
4
4
  import { defineCommand } from 'citty'
5
5
  import type { Miniflare } from 'miniflare'
6
- import type { WranglerConfig } from 'localflare-core'
6
+ import { WRANGLER_CONFIG_FILES, type WranglerConfig } from 'localflare-core'
7
+
8
+ import { error, event, log, rn, warn } from 't0n/log'
9
+ import { getRuntime, shutdown, watch } from 't0n/cli'
10
+
7
11
  import {
8
- build, wait, watch, normalizePlatform, platformError, getRuntime,
12
+ build, wait, normalizePlatform, platformError,
9
13
  wranglerConfig, createMiniflare, localflareManifest,
10
14
  getDockerHost,
11
15
  findTsx
12
16
  } from '../utils'
13
- import { error, event, log, rn, warn } from '../../utils/log'
14
17
  import { _root } from '../../utils/paths'
15
18
  import { withPort } from '../../utils/port'
16
- import shutdown from '../../utils/shutdown'
17
19
 
18
20
  export default defineCommand({
19
21
  meta: {
@@ -65,7 +67,13 @@ export default defineCommand({
65
67
  event('Restarting..')
66
68
  await fn()
67
69
  // event('Restarted...')
68
- })
70
+ }, [
71
+ join(_root, '{actions,features,routes,configs,enums,libs,locales,middlewares,models,utils}/**/*.ts'),
72
+ join(_root, '.env.dev'),
73
+ join(_root, '.env.prod'),
74
+ join(_root, 'package.json'),
75
+ ...WRANGLER_CONFIG_FILES.map(f => join(_root, f)),
76
+ ], _root)
69
77
  // @ts-ignore
70
78
  stop && shutdown(stop)
71
79
  } catch (e: any) {
@@ -1,10 +1,11 @@
1
1
  import { defineCommand } from 'citty'
2
2
  import { join, relative } from 'pathe'
3
3
  import { Migrator } from 'forj'
4
- import { makeFile, hasExt, camelCase, kebabCase } from '../utils'
5
- import { _root } from '../../utils/paths'
6
- import { event, error } from '../../utils/log'
4
+ import { camelCase, kebabCase } from 't0n'
7
5
  import { dim } from 't0n/color'
6
+ import { event, error } from 't0n/log'
7
+ import { makeFile, hasExt } from '../utils'
8
+ import { _root } from '../../utils/paths'
8
9
  import * as stub from '../stubs'
9
10
 
10
11
  export default defineCommand({
@@ -22,11 +23,20 @@ export default defineCommand({
22
23
  if (!name)
23
24
  return error('File name is required')
24
25
 
26
+ const makeFileName = (s: string) => {
27
+ const lastDotIndex = s.lastIndexOf('.')
28
+ const hasExtension = lastDotIndex > 0 && lastDotIndex < s.length - 1
29
+
30
+ return hasExtension
31
+ ? `${kebabCase(s.substring(0, lastDotIndex))}.${s.substring(lastDotIndex + 1)}`
32
+ : s
33
+ }
34
+
25
35
  const path = (p: string, dir: string = action) => join(_root, dir + 's', p)
26
36
  let fileName = ''
27
37
  switch (action) {
28
38
  case 'config':
29
- fileName = path(kebabCase(name))
39
+ fileName = path(makeFileName(name))
30
40
  if (!hasExt(fileName)) fileName += '.ts'
31
41
  makeFile(fileName, name.endsWith('.json') ? '{\n}' : 'export default {\n\n}\n')
32
42
  break
@@ -36,7 +46,7 @@ export default defineCommand({
36
46
  case 'route':
37
47
  case 'action':
38
48
  case 'endpoint':
39
- fileName = path(kebabCase(name))
49
+ fileName = path(makeFileName(name))
40
50
  if (!fileName.endsWith('.ts')) fileName += '.ts'
41
51
  makeFile(fileName, stub.replace(stub.route, { R_NAME: camelCase(name) }))
42
52
  break
@@ -3,9 +3,11 @@ import { spawn } from 'node:child_process'
3
3
  import { join } from 'pathe'
4
4
  import { Migrator } from 'forj'
5
5
  import { gray } from 't0n/color'
6
- import { getRuntime, cleanDB, cleanDir } from '../utils'
6
+ import { getRuntime } from 't0n/cli'
7
+ import { wait, info, event, rn, error, log } from 't0n/log'
8
+
9
+ import { cleanDB, cleanDir } from '../utils'
7
10
  import { _root } from '../../utils/paths'
8
- import { wait, info, event, rn, error, log } from '../../utils/log'
9
11
 
10
12
  export default defineCommand({
11
13
  meta: {
@@ -2,8 +2,8 @@ import { join } from 'pathe'
2
2
  import { defineCommand } from 'citty'
3
3
  import { inspectRoutes } from 'hono/dev'
4
4
  import { IMPORT } from 't0n'
5
+ import { rn } from 't0n/log'
5
6
  import { _rajt } from '../../utils/paths'
6
- import { rn } from '../../utils/log'
7
7
  import { highlightedURI, highlightedMethod } from '../utils'
8
8
 
9
9
  export default defineCommand({
package/src/cli/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { defineCommand, runMain, renderUsage } from 'citty'
2
2
  import type { ArgsDef, CommandDef } from 'citty'
3
3
  import { createConsola } from 'consola'
4
- import { logo } from '../utils/log'
4
+ import { logo } from 't0n/log'
5
5
  import { isColorSupported, gray } from 't0n/color'
6
6
  import { version as rajtVersion } from '../../package.json'
7
7
 
package/src/cli/types.ts CHANGED
@@ -1,4 +1,3 @@
1
1
  import { platforms } from './constants'
2
2
 
3
- export type ChokidarEventName = 'add' | 'addDir' | 'change' | 'unlink' | 'unlinkDir'
4
3
  export type Platform = typeof platforms[number]
package/src/cli/utils.ts CHANGED
@@ -3,21 +3,21 @@ import esbuild from 'esbuild'
3
3
  import { Miniflare } from 'miniflare'
4
4
  import { mkdirSync, existsSync, statSync, readdirSync, rmSync, unlinkSync, copyFileSync, writeFileSync } from 'node:fs'
5
5
  import { readFile, stat, writeFile } from 'node:fs/promises'
6
- import { basename, dirname, join, relative } from 'pathe'
6
+ import { basename, dirname, join } from 'pathe'
7
7
  import { createHash, createHmac } from 'node:crypto'
8
8
 
9
9
  import { findWranglerConfig, parseWranglerConfig, WRANGLER_CONFIG_FILES } from 'localflare-core'
10
10
  import type { WranglerConfig, LocalflareManifest } from 'localflare-core'
11
11
 
12
- import chokidar from 'chokidar'
13
12
  import { gray, bold, italic, purple, yellow, red } from 't0n/color'
14
- import type { ChokidarEventName, Platform } from './types'
13
+ import { substep, event, error, warn } from 't0n/log'
15
14
 
16
15
  import { cacheRoutes } from '../routes'
17
- import { substep, event, error, wait as wwait, warn, log } from '../utils/log'
18
16
  import { platforms } from './constants'
19
17
  import { _rajt, _root } from '../utils/paths'
20
18
 
19
+ import type { Platform } from './types'
20
+
21
21
  export function normalizePlatform(platform: Platform) {
22
22
  platform = platform?.toLowerCase() as Platform
23
23
  if (!platforms?.includes(platform)) return null
@@ -42,14 +42,6 @@ export function normalizePlatform(platform: Platform) {
42
42
  const formatArgs = (...args: any[]) => args.flat().map(a => gray(italic(bold(a)))).join(', ')
43
43
  export const platformError = () => error(`Provide a valid platform: ${formatArgs(platforms)}.\n`)
44
44
 
45
- export function getRuntime() {
46
- try {
47
- return process?.isBun || typeof Bun !== 'undefined' ? 'bun' : 'node'
48
- } catch {
49
- return 'node'
50
- }
51
- }
52
-
53
45
  export const formatSize = (bytes: number) => {
54
46
  if (bytes < 1024) return `${bytes}b`
55
47
  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)}kb`
@@ -398,64 +390,6 @@ export function createMiniflare(opts = {}) {
398
390
  })
399
391
  }
400
392
 
401
- function getAssetChangeMessage(
402
- e: ChokidarEventName,
403
- path: string
404
- ): string {
405
- path = relative(_root, path)
406
- switch (e) {
407
- case 'add':
408
- return `File ${path} was added`
409
- case 'addDir':
410
- return `Directory ${path} was added`
411
- case 'unlink':
412
- return `File ${path} was removed`
413
- case 'unlinkDir':
414
- return `Directory ${path} was removed`
415
- case 'change':
416
- default:
417
- return `${path} changed`
418
- }
419
- }
420
-
421
- export async function watch(cb: (e: ChokidarEventName | string, file: string) => Promise<void>) {
422
- const codeWatcher = chokidar.watch([
423
- join(_root, '{actions,features,routes,configs,enums,libs,locales,middlewares,models,utils}/**/*.ts'),
424
- join(_root, '.env.dev'),
425
- join(_root, '.env.prod'),
426
- join(_root, 'package.json'),
427
- ...WRANGLER_CONFIG_FILES.map(f => join(_root, f)),
428
- ], {
429
- ignored: /(^|[/\\])\../, // ignore hidden files
430
- persistent: true,
431
- ignoreInitial: true,
432
- awaitWriteFinish: {
433
- stabilityThreshold: 200,
434
- pollInterval: 100,
435
- },
436
- })
437
- let restartTimeout: NodeJS.Timeout | null = null
438
-
439
- const watcher = (e: ChokidarEventName) => async (file: string) => {
440
- log(getAssetChangeMessage(e, file))
441
-
442
- if (restartTimeout)
443
- clearTimeout(restartTimeout)
444
-
445
- restartTimeout = setTimeout(async () => {
446
- await cb(e, file)
447
- }, 300)
448
- }
449
-
450
- codeWatcher.on('change', watcher('change'))
451
- codeWatcher.on('add', watcher('add'))
452
- codeWatcher.on('unlink', watcher('unlink'))
453
- codeWatcher.on('addDir', watcher('addDir'))
454
- codeWatcher.on('unlinkDir', watcher('unlinkDir'))
455
-
456
- wwait('Watching for file changes')
457
- }
458
-
459
393
  export async function wait(ms: number) {
460
394
  return new Promise(r => setTimeout(r, ms))
461
395
  }
@@ -491,37 +425,6 @@ export function hasExt(path: string) {
491
425
  return index > 0 && index < path.length - 1
492
426
  }
493
427
 
494
- function normalizeText(text: string, separator = '_') {
495
- const validSeparators = ['_', '-']
496
- const sep = validSeparators.includes(separator) ? separator : '_'
497
-
498
- const lastDotIndex = text.lastIndexOf('.')
499
- const hasExtension = lastDotIndex > 0 && lastDotIndex < text.length - 1
500
- const fileName = hasExtension ? text.substring(0, lastDotIndex) : text
501
- const extension = hasExtension ? text.substring(lastDotIndex + 1) : ''
502
-
503
- const normalizedName = fileName
504
- .replace(/([a-z])([A-Z])/g, `$1${sep}$2`)
505
- .replace(/[\s\-_]+/g, sep)
506
- .toLowerCase()
507
- .replace(new RegExp(`[^\\w${sep}]+`, 'g'), '')
508
- .replace(new RegExp(`${sep}{2,}`, 'g'), sep)
509
- .replace(new RegExp(`^${sep}+|${sep}+$`, 'g'), '')
510
-
511
- return hasExtension ? `${normalizedName}.${extension}` : normalizedName
512
- }
513
-
514
- export const snakeCase = (text: string) => normalizeText(text, '_')
515
- export const kebabCase = (text: string) => normalizeText(text, '-')
516
-
517
- export const camelCase = (text: string) =>
518
- text.replace(/[^a-zA-Z0-9]+/g, ' ')
519
- .trim()
520
- .split(/\s+/)
521
- .filter(word => word.length > 0)
522
- .map(word => word.charAt(0).toUpperCase() + word.slice(1))
523
- .join('')
524
-
525
428
  export const highlightedMethod = (method: string, str?: string | null, siblings: boolean = false): string => {
526
429
  const val = str || method
527
430
 
package/src/dev-node.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { serve, type ServerType } from '@hono/node-server'
2
+ import { shutdown } from 't0n/cli'
2
3
  import app from './dev'
3
- import shutdown from './utils/shutdown'
4
4
 
5
5
  const fetch = app.fetch
6
6
 
package/src/routes.ts CHANGED
@@ -2,6 +2,7 @@ import { copyFileSync, existsSync, readdirSync, statSync, writeFileSync } from '
2
2
  import { join, resolve, relative } from 'pathe'
3
3
 
4
4
  import { IMPORT, JSJSON } from 't0n'
5
+ import { rn, substep, warn } from 't0n/log'
5
6
  import glob from 'tiny-glob'
6
7
  import { config } from 'dotenv'
7
8
  import { describeRoute, resolver, validator } from 'hono-openapi'
@@ -11,10 +12,8 @@ import { registerHandler, registerMiddleware } from './register'
11
12
  import createApp from './create-app'
12
13
  import _response from './response'
13
14
  import _validator from './validator'
14
- import { isAnonFn } from './utils/func'
15
15
  import ensureDir from './utils/ensuredir'
16
16
  import versionSHA from './utils/version-sha'
17
- import { rn, substep, warn } from './utils/log'
18
17
  import { _root, _rajt } from './utils/paths'
19
18
  import { generateOpenAPI } from './open-api/spec'
20
19
  import { verbAlias } from './http'
@@ -36,7 +35,7 @@ const walk = async (dir: string, baseDir: string, fn: Function, parentMw: string
36
35
  const mod = await IMPORT(indexFile)
37
36
  const group = mod.default
38
37
 
39
- !isAnonFn(group) && group?.mw?.length && currentMw.push(group?.name)
38
+ group?.name && group.name !== 'anonymous' && group?.mw?.length && currentMw.push(group.name)
40
39
  fn(indexFile, baseDir, group, currentMw)
41
40
  }
42
41
 
@@ -352,11 +351,9 @@ export async function cacheRoutes() {
352
351
 
353
352
  const _rajtDir = await dependencyPath('rajt')
354
353
 
355
- JSJSON(Object.fromEntries(routes.map(r => ([r.path + r.method, r.name]))))
356
-
357
354
  writeFileSync(iPath, `// AUTO-GENERATED FILE - DO NOT EDIT
358
- ${env?.length ? `import { Envir } from '${await dependencyPath('t0n')}/src/envir'\nEnvir.add({${env.map(([key, val]) => key +':'+ JSJSON(val)).join(',')}})` : ''}
359
- ${Object.entries(configs)?.length ? `import Config from '${_rajtDir}/src/config'\nConfig.add(${JSJSON})` : ''}
355
+ ${env?.length ? `import { Envir } from '${await dependencyPath('t0n')}/src/envir'\nEnvir.add(${JSJSON(Object.fromEntries(env))})` : ''}
356
+ ${Object.entries(configs)?.length ? `import Config from '${_rajtDir}/src/config'\nConfig.add(${JSJSON(configs)})` : ''}
360
357
 
361
358
  import { registerHandler, registerMiddleware } from '${_rajtDir}/src/register'
362
359
  ${handlers.map(([file, name, _export]) => `\nimport ${_export ? `{ ${name} }` : name} from '${_rajtDir}/src/${file}'\nregisterHandler('${name}', ${name})`).join('\n')}
package/src/utils/port.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import net from 'node:net'
2
2
  import { exec } from 'node:child_process'
3
- import { error, warn } from './log'
3
+ import { error, warn } from 't0n/log'
4
4
 
5
5
  export function withPort(desiredPort: number, cb: (port: number) => void, maxAttempts = 10) {
6
6
  getAvailablePort(desiredPort)
package/src/utils/func.ts DELETED
@@ -1,8 +0,0 @@
1
- export const isAsyncFn = (fn: any) => {
2
- return fn?.constructor?.name === 'AsyncFunction'
3
- || fn.toString().toLowerCase().trim().startsWith('async')
4
- }
5
-
6
- export const isAnonFn = (fn: any) => {
7
- return fn?.name === '' || fn?.name === 'anonymous'
8
- }
package/src/utils/log.ts DELETED
@@ -1,110 +0,0 @@
1
- import { blue, bold, gray, green, magenta, red, yellow, white } from 't0n/color'
2
-
3
- const _step = (color: Function, ...msg: any[]) => {
4
- const length = msg.length
5
- if (!length) return
6
- if (length < 2)
7
- return console.log(color('⁕') +' '+ msg[0])
8
-
9
- const total = length - 1
10
- for (let i: number = 0; i < length; i++) {
11
- switch (i) {
12
- case 0:
13
- console.log(color('⁕') + ' ' + msg[i])
14
- continue
15
- case total:
16
- console.log(` ${gray('⁕')} ${msg[i]}\t`)
17
- continue
18
- default:
19
- console.log(` ${gray('⁕')} ` + msg[i])
20
- continue
21
- }
22
- }
23
- }
24
-
25
- export const step = (...msg: any[]) => _step(blue, ...msg)
26
- export const stepWarn = (...msg: any[]) => _step(yellow, ...msg)
27
-
28
- export const substep = (...msg: any[]) => {
29
- const length = msg.length
30
- for (let i: number = 0; i < length; i++)
31
- console.log(` ${gray('⁕')} ` + msg[i])
32
- }
33
-
34
- export const ln = () => console.log('\n')
35
- export const rn = () => console.log('\t')
36
-
37
- export const logo = gray(bold('λ'))
38
- export const prefixes = {
39
- wait: white(bold('○')),
40
- error: red(bold('⨯')),
41
- warn: yellow(bold('⚠')),
42
- ready: logo,
43
- info: white(bold(' ')),
44
- event: green(bold('✓')),
45
- trace: magenta(bold('»')),
46
- log: gray(bold('⁕')),
47
- } as const
48
-
49
- const LOGGING_METHOD = {
50
- log: 'log',
51
- warn: 'warn',
52
- error: 'error',
53
- } as const
54
-
55
- function prefixedLog(prefixType: keyof typeof prefixes, ...msg: any[]) {
56
- const length = msg.length
57
- if ((msg[0] === '' || msg[0] === undefined) && length === 1)
58
- msg.shift()
59
-
60
- const consoleMethod: keyof typeof LOGGING_METHOD =
61
- prefixType in LOGGING_METHOD
62
- ? LOGGING_METHOD[prefixType as keyof typeof LOGGING_METHOD]
63
- : 'log'
64
-
65
- const prefix = prefixes[prefixType]
66
- // If there's no message, don't print the prefix but a new line
67
- if (length === 0) {
68
- console[consoleMethod]('')
69
- } else {
70
- // Ensure if there's ANSI escape codes it's concatenated into one string.
71
- // Chrome DevTool can only handle color if it's in one string.
72
- if (length === 1 && typeof msg[0] === 'string') {
73
- console[consoleMethod](prefix +' '+ msg[0])
74
- } else {
75
- console[consoleMethod](prefix, ...msg)
76
- }
77
- }
78
- }
79
-
80
- export function log(...msg: any[]) {
81
- prefixedLog('log', ...msg)
82
- }
83
-
84
- export function wait(...msg: any[]) {
85
- prefixedLog('wait', ...msg)
86
- }
87
-
88
- export function error(...msg: any[]) {
89
- prefixedLog('error', ...msg)
90
- }
91
-
92
- export function warn(...msg: any[]) {
93
- prefixedLog('warn', ...msg)
94
- }
95
-
96
- export function ready(...msg: any[]) {
97
- prefixedLog('ready', ...msg)
98
- }
99
-
100
- export function info(...msg: any[]) {
101
- prefixedLog('info', ...msg)
102
- }
103
-
104
- export function event(...msg: any[]) {
105
- prefixedLog('event', ...msg)
106
- }
107
-
108
- export function trace(...msg: any[]) {
109
- prefixedLog('trace', ...msg)
110
- }
@@ -1,19 +0,0 @@
1
- export default function shutdown(cb: (signal: string, e: unknown) => void | Promise<void>) {
2
- if (!process) return
3
- const down = (signal: string) => (e?: unknown) => {
4
- try {
5
- cb(signal, e)
6
- setTimeout(() => process.exit(0), 100)
7
- } catch (e) {
8
- process.exit(1)
9
- }
10
- }
11
-
12
- process.on('SIGINT', down('SIGINT'))
13
- process.on('SIGTERM', down('SIGTERM'))
14
- process.on('SIGHUP', down('SIGHUP'))
15
- process.on('unhandledRejection', down('UNCAUGHT_REJECTION'))
16
- process.on('uncaughtException', down('UNCAUGHT_EXCEPTION'))
17
- // process.on('beforeExit', down('BEFORE_EXIT'))
18
- // process.on('exit', down('EXIT'))
19
- }