@orieljs/support 0.1.0-alpha.2 → 0.1.0-alpha.4

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 CHANGED
@@ -85,4 +85,11 @@ declare function tap<T>(target: T, callback: (target: T) => void): T;
85
85
  /** Calls fn up to `times` times (attempt numbers are 1-based). Rethrows the last error, or the first one `when` rejects. */
86
86
  declare function retry<T>(times: number, fn: (attempt: number) => T | Promise<T>, sleepMs?: number | ((attempt: number) => number), when?: (error: unknown) => boolean): Promise<T>;
87
87
 
88
- export { Arr, ClassRegistry, type Facade, type FacadeStatics, ServiceProvider, Str, app, config, facade, now, retry, tap, value };
88
+ /**
89
+ * Laravel's __(): the line for `key` with `:placeholders` filled (`:name`, `:Name` capitalized, `:NAME` upper-cased),
90
+ * longest placeholder first. A key with no line comes back as is, so a sentence can be its own key:
91
+ * __('auth.failed'), __('auth.throttle', { seconds: 30 }), __('A reset link will be sent if the account exists.').
92
+ */
93
+ declare function __(key: string, replace?: Record<string, string | number>): string;
94
+
95
+ export { Arr, ClassRegistry, type Facade, type FacadeStatics, ServiceProvider, Str, __, app, config, facade, now, retry, tap, value };
package/dist/index.js CHANGED
@@ -236,11 +236,34 @@ async function retry(times, fn, sleepMs = 0, when) {
236
236
  }
237
237
  }
238
238
  }
239
+
240
+ // lang.ts
241
+ var LINES = {
242
+ "auth.failed": "These credentials do not match our records.",
243
+ "auth.password": "The provided password is incorrect.",
244
+ "auth.throttle": "Too many login attempts. Please try again in :seconds seconds.",
245
+ "passwords.reset": "Your password has been reset.",
246
+ "passwords.sent": "We have emailed your password reset link.",
247
+ "passwords.throttled": "Please wait before retrying.",
248
+ "passwords.token": "This password reset token is invalid.",
249
+ "passwords.user": "We can't find a user with that email address."
250
+ };
251
+ function __(key, replace = {}) {
252
+ let line = LINES[key] ?? key;
253
+ const names = Object.keys(replace).sort((a, b) => b.length - a.length);
254
+ for (const name of names) {
255
+ const value2 = String(replace[name]);
256
+ const capitalized = name.charAt(0).toUpperCase() + name.slice(1);
257
+ line = line.replaceAll(`:${capitalized}`, value2.charAt(0).toUpperCase() + value2.slice(1)).replaceAll(`:${name.toUpperCase()}`, value2.toUpperCase()).replaceAll(`:${name}`, value2);
258
+ }
259
+ return line;
260
+ }
239
261
  export {
240
262
  Arr,
241
263
  ClassRegistry,
242
264
  ServiceProvider,
243
265
  Str,
266
+ __,
244
267
  app,
245
268
  collect,
246
269
  config,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../Str.ts","../Arr.ts","../ServiceProvider.ts","../Facade.ts","../ClassRegistry.ts","../helpers.ts"],"sourcesContent":["import { randomBytes, randomUUID } from 'node:crypto'\nimport pluralize from 'pluralize'\n\nconst words = (value: string): string[] =>\n value\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .split(/[^A-Za-z\\d]+/)\n .filter(Boolean)\n\nconst ALPHANUM = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\nconst escapeRegex = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\nconst anyOf = (needles: string | string[]) => (Array.isArray(needles) ? needles : [needles]).filter((n) => n !== '')\n\nexport const Str = {\n ucfirst: (v: string) => v.charAt(0).toUpperCase() + v.slice(1),\n lcfirst: (v: string) => v.charAt(0).toLowerCase() + v.slice(1),\n studly: (v: string) => words(v).map((w) => Str.ucfirst(w.toLowerCase())).join(''),\n camel: (v: string) => Str.lcfirst(Str.studly(v)),\n snake: (v: string, delimiter = '_') => words(v).map((w) => w.toLowerCase()).join(delimiter),\n kebab: (v: string) => Str.snake(v, '-'),\n title: (v: string) => v.toLowerCase().replace(/(^|\\s)\\S/g, (m) => m.toUpperCase()),\n slug: (v: string, separator = '-') =>\n v\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .replace(/[^a-z\\d]+/g, separator)\n .replace(new RegExp(`^${escapeRegex(separator)}+|${escapeRegex(separator)}+$`, 'g'), ''),\n plural: (v: string, count = 2) => pluralize(v, count),\n singular: (v: string) => pluralize.singular(v),\n random: (length = 16) => {\n let out = ''\n while (out.length < length) {\n for (const byte of randomBytes(length)) {\n if (byte < 248 && out.length < length) out += ALPHANUM[byte % 62] // 248 = 62*4, avoids modulo bias\n }\n }\n return out\n },\n uuid: () => randomUUID(),\n /** Wildcard match: `*` matches anything; everything else is literal. */\n is: (pattern: string, value: string) =>\n pattern === value || new RegExp(`^${pattern.split('*').map(escapeRegex).join('.*')}$`, 's').test(value),\n startsWith: (v: string, needles: string | string[]) => anyOf(needles).some((n) => v.startsWith(n)),\n endsWith: (v: string, needles: string | string[]) => anyOf(needles).some((n) => v.endsWith(n)),\n contains: (v: string, needles: string | string[]) => anyOf(needles).some((n) => v.includes(n)),\n after: (v: string, search: string) => (search === '' || !v.includes(search) ? v : v.slice(v.indexOf(search) + search.length)),\n afterLast: (v: string, search: string) =>\n search === '' || !v.includes(search) ? v : v.slice(v.lastIndexOf(search) + search.length),\n before: (v: string, search: string) => (search === '' || !v.includes(search) ? v : v.slice(0, v.indexOf(search))),\n beforeLast: (v: string, search: string) =>\n search === '' || !v.includes(search) ? v : v.slice(0, v.lastIndexOf(search)),\n between: (v: string, from: string, to: string) => Str.beforeLast(Str.after(v, from), to),\n limit: (v: string, limit = 100, end = '...') => (v.length <= limit ? v : v.slice(0, limit).trimEnd() + end),\n start: (v: string, prefix: string) => (v.startsWith(prefix) ? v : prefix + v),\n finish: (v: string, cap: string) => (v.endsWith(cap) ? v : v + cap),\n}\n","type Obj = Record<string, unknown>\nconst FORBIDDEN = new Set(['__proto__', 'prototype', 'constructor'])\nconst isWalkable = (v: unknown): v is Obj => typeof v === 'object' && v !== null\nconst segments = (key: string) => key.split('.')\n\nexport const Arr = {\n get<T = unknown>(target: unknown, key: string | undefined, defaultValue?: T): T {\n if (key === undefined || key === '') return target as T\n let current: unknown = target\n for (const segment of segments(key)) {\n if (!isWalkable(current) || !Object.hasOwn(current, segment)) return defaultValue as T\n current = current[segment]\n }\n return current as T\n },\n\n has(target: unknown, key: string): boolean {\n const missing = Symbol('missing')\n return Arr.get(target, key, missing) !== missing\n },\n\n set(target: Obj, key: string, value: unknown): Obj {\n const parts = segments(key)\n if (parts.some((p) => FORBIDDEN.has(p))) throw new Error(`Refusing to set unsafe key \"${key}\"`)\n let current: Obj = target\n parts.slice(0, -1).forEach((segment) => {\n if (!isWalkable(current[segment])) current[segment] = {}\n current = current[segment] as Obj\n })\n current[parts.at(-1)!] = value\n return target\n },\n\n forget(target: Obj, key: string): void {\n const parts = segments(key)\n const parent = parts.length === 1 ? target : Arr.get<unknown>(target, parts.slice(0, -1).join('.'))\n if (isWalkable(parent)) delete parent[parts.at(-1)!]\n },\n\n dot(target: Obj, prefix = ''): Obj {\n const out: Obj = {}\n for (const [k, v] of Object.entries(target)) {\n const path = prefix + k\n if (isWalkable(v) && Object.keys(v).length > 0) Object.assign(out, Arr.dot(v as Obj, `${path}.`))\n else out[path] = v\n }\n return out\n },\n\n undot(flat: Obj): Obj {\n const out: Obj = {}\n for (const [k, v] of Object.entries(flat)) Arr.set(out, k, v)\n return out\n },\n\n only<T extends Obj>(target: T, keys: string[]): Partial<T> {\n return Object.fromEntries(keys.filter((k) => Object.hasOwn(target, k)).map((k) => [k, target[k]])) as Partial<T>\n },\n\n except<T extends Obj>(target: T, keys: string[]): Partial<T> {\n const skip = new Set(keys)\n return Object.fromEntries(Object.entries(target).filter(([k]) => !skip.has(k))) as Partial<T>\n },\n\n wrap<T>(value: T | T[] | null | undefined): T[] {\n if (value === null || value === undefined) return []\n return Array.isArray(value) ? value : [value]\n },\n\n first<T, D = undefined>(items: readonly T[], predicate?: (item: T, index: number) => boolean, defaultValue?: D): T | D {\n const index = predicate ? items.findIndex(predicate) : items.length > 0 ? 0 : -1\n return index === -1 ? (defaultValue as D) : items[index]!\n },\n\n last<T, D = undefined>(items: readonly T[], predicate?: (item: T, index: number) => boolean, defaultValue?: D): T | D {\n const index = predicate ? items.findLastIndex(predicate) : items.length - 1\n return index === -1 ? (defaultValue as D) : items[index]!\n },\n}\n","import { ConfigRepository, type Application, type ServiceProvider as ServiceProviderContract } from '@orieljs/contracts'\n\nexport abstract class ServiceProvider implements ServiceProviderContract {\n constructor(protected readonly app: Application) {}\n\n register(): void {}\n\n boot(): void | Promise<void> {}\n\n /** Package defaults under `key`; values the app already set win (shallow merge, like Laravel). */\n protected mergeConfigFrom(defaults: Record<string, unknown>, key: string): void {\n const config = this.app.make(ConfigRepository)\n config.set(key, { ...defaults, ...config.get<Record<string, unknown>>(key, {}) })\n }\n}\n","import type { Abstract } from '@orieljs/contracts'\nimport { ContainerNotAvailableError, currentContainer, describe } from '@orieljs/container'\n\nexport interface FacadeStatics<T> {\n getFacadeRoot(): T\n /** Replace the instance in the current container (used by X.fake()). */\n swap(instance: T): void\n}\nexport type Facade<T, X = object> = T & X & FacadeStatics<T>\n\nexport function facade<T extends object, X extends object = object>(abstract: Abstract<T>, extras?: X): Facade<T, X> {\n const container = () => {\n const c = currentContainer()\n if (!c) throw new ContainerNotAvailableError(describe(abstract))\n return c\n }\n const statics: FacadeStatics<T> = {\n getFacadeRoot: () => container().make(abstract),\n swap: (instance) => void container().instance(abstract, instance),\n }\n\n const proxy: Facade<T, X> = new Proxy({} as Facade<T, X>, {\n get(_target, prop) {\n if (typeof prop === 'symbol' || prop === 'then') return undefined\n if (extras && Object.hasOwn(extras, prop)) {\n const extra = (extras as Record<string, unknown>)[prop]\n return typeof extra === 'function' ? extra.bind(proxy) : extra\n }\n if (Object.hasOwn(statics, prop)) return statics[prop as keyof FacadeStatics<T>]\n const root = statics.getFacadeRoot()\n const value = Reflect.get(root, prop, root)\n return typeof value === 'function' ? value.bind(root) : value\n },\n })\n return proxy\n}\n","import type { Class, ClassRegistry as ClassRegistryContract } from '@orieljs/contracts'\n\nexport class ClassRegistry implements ClassRegistryContract {\n private readonly byName = new Map<string, Class<unknown>>()\n private readonly byClass = new Map<Class<unknown>, string>()\n\n register(cls: Class<unknown>, name: string = cls.name): string {\n const existingName = this.byClass.get(cls)\n if (existingName !== undefined) return existingName\n if (!name) throw new Error('Anonymous classes need an explicit name: registry.register(cls, \"Some.Name\")')\n const existing = this.byName.get(name)\n if (existing && existing !== cls) {\n throw new Error(`\"${name}\" is already registered to a different class. Pass an explicit name: register(cls, \"Module.${name}\")`)\n }\n this.byName.set(name, cls)\n this.byClass.set(cls, name)\n return name\n }\n\n nameOf(cls: Class<unknown>): string | undefined {\n return this.byClass.get(cls)\n }\n\n resolve<T = unknown>(name: string): Class<T> {\n const cls = this.byName.get(name)\n if (!cls) throw new Error(`No class registered as \"${name}\". Is it registered by its service provider?`)\n return cls as Class<T>\n }\n\n has(name: string): boolean {\n return this.byName.has(name)\n }\n}\n","import { setTimeout as sleep } from 'node:timers/promises'\nimport { Application, ConfigRepository, type Abstract } from '@orieljs/contracts'\nimport { currentContainer, inject } from '@orieljs/container'\n\nexport { collect } from '@orieljs/collections'\n\n/** Container methods that must act on the current (request) scope rather than on the root application. */\nconst SCOPE_METHODS = new Set<PropertyKey>(['make', 'instance', 'bound', 'resolved', 'forgetInstance', 'createScope', 'run'])\nconst scopedViews = new WeakMap<object, Application>()\n\n/** The application, seen from `scope`: container methods hit the scope, everything else hits the application. */\nfunction viewFrom(scope: object, application: Application): Application {\n let view = scopedViews.get(scope)\n if (view === undefined) {\n view = new Proxy(application, {\n get(target, property) {\n const source: object = SCOPE_METHODS.has(property) ? scope : target\n const member: unknown = Reflect.get(source, property, source)\n return typeof member === 'function' ? member.bind(source) : member\n },\n })\n scopedViews.set(scope, view)\n }\n return view\n}\n\n/**\n * The application, or an abstract resolved from the current container.\n * Inside a request scope, app().make()/instance()/… act on that scope, so app().make(X) sees scoped services.\n */\nexport function app(): Application\nexport function app<T>(abstract: Abstract<T>): T\nexport function app<T>(abstract?: Abstract<T>): T | Application {\n if (abstract !== undefined) return inject(abstract)\n const application = inject(Application)\n const current = currentContainer()\n return current === undefined || current === application ? application : viewFrom(current, application)\n}\n\nexport function config(): ConfigRepository\nexport function config(values: Record<string, unknown>): void\nexport function config<T = unknown>(key: string, defaultValue?: T): T\nexport function config(keyOrValues?: string | Record<string, unknown>, defaultValue?: unknown): unknown {\n const repository = inject(ConfigRepository)\n if (keyOrValues === undefined) return repository\n if (typeof keyOrValues === 'string') return repository.get(keyOrValues, defaultValue)\n repository.set(keyOrValues)\n return undefined\n}\n\nexport const now = (): Date => new Date()\n\nexport const value = <T>(v: T | (() => T)): T => (typeof v === 'function' ? (v as () => T)() : v)\n\nexport function tap<T>(target: T, callback: (target: T) => void): T {\n callback(target)\n return target\n}\n\n/** Calls fn up to `times` times (attempt numbers are 1-based). Rethrows the last error, or the first one `when` rejects. */\nexport async function retry<T>(\n times: number,\n fn: (attempt: number) => T | Promise<T>,\n sleepMs: number | ((attempt: number) => number) = 0,\n when?: (error: unknown) => boolean,\n): Promise<T> {\n for (let attempt = 1; ; attempt++) {\n try {\n return await fn(attempt)\n } catch (error) {\n if (attempt >= times || (when && !when(error))) throw error\n const ms = typeof sleepMs === 'function' ? sleepMs(attempt) : sleepMs\n if (ms > 0) await sleep(ms)\n }\n }\n}\n"],"mappings":"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","names":["value","value","app","config","value","ConfigRepository","currentContainer"]}
1
+ {"version":3,"sources":["../Str.ts","../Arr.ts","../ServiceProvider.ts","../Facade.ts","../ClassRegistry.ts","../helpers.ts","../lang.ts"],"sourcesContent":["import { randomBytes, randomUUID } from 'node:crypto'\nimport pluralize from 'pluralize'\n\nconst words = (value: string): string[] =>\n value\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .split(/[^A-Za-z\\d]+/)\n .filter(Boolean)\n\nconst ALPHANUM = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\nconst escapeRegex = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\nconst anyOf = (needles: string | string[]) => (Array.isArray(needles) ? needles : [needles]).filter((n) => n !== '')\n\nexport const Str = {\n ucfirst: (v: string) => v.charAt(0).toUpperCase() + v.slice(1),\n lcfirst: (v: string) => v.charAt(0).toLowerCase() + v.slice(1),\n studly: (v: string) => words(v).map((w) => Str.ucfirst(w.toLowerCase())).join(''),\n camel: (v: string) => Str.lcfirst(Str.studly(v)),\n snake: (v: string, delimiter = '_') => words(v).map((w) => w.toLowerCase()).join(delimiter),\n kebab: (v: string) => Str.snake(v, '-'),\n title: (v: string) => v.toLowerCase().replace(/(^|\\s)\\S/g, (m) => m.toUpperCase()),\n slug: (v: string, separator = '-') =>\n v\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .replace(/[^a-z\\d]+/g, separator)\n .replace(new RegExp(`^${escapeRegex(separator)}+|${escapeRegex(separator)}+$`, 'g'), ''),\n plural: (v: string, count = 2) => pluralize(v, count),\n singular: (v: string) => pluralize.singular(v),\n random: (length = 16) => {\n let out = ''\n while (out.length < length) {\n for (const byte of randomBytes(length)) {\n if (byte < 248 && out.length < length) out += ALPHANUM[byte % 62] // 248 = 62*4, avoids modulo bias\n }\n }\n return out\n },\n uuid: () => randomUUID(),\n /** Wildcard match: `*` matches anything; everything else is literal. */\n is: (pattern: string, value: string) =>\n pattern === value || new RegExp(`^${pattern.split('*').map(escapeRegex).join('.*')}$`, 's').test(value),\n startsWith: (v: string, needles: string | string[]) => anyOf(needles).some((n) => v.startsWith(n)),\n endsWith: (v: string, needles: string | string[]) => anyOf(needles).some((n) => v.endsWith(n)),\n contains: (v: string, needles: string | string[]) => anyOf(needles).some((n) => v.includes(n)),\n after: (v: string, search: string) => (search === '' || !v.includes(search) ? v : v.slice(v.indexOf(search) + search.length)),\n afterLast: (v: string, search: string) =>\n search === '' || !v.includes(search) ? v : v.slice(v.lastIndexOf(search) + search.length),\n before: (v: string, search: string) => (search === '' || !v.includes(search) ? v : v.slice(0, v.indexOf(search))),\n beforeLast: (v: string, search: string) =>\n search === '' || !v.includes(search) ? v : v.slice(0, v.lastIndexOf(search)),\n between: (v: string, from: string, to: string) => Str.beforeLast(Str.after(v, from), to),\n limit: (v: string, limit = 100, end = '...') => (v.length <= limit ? v : v.slice(0, limit).trimEnd() + end),\n start: (v: string, prefix: string) => (v.startsWith(prefix) ? v : prefix + v),\n finish: (v: string, cap: string) => (v.endsWith(cap) ? v : v + cap),\n}\n","type Obj = Record<string, unknown>\nconst FORBIDDEN = new Set(['__proto__', 'prototype', 'constructor'])\nconst isWalkable = (v: unknown): v is Obj => typeof v === 'object' && v !== null\nconst segments = (key: string) => key.split('.')\n\nexport const Arr = {\n get<T = unknown>(target: unknown, key: string | undefined, defaultValue?: T): T {\n if (key === undefined || key === '') return target as T\n let current: unknown = target\n for (const segment of segments(key)) {\n if (!isWalkable(current) || !Object.hasOwn(current, segment)) return defaultValue as T\n current = current[segment]\n }\n return current as T\n },\n\n has(target: unknown, key: string): boolean {\n const missing = Symbol('missing')\n return Arr.get(target, key, missing) !== missing\n },\n\n set(target: Obj, key: string, value: unknown): Obj {\n const parts = segments(key)\n if (parts.some((p) => FORBIDDEN.has(p))) throw new Error(`Refusing to set unsafe key \"${key}\"`)\n let current: Obj = target\n parts.slice(0, -1).forEach((segment) => {\n if (!isWalkable(current[segment])) current[segment] = {}\n current = current[segment] as Obj\n })\n current[parts.at(-1)!] = value\n return target\n },\n\n forget(target: Obj, key: string): void {\n const parts = segments(key)\n const parent = parts.length === 1 ? target : Arr.get<unknown>(target, parts.slice(0, -1).join('.'))\n if (isWalkable(parent)) delete parent[parts.at(-1)!]\n },\n\n dot(target: Obj, prefix = ''): Obj {\n const out: Obj = {}\n for (const [k, v] of Object.entries(target)) {\n const path = prefix + k\n if (isWalkable(v) && Object.keys(v).length > 0) Object.assign(out, Arr.dot(v as Obj, `${path}.`))\n else out[path] = v\n }\n return out\n },\n\n undot(flat: Obj): Obj {\n const out: Obj = {}\n for (const [k, v] of Object.entries(flat)) Arr.set(out, k, v)\n return out\n },\n\n only<T extends Obj>(target: T, keys: string[]): Partial<T> {\n return Object.fromEntries(keys.filter((k) => Object.hasOwn(target, k)).map((k) => [k, target[k]])) as Partial<T>\n },\n\n except<T extends Obj>(target: T, keys: string[]): Partial<T> {\n const skip = new Set(keys)\n return Object.fromEntries(Object.entries(target).filter(([k]) => !skip.has(k))) as Partial<T>\n },\n\n wrap<T>(value: T | T[] | null | undefined): T[] {\n if (value === null || value === undefined) return []\n return Array.isArray(value) ? value : [value]\n },\n\n first<T, D = undefined>(items: readonly T[], predicate?: (item: T, index: number) => boolean, defaultValue?: D): T | D {\n const index = predicate ? items.findIndex(predicate) : items.length > 0 ? 0 : -1\n return index === -1 ? (defaultValue as D) : items[index]!\n },\n\n last<T, D = undefined>(items: readonly T[], predicate?: (item: T, index: number) => boolean, defaultValue?: D): T | D {\n const index = predicate ? items.findLastIndex(predicate) : items.length - 1\n return index === -1 ? (defaultValue as D) : items[index]!\n },\n}\n","import { ConfigRepository, type Application, type ServiceProvider as ServiceProviderContract } from '@orieljs/contracts'\n\nexport abstract class ServiceProvider implements ServiceProviderContract {\n constructor(protected readonly app: Application) {}\n\n register(): void {}\n\n boot(): void | Promise<void> {}\n\n /** Package defaults under `key`; values the app already set win (shallow merge, like Laravel). */\n protected mergeConfigFrom(defaults: Record<string, unknown>, key: string): void {\n const config = this.app.make(ConfigRepository)\n config.set(key, { ...defaults, ...config.get<Record<string, unknown>>(key, {}) })\n }\n}\n","import type { Abstract } from '@orieljs/contracts'\nimport { ContainerNotAvailableError, currentContainer, describe } from '@orieljs/container'\n\nexport interface FacadeStatics<T> {\n getFacadeRoot(): T\n /** Replace the instance in the current container (used by X.fake()). */\n swap(instance: T): void\n}\nexport type Facade<T, X = object> = T & X & FacadeStatics<T>\n\nexport function facade<T extends object, X extends object = object>(abstract: Abstract<T>, extras?: X): Facade<T, X> {\n const container = () => {\n const c = currentContainer()\n if (!c) throw new ContainerNotAvailableError(describe(abstract))\n return c\n }\n const statics: FacadeStatics<T> = {\n getFacadeRoot: () => container().make(abstract),\n swap: (instance) => void container().instance(abstract, instance),\n }\n\n const proxy: Facade<T, X> = new Proxy({} as Facade<T, X>, {\n get(_target, prop) {\n if (typeof prop === 'symbol' || prop === 'then') return undefined\n if (extras && Object.hasOwn(extras, prop)) {\n const extra = (extras as Record<string, unknown>)[prop]\n return typeof extra === 'function' ? extra.bind(proxy) : extra\n }\n if (Object.hasOwn(statics, prop)) return statics[prop as keyof FacadeStatics<T>]\n const root = statics.getFacadeRoot()\n const value = Reflect.get(root, prop, root)\n return typeof value === 'function' ? value.bind(root) : value\n },\n })\n return proxy\n}\n","import type { Class, ClassRegistry as ClassRegistryContract } from '@orieljs/contracts'\n\nexport class ClassRegistry implements ClassRegistryContract {\n private readonly byName = new Map<string, Class<unknown>>()\n private readonly byClass = new Map<Class<unknown>, string>()\n\n register(cls: Class<unknown>, name: string = cls.name): string {\n const existingName = this.byClass.get(cls)\n if (existingName !== undefined) return existingName\n if (!name) throw new Error('Anonymous classes need an explicit name: registry.register(cls, \"Some.Name\")')\n const existing = this.byName.get(name)\n if (existing && existing !== cls) {\n throw new Error(`\"${name}\" is already registered to a different class. Pass an explicit name: register(cls, \"Module.${name}\")`)\n }\n this.byName.set(name, cls)\n this.byClass.set(cls, name)\n return name\n }\n\n nameOf(cls: Class<unknown>): string | undefined {\n return this.byClass.get(cls)\n }\n\n resolve<T = unknown>(name: string): Class<T> {\n const cls = this.byName.get(name)\n if (!cls) throw new Error(`No class registered as \"${name}\". Is it registered by its service provider?`)\n return cls as Class<T>\n }\n\n has(name: string): boolean {\n return this.byName.has(name)\n }\n}\n","import { setTimeout as sleep } from 'node:timers/promises'\nimport { Application, ConfigRepository, type Abstract } from '@orieljs/contracts'\nimport { currentContainer, inject } from '@orieljs/container'\n\nexport { collect } from '@orieljs/collections'\n\n/** Container methods that must act on the current (request) scope rather than on the root application. */\nconst SCOPE_METHODS = new Set<PropertyKey>(['make', 'instance', 'bound', 'resolved', 'forgetInstance', 'createScope', 'run'])\nconst scopedViews = new WeakMap<object, Application>()\n\n/** The application, seen from `scope`: container methods hit the scope, everything else hits the application. */\nfunction viewFrom(scope: object, application: Application): Application {\n let view = scopedViews.get(scope)\n if (view === undefined) {\n view = new Proxy(application, {\n get(target, property) {\n const source: object = SCOPE_METHODS.has(property) ? scope : target\n const member: unknown = Reflect.get(source, property, source)\n return typeof member === 'function' ? member.bind(source) : member\n },\n })\n scopedViews.set(scope, view)\n }\n return view\n}\n\n/**\n * The application, or an abstract resolved from the current container.\n * Inside a request scope, app().make()/instance()/… act on that scope, so app().make(X) sees scoped services.\n */\nexport function app(): Application\nexport function app<T>(abstract: Abstract<T>): T\nexport function app<T>(abstract?: Abstract<T>): T | Application {\n if (abstract !== undefined) return inject(abstract)\n const application = inject(Application)\n const current = currentContainer()\n return current === undefined || current === application ? application : viewFrom(current, application)\n}\n\nexport function config(): ConfigRepository\nexport function config(values: Record<string, unknown>): void\nexport function config<T = unknown>(key: string, defaultValue?: T): T\nexport function config(keyOrValues?: string | Record<string, unknown>, defaultValue?: unknown): unknown {\n const repository = inject(ConfigRepository)\n if (keyOrValues === undefined) return repository\n if (typeof keyOrValues === 'string') return repository.get(keyOrValues, defaultValue)\n repository.set(keyOrValues)\n return undefined\n}\n\nexport const now = (): Date => new Date()\n\nexport const value = <T>(v: T | (() => T)): T => (typeof v === 'function' ? (v as () => T)() : v)\n\nexport function tap<T>(target: T, callback: (target: T) => void): T {\n callback(target)\n return target\n}\n\n/** Calls fn up to `times` times (attempt numbers are 1-based). Rethrows the last error, or the first one `when` rejects. */\nexport async function retry<T>(\n times: number,\n fn: (attempt: number) => T | Promise<T>,\n sleepMs: number | ((attempt: number) => number) = 0,\n when?: (error: unknown) => boolean,\n): Promise<T> {\n for (let attempt = 1; ; attempt++) {\n try {\n return await fn(attempt)\n } catch (error) {\n if (attempt >= times || (when && !when(error))) throw error\n const ms = typeof sleepMs === 'function' ? sleepMs(attempt) : sleepMs\n if (ms > 0) await sleep(ms)\n }\n }\n}\n","/** Laravel's English lang/en/auth.php and lang/en/passwords.php. */\nconst LINES: Record<string, string> = {\n 'auth.failed': 'These credentials do not match our records.',\n 'auth.password': 'The provided password is incorrect.',\n 'auth.throttle': 'Too many login attempts. Please try again in :seconds seconds.',\n 'passwords.reset': 'Your password has been reset.',\n 'passwords.sent': 'We have emailed your password reset link.',\n 'passwords.throttled': 'Please wait before retrying.',\n 'passwords.token': 'This password reset token is invalid.',\n 'passwords.user': \"We can't find a user with that email address.\",\n}\n\n/**\n * Laravel's __(): the line for `key` with `:placeholders` filled (`:name`, `:Name` capitalized, `:NAME` upper-cased),\n * longest placeholder first. A key with no line comes back as is, so a sentence can be its own key:\n * __('auth.failed'), __('auth.throttle', { seconds: 30 }), __('A reset link will be sent if the account exists.').\n */\nexport function __(key: string, replace: Record<string, string | number> = {}): string {\n let line = LINES[key] ?? key\n const names = Object.keys(replace).sort((a, b) => b.length - a.length)\n for (const name of names) {\n const value = String(replace[name])\n const capitalized = name.charAt(0).toUpperCase() + name.slice(1)\n line = line\n .replaceAll(`:${capitalized}`, value.charAt(0).toUpperCase() + value.slice(1))\n .replaceAll(`:${name.toUpperCase()}`, value.toUpperCase())\n .replaceAll(`:${name}`, value)\n }\n return line\n}\n"],"mappings":"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","names":["value","value","app","config","value","ConfigRepository","currentContainer","value"]}
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@orieljs/support",
3
- "version": "0.1.0-alpha.2",
3
+ "version": "0.1.0-alpha.4",
4
4
  "description": "Oriel support utilities: Str, Arr, service providers, facades and helpers.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
7
+ "homepage": "https://orieljs.vercel.app",
7
8
  "sideEffects": false,
8
9
  "repository": {
9
10
  "type": "git",
@@ -30,9 +31,9 @@
30
31
  ],
31
32
  "dependencies": {
32
33
  "pluralize": "8.0.0",
33
- "@orieljs/collections": "0.1.0-alpha.2",
34
- "@orieljs/container": "0.1.0-alpha.2",
35
- "@orieljs/contracts": "0.1.0-alpha.2"
34
+ "@orieljs/collections": "0.1.0-alpha.4",
35
+ "@orieljs/contracts": "0.1.0-alpha.4",
36
+ "@orieljs/container": "0.1.0-alpha.4"
36
37
  },
37
38
  "devDependencies": {
38
39
  "@types/pluralize": "0.0.33"