From 1515ae56afa3445a6b267978f848bfdcfd7b1c29 Mon Sep 17 00:00:00 2001 From: Tola Leng Date: Fri, 16 May 2025 22:08:50 +0800 Subject: [PATCH] updated data for server backend --- server/pb_data/auxiliary.db | Bin 10645504 -> 10645504 bytes server/pb_data/data.db | Bin 1056768 -> 1056768 bytes server/pb_data/types.d.ts | 9897 ++++++++++++++++++----------------- 3 files changed, 5100 insertions(+), 4797 deletions(-) diff --git a/server/pb_data/auxiliary.db b/server/pb_data/auxiliary.db index 45093ebc624bdd18680142cbc0101dbba95331d3..9727cbd401a6e5e485ab23cc83951fdeabef9adb 100644 GIT binary patch delta 159927 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
#xETE>dD=CV zZ&hgZ6QH7}0ng6L2Qi+fcUGREtggSx6CbSntVyeT6bdYW0tYME5i}J3hk#S5+oD13oXz)Rm?h$&KT-INS74D>baB$)&iv7VG z@{H>yzB&Q7npC@>)jKDyz^#^DyCyz1+~5Z%zJ&)#)httcCbp2+woWm_Ti4a6-mBu& zn^h&B7Tb%yD%w%Brf6c}{=$n3=NEjdzgh3qo4`BiQQd{Q({+}J=&S{H}oU) zdPwXvj(UsQMoCmV`A_l>m34xO06?yhl7s{GPZ8l1e6tHN1V+HJB#`8)2J1T=5w;GGo z1jNTsl2Z(MgdmwQCNRXV{=4!=?zb5=Bw5^l#9gC??wJEskN9iAa~(X7cx=?5>2r*; zH2@lM(-?8eE|hPaW4x3gOKah{8)yXUpKVWTi%{9kr`FKD27uNc107#lt9o+`l;xPr$rh4NnJjD)zKS>2TIBxnRx(l`=)sB&8s%r~8 zqr-34RVwePE+>8-xYw9}Cc60DCL`!umEEKSsMq<%pDk&C;-^ZVDXJ)ZQD3k73`m}|Zmy03N!Mm=r?!s%l)i^f(H+z~RF*0ue<1%%9)LM| z2YD5F9wioTE4-vI1_{PaESynT0Wz^q3l0>x3+nWLI{rn@%3si4+~mqVnp4no)6P3b zQC`v>N`JMM!)jPiUw@`4LqAF3&Fjr_={r~f_r807h@KJ@B$PZyATNeLA12iI1Sc< z`fX+I}W-KV3UuZ2l`_&Ret+LY9mq0Dv0 zIcU#ai4L+mRun|)>x>TMy$aqc?w9`Sfp+PvL@!M-PDe|Bn<#@w5--hNH=BU`*!+xU z_)8(vM)PcB-=4_-M1JcA6CW4Mw968lS4r7Wl#Z z&I*U^e&aM;z`EbaVXIPViyVI2c-2W-y#dZgD^MV{RZR+kVXdorUpXH?myIn|pVC_G z09caEg>A=F)sDBFxu&XxxPY!tzR*^+Zlbo}dljYL4y{;PwOKi0w=b(&rC83<@=u*r z8tw=Ylh+o=WrI~CM9kGyNuW+J`;ND^Jym#XLuH4nNO|1esyt&3?E5oSsmeYu|7fRr zRmHECvc+0Z@)VZrEBrg8QtB^UR9I5*TEX=NPGGhV>mShf=_l(RF8Q7Ac8J`$4m_dH z(sk&j!Abq2_G2)Om$lopmuO?!F71ih8L%VXLif-{a1y%|4CSq`6T$`ED}w(oQmOI; zJI;2qrJwN=`fG<6onkQb=~Xic(j{q^VO>m=c6Di&Vf QQ3dgL_cKz&+_Y0ZJ(T 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

-}uzMnhsz_E#$r=OLZ14ISRwone~yojv~X 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 u%+-my;zWHV4Uy3GCX8kbmsQ<_VCGNTAI6>l diff --git a/server/pb_data/types.d.ts b/server/pb_data/types.d.ts index ba57cf0..2503831 100644 --- a/server/pb_data/types.d.ts +++ b/server/pb_data/types.d.ts @@ -1,4 +1,4 @@ -// 1745145965 +// 1746911627 // GENERATED CODE - DO NOT MODIFY BY HAND // ------------------------------------------------------------------- @@ -1770,8 +1770,8 @@ namespace os { * than ReadFrom. This is used to permit ReadFrom to call io.Copy * without leading to a recursive call to ReadFrom. */ - type _skQrVEU = noReadFrom&File - interface fileWithoutReadFrom extends _skQrVEU { + type _snLnyFf = noReadFrom&File + interface fileWithoutReadFrom extends _snLnyFf { } interface File { /** @@ -1815,8 +1815,8 @@ namespace os { * than WriteTo. This is used to permit WriteTo to call io.Copy * without leading to a recursive call to WriteTo. */ - type _swFbbKO = noWriteTo&File - interface fileWithoutWriteTo extends _swFbbKO { + type _syNvbJl = noWriteTo&File + interface fileWithoutWriteTo extends _syNvbJl { } interface File { /** @@ -2460,8 +2460,8 @@ namespace os { * * The methods of File are safe for concurrent use. */ - type _sGLkCJa = file - interface File extends _sGLkCJa { + type _sDzXOPD = file + interface File extends _sDzXOPD { } /** * A FileInfo describes a file and is returned by [Stat] and [Lstat]. @@ -3207,14 +3207,14 @@ namespace dbx { /** * MssqlBuilder is the builder for SQL Server databases. */ - type _supywhQ = BaseBuilder - interface MssqlBuilder extends _supywhQ { + type _sLlglaO = BaseBuilder + interface MssqlBuilder extends _sLlglaO { } /** * MssqlQueryBuilder is the query builder for SQL Server databases. */ - type _swVApKs = BaseQueryBuilder - interface MssqlQueryBuilder extends _swVApKs { + type _sIerFva = BaseQueryBuilder + interface MssqlQueryBuilder extends _sIerFva { } interface newMssqlBuilder { /** @@ -3285,8 +3285,8 @@ namespace dbx { /** * MysqlBuilder is the builder for MySQL databases. */ - type _sFlVeHc = BaseBuilder - interface MysqlBuilder extends _sFlVeHc { + type _sJRJGqZ = BaseBuilder + interface MysqlBuilder extends _sJRJGqZ { } interface newMysqlBuilder { /** @@ -3361,14 +3361,14 @@ namespace dbx { /** * OciBuilder is the builder for Oracle databases. */ - type _sGHVCVI = BaseBuilder - interface OciBuilder extends _sGHVCVI { + type _sHTbvIJ = BaseBuilder + interface OciBuilder extends _sHTbvIJ { } /** * OciQueryBuilder is the query builder for Oracle databases. */ - type _sNtBqIH = BaseQueryBuilder - interface OciQueryBuilder extends _sNtBqIH { + type _sGNFgrc = BaseQueryBuilder + interface OciQueryBuilder extends _sGNFgrc { } interface newOciBuilder { /** @@ -3431,8 +3431,8 @@ namespace dbx { /** * PgsqlBuilder is the builder for PostgreSQL databases. */ - type _sHnONiI = BaseBuilder - interface PgsqlBuilder extends _sHnONiI { + type _sALdjlO = BaseBuilder + interface PgsqlBuilder extends _sALdjlO { } interface newPgsqlBuilder { /** @@ -3499,8 +3499,8 @@ namespace dbx { /** * SqliteBuilder is the builder for SQLite databases. */ - type _sLQNJzh = BaseBuilder - interface SqliteBuilder extends _sLQNJzh { + type _spUmBhh = BaseBuilder + interface SqliteBuilder extends _spUmBhh { } interface newSqliteBuilder { /** @@ -3599,8 +3599,8 @@ namespace dbx { /** * StandardBuilder is the builder that is used by DB for an unknown driver. */ - type _stKkCId = BaseBuilder - interface StandardBuilder extends _stKkCId { + type _sWjnuHQ = BaseBuilder + interface StandardBuilder extends _sWjnuHQ { } interface newStandardBuilder { /** @@ -3666,8 +3666,8 @@ namespace dbx { * DB enhances sql.DB by providing a set of DB-agnostic query building methods. * DB allows easier query building and population of data into Go variables. */ - type _sBLlpCi = Builder - interface DB extends _sBLlpCi { + type _swIUbPb = Builder + interface DB extends _swIUbPb { /** * FieldMapper maps struct fields to DB columns. Defaults to DefaultFieldMapFunc. */ @@ -4471,8 +4471,8 @@ namespace dbx { * Rows enhances sql.Rows by providing additional data query methods. * Rows can be obtained by calling Query.Rows(). It is mainly used to populate data row by row. */ - type _sCAEDLT = sql.Rows - interface Rows extends _sCAEDLT { + type _sguxiye = sql.Rows + interface Rows extends _sguxiye { } interface Rows { /** @@ -4844,8 +4844,8 @@ namespace dbx { }): string } interface structInfo { } - type _sxcaVkz = structInfo - interface structValue extends _sxcaVkz { + type _sPncttL = structInfo + interface structValue extends _sPncttL { } interface fieldInfo { } @@ -4884,8 +4884,8 @@ namespace dbx { /** * Tx enhances sql.Tx with additional querying methods. */ - type _sQCIwvZ = Builder - interface Tx extends _sQCIwvZ { + type _sbhRiou = Builder + interface Tx extends _sbhRiou { } interface Tx { /** @@ -5044,111 +5044,6 @@ namespace security { } } -/** - * Package template is a thin wrapper around the standard html/template - * and text/template packages that implements a convenient registry to - * load and cache templates on the fly concurrently. - * - * It was created to assist the JSVM plugin HTML rendering, but could be used in other Go code. - * - * Example: - * - * ``` - * registry := template.NewRegistry() - * - * html1, err := registry.LoadFiles( - * // the files set wil be parsed only once and then cached - * "layout.html", - * "content.html", - * ).Render(map[string]any{"name": "John"}) - * - * html2, err := registry.LoadFiles( - * // reuse the already parsed and cached files set - * "layout.html", - * "content.html", - * ).Render(map[string]any{"name": "Jane"}) - * ``` - */ -namespace template { - interface newRegistry { - /** - * NewRegistry creates and initializes a new templates registry with - * some defaults (eg. global "raw" template function for unescaped HTML). - * - * Use the Registry.Load* methods to load templates into the registry. - */ - (): (Registry) - } - /** - * Registry defines a templates registry that is safe to be used by multiple goroutines. - * - * Use the Registry.Load* methods to load templates into the registry. - */ - interface Registry { - } - interface Registry { - /** - * AddFuncs registers new global template functions. - * - * The key of each map entry is the function name that will be used in the templates. - * If a function with the map entry name already exists it will be replaced with the new one. - * - * The value of each map entry is a function that must have either a - * single return value, or two return values of which the second has type error. - * - * Example: - * - * ``` - * r.AddFuncs(map[string]any{ - * "toUpper": func(str string) string { - * return strings.ToUppser(str) - * }, - * ... - * }) - * ``` - */ - addFuncs(funcs: _TygojaDict): (Registry) - } - interface Registry { - /** - * LoadFiles caches (if not already) the specified filenames set as a - * single template and returns a ready to use Renderer instance. - * - * There must be at least 1 filename specified. - */ - loadFiles(...filenames: string[]): (Renderer) - } - interface Registry { - /** - * LoadString caches (if not already) the specified inline string as a - * single template and returns a ready to use Renderer instance. - */ - loadString(text: string): (Renderer) - } - interface Registry { - /** - * LoadFS caches (if not already) the specified fs and globPatterns - * pair as single template and returns a ready to use Renderer instance. - * - * There must be at least 1 file matching the provided globPattern(s) - * (note that most file names serves as glob patterns matching themselves). - */ - loadFS(fsys: fs.FS, ...globPatterns: string[]): (Renderer) - } - /** - * Renderer defines a single parsed template. - */ - interface Renderer { - } - interface Renderer { - /** - * Render executes the template with the specified data as the dot object - * and returns the result as plain string. - */ - render(data: any): string - } -} - namespace filesystem { /** * FileReader defines an interface for a file resource reader. @@ -5245,8 +5140,8 @@ namespace filesystem { */ open(): io.ReadSeekCloser } - type _sLyNbVv = bytes.Reader - interface bytesReadSeekCloser extends _sLyNbVv { + type _sgrUUXz = bytes.Reader + interface bytesReadSeekCloser extends _sgrUUXz { } interface bytesReadSeekCloser { /** @@ -5254,6 +5149,16 @@ namespace filesystem { */ close(): void } + /** + * openFuncAsReader defines a FileReader from a bare Open function. + */ + interface openFuncAsReader {(): io.ReadSeekCloser } + interface openFuncAsReader { + /** + * Open implements the [filesystem.FileReader] interface. + */ + open(): io.ReadSeekCloser + } interface System { } interface newS3 { @@ -5300,14 +5205,36 @@ namespace filesystem { } interface System { /** - * GetFile returns a file content reader for the given fileKey. + * GetReader returns a file content reader for the given fileKey. * * NB! Make sure to call Close() on the file after you are done working with it. * * If the file doesn't exist returns ErrNotFound. */ + getReader(fileKey: string): (blob.Reader) + } + interface System { + /** + * Deprecated: Please use GetReader(fileKey) instead. + */ getFile(fileKey: string): (blob.Reader) } + interface System { + /** + * GetReuploadableFile constructs a new reuploadable File value + * from the associated fileKey blob.Reader. + * + * If preserveName is false then the returned File.Name will have + * a new randomly generated suffix, otherwise it will reuse the original one. + * + * This method could be useful in case you want to clone an existing + * Record file and assign it to a new Record (e.g. in a Record duplicate action). + * + * If you simply want to copy an existing file to a new location you + * could check the Copy(srcKey, dstKey) method. + */ + getReuploadableFile(fileKey: string, preserveName: boolean): (File) + } interface System { /** * Copy copies the file stored at srcKey to dstKey. @@ -5565,6 +5492,13 @@ namespace core { * IsTransactional checks if the current app instance is part of a transaction. */ isTransactional(): boolean + /** + * TxInfo returns the transaction associated with the current app instance (if any). + * + * Could be used if you want to execute indirectly a function after + * the related app transaction completes using `app.TxInfo().OnAfterFunc(callback)`. + */ + txInfo(): (TxAppInfo) /** * Bootstrap initializes the application * (aka. create data dir, open db connections, load settings, etc.). @@ -5676,51 +5610,89 @@ namespace core { */ runAllMigrations(): void /** - * DB returns the default app data db instance (pb_data/data.db). + * DB returns the default app data.db builder instance. + * + * To minimize SQLITE_BUSY errors, it automatically routes the + * SELECT queries to the underlying concurrent db pool and everything else + * to the nonconcurrent one. + * + * For more finer control over the used connections pools you can + * call directly ConcurrentDB() or NonconcurrentDB(). */ db(): dbx.Builder /** - * NonconcurrentDB returns the nonconcurrent app data db instance (pb_data/data.db). + * ConcurrentDB returns the concurrent app data.db builder instance. + * + * This method is used mainly internally for executing db read + * operations in a concurrent/non-blocking manner. + * + * Most users should use simply DB() as it will automatically + * route the query execution to ConcurrentDB() or NonconcurrentDB(). + * + * In a transaction the ConcurrentDB() and NonconcurrentDB() refer to the same *dbx.TX instance. + */ + concurrentDB(): dbx.Builder + /** + * NonconcurrentDB returns the nonconcurrent app data.db builder instance. * * The returned db instance is limited only to a single open connection, - * meaning that it can process only 1 db operation at a time (other operations will be queued up). + * meaning that it can process only 1 db operation at a time (other queries queue up). * * This method is used mainly internally and in the tests to execute write * (save/delete) db operations as it helps with minimizing the SQLITE_BUSY errors. * - * For the majority of cases you would want to use the regular DB() method - * since it allows concurrent db read operations. + * Most users should use simply DB() as it will automatically + * route the query execution to ConcurrentDB() or NonconcurrentDB(). * * In a transaction the ConcurrentDB() and NonconcurrentDB() refer to the same *dbx.TX instance. */ nonconcurrentDB(): dbx.Builder /** - * AuxDB returns the default app auxiliary db instance (pb_data/auxiliary.db). + * AuxDB returns the app auxiliary.db builder instance. + * + * To minimize SQLITE_BUSY errors, it automatically routes the + * SELECT queries to the underlying concurrent db pool and everything else + * to the nonconcurrent one. + * + * For more finer control over the used connections pools you can + * call directly AuxConcurrentDB() or AuxNonconcurrentDB(). */ auxDB(): dbx.Builder /** - * AuxNonconcurrentDB returns the nonconcurrent app auxiliary db instance (pb_data/auxiliary.db).. + * AuxConcurrentDB returns the concurrent app auxiliary.db builder instance. + * + * This method is used mainly internally for executing db read + * operations in a concurrent/non-blocking manner. + * + * Most users should use simply AuxDB() as it will automatically + * route the query execution to AuxConcurrentDB() or AuxNonconcurrentDB(). + * + * In a transaction the AuxConcurrentDB() and AuxNonconcurrentDB() refer to the same *dbx.TX instance. + */ + auxConcurrentDB(): dbx.Builder + /** + * AuxNonconcurrentDB returns the nonconcurrent app auxiliary.db builder instance. * * The returned db instance is limited only to a single open connection, - * meaning that it can process only 1 db operation at a time (other operations will be queued up). + * meaning that it can process only 1 db operation at a time (other queries queue up). * * This method is used mainly internally and in the tests to execute write * (save/delete) db operations as it helps with minimizing the SQLITE_BUSY errors. * - * For the majority of cases you would want to use the regular DB() method - * since it allows concurrent db read operations. + * Most users should use simply AuxDB() as it will automatically + * route the query execution to AuxConcurrentDB() or AuxNonconcurrentDB(). * - * In a transaction the AuxNonconcurrentDB() and AuxNonconcurrentDB() refer to the same *dbx.TX instance. + * In a transaction the AuxConcurrentDB() and AuxNonconcurrentDB() refer to the same *dbx.TX instance. */ auxNonconcurrentDB(): dbx.Builder /** * HasTable checks if a table (or view) with the provided name exists (case insensitive). - * in the current app.DB() instance. + * in the data.db. */ hasTable(tableName: string): boolean /** * AuxHasTable checks if a table (or view) with the provided name exists (case insensitive) - * in the current app.AuxDB() instance. + * in the auxiliary.db. */ auxHasTable(tableName: string): boolean /** @@ -5775,22 +5747,20 @@ namespace core { */ findRecordByViewFile(viewCollectionModelOrIdentifier: any, fileFieldName: string, filename: string): (Record) /** - * Vacuum executes VACUUM on the current app.DB() instance - * in order to reclaim unused data db disk space. + * Vacuum executes VACUUM on the data.db in order to reclaim unused data db disk space. */ vacuum(): void /** - * AuxVacuum executes VACUUM on the current app.AuxDB() instance - * in order to reclaim unused auxiliary db disk space. + * AuxVacuum executes VACUUM on the auxiliary.db in order to reclaim unused auxiliary db disk space. */ auxVacuum(): void /** - * ModelQuery creates a new preconfigured select app.DB() query with preset + * ModelQuery creates a new preconfigured select data.db query with preset * SELECT, FROM and other common fields based on the provided model. */ modelQuery(model: Model): (dbx.SelectQuery) /** - * AuxModelQuery creates a new preconfigured select app.AuxDB() query with preset + * AuxModelQuery creates a new preconfigured select auxiliary.db query with preset * SELECT, FROM and other common fields based on the provided model. */ auxModelQuery(model: Model): (dbx.SelectQuery) @@ -7136,8 +7106,8 @@ namespace core { /** * AuthOrigin defines a Record proxy for working with the authOrigins collection. */ - type _snrDGCz = Record - interface AuthOrigin extends _snrDGCz { + type _sUmzkLl = Record + interface AuthOrigin extends _sUmzkLl { } interface newAuthOrigin { /** @@ -7315,6 +7285,15 @@ namespace core { */ logger(): (slog.Logger) } + interface BaseApp { + /** + * TxInfo returns the transaction associated with the current app instance (if any). + * + * Could be used if you want to execute indirectly a function after + * the related app transaction completes using `app.TxInfo().OnAfterFunc(callback)`. + */ + txInfo(): (TxAppInfo) + } interface BaseApp { /** * IsTransactional checks if the current app instance is part of a transaction. @@ -7350,22 +7329,43 @@ namespace core { } interface BaseApp { /** - * DB returns the default app data db instance (pb_data/data.db). + * DB returns the default app data.db builder instance. + * + * To minimize SQLITE_BUSY errors, it automatically routes the + * SELECT queries to the underlying concurrent db pool and everything + * else to the nonconcurrent one. + * + * For more finer control over the used connections pools you can + * call directly ConcurrentDB() or NonconcurrentDB(). */ db(): dbx.Builder } interface BaseApp { /** - * NonconcurrentDB returns the nonconcurrent app data db instance (pb_data/data.db). + * ConcurrentDB returns the concurrent app data.db builder instance. + * + * This method is used mainly internally for executing db read + * operations in a concurrent/non-blocking manner. + * + * Most users should use simply DB() as it will automatically + * route the query execution to ConcurrentDB() or NonconcurrentDB(). + * + * In a transaction the ConcurrentDB() and NonconcurrentDB() refer to the same *dbx.TX instance. + */ + concurrentDB(): dbx.Builder + } + interface BaseApp { + /** + * NonconcurrentDB returns the nonconcurrent app data.db builder instance. * * The returned db instance is limited only to a single open connection, - * meaning that it can process only 1 db operation at a time (other operations will be queued up). + * meaning that it can process only 1 db operation at a time (other queries queue up). * * This method is used mainly internally and in the tests to execute write * (save/delete) db operations as it helps with minimizing the SQLITE_BUSY errors. * - * For the majority of cases you would want to use the regular DB() method - * since it allows concurrent db read operations. + * Most users should use simply DB() as it will automatically + * route the query execution to ConcurrentDB() or NonconcurrentDB(). * * In a transaction the ConcurrentDB() and NonconcurrentDB() refer to the same *dbx.TX instance. */ @@ -7373,24 +7373,45 @@ namespace core { } interface BaseApp { /** - * AuxDB returns the default app auxiliary db instance (pb_data/auxiliary.db). + * AuxDB returns the app auxiliary.db builder instance. + * + * To minimize SQLITE_BUSY errors, it automatically routes the + * SELECT queries to the underlying concurrent db pool and everything + * else to the nonconcurrent one. + * + * For more finer control over the used connections pools you can + * call directly AuxConcurrentDB() or AuxNonconcurrentDB(). */ auxDB(): dbx.Builder } interface BaseApp { /** - * AuxNonconcurrentDB returns the nonconcurrent app auxiliary db instance (pb_data/auxiliary.db). + * AuxConcurrentDB returns the concurrent app auxiliary.db builder instance. + * + * This method is used mainly internally for executing db read + * operations in a concurrent/non-blocking manner. + * + * Most users should use simply AuxDB() as it will automatically + * route the query execution to AuxConcurrentDB() or AuxNonconcurrentDB(). + * + * In a transaction the AuxConcurrentDB() and AuxNonconcurrentDB() refer to the same *dbx.TX instance. + */ + auxConcurrentDB(): dbx.Builder + } + interface BaseApp { + /** + * AuxNonconcurrentDB returns the nonconcurrent app auxiliary.db builder instance. * * The returned db instance is limited only to a single open connection, - * meaning that it can process only 1 db operation at a time (other operations will be queued up). + * meaning that it can process only 1 db operation at a time (other queries queue up). * * This method is used mainly internally and in the tests to execute write * (save/delete) db operations as it helps with minimizing the SQLITE_BUSY errors. * - * For the majority of cases you would want to use the regular DB() method - * since it allows concurrent db read operations. + * Most users should use simply AuxDB() as it will automatically + * route the query execution to AuxConcurrentDB() or AuxNonconcurrentDB(). * - * In a transaction the AuxNonconcurrentDB() and AuxNonconcurrentDB() refer to the same *dbx.TX instance. + * In a transaction the AuxConcurrentDB() and AuxNonconcurrentDB() refer to the same *dbx.TX instance. */ auxNonconcurrentDB(): dbx.Builder } @@ -7831,8 +7852,8 @@ namespace core { /** * @todo experiment eventually replacing the rules *string with a struct? */ - type _sXgfjak = BaseModel - interface baseCollection extends _sXgfjak { + type _smUOmdS = BaseModel + interface baseCollection extends _smUOmdS { listRule?: string viewRule?: string createRule?: string @@ -7859,8 +7880,8 @@ namespace core { /** * Collection defines the table, fields and various options related to a set of records. */ - type _sjMcSdR = baseCollection&collectionAuthOptions&collectionViewOptions - interface Collection extends _sjMcSdR { + type _sKRFDEg = baseCollection&collectionAuthOptions&collectionViewOptions + interface Collection extends _sKRFDEg { } interface newCollection { /** @@ -8414,14 +8435,14 @@ namespace core { } interface BaseApp { /** - * ModelQuery creates a new preconfigured select app.DB() query with preset + * ModelQuery creates a new preconfigured select data.db query with preset * SELECT, FROM and other common fields based on the provided model. */ modelQuery(m: Model): (dbx.SelectQuery) } interface BaseApp { /** - * AuxModelQuery creates a new preconfigured select app.AuxDB() query with preset + * AuxModelQuery creates a new preconfigured select auxiliary.db query with preset * SELECT, FROM and other common fields based on the provided model. */ auxModelQuery(m: Model): (dbx.SelectQuery) @@ -8530,6 +8551,175 @@ namespace core { */ validateWithContext(ctx: context.Context, model: Model): void } + /** + * note: expects both builder to use the same driver + */ + interface dualDBBuilder { + } + interface dualDBBuilder { + /** + * Select implements the [dbx.Builder.Select] interface method. + */ + select(...cols: string[]): (dbx.SelectQuery) + } + interface dualDBBuilder { + /** + * Model implements the [dbx.Builder.Model] interface method. + */ + model(data: { + }): (dbx.ModelQuery) + } + interface dualDBBuilder { + /** + * GeneratePlaceholder implements the [dbx.Builder.GeneratePlaceholder] interface method. + */ + generatePlaceholder(i: number): string + } + interface dualDBBuilder { + /** + * Quote implements the [dbx.Builder.Quote] interface method. + */ + quote(str: string): string + } + interface dualDBBuilder { + /** + * QuoteSimpleTableName implements the [dbx.Builder.QuoteSimpleTableName] interface method. + */ + quoteSimpleTableName(table: string): string + } + interface dualDBBuilder { + /** + * QuoteSimpleColumnName implements the [dbx.Builder.QuoteSimpleColumnName] interface method. + */ + quoteSimpleColumnName(col: string): string + } + interface dualDBBuilder { + /** + * QueryBuilder implements the [dbx.Builder.QueryBuilder] interface method. + */ + queryBuilder(): dbx.QueryBuilder + } + interface dualDBBuilder { + /** + * Insert implements the [dbx.Builder.Insert] interface method. + */ + insert(table: string, cols: dbx.Params): (dbx.Query) + } + interface dualDBBuilder { + /** + * Upsert implements the [dbx.Builder.Upsert] interface method. + */ + upsert(table: string, cols: dbx.Params, ...constraints: string[]): (dbx.Query) + } + interface dualDBBuilder { + /** + * Update implements the [dbx.Builder.Update] interface method. + */ + update(table: string, cols: dbx.Params, where: dbx.Expression): (dbx.Query) + } + interface dualDBBuilder { + /** + * Delete implements the [dbx.Builder.Delete] interface method. + */ + delete(table: string, where: dbx.Expression): (dbx.Query) + } + interface dualDBBuilder { + /** + * CreateTable implements the [dbx.Builder.CreateTable] interface method. + */ + createTable(table: string, cols: _TygojaDict, ...options: string[]): (dbx.Query) + } + interface dualDBBuilder { + /** + * RenameTable implements the [dbx.Builder.RenameTable] interface method. + */ + renameTable(oldName: string, newName: string): (dbx.Query) + } + interface dualDBBuilder { + /** + * DropTable implements the [dbx.Builder.DropTable] interface method. + */ + dropTable(table: string): (dbx.Query) + } + interface dualDBBuilder { + /** + * TruncateTable implements the [dbx.Builder.TruncateTable] interface method. + */ + truncateTable(table: string): (dbx.Query) + } + interface dualDBBuilder { + /** + * AddColumn implements the [dbx.Builder.AddColumn] interface method. + */ + addColumn(table: string, col: string, typ: string): (dbx.Query) + } + interface dualDBBuilder { + /** + * DropColumn implements the [dbx.Builder.DropColumn] interface method. + */ + dropColumn(table: string, col: string): (dbx.Query) + } + interface dualDBBuilder { + /** + * RenameColumn implements the [dbx.Builder.RenameColumn] interface method. + */ + renameColumn(table: string, oldName: string, newName: string): (dbx.Query) + } + interface dualDBBuilder { + /** + * AlterColumn implements the [dbx.Builder.AlterColumn] interface method. + */ + alterColumn(table: string, col: string, typ: string): (dbx.Query) + } + interface dualDBBuilder { + /** + * AddPrimaryKey implements the [dbx.Builder.AddPrimaryKey] interface method. + */ + addPrimaryKey(table: string, name: string, ...cols: string[]): (dbx.Query) + } + interface dualDBBuilder { + /** + * DropPrimaryKey implements the [dbx.Builder.DropPrimaryKey] interface method. + */ + dropPrimaryKey(table: string, name: string): (dbx.Query) + } + interface dualDBBuilder { + /** + * AddForeignKey implements the [dbx.Builder.AddForeignKey] interface method. + */ + addForeignKey(table: string, name: string, cols: Array, refCols: Array, refTable: string, ...options: string[]): (dbx.Query) + } + interface dualDBBuilder { + /** + * DropForeignKey implements the [dbx.Builder.DropForeignKey] interface method. + */ + dropForeignKey(table: string, name: string): (dbx.Query) + } + interface dualDBBuilder { + /** + * CreateIndex implements the [dbx.Builder.CreateIndex] interface method. + */ + createIndex(table: string, name: string, ...cols: string[]): (dbx.Query) + } + interface dualDBBuilder { + /** + * CreateUniqueIndex implements the [dbx.Builder.CreateUniqueIndex] interface method. + */ + createUniqueIndex(table: string, name: string, ...cols: string[]): (dbx.Query) + } + interface dualDBBuilder { + /** + * DropIndex implements the [dbx.Builder.DropIndex] interface method. + */ + dropIndex(table: string, name: string): (dbx.Query) + } + interface dualDBBuilder { + /** + * NewQuery implements the [dbx.Builder.NewQuery] interface method by + * routing the SELECT queries to the concurrent builder instance. + */ + newQuery(str: string): (dbx.Query) + } interface defaultDBConnect { (dbPath: string): (dbx.DB) } @@ -8643,28 +8833,26 @@ namespace core { interface BaseApp { /** * HasTable checks if a table (or view) with the provided name exists (case insensitive). - * in the current app.DB() instance. + * in the data.db. */ hasTable(tableName: string): boolean } interface BaseApp { /** * AuxHasTable checks if a table (or view) with the provided name exists (case insensitive) - * in the current app.AuxDB() instance. + * in the auixiliary.db. */ auxHasTable(tableName: string): boolean } interface BaseApp { /** - * Vacuum executes VACUUM on the current app.DB() instance - * in order to reclaim unused data db disk space. + * Vacuum executes VACUUM on the data.db in order to reclaim unused data db disk space. */ vacuum(): void } interface BaseApp { /** - * AuxVacuum executes VACUUM on the current app.AuxDB() instance - * in order to reclaim unused auxiliary db disk space. + * AuxVacuum executes VACUUM on the auxiliary.db in order to reclaim unused auxiliary db disk space. */ auxVacuum(): void } @@ -8684,13 +8872,27 @@ namespace core { */ auxRunInTransaction(fn: (txApp: App) => void): void } - interface txAppInfo { + /** + * TxAppInfo represents an active transaction context associated to an existing app instance. + */ + interface TxAppInfo { + } + interface TxAppInfo { + /** + * OnComplete registers the provided callback that will be invoked + * once the related transaction ends (either completes successfully or rollbacked with an error). + * + * The callback receives the transaction error (if any) as its argument. + * Any additional errors returned by the OnComplete callbacks will be + * joined together with txErr when returning the final transaction result. + */ + onComplete(fn: (txErr: Error) => void): void } /** * RequestEvent defines the PocketBase router handler event. */ - type _sgjRjyv = router.Event - interface RequestEvent extends _sgjRjyv { + type _sKhraUa = router.Event + interface RequestEvent extends _sKhraUa { app: App auth?: Record } @@ -8750,8 +8952,8 @@ namespace core { */ clone(): (RequestInfo) } - type _sefcbgM = hook.Event&RequestEvent - interface BatchRequestEvent extends _sefcbgM { + type _sbXFFhl = hook.Event&RequestEvent + interface BatchRequestEvent extends _sbXFFhl { batch: Array<(InternalRequest | undefined)> } interface InternalRequest { @@ -8788,24 +8990,24 @@ namespace core { interface baseCollectionEventData { tags(): Array } - type _slyoaon = hook.Event - interface BootstrapEvent extends _slyoaon { + type _spyRtBo = hook.Event + interface BootstrapEvent extends _spyRtBo { app: App } - type _stTZimB = hook.Event - interface TerminateEvent extends _stTZimB { + type _scmVEbS = hook.Event + interface TerminateEvent extends _scmVEbS { app: App isRestart: boolean } - type _smnOmNo = hook.Event - interface BackupEvent extends _smnOmNo { + type _sLJKyMQ = hook.Event + interface BackupEvent extends _sLJKyMQ { app: App context: context.Context name: string // the name of the backup to create/restore. exclude: Array // list of dir entries to exclude from the backup create/restore. } - type _saHyHjH = hook.Event - interface ServeEvent extends _saHyHjH { + type _sZsAFoN = hook.Event + interface ServeEvent extends _sZsAFoN { app: App router?: router.Router server?: http.Server @@ -8828,31 +9030,31 @@ namespace core { */ installerFunc: (app: App, systemSuperuser: Record, baseURL: string) => void } - type _sjfIpXP = hook.Event&RequestEvent - interface SettingsListRequestEvent extends _sjfIpXP { + type _szpyhbL = hook.Event&RequestEvent + interface SettingsListRequestEvent extends _szpyhbL { settings?: Settings } - type _shDoQSP = hook.Event&RequestEvent - interface SettingsUpdateRequestEvent extends _shDoQSP { + type _sUrpTPz = hook.Event&RequestEvent + interface SettingsUpdateRequestEvent extends _sUrpTPz { oldSettings?: Settings newSettings?: Settings } - type _sxdTyKG = hook.Event - interface SettingsReloadEvent extends _sxdTyKG { + type _sOIBUYK = hook.Event + interface SettingsReloadEvent extends _sOIBUYK { app: App } - type _smgTZUv = hook.Event - interface MailerEvent extends _smgTZUv { + type _srxGkIn = hook.Event + interface MailerEvent extends _srxGkIn { app: App mailer: mailer.Mailer message?: mailer.Message } - type _scTLhBE = MailerEvent&baseRecordEventData - interface MailerRecordEvent extends _scTLhBE { + type _spcbBxx = MailerEvent&baseRecordEventData + interface MailerRecordEvent extends _spcbBxx { meta: _TygojaDict } - type _sNcRlIv = hook.Event&baseModelEventData - interface ModelEvent extends _sNcRlIv { + type _seMeelk = hook.Event&baseModelEventData + interface ModelEvent extends _seMeelk { app: App context: context.Context /** @@ -8864,12 +9066,12 @@ namespace core { */ type: string } - type _shduuqv = ModelEvent - interface ModelErrorEvent extends _shduuqv { + type _stQeXll = ModelEvent + interface ModelErrorEvent extends _stQeXll { error: Error } - type _spDNbJF = hook.Event&baseRecordEventData - interface RecordEvent extends _spDNbJF { + type _sLYFFhx = hook.Event&baseRecordEventData + interface RecordEvent extends _sLYFFhx { app: App context: context.Context /** @@ -8881,12 +9083,12 @@ namespace core { */ type: string } - type _sjbgsFq = RecordEvent - interface RecordErrorEvent extends _sjbgsFq { + type _sWPmnLi = RecordEvent + interface RecordErrorEvent extends _sWPmnLi { error: Error } - type _sevecpA = hook.Event&baseCollectionEventData - interface CollectionEvent extends _sevecpA { + type _seGYfWU = hook.Event&baseCollectionEventData + interface CollectionEvent extends _seGYfWU { app: App context: context.Context /** @@ -8898,95 +9100,95 @@ namespace core { */ type: string } - type _srDChjg = CollectionEvent - interface CollectionErrorEvent extends _srDChjg { + type _sOEsoWv = CollectionEvent + interface CollectionErrorEvent extends _sOEsoWv { error: Error } - type _sHpoeWa = hook.Event&RequestEvent&baseRecordEventData - interface FileTokenRequestEvent extends _sHpoeWa { + type _swJRVXC = hook.Event&RequestEvent&baseRecordEventData + interface FileTokenRequestEvent extends _swJRVXC { token: string } - type _sajLYWu = hook.Event&RequestEvent&baseCollectionEventData - interface FileDownloadRequestEvent extends _sajLYWu { + type _skWTzPe = hook.Event&RequestEvent&baseCollectionEventData + interface FileDownloadRequestEvent extends _skWTzPe { record?: Record fileField?: FileField servedPath: string servedName: string } - type _sMlbYER = hook.Event&RequestEvent - interface CollectionsListRequestEvent extends _sMlbYER { + type _sjZNtLd = hook.Event&RequestEvent + interface CollectionsListRequestEvent extends _sjZNtLd { collections: Array<(Collection | undefined)> result?: search.Result } - type _sGLWpJg = hook.Event&RequestEvent - interface CollectionsImportRequestEvent extends _sGLWpJg { + type _sQwJwmj = hook.Event&RequestEvent + interface CollectionsImportRequestEvent extends _sQwJwmj { collectionsData: Array<_TygojaDict> deleteMissing: boolean } - type _sexppuu = hook.Event&RequestEvent&baseCollectionEventData - interface CollectionRequestEvent extends _sexppuu { + type _ssHWEJn = hook.Event&RequestEvent&baseCollectionEventData + interface CollectionRequestEvent extends _ssHWEJn { } - type _sjJsxVo = hook.Event&RequestEvent - interface RealtimeConnectRequestEvent extends _sjJsxVo { + type _sZMxaAS = hook.Event&RequestEvent + interface RealtimeConnectRequestEvent extends _sZMxaAS { client: subscriptions.Client /** * note: modifying it after the connect has no effect */ idleTimeout: time.Duration } - type _sDgBdgY = hook.Event&RequestEvent - interface RealtimeMessageEvent extends _sDgBdgY { + type _sirsirI = hook.Event&RequestEvent + interface RealtimeMessageEvent extends _sirsirI { client: subscriptions.Client message?: subscriptions.Message } - type _sCAVeFa = hook.Event&RequestEvent - interface RealtimeSubscribeRequestEvent extends _sCAVeFa { + type _sGVLXGI = hook.Event&RequestEvent + interface RealtimeSubscribeRequestEvent extends _sGVLXGI { client: subscriptions.Client subscriptions: Array } - type _sSxihHJ = hook.Event&RequestEvent&baseCollectionEventData - interface RecordsListRequestEvent extends _sSxihHJ { + type _sNkctgx = hook.Event&RequestEvent&baseCollectionEventData + interface RecordsListRequestEvent extends _sNkctgx { /** * @todo consider removing and maybe add as generic to the search.Result? */ records: Array<(Record | undefined)> result?: search.Result } - type _sATsCuP = hook.Event&RequestEvent&baseCollectionEventData - interface RecordRequestEvent extends _sATsCuP { + type _sesXIeC = hook.Event&RequestEvent&baseCollectionEventData + interface RecordRequestEvent extends _sesXIeC { record?: Record } - type _sWNhoZK = hook.Event&baseRecordEventData - interface RecordEnrichEvent extends _sWNhoZK { + type _sNqEfxw = hook.Event&baseRecordEventData + interface RecordEnrichEvent extends _sNqEfxw { app: App requestInfo?: RequestInfo } - type _sjrCJLJ = hook.Event&RequestEvent&baseCollectionEventData - interface RecordCreateOTPRequestEvent extends _sjrCJLJ { + type _saJisDV = hook.Event&RequestEvent&baseCollectionEventData + interface RecordCreateOTPRequestEvent extends _saJisDV { record?: Record password: string } - type _stapJTk = hook.Event&RequestEvent&baseCollectionEventData - interface RecordAuthWithOTPRequestEvent extends _stapJTk { + type _sOSfgvh = hook.Event&RequestEvent&baseCollectionEventData + interface RecordAuthWithOTPRequestEvent extends _sOSfgvh { record?: Record otp?: OTP } - type _snjCSRB = hook.Event&RequestEvent&baseCollectionEventData - interface RecordAuthRequestEvent extends _snjCSRB { + type _sAHiJnG = hook.Event&RequestEvent&baseCollectionEventData + interface RecordAuthRequestEvent extends _sAHiJnG { record?: Record token: string meta: any authMethod: string } - type _sqiNpQO = hook.Event&RequestEvent&baseCollectionEventData - interface RecordAuthWithPasswordRequestEvent extends _sqiNpQO { + type _syiXgiO = hook.Event&RequestEvent&baseCollectionEventData + interface RecordAuthWithPasswordRequestEvent extends _syiXgiO { record?: Record identity: string identityField: string password: string } - type _swUWIwN = hook.Event&RequestEvent&baseCollectionEventData - interface RecordAuthWithOAuth2RequestEvent extends _swUWIwN { + type _sRauTZa = hook.Event&RequestEvent&baseCollectionEventData + interface RecordAuthWithOAuth2RequestEvent extends _sRauTZa { providerName: string providerClient: auth.Provider record?: Record @@ -8994,41 +9196,41 @@ namespace core { createData: _TygojaDict isNewRecord: boolean } - type _sTOKZtT = hook.Event&RequestEvent&baseCollectionEventData - interface RecordAuthRefreshRequestEvent extends _sTOKZtT { + type _srGgmEJ = hook.Event&RequestEvent&baseCollectionEventData + interface RecordAuthRefreshRequestEvent extends _srGgmEJ { record?: Record } - type _smhPrJE = hook.Event&RequestEvent&baseCollectionEventData - interface RecordRequestPasswordResetRequestEvent extends _smhPrJE { + type _sFfmUxk = hook.Event&RequestEvent&baseCollectionEventData + interface RecordRequestPasswordResetRequestEvent extends _sFfmUxk { record?: Record } - type _seyBywb = hook.Event&RequestEvent&baseCollectionEventData - interface RecordConfirmPasswordResetRequestEvent extends _seyBywb { + type _sLGZbki = hook.Event&RequestEvent&baseCollectionEventData + interface RecordConfirmPasswordResetRequestEvent extends _sLGZbki { record?: Record } - type _sOTimJR = hook.Event&RequestEvent&baseCollectionEventData - interface RecordRequestVerificationRequestEvent extends _sOTimJR { + type _sQcbAzh = hook.Event&RequestEvent&baseCollectionEventData + interface RecordRequestVerificationRequestEvent extends _sQcbAzh { record?: Record } - type _sujpNMo = hook.Event&RequestEvent&baseCollectionEventData - interface RecordConfirmVerificationRequestEvent extends _sujpNMo { + type _sIJpEBx = hook.Event&RequestEvent&baseCollectionEventData + interface RecordConfirmVerificationRequestEvent extends _sIJpEBx { record?: Record } - type _sdRcSQz = hook.Event&RequestEvent&baseCollectionEventData - interface RecordRequestEmailChangeRequestEvent extends _sdRcSQz { + type _sGcXDVI = hook.Event&RequestEvent&baseCollectionEventData + interface RecordRequestEmailChangeRequestEvent extends _sGcXDVI { record?: Record newEmail: string } - type _snWjMuj = hook.Event&RequestEvent&baseCollectionEventData - interface RecordConfirmEmailChangeRequestEvent extends _snWjMuj { + type _sFyRDNw = hook.Event&RequestEvent&baseCollectionEventData + interface RecordConfirmEmailChangeRequestEvent extends _sFyRDNw { record?: Record newEmail: string } /** * ExternalAuth defines a Record proxy for working with the externalAuths collection. */ - type _sAWReuX = Record - interface ExternalAuth extends _sAWReuX { + type _sBktZEa = Record + interface ExternalAuth extends _sBktZEa { } interface newExternalAuth { /** @@ -10306,7 +10508,7 @@ namespace core { /** * MaxSize specifies the maximum size of the allowed field value (in bytes and up to 2^53-1). * - * If zero, a default limit of 5MB is applied. + * If zero, a default limit of 1MB is applied. */ maxSize: number /** @@ -11490,8 +11692,8 @@ namespace core { interface onlyFieldType { type: string } - type _sUmsJeP = Field - interface fieldWithType extends _sUmsJeP { + type _sHqecYH = Field + interface fieldWithType extends _sHqecYH { type: string } interface fieldWithType { @@ -11523,8 +11725,8 @@ namespace core { */ scan(value: any): void } - type _spONyAk = BaseModel - interface Log extends _spONyAk { + type _sUWXjNf = BaseModel + interface Log extends _sUWXjNf { created: types.DateTime data: types.JSONMap message: string @@ -11570,8 +11772,8 @@ namespace core { /** * MFA defines a Record proxy for working with the mfas collection. */ - type _sPmjoIt = Record - interface MFA extends _sPmjoIt { + type _sobFmjd = Record + interface MFA extends _sobFmjd { } interface newMFA { /** @@ -11793,8 +11995,8 @@ namespace core { /** * OTP defines a Record proxy for working with the otps collection. */ - type _sMbRUkg = Record - interface OTP extends _sMbRUkg { + type _swyrTJF = Record + interface OTP extends _swyrTJF { } interface newOTP { /** @@ -12030,8 +12232,8 @@ namespace core { } interface runner { } - type _szTxNVa = BaseModel - interface Record extends _szTxNVa { + type _sksdbkz = BaseModel + interface Record extends _sksdbkz { } interface newRecord { /** @@ -12506,8 +12708,8 @@ namespace core { * BaseRecordProxy implements the [RecordProxy] interface and it is intended * to be used as embed to custom user provided Record proxy structs. */ - type _sXGjidT = Record - interface BaseRecordProxy extends _sXGjidT { + type _sPOlOfX = Record + interface BaseRecordProxy extends _sPOlOfX { } interface BaseRecordProxy { /** @@ -12756,8 +12958,8 @@ namespace core { /** * Settings defines the PocketBase app settings. */ - type _sNyTggi = settings - interface Settings extends _sNyTggi { + type _sXtvxjh = settings + interface Settings extends _sXtvxjh { } interface Settings { /** @@ -13058,8 +13260,8 @@ namespace core { */ durationTime(): time.Duration } - type _saXVBKQ = BaseModel - interface Param extends _saXVBKQ { + type _sCbDiPV = BaseModel + interface Param extends _sCbDiPV { created: types.DateTime updated: types.DateTime value: types.JSONRaw @@ -13573,8 +13775,8 @@ namespace apis { */ (limitBytes: number): (hook.Handler) } - type _srOkiJJ = io.ReadCloser - interface limitedReader extends _srOkiJJ { + type _svzUclG = io.ReadCloser + interface limitedReader extends _svzUclG { } interface limitedReader { read(b: string|Array): number @@ -13725,8 +13927,8 @@ namespace apis { */ (config: GzipConfig): (hook.Handler) } - type _sZgNMls = http.ResponseWriter&io.Writer - interface gzipResponseWriter extends _sZgNMls { + type _sGCwxMx = http.ResponseWriter&io.Writer + interface gzipResponseWriter extends _sGCwxMx { } interface gzipResponseWriter { writeHeader(code: number): void @@ -13746,11 +13948,11 @@ namespace apis { interface gzipResponseWriter { unwrap(): http.ResponseWriter } - type _scmaGaH = sync.RWMutex - interface rateLimiter extends _scmaGaH { + type _sXBRDsb = sync.RWMutex + interface rateLimiter extends _sXBRDsb { } - type _slqWlTd = sync.Mutex - interface fixedWindow extends _slqWlTd { + type _sxuiJKx = sync.Mutex + interface fixedWindow extends _sxuiJKx { } interface realtimeSubscribeForm { clientId: string @@ -13991,8 +14193,8 @@ namespace pocketbase { * It implements [CoreApp] via embedding and all of the app interface methods * could be accessed directly through the instance (eg. PocketBase.DataDir()). */ - type _scfUcGQ = CoreApp - interface PocketBase extends _scfUcGQ { + type _sQnaLxt = CoreApp + interface PocketBase extends _sQnaLxt { /** * RootCmd is the main console command */ @@ -14077,6 +14279,111 @@ namespace pocketbase { } } +/** + * Package template is a thin wrapper around the standard html/template + * and text/template packages that implements a convenient registry to + * load and cache templates on the fly concurrently. + * + * It was created to assist the JSVM plugin HTML rendering, but could be used in other Go code. + * + * Example: + * + * ``` + * registry := template.NewRegistry() + * + * html1, err := registry.LoadFiles( + * // the files set wil be parsed only once and then cached + * "layout.html", + * "content.html", + * ).Render(map[string]any{"name": "John"}) + * + * html2, err := registry.LoadFiles( + * // reuse the already parsed and cached files set + * "layout.html", + * "content.html", + * ).Render(map[string]any{"name": "Jane"}) + * ``` + */ +namespace template { + interface newRegistry { + /** + * NewRegistry creates and initializes a new templates registry with + * some defaults (eg. global "raw" template function for unescaped HTML). + * + * Use the Registry.Load* methods to load templates into the registry. + */ + (): (Registry) + } + /** + * Registry defines a templates registry that is safe to be used by multiple goroutines. + * + * Use the Registry.Load* methods to load templates into the registry. + */ + interface Registry { + } + interface Registry { + /** + * AddFuncs registers new global template functions. + * + * The key of each map entry is the function name that will be used in the templates. + * If a function with the map entry name already exists it will be replaced with the new one. + * + * The value of each map entry is a function that must have either a + * single return value, or two return values of which the second has type error. + * + * Example: + * + * ``` + * r.AddFuncs(map[string]any{ + * "toUpper": func(str string) string { + * return strings.ToUppser(str) + * }, + * ... + * }) + * ``` + */ + addFuncs(funcs: _TygojaDict): (Registry) + } + interface Registry { + /** + * LoadFiles caches (if not already) the specified filenames set as a + * single template and returns a ready to use Renderer instance. + * + * There must be at least 1 filename specified. + */ + loadFiles(...filenames: string[]): (Renderer) + } + interface Registry { + /** + * LoadString caches (if not already) the specified inline string as a + * single template and returns a ready to use Renderer instance. + */ + loadString(text: string): (Renderer) + } + interface Registry { + /** + * LoadFS caches (if not already) the specified fs and globPatterns + * pair as single template and returns a ready to use Renderer instance. + * + * There must be at least 1 file matching the provided globPattern(s) + * (note that most file names serves as glob patterns matching themselves). + */ + loadFS(fsys: fs.FS, ...globPatterns: string[]): (Renderer) + } + /** + * Renderer defines a single parsed template. + */ + interface Renderer { + } + interface Renderer { + /** + * Render executes the template with the specified data as the dot object + * and returns the result as plain string. + */ + render(data: any): string + } +} + /** * Package sync provides basic synchronization primitives such as mutual * exclusion locks. Other than the [Once] and [WaitGroup] types, most are intended @@ -15120,169 +15427,6 @@ namespace time { } } -/** - * Package context defines the Context type, which carries deadlines, - * cancellation signals, and other request-scoped values across API boundaries - * and between processes. - * - * Incoming requests to a server should create a [Context], and outgoing - * calls to servers should accept a Context. The chain of function - * calls between them must propagate the Context, optionally replacing - * it with a derived Context created using [WithCancel], [WithDeadline], - * [WithTimeout], or [WithValue]. When a Context is canceled, all - * Contexts derived from it are also canceled. - * - * The [WithCancel], [WithDeadline], and [WithTimeout] functions take a - * Context (the parent) and return a derived Context (the child) and a - * [CancelFunc]. Calling the CancelFunc cancels the child and its - * children, removes the parent's reference to the child, and stops - * any associated timers. Failing to call the CancelFunc leaks the - * child and its children until the parent is canceled or the timer - * fires. The go vet tool checks that CancelFuncs are used on all - * control-flow paths. - * - * The [WithCancelCause] function returns a [CancelCauseFunc], which - * takes an error and records it as the cancellation cause. Calling - * [Cause] on the canceled context or any of its children retrieves - * the cause. If no cause is specified, Cause(ctx) returns the same - * value as ctx.Err(). - * - * Programs that use Contexts should follow these rules to keep interfaces - * consistent across packages and enable static analysis tools to check context - * propagation: - * - * Do not store Contexts inside a struct type; instead, pass a Context - * explicitly to each function that needs it. The Context should be the first - * parameter, typically named ctx: - * - * ``` - * func DoSomething(ctx context.Context, arg Arg) error { - * // ... use ctx ... - * } - * ``` - * - * Do not pass a nil [Context], even if a function permits it. Pass [context.TODO] - * if you are unsure about which Context to use. - * - * Use context Values only for request-scoped data that transits processes and - * APIs, not for passing optional parameters to functions. - * - * The same Context may be passed to functions running in different goroutines; - * Contexts are safe for simultaneous use by multiple goroutines. - * - * See https://blog.golang.org/context for example code for a server that uses - * Contexts. - */ -namespace context { - /** - * A Context carries a deadline, a cancellation signal, and other values across - * API boundaries. - * - * Context's methods may be called by multiple goroutines simultaneously. - */ - interface Context { - [key:string]: any; - /** - * Deadline returns the time when work done on behalf of this context - * should be canceled. Deadline returns ok==false when no deadline is - * set. Successive calls to Deadline return the same results. - */ - deadline(): [time.Time, boolean] - /** - * Done returns a channel that's closed when work done on behalf of this - * context should be canceled. Done may return nil if this context can - * never be canceled. Successive calls to Done return the same value. - * The close of the Done channel may happen asynchronously, - * after the cancel function returns. - * - * WithCancel arranges for Done to be closed when cancel is called; - * WithDeadline arranges for Done to be closed when the deadline - * expires; WithTimeout arranges for Done to be closed when the timeout - * elapses. - * - * Done is provided for use in select statements: - * - * // Stream generates values with DoSomething and sends them to out - * // until DoSomething returns an error or ctx.Done is closed. - * func Stream(ctx context.Context, out chan<- Value) error { - * for { - * v, err := DoSomething(ctx) - * if err != nil { - * return err - * } - * select { - * case <-ctx.Done(): - * return ctx.Err() - * case out <- v: - * } - * } - * } - * - * See https://blog.golang.org/pipelines for more examples of how to use - * a Done channel for cancellation. - */ - done(): undefined - /** - * If Done is not yet closed, Err returns nil. - * If Done is closed, Err returns a non-nil error explaining why: - * Canceled if the context was canceled - * or DeadlineExceeded if the context's deadline passed. - * After Err returns a non-nil error, successive calls to Err return the same error. - */ - err(): void - /** - * Value returns the value associated with this context for key, or nil - * if no value is associated with key. Successive calls to Value with - * the same key returns the same result. - * - * Use context values only for request-scoped data that transits - * processes and API boundaries, not for passing optional parameters to - * functions. - * - * A key identifies a specific value in a Context. Functions that wish - * to store values in Context typically allocate a key in a global - * variable then use that key as the argument to context.WithValue and - * Context.Value. A key can be any type that supports equality; - * packages should define keys as an unexported type to avoid - * collisions. - * - * Packages that define a Context key should provide type-safe accessors - * for the values stored using that key: - * - * ``` - * // Package user defines a User type that's stored in Contexts. - * package user - * - * import "context" - * - * // User is the type of value stored in the Contexts. - * type User struct {...} - * - * // key is an unexported type for keys defined in this package. - * // This prevents collisions with keys defined in other packages. - * type key int - * - * // userKey is the key for user.User values in Contexts. It is - * // unexported; clients use user.NewContext and user.FromContext - * // instead of using this key directly. - * var userKey key - * - * // NewContext returns a new Context that carries value u. - * func NewContext(ctx context.Context, u *User) context.Context { - * return context.WithValue(ctx, userKey, u) - * } - * - * // FromContext returns the User value stored in ctx, if any. - * func FromContext(ctx context.Context) (*User, bool) { - * u, ok := ctx.Value(userKey).(*User) - * return u, ok - * } - * ``` - */ - value(key: any): any - } -} - /** * Package fs defines basic interfaces to a file system. * A file system can be provided by the host operating system @@ -15484,17 +15628,1127 @@ namespace fs { } /** - * Package bufio implements buffered I/O. It wraps an io.Reader or io.Writer - * object, creating another object (Reader or Writer) that also implements - * the interface but provides buffering and some help for textual I/O. + * Package context defines the Context type, which carries deadlines, + * cancellation signals, and other request-scoped values across API boundaries + * and between processes. + * + * Incoming requests to a server should create a [Context], and outgoing + * calls to servers should accept a Context. The chain of function + * calls between them must propagate the Context, optionally replacing + * it with a derived Context created using [WithCancel], [WithDeadline], + * [WithTimeout], or [WithValue]. When a Context is canceled, all + * Contexts derived from it are also canceled. + * + * The [WithCancel], [WithDeadline], and [WithTimeout] functions take a + * Context (the parent) and return a derived Context (the child) and a + * [CancelFunc]. Calling the CancelFunc cancels the child and its + * children, removes the parent's reference to the child, and stops + * any associated timers. Failing to call the CancelFunc leaks the + * child and its children until the parent is canceled or the timer + * fires. The go vet tool checks that CancelFuncs are used on all + * control-flow paths. + * + * The [WithCancelCause] function returns a [CancelCauseFunc], which + * takes an error and records it as the cancellation cause. Calling + * [Cause] on the canceled context or any of its children retrieves + * the cause. If no cause is specified, Cause(ctx) returns the same + * value as ctx.Err(). + * + * Programs that use Contexts should follow these rules to keep interfaces + * consistent across packages and enable static analysis tools to check context + * propagation: + * + * Do not store Contexts inside a struct type; instead, pass a Context + * explicitly to each function that needs it. The Context should be the first + * parameter, typically named ctx: + * + * ``` + * func DoSomething(ctx context.Context, arg Arg) error { + * // ... use ctx ... + * } + * ``` + * + * Do not pass a nil [Context], even if a function permits it. Pass [context.TODO] + * if you are unsure about which Context to use. + * + * Use context Values only for request-scoped data that transits processes and + * APIs, not for passing optional parameters to functions. + * + * The same Context may be passed to functions running in different goroutines; + * Contexts are safe for simultaneous use by multiple goroutines. + * + * See https://blog.golang.org/context for example code for a server that uses + * Contexts. */ -namespace bufio { +namespace context { /** - * ReadWriter stores pointers to a [Reader] and a [Writer]. - * It implements [io.ReadWriter]. + * A Context carries a deadline, a cancellation signal, and other values across + * API boundaries. + * + * Context's methods may be called by multiple goroutines simultaneously. */ - type _sGpwNFe = Reader&Writer - interface ReadWriter extends _sGpwNFe { + interface Context { + [key:string]: any; + /** + * Deadline returns the time when work done on behalf of this context + * should be canceled. Deadline returns ok==false when no deadline is + * set. Successive calls to Deadline return the same results. + */ + deadline(): [time.Time, boolean] + /** + * Done returns a channel that's closed when work done on behalf of this + * context should be canceled. Done may return nil if this context can + * never be canceled. Successive calls to Done return the same value. + * The close of the Done channel may happen asynchronously, + * after the cancel function returns. + * + * WithCancel arranges for Done to be closed when cancel is called; + * WithDeadline arranges for Done to be closed when the deadline + * expires; WithTimeout arranges for Done to be closed when the timeout + * elapses. + * + * Done is provided for use in select statements: + * + * // Stream generates values with DoSomething and sends them to out + * // until DoSomething returns an error or ctx.Done is closed. + * func Stream(ctx context.Context, out chan<- Value) error { + * for { + * v, err := DoSomething(ctx) + * if err != nil { + * return err + * } + * select { + * case <-ctx.Done(): + * return ctx.Err() + * case out <- v: + * } + * } + * } + * + * See https://blog.golang.org/pipelines for more examples of how to use + * a Done channel for cancellation. + */ + done(): undefined + /** + * If Done is not yet closed, Err returns nil. + * If Done is closed, Err returns a non-nil error explaining why: + * Canceled if the context was canceled + * or DeadlineExceeded if the context's deadline passed. + * After Err returns a non-nil error, successive calls to Err return the same error. + */ + err(): void + /** + * Value returns the value associated with this context for key, or nil + * if no value is associated with key. Successive calls to Value with + * the same key returns the same result. + * + * Use context values only for request-scoped data that transits + * processes and API boundaries, not for passing optional parameters to + * functions. + * + * A key identifies a specific value in a Context. Functions that wish + * to store values in Context typically allocate a key in a global + * variable then use that key as the argument to context.WithValue and + * Context.Value. A key can be any type that supports equality; + * packages should define keys as an unexported type to avoid + * collisions. + * + * Packages that define a Context key should provide type-safe accessors + * for the values stored using that key: + * + * ``` + * // Package user defines a User type that's stored in Contexts. + * package user + * + * import "context" + * + * // User is the type of value stored in the Contexts. + * type User struct {...} + * + * // key is an unexported type for keys defined in this package. + * // This prevents collisions with keys defined in other packages. + * type key int + * + * // userKey is the key for user.User values in Contexts. It is + * // unexported; clients use user.NewContext and user.FromContext + * // instead of using this key directly. + * var userKey key + * + * // NewContext returns a new Context that carries value u. + * func NewContext(ctx context.Context, u *User) context.Context { + * return context.WithValue(ctx, userKey, u) + * } + * + * // FromContext returns the User value stored in ctx, if any. + * func FromContext(ctx context.Context) (*User, bool) { + * u, ok := ctx.Value(userKey).(*User) + * return u, ok + * } + * ``` + */ + value(key: any): any + } +} + +/** + * Package sql provides a generic interface around SQL (or SQL-like) + * databases. + * + * The sql package must be used in conjunction with a database driver. + * See https://golang.org/s/sqldrivers for a list of drivers. + * + * Drivers that do not support context cancellation will not return until + * after the query is completed. + * + * For usage examples, see the wiki page at + * https://golang.org/s/sqlwiki. + */ +namespace sql { + /** + * TxOptions holds the transaction options to be used in [DB.BeginTx]. + */ + interface TxOptions { + /** + * Isolation is the transaction isolation level. + * If zero, the driver or database's default level is used. + */ + isolation: IsolationLevel + readOnly: boolean + } + /** + * NullString represents a string that may be null. + * NullString implements the [Scanner] interface so + * it can be used as a scan destination: + * + * ``` + * var s NullString + * err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&s) + * ... + * if s.Valid { + * // use s.String + * } else { + * // NULL value + * } + * ``` + */ + interface NullString { + string: string + valid: boolean // Valid is true if String is not NULL + } + interface NullString { + /** + * Scan implements the [Scanner] interface. + */ + scan(value: any): void + } + interface NullString { + /** + * Value implements the [driver.Valuer] interface. + */ + value(): any + } + /** + * DB is a database handle representing a pool of zero or more + * underlying connections. It's safe for concurrent use by multiple + * goroutines. + * + * The sql package creates and frees connections automatically; it + * also maintains a free pool of idle connections. If the database has + * a concept of per-connection state, such state can be reliably observed + * within a transaction ([Tx]) or connection ([Conn]). Once [DB.Begin] is called, the + * returned [Tx] is bound to a single connection. Once [Tx.Commit] or + * [Tx.Rollback] is called on the transaction, that transaction's + * connection is returned to [DB]'s idle connection pool. The pool size + * can be controlled with [DB.SetMaxIdleConns]. + */ + interface DB { + } + interface DB { + /** + * PingContext verifies a connection to the database is still alive, + * establishing a connection if necessary. + */ + pingContext(ctx: context.Context): void + } + interface DB { + /** + * Ping verifies a connection to the database is still alive, + * establishing a connection if necessary. + * + * Ping uses [context.Background] internally; to specify the context, use + * [DB.PingContext]. + */ + ping(): void + } + interface DB { + /** + * Close closes the database and prevents new queries from starting. + * Close then waits for all queries that have started processing on the server + * to finish. + * + * It is rare to Close a [DB], as the [DB] handle is meant to be + * long-lived and shared between many goroutines. + */ + close(): void + } + interface DB { + /** + * SetMaxIdleConns sets the maximum number of connections in the idle + * connection pool. + * + * If MaxOpenConns is greater than 0 but less than the new MaxIdleConns, + * then the new MaxIdleConns will be reduced to match the MaxOpenConns limit. + * + * If n <= 0, no idle connections are retained. + * + * The default max idle connections is currently 2. This may change in + * a future release. + */ + setMaxIdleConns(n: number): void + } + interface DB { + /** + * SetMaxOpenConns sets the maximum number of open connections to the database. + * + * If MaxIdleConns is greater than 0 and the new MaxOpenConns is less than + * MaxIdleConns, then MaxIdleConns will be reduced to match the new + * MaxOpenConns limit. + * + * If n <= 0, then there is no limit on the number of open connections. + * The default is 0 (unlimited). + */ + setMaxOpenConns(n: number): void + } + interface DB { + /** + * SetConnMaxLifetime sets the maximum amount of time a connection may be reused. + * + * Expired connections may be closed lazily before reuse. + * + * If d <= 0, connections are not closed due to a connection's age. + */ + setConnMaxLifetime(d: time.Duration): void + } + interface DB { + /** + * SetConnMaxIdleTime sets the maximum amount of time a connection may be idle. + * + * Expired connections may be closed lazily before reuse. + * + * If d <= 0, connections are not closed due to a connection's idle time. + */ + setConnMaxIdleTime(d: time.Duration): void + } + interface DB { + /** + * Stats returns database statistics. + */ + stats(): DBStats + } + interface DB { + /** + * PrepareContext creates a prepared statement for later queries or executions. + * Multiple queries or executions may be run concurrently from the + * returned statement. + * The caller must call the statement's [*Stmt.Close] method + * when the statement is no longer needed. + * + * The provided context is used for the preparation of the statement, not for the + * execution of the statement. + */ + prepareContext(ctx: context.Context, query: string): (Stmt) + } + interface DB { + /** + * Prepare creates a prepared statement for later queries or executions. + * Multiple queries or executions may be run concurrently from the + * returned statement. + * The caller must call the statement's [*Stmt.Close] method + * when the statement is no longer needed. + * + * Prepare uses [context.Background] internally; to specify the context, use + * [DB.PrepareContext]. + */ + prepare(query: string): (Stmt) + } + interface DB { + /** + * ExecContext executes a query without returning any rows. + * The args are for any placeholder parameters in the query. + */ + execContext(ctx: context.Context, query: string, ...args: any[]): Result + } + interface DB { + /** + * Exec executes a query without returning any rows. + * The args are for any placeholder parameters in the query. + * + * Exec uses [context.Background] internally; to specify the context, use + * [DB.ExecContext]. + */ + exec(query: string, ...args: any[]): Result + } + interface DB { + /** + * QueryContext executes a query that returns rows, typically a SELECT. + * The args are for any placeholder parameters in the query. + */ + queryContext(ctx: context.Context, query: string, ...args: any[]): (Rows) + } + interface DB { + /** + * Query executes a query that returns rows, typically a SELECT. + * The args are for any placeholder parameters in the query. + * + * Query uses [context.Background] internally; to specify the context, use + * [DB.QueryContext]. + */ + query(query: string, ...args: any[]): (Rows) + } + interface DB { + /** + * QueryRowContext executes a query that is expected to return at most one row. + * QueryRowContext always returns a non-nil value. Errors are deferred until + * [Row]'s Scan method is called. + * If the query selects no rows, the [*Row.Scan] will return [ErrNoRows]. + * Otherwise, [*Row.Scan] scans the first selected row and discards + * the rest. + */ + queryRowContext(ctx: context.Context, query: string, ...args: any[]): (Row) + } + interface DB { + /** + * QueryRow executes a query that is expected to return at most one row. + * QueryRow always returns a non-nil value. Errors are deferred until + * [Row]'s Scan method is called. + * If the query selects no rows, the [*Row.Scan] will return [ErrNoRows]. + * Otherwise, [*Row.Scan] scans the first selected row and discards + * the rest. + * + * QueryRow uses [context.Background] internally; to specify the context, use + * [DB.QueryRowContext]. + */ + queryRow(query: string, ...args: any[]): (Row) + } + interface DB { + /** + * BeginTx starts a transaction. + * + * The provided context is used until the transaction is committed or rolled back. + * If the context is canceled, the sql package will roll back + * the transaction. [Tx.Commit] will return an error if the context provided to + * BeginTx is canceled. + * + * The provided [TxOptions] is optional and may be nil if defaults should be used. + * If a non-default isolation level is used that the driver doesn't support, + * an error will be returned. + */ + beginTx(ctx: context.Context, opts: TxOptions): (Tx) + } + interface DB { + /** + * Begin starts a transaction. The default isolation level is dependent on + * the driver. + * + * Begin uses [context.Background] internally; to specify the context, use + * [DB.BeginTx]. + */ + begin(): (Tx) + } + interface DB { + /** + * Driver returns the database's underlying driver. + */ + driver(): any + } + interface DB { + /** + * Conn returns a single connection by either opening a new connection + * or returning an existing connection from the connection pool. Conn will + * block until either a connection is returned or ctx is canceled. + * Queries run on the same Conn will be run in the same database session. + * + * Every Conn must be returned to the database pool after use by + * calling [Conn.Close]. + */ + conn(ctx: context.Context): (Conn) + } + /** + * Tx is an in-progress database transaction. + * + * A transaction must end with a call to [Tx.Commit] or [Tx.Rollback]. + * + * After a call to [Tx.Commit] or [Tx.Rollback], all operations on the + * transaction fail with [ErrTxDone]. + * + * The statements prepared for a transaction by calling + * the transaction's [Tx.Prepare] or [Tx.Stmt] methods are closed + * by the call to [Tx.Commit] or [Tx.Rollback]. + */ + interface Tx { + } + interface Tx { + /** + * Commit commits the transaction. + */ + commit(): void + } + interface Tx { + /** + * Rollback aborts the transaction. + */ + rollback(): void + } + interface Tx { + /** + * PrepareContext creates a prepared statement for use within a transaction. + * + * The returned statement operates within the transaction and will be closed + * when the transaction has been committed or rolled back. + * + * To use an existing prepared statement on this transaction, see [Tx.Stmt]. + * + * The provided context will be used for the preparation of the context, not + * for the execution of the returned statement. The returned statement + * will run in the transaction context. + */ + prepareContext(ctx: context.Context, query: string): (Stmt) + } + interface Tx { + /** + * Prepare creates a prepared statement for use within a transaction. + * + * The returned statement operates within the transaction and will be closed + * when the transaction has been committed or rolled back. + * + * To use an existing prepared statement on this transaction, see [Tx.Stmt]. + * + * Prepare uses [context.Background] internally; to specify the context, use + * [Tx.PrepareContext]. + */ + prepare(query: string): (Stmt) + } + interface Tx { + /** + * StmtContext returns a transaction-specific prepared statement from + * an existing statement. + * + * Example: + * + * ``` + * updateMoney, err := db.Prepare("UPDATE balance SET money=money+? WHERE id=?") + * ... + * tx, err := db.Begin() + * ... + * res, err := tx.StmtContext(ctx, updateMoney).Exec(123.45, 98293203) + * ``` + * + * The provided context is used for the preparation of the statement, not for the + * execution of the statement. + * + * The returned statement operates within the transaction and will be closed + * when the transaction has been committed or rolled back. + */ + stmtContext(ctx: context.Context, stmt: Stmt): (Stmt) + } + interface Tx { + /** + * Stmt returns a transaction-specific prepared statement from + * an existing statement. + * + * Example: + * + * ``` + * updateMoney, err := db.Prepare("UPDATE balance SET money=money+? WHERE id=?") + * ... + * tx, err := db.Begin() + * ... + * res, err := tx.Stmt(updateMoney).Exec(123.45, 98293203) + * ``` + * + * The returned statement operates within the transaction and will be closed + * when the transaction has been committed or rolled back. + * + * Stmt uses [context.Background] internally; to specify the context, use + * [Tx.StmtContext]. + */ + stmt(stmt: Stmt): (Stmt) + } + interface Tx { + /** + * ExecContext executes a query that doesn't return rows. + * For example: an INSERT and UPDATE. + */ + execContext(ctx: context.Context, query: string, ...args: any[]): Result + } + interface Tx { + /** + * Exec executes a query that doesn't return rows. + * For example: an INSERT and UPDATE. + * + * Exec uses [context.Background] internally; to specify the context, use + * [Tx.ExecContext]. + */ + exec(query: string, ...args: any[]): Result + } + interface Tx { + /** + * QueryContext executes a query that returns rows, typically a SELECT. + */ + queryContext(ctx: context.Context, query: string, ...args: any[]): (Rows) + } + interface Tx { + /** + * Query executes a query that returns rows, typically a SELECT. + * + * Query uses [context.Background] internally; to specify the context, use + * [Tx.QueryContext]. + */ + query(query: string, ...args: any[]): (Rows) + } + interface Tx { + /** + * QueryRowContext executes a query that is expected to return at most one row. + * QueryRowContext always returns a non-nil value. Errors are deferred until + * [Row]'s Scan method is called. + * If the query selects no rows, the [*Row.Scan] will return [ErrNoRows]. + * Otherwise, the [*Row.Scan] scans the first selected row and discards + * the rest. + */ + queryRowContext(ctx: context.Context, query: string, ...args: any[]): (Row) + } + interface Tx { + /** + * QueryRow executes a query that is expected to return at most one row. + * QueryRow always returns a non-nil value. Errors are deferred until + * [Row]'s Scan method is called. + * If the query selects no rows, the [*Row.Scan] will return [ErrNoRows]. + * Otherwise, the [*Row.Scan] scans the first selected row and discards + * the rest. + * + * QueryRow uses [context.Background] internally; to specify the context, use + * [Tx.QueryRowContext]. + */ + queryRow(query: string, ...args: any[]): (Row) + } + /** + * Stmt is a prepared statement. + * A Stmt is safe for concurrent use by multiple goroutines. + * + * If a Stmt is prepared on a [Tx] or [Conn], it will be bound to a single + * underlying connection forever. If the [Tx] or [Conn] closes, the Stmt will + * become unusable and all operations will return an error. + * If a Stmt is prepared on a [DB], it will remain usable for the lifetime of the + * [DB]. When the Stmt needs to execute on a new underlying connection, it will + * prepare itself on the new connection automatically. + */ + interface Stmt { + } + interface Stmt { + /** + * ExecContext executes a prepared statement with the given arguments and + * returns a [Result] summarizing the effect of the statement. + */ + execContext(ctx: context.Context, ...args: any[]): Result + } + interface Stmt { + /** + * Exec executes a prepared statement with the given arguments and + * returns a [Result] summarizing the effect of the statement. + * + * Exec uses [context.Background] internally; to specify the context, use + * [Stmt.ExecContext]. + */ + exec(...args: any[]): Result + } + interface Stmt { + /** + * QueryContext executes a prepared query statement with the given arguments + * and returns the query results as a [*Rows]. + */ + queryContext(ctx: context.Context, ...args: any[]): (Rows) + } + interface Stmt { + /** + * Query executes a prepared query statement with the given arguments + * and returns the query results as a *Rows. + * + * Query uses [context.Background] internally; to specify the context, use + * [Stmt.QueryContext]. + */ + query(...args: any[]): (Rows) + } + interface Stmt { + /** + * QueryRowContext executes a prepared query statement with the given arguments. + * If an error occurs during the execution of the statement, that error will + * be returned by a call to Scan on the returned [*Row], which is always non-nil. + * If the query selects no rows, the [*Row.Scan] will return [ErrNoRows]. + * Otherwise, the [*Row.Scan] scans the first selected row and discards + * the rest. + */ + queryRowContext(ctx: context.Context, ...args: any[]): (Row) + } + interface Stmt { + /** + * QueryRow executes a prepared query statement with the given arguments. + * If an error occurs during the execution of the statement, that error will + * be returned by a call to Scan on the returned [*Row], which is always non-nil. + * If the query selects no rows, the [*Row.Scan] will return [ErrNoRows]. + * Otherwise, the [*Row.Scan] scans the first selected row and discards + * the rest. + * + * Example usage: + * + * ``` + * var name string + * err := nameByUseridStmt.QueryRow(id).Scan(&name) + * ``` + * + * QueryRow uses [context.Background] internally; to specify the context, use + * [Stmt.QueryRowContext]. + */ + queryRow(...args: any[]): (Row) + } + interface Stmt { + /** + * Close closes the statement. + */ + close(): void + } + /** + * Rows is the result of a query. Its cursor starts before the first row + * of the result set. Use [Rows.Next] to advance from row to row. + */ + interface Rows { + } + interface Rows { + /** + * Next prepares the next result row for reading with the [Rows.Scan] method. It + * returns true on success, or false if there is no next result row or an error + * happened while preparing it. [Rows.Err] should be consulted to distinguish between + * the two cases. + * + * Every call to [Rows.Scan], even the first one, must be preceded by a call to [Rows.Next]. + */ + next(): boolean + } + interface Rows { + /** + * NextResultSet prepares the next result set for reading. It reports whether + * there is further result sets, or false if there is no further result set + * or if there is an error advancing to it. The [Rows.Err] method should be consulted + * to distinguish between the two cases. + * + * After calling NextResultSet, the [Rows.Next] method should always be called before + * scanning. If there are further result sets they may not have rows in the result + * set. + */ + nextResultSet(): boolean + } + interface Rows { + /** + * Err returns the error, if any, that was encountered during iteration. + * Err may be called after an explicit or implicit [Rows.Close]. + */ + err(): void + } + interface Rows { + /** + * Columns returns the column names. + * Columns returns an error if the rows are closed. + */ + columns(): Array + } + interface Rows { + /** + * ColumnTypes returns column information such as column type, length, + * and nullable. Some information may not be available from some drivers. + */ + columnTypes(): Array<(ColumnType | undefined)> + } + interface Rows { + /** + * Scan copies the columns in the current row into the values pointed + * at by dest. The number of values in dest must be the same as the + * number of columns in [Rows]. + * + * Scan converts columns read from the database into the following + * common Go types and special types provided by the sql package: + * + * ``` + * *string + * *[]byte + * *int, *int8, *int16, *int32, *int64 + * *uint, *uint8, *uint16, *uint32, *uint64 + * *bool + * *float32, *float64 + * *interface{} + * *RawBytes + * *Rows (cursor value) + * any type implementing Scanner (see Scanner docs) + * ``` + * + * In the most simple case, if the type of the value from the source + * column is an integer, bool or string type T and dest is of type *T, + * Scan simply assigns the value through the pointer. + * + * Scan also converts between string and numeric types, as long as no + * information would be lost. While Scan stringifies all numbers + * scanned from numeric database columns into *string, scans into + * numeric types are checked for overflow. For example, a float64 with + * value 300 or a string with value "300" can scan into a uint16, but + * not into a uint8, though float64(255) or "255" can scan into a + * uint8. One exception is that scans of some float64 numbers to + * strings may lose information when stringifying. In general, scan + * floating point columns into *float64. + * + * If a dest argument has type *[]byte, Scan saves in that argument a + * copy of the corresponding data. The copy is owned by the caller and + * can be modified and held indefinitely. The copy can be avoided by + * using an argument of type [*RawBytes] instead; see the documentation + * for [RawBytes] for restrictions on its use. + * + * If an argument has type *interface{}, Scan copies the value + * provided by the underlying driver without conversion. When scanning + * from a source value of type []byte to *interface{}, a copy of the + * slice is made and the caller owns the result. + * + * Source values of type [time.Time] may be scanned into values of type + * *time.Time, *interface{}, *string, or *[]byte. When converting to + * the latter two, [time.RFC3339Nano] is used. + * + * Source values of type bool may be scanned into types *bool, + * *interface{}, *string, *[]byte, or [*RawBytes]. + * + * For scanning into *bool, the source may be true, false, 1, 0, or + * string inputs parseable by [strconv.ParseBool]. + * + * Scan can also convert a cursor returned from a query, such as + * "select cursor(select * from my_table) from dual", into a + * [*Rows] value that can itself be scanned from. The parent + * select query will close any cursor [*Rows] if the parent [*Rows] is closed. + * + * If any of the first arguments implementing [Scanner] returns an error, + * that error will be wrapped in the returned error. + */ + scan(...dest: any[]): void + } + interface Rows { + /** + * Close closes the [Rows], preventing further enumeration. If [Rows.Next] is called + * and returns false and there are no further result sets, + * the [Rows] are closed automatically and it will suffice to check the + * result of [Rows.Err]. Close is idempotent and does not affect the result of [Rows.Err]. + */ + close(): void + } + /** + * A Result summarizes an executed SQL command. + */ + interface Result { + [key:string]: any; + /** + * LastInsertId returns the integer generated by the database + * in response to a command. Typically this will be from an + * "auto increment" column when inserting a new row. Not all + * databases support this feature, and the syntax of such + * statements varies. + */ + lastInsertId(): number + /** + * RowsAffected returns the number of rows affected by an + * update, insert, or delete. Not every database or database + * driver may support this. + */ + rowsAffected(): number + } +} + +/** + * Package syntax parses regular expressions into parse trees and compiles + * parse trees into programs. Most clients of regular expressions will use the + * facilities of package [regexp] (such as [regexp.Compile] and [regexp.Match]) instead of this package. + * + * # Syntax + * + * The regular expression syntax understood by this package when parsing with the [Perl] flag is as follows. + * Parts of the syntax can be disabled by passing alternate flags to [Parse]. + * + * Single characters: + * + * ``` + * . any character, possibly including newline (flag s=true) + * [xyz] character class + * [^xyz] negated character class + * \d Perl character class + * \D negated Perl character class + * [[:alpha:]] ASCII character class + * [[:^alpha:]] negated ASCII character class + * \pN Unicode character class (one-letter name) + * \p{Greek} Unicode character class + * \PN negated Unicode character class (one-letter name) + * \P{Greek} negated Unicode character class + * ``` + * + * Composites: + * + * ``` + * xy x followed by y + * x|y x or y (prefer x) + * ``` + * + * Repetitions: + * + * ``` + * x* zero or more x, prefer more + * x+ one or more x, prefer more + * x? zero or one x, prefer one + * x{n,m} n or n+1 or ... or m x, prefer more + * x{n,} n or more x, prefer more + * x{n} exactly n x + * x*? zero or more x, prefer fewer + * x+? one or more x, prefer fewer + * x?? zero or one x, prefer zero + * x{n,m}? n or n+1 or ... or m x, prefer fewer + * x{n,}? n or more x, prefer fewer + * x{n}? exactly n x + * ``` + * + * Implementation restriction: The counting forms x{n,m}, x{n,}, and x{n} + * reject forms that create a minimum or maximum repetition count above 1000. + * Unlimited repetitions are not subject to this restriction. + * + * Grouping: + * + * ``` + * (re) numbered capturing group (submatch) + * (?Pre) named & numbered capturing group (submatch) + * (?re) named & numbered capturing group (submatch) + * (?:re) non-capturing group + * (?flags) set flags within current group; non-capturing + * (?flags:re) set flags during re; non-capturing + * + * Flag syntax is xyz (set) or -xyz (clear) or xy-z (set xy, clear z). The flags are: + * + * i case-insensitive (default false) + * m multi-line mode: ^ and $ match begin/end line in addition to begin/end text (default false) + * s let . match \n (default false) + * U ungreedy: swap meaning of x* and x*?, x+ and x+?, etc (default false) + * ``` + * + * Empty strings: + * + * ``` + * ^ at beginning of text or line (flag m=true) + * $ at end of text (like \z not \Z) or line (flag m=true) + * \A at beginning of text + * \b at ASCII word boundary (\w on one side and \W, \A, or \z on the other) + * \B not at ASCII word boundary + * \z at end of text + * ``` + * + * Escape sequences: + * + * ``` + * \a bell (== \007) + * \f form feed (== \014) + * \t horizontal tab (== \011) + * \n newline (== \012) + * \r carriage return (== \015) + * \v vertical tab character (== \013) + * \* literal *, for any punctuation character * + * \123 octal character code (up to three digits) + * \x7F hex character code (exactly two digits) + * \x{10FFFF} hex character code + * \Q...\E literal text ... even if ... has punctuation + * ``` + * + * Character class elements: + * + * ``` + * x single character + * A-Z character range (inclusive) + * \d Perl character class + * [:foo:] ASCII character class foo + * \p{Foo} Unicode character class Foo + * \pF Unicode character class F (one-letter name) + * ``` + * + * Named character classes as character class elements: + * + * ``` + * [\d] digits (== \d) + * [^\d] not digits (== \D) + * [\D] not digits (== \D) + * [^\D] not not digits (== \d) + * [[:name:]] named ASCII class inside character class (== [:name:]) + * [^[:name:]] named ASCII class inside negated character class (== [:^name:]) + * [\p{Name}] named Unicode property inside character class (== \p{Name}) + * [^\p{Name}] named Unicode property inside negated character class (== \P{Name}) + * ``` + * + * Perl character classes (all ASCII-only): + * + * ``` + * \d digits (== [0-9]) + * \D not digits (== [^0-9]) + * \s whitespace (== [\t\n\f\r ]) + * \S not whitespace (== [^\t\n\f\r ]) + * \w word characters (== [0-9A-Za-z_]) + * \W not word characters (== [^0-9A-Za-z_]) + * ``` + * + * ASCII character classes: + * + * ``` + * [[:alnum:]] alphanumeric (== [0-9A-Za-z]) + * [[:alpha:]] alphabetic (== [A-Za-z]) + * [[:ascii:]] ASCII (== [\x00-\x7F]) + * [[:blank:]] blank (== [\t ]) + * [[:cntrl:]] control (== [\x00-\x1F\x7F]) + * [[:digit:]] digits (== [0-9]) + * [[:graph:]] graphical (== [!-~] == [A-Za-z0-9!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]) + * [[:lower:]] lower case (== [a-z]) + * [[:print:]] printable (== [ -~] == [ [:graph:]]) + * [[:punct:]] punctuation (== [!-/:-@[-`{-~]) + * [[:space:]] whitespace (== [\t\n\v\f\r ]) + * [[:upper:]] upper case (== [A-Z]) + * [[:word:]] word characters (== [0-9A-Za-z_]) + * [[:xdigit:]] hex digit (== [0-9A-Fa-f]) + * ``` + * + * Unicode character classes are those in [unicode.Categories] and [unicode.Scripts]. + */ +namespace syntax { + /** + * Flags control the behavior of the parser and record information about regexp context. + */ + interface Flags extends Number{} +} + +namespace store { + /** + * Store defines a concurrent safe in memory key-value data store. + */ + interface Store { + } + interface Store { + /** + * Reset clears the store and replaces the store data with a + * shallow copy of the provided newData. + */ + reset(newData: _TygojaDict): void + } + interface Store { + /** + * Length returns the current number of elements in the store. + */ + length(): number + } + interface Store { + /** + * RemoveAll removes all the existing store entries. + */ + removeAll(): void + } + interface Store { + /** + * Remove removes a single entry from the store. + * + * Remove does nothing if key doesn't exist in the store. + */ + remove(key: K): void + } + interface Store { + /** + * Has checks if element with the specified key exist or not. + */ + has(key: K): boolean + } + interface Store { + /** + * Get returns a single element value from the store. + * + * If key is not set, the zero T value is returned. + */ + get(key: K): T + } + interface Store { + /** + * GetOk is similar to Get but returns also a boolean indicating whether the key exists or not. + */ + getOk(key: K): [T, boolean] + } + interface Store { + /** + * GetAll returns a shallow copy of the current store data. + */ + getAll(): _TygojaDict + } + interface Store { + /** + * Values returns a slice with all of the current store values. + */ + values(): Array + } + interface Store { + /** + * Set sets (or overwrite if already exists) a new value for key. + */ + set(key: K, value: T): void + } + interface Store { + /** + * SetFunc sets (or overwrite if already exists) a new value resolved + * from the function callback for the provided key. + * + * The function callback receives as argument the old store element value (if exists). + * If there is no old store element, the argument will be the T zero value. + * + * Example: + * + * ``` + * s := store.New[string, int](nil) + * s.SetFunc("count", func(old int) int { + * return old + 1 + * }) + * ``` + */ + setFunc(key: K, fn: (old: T) => T): void + } + interface Store { + /** + * GetOrSet retrieves a single existing value for the provided key + * or stores a new one if it doesn't exist. + */ + getOrSet(key: K, setFunc: () => T): T + } + interface Store { + /** + * SetIfLessThanLimit sets (or overwrite if already exist) a new value for key. + * + * This method is similar to Set() but **it will skip adding new elements** + * to the store if the store length has reached the specified limit. + * false is returned if maxAllowedElements limit is reached. + */ + setIfLessThanLimit(key: K, value: T, maxAllowedElements: number): boolean + } + interface Store { + /** + * UnmarshalJSON implements [json.Unmarshaler] and imports the + * provided JSON data into the store. + * + * The store entries that match with the ones from the data will be overwritten with the new value. + */ + unmarshalJSON(data: string|Array): void + } + interface Store { + /** + * MarshalJSON implements [json.Marshaler] and export the current + * store data into valid JSON. + */ + marshalJSON(): string|Array } } @@ -15666,165 +16920,2381 @@ namespace net { } /** - * Package syntax parses regular expressions into parse trees and compiles - * parse trees into programs. Most clients of regular expressions will use the - * facilities of package [regexp] (such as [regexp.Compile] and [regexp.Match]) instead of this package. + * Package jwt is a Go implementation of JSON Web Tokens: http://self-issued.info/docs/draft-jones-json-web-token.html * - * # Syntax - * - * The regular expression syntax understood by this package when parsing with the [Perl] flag is as follows. - * Parts of the syntax can be disabled by passing alternate flags to [Parse]. - * - * Single characters: - * - * ``` - * . any character, possibly including newline (flag s=true) - * [xyz] character class - * [^xyz] negated character class - * \d Perl character class - * \D negated Perl character class - * [[:alpha:]] ASCII character class - * [[:^alpha:]] negated ASCII character class - * \pN Unicode character class (one-letter name) - * \p{Greek} Unicode character class - * \PN negated Unicode character class (one-letter name) - * \P{Greek} negated Unicode character class - * ``` - * - * Composites: - * - * ``` - * xy x followed by y - * x|y x or y (prefer x) - * ``` - * - * Repetitions: - * - * ``` - * x* zero or more x, prefer more - * x+ one or more x, prefer more - * x? zero or one x, prefer one - * x{n,m} n or n+1 or ... or m x, prefer more - * x{n,} n or more x, prefer more - * x{n} exactly n x - * x*? zero or more x, prefer fewer - * x+? one or more x, prefer fewer - * x?? zero or one x, prefer zero - * x{n,m}? n or n+1 or ... or m x, prefer fewer - * x{n,}? n or more x, prefer fewer - * x{n}? exactly n x - * ``` - * - * Implementation restriction: The counting forms x{n,m}, x{n,}, and x{n} - * reject forms that create a minimum or maximum repetition count above 1000. - * Unlimited repetitions are not subject to this restriction. - * - * Grouping: - * - * ``` - * (re) numbered capturing group (submatch) - * (?Pre) named & numbered capturing group (submatch) - * (?re) named & numbered capturing group (submatch) - * (?:re) non-capturing group - * (?flags) set flags within current group; non-capturing - * (?flags:re) set flags during re; non-capturing - * - * Flag syntax is xyz (set) or -xyz (clear) or xy-z (set xy, clear z). The flags are: - * - * i case-insensitive (default false) - * m multi-line mode: ^ and $ match begin/end line in addition to begin/end text (default false) - * s let . match \n (default false) - * U ungreedy: swap meaning of x* and x*?, x+ and x+?, etc (default false) - * ``` - * - * Empty strings: - * - * ``` - * ^ at beginning of text or line (flag m=true) - * $ at end of text (like \z not \Z) or line (flag m=true) - * \A at beginning of text - * \b at ASCII word boundary (\w on one side and \W, \A, or \z on the other) - * \B not at ASCII word boundary - * \z at end of text - * ``` - * - * Escape sequences: - * - * ``` - * \a bell (== \007) - * \f form feed (== \014) - * \t horizontal tab (== \011) - * \n newline (== \012) - * \r carriage return (== \015) - * \v vertical tab character (== \013) - * \* literal *, for any punctuation character * - * \123 octal character code (up to three digits) - * \x7F hex character code (exactly two digits) - * \x{10FFFF} hex character code - * \Q...\E literal text ... even if ... has punctuation - * ``` - * - * Character class elements: - * - * ``` - * x single character - * A-Z character range (inclusive) - * \d Perl character class - * [:foo:] ASCII character class foo - * \p{Foo} Unicode character class Foo - * \pF Unicode character class F (one-letter name) - * ``` - * - * Named character classes as character class elements: - * - * ``` - * [\d] digits (== \d) - * [^\d] not digits (== \D) - * [\D] not digits (== \D) - * [^\D] not not digits (== \d) - * [[:name:]] named ASCII class inside character class (== [:name:]) - * [^[:name:]] named ASCII class inside negated character class (== [:^name:]) - * [\p{Name}] named Unicode property inside character class (== \p{Name}) - * [^\p{Name}] named Unicode property inside negated character class (== \P{Name}) - * ``` - * - * Perl character classes (all ASCII-only): - * - * ``` - * \d digits (== [0-9]) - * \D not digits (== [^0-9]) - * \s whitespace (== [\t\n\f\r ]) - * \S not whitespace (== [^\t\n\f\r ]) - * \w word characters (== [0-9A-Za-z_]) - * \W not word characters (== [^0-9A-Za-z_]) - * ``` - * - * ASCII character classes: - * - * ``` - * [[:alnum:]] alphanumeric (== [0-9A-Za-z]) - * [[:alpha:]] alphabetic (== [A-Za-z]) - * [[:ascii:]] ASCII (== [\x00-\x7F]) - * [[:blank:]] blank (== [\t ]) - * [[:cntrl:]] control (== [\x00-\x1F\x7F]) - * [[:digit:]] digits (== [0-9]) - * [[:graph:]] graphical (== [!-~] == [A-Za-z0-9!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]) - * [[:lower:]] lower case (== [a-z]) - * [[:print:]] printable (== [ -~] == [ [:graph:]]) - * [[:punct:]] punctuation (== [!-/:-@[-`{-~]) - * [[:space:]] whitespace (== [\t\n\v\f\r ]) - * [[:upper:]] upper case (== [A-Z]) - * [[:word:]] word characters (== [0-9A-Za-z_]) - * [[:xdigit:]] hex digit (== [0-9A-Fa-f]) - * ``` - * - * Unicode character classes are those in [unicode.Categories] and [unicode.Scripts]. + * See README.md for more info. */ -namespace syntax { +namespace jwt { /** - * Flags control the behavior of the parser and record information about regexp context. + * MapClaims is a claims type that uses the map[string]interface{} for JSON + * decoding. This is the default claims type if you don't supply one */ - interface Flags extends Number{} + interface MapClaims extends _TygojaDict{} + interface MapClaims { + /** + * GetExpirationTime implements the Claims interface. + */ + getExpirationTime(): (NumericDate) + } + interface MapClaims { + /** + * GetNotBefore implements the Claims interface. + */ + getNotBefore(): (NumericDate) + } + interface MapClaims { + /** + * GetIssuedAt implements the Claims interface. + */ + getIssuedAt(): (NumericDate) + } + interface MapClaims { + /** + * GetAudience implements the Claims interface. + */ + getAudience(): ClaimStrings + } + interface MapClaims { + /** + * GetIssuer implements the Claims interface. + */ + getIssuer(): string + } + interface MapClaims { + /** + * GetSubject implements the Claims interface. + */ + getSubject(): string + } +} + +/** + * Package types implements some commonly used db serializable types + * like datetime, json, etc. + */ +namespace types { + /** + * DateTime represents a [time.Time] instance in UTC that is wrapped + * and serialized using the app default date layout. + */ + interface DateTime { + } + interface DateTime { + /** + * Time returns the internal [time.Time] instance. + */ + time(): time.Time + } + interface DateTime { + /** + * Add returns a new DateTime based on the current DateTime + the specified duration. + */ + add(duration: time.Duration): DateTime + } + interface DateTime { + /** + * Sub returns a [time.Duration] by subtracting the specified DateTime from the current one. + * + * If the result exceeds the maximum (or minimum) value that can be stored in a [time.Duration], + * the maximum (or minimum) duration will be returned. + */ + sub(u: DateTime): time.Duration + } + interface DateTime { + /** + * AddDate returns a new DateTime based on the current one + duration. + * + * It follows the same rules as [time.AddDate]. + */ + addDate(years: number, months: number, days: number): DateTime + } + interface DateTime { + /** + * After reports whether the current DateTime instance is after u. + */ + after(u: DateTime): boolean + } + interface DateTime { + /** + * Before reports whether the current DateTime instance is before u. + */ + before(u: DateTime): boolean + } + interface DateTime { + /** + * Compare compares the current DateTime instance with u. + * If the current instance is before u, it returns -1. + * If the current instance is after u, it returns +1. + * If they're the same, it returns 0. + */ + compare(u: DateTime): number + } + interface DateTime { + /** + * Equal reports whether the current DateTime and u represent the same time instant. + * Two DateTime can be equal even if they are in different locations. + * For example, 6:00 +0200 and 4:00 UTC are Equal. + */ + equal(u: DateTime): boolean + } + interface DateTime { + /** + * Unix returns the current DateTime as a Unix time, aka. + * the number of seconds elapsed since January 1, 1970 UTC. + */ + unix(): number + } + interface DateTime { + /** + * IsZero checks whether the current DateTime instance has zero time value. + */ + isZero(): boolean + } + interface DateTime { + /** + * String serializes the current DateTime instance into a formatted + * UTC date string. + * + * The zero value is serialized to an empty string. + */ + string(): string + } + interface DateTime { + /** + * MarshalJSON implements the [json.Marshaler] interface. + */ + marshalJSON(): string|Array + } + interface DateTime { + /** + * UnmarshalJSON implements the [json.Unmarshaler] interface. + */ + unmarshalJSON(b: string|Array): void + } + interface DateTime { + /** + * Value implements the [driver.Valuer] interface. + */ + value(): any + } + interface DateTime { + /** + * Scan implements [sql.Scanner] interface to scan the provided value + * into the current DateTime instance. + */ + scan(value: any): void + } + /** + * GeoPoint defines a struct for storing geo coordinates as serialized json object + * (e.g. {lon:0,lat:0}). + * + * Note: using object notation and not a plain array to avoid the confusion + * as there doesn't seem to be a fixed standard for the coordinates order. + */ + interface GeoPoint { + lon: number + lat: number + } + interface GeoPoint { + /** + * String returns the string representation of the current GeoPoint instance. + */ + string(): string + } + interface GeoPoint { + /** + * AsMap implements [core.mapExtractor] and returns a value suitable + * to be used in an API rule expression. + */ + asMap(): _TygojaDict + } + interface GeoPoint { + /** + * Value implements the [driver.Valuer] interface. + */ + value(): any + } + interface GeoPoint { + /** + * Scan implements [sql.Scanner] interface to scan the provided value + * into the current GeoPoint instance. + * + * The value argument could be nil (no-op), another GeoPoint instance, + * map or serialized json object with lat-lon props. + */ + scan(value: any): void + } + /** + * JSONArray defines a slice that is safe for json and db read/write. + */ + interface JSONArray extends Array{} + /** + * JSONMap defines a map that is safe for json and db read/write. + */ + interface JSONMap extends _TygojaDict{} + /** + * JSONRaw defines a json value type that is safe for db read/write. + */ + interface JSONRaw extends Array{} + interface JSONRaw { + /** + * String returns the current JSONRaw instance as a json encoded string. + */ + string(): string + } + interface JSONRaw { + /** + * MarshalJSON implements the [json.Marshaler] interface. + */ + marshalJSON(): string|Array + } + interface JSONRaw { + /** + * UnmarshalJSON implements the [json.Unmarshaler] interface. + */ + unmarshalJSON(b: string|Array): void + } + interface JSONRaw { + /** + * Value implements the [driver.Valuer] interface. + */ + value(): any + } + interface JSONRaw { + /** + * Scan implements [sql.Scanner] interface to scan the provided value + * into the current JSONRaw instance. + */ + scan(value: any): void + } +} + +namespace search { + /** + * Result defines the returned search result structure. + */ + interface Result { + items: any + page: number + perPage: number + totalItems: number + totalPages: number + } + /** + * ResolverResult defines a single FieldResolver.Resolve() successfully parsed result. + */ + interface ResolverResult { + /** + * Identifier is the plain SQL identifier/column that will be used + * in the final db expression as left or right operand. + */ + identifier: string + /** + * NoCoalesce instructs to not use COALESCE or NULL fallbacks + * when building the identifier expression. + */ + noCoalesce: boolean + /** + * Params is a map with db placeholder->value pairs that will be added + * to the query when building both resolved operands/sides in a single expression. + */ + params: dbx.Params + /** + * MultiMatchSubQuery is an optional sub query expression that will be added + * in addition to the combined ResolverResult expression during build. + */ + multiMatchSubQuery: dbx.Expression + /** + * AfterBuild is an optional function that will be called after building + * and combining the result of both resolved operands/sides in a single expression. + */ + afterBuild: (expr: dbx.Expression) => dbx.Expression + } +} + +/** + * Package slog provides structured logging, + * in which log records include a message, + * a severity level, and various other attributes + * expressed as key-value pairs. + * + * It defines a type, [Logger], + * which provides several methods (such as [Logger.Info] and [Logger.Error]) + * for reporting events of interest. + * + * Each Logger is associated with a [Handler]. + * A Logger output method creates a [Record] from the method arguments + * and passes it to the Handler, which decides how to handle it. + * There is a default Logger accessible through top-level functions + * (such as [Info] and [Error]) that call the corresponding Logger methods. + * + * A log record consists of a time, a level, a message, and a set of key-value + * pairs, where the keys are strings and the values may be of any type. + * As an example, + * + * ``` + * slog.Info("hello", "count", 3) + * ``` + * + * creates a record containing the time of the call, + * a level of Info, the message "hello", and a single + * pair with key "count" and value 3. + * + * The [Info] top-level function calls the [Logger.Info] method on the default Logger. + * In addition to [Logger.Info], there are methods for Debug, Warn and Error levels. + * Besides these convenience methods for common levels, + * there is also a [Logger.Log] method which takes the level as an argument. + * Each of these methods has a corresponding top-level function that uses the + * default logger. + * + * The default handler formats the log record's message, time, level, and attributes + * as a string and passes it to the [log] package. + * + * ``` + * 2022/11/08 15:28:26 INFO hello count=3 + * ``` + * + * For more control over the output format, create a logger with a different handler. + * This statement uses [New] to create a new logger with a [TextHandler] + * that writes structured records in text form to standard error: + * + * ``` + * logger := slog.New(slog.NewTextHandler(os.Stderr, nil)) + * ``` + * + * [TextHandler] output is a sequence of key=value pairs, easily and unambiguously + * parsed by machine. This statement: + * + * ``` + * logger.Info("hello", "count", 3) + * ``` + * + * produces this output: + * + * ``` + * time=2022-11-08T15:28:26.000-05:00 level=INFO msg=hello count=3 + * ``` + * + * The package also provides [JSONHandler], whose output is line-delimited JSON: + * + * ``` + * logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) + * logger.Info("hello", "count", 3) + * ``` + * + * produces this output: + * + * ``` + * {"time":"2022-11-08T15:28:26.000000000-05:00","level":"INFO","msg":"hello","count":3} + * ``` + * + * Both [TextHandler] and [JSONHandler] can be configured with [HandlerOptions]. + * There are options for setting the minimum level (see Levels, below), + * displaying the source file and line of the log call, and + * modifying attributes before they are logged. + * + * Setting a logger as the default with + * + * ``` + * slog.SetDefault(logger) + * ``` + * + * will cause the top-level functions like [Info] to use it. + * [SetDefault] also updates the default logger used by the [log] package, + * so that existing applications that use [log.Printf] and related functions + * will send log records to the logger's handler without needing to be rewritten. + * + * Some attributes are common to many log calls. + * For example, you may wish to include the URL or trace identifier of a server request + * with all log events arising from the request. + * Rather than repeat the attribute with every log call, you can use [Logger.With] + * to construct a new Logger containing the attributes: + * + * ``` + * logger2 := logger.With("url", r.URL) + * ``` + * + * The arguments to With are the same key-value pairs used in [Logger.Info]. + * The result is a new Logger with the same handler as the original, but additional + * attributes that will appear in the output of every call. + * + * # Levels + * + * A [Level] is an integer representing the importance or severity of a log event. + * The higher the level, the more severe the event. + * This package defines constants for the most common levels, + * but any int can be used as a level. + * + * In an application, you may wish to log messages only at a certain level or greater. + * One common configuration is to log messages at Info or higher levels, + * suppressing debug logging until it is needed. + * The built-in handlers can be configured with the minimum level to output by + * setting [HandlerOptions.Level]. + * The program's `main` function typically does this. + * The default value is LevelInfo. + * + * Setting the [HandlerOptions.Level] field to a [Level] value + * fixes the handler's minimum level throughout its lifetime. + * Setting it to a [LevelVar] allows the level to be varied dynamically. + * A LevelVar holds a Level and is safe to read or write from multiple + * goroutines. + * To vary the level dynamically for an entire program, first initialize + * a global LevelVar: + * + * ``` + * var programLevel = new(slog.LevelVar) // Info by default + * ``` + * + * Then use the LevelVar to construct a handler, and make it the default: + * + * ``` + * h := slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{Level: programLevel}) + * slog.SetDefault(slog.New(h)) + * ``` + * + * Now the program can change its logging level with a single statement: + * + * ``` + * programLevel.Set(slog.LevelDebug) + * ``` + * + * # Groups + * + * Attributes can be collected into groups. + * A group has a name that is used to qualify the names of its attributes. + * How this qualification is displayed depends on the handler. + * [TextHandler] separates the group and attribute names with a dot. + * [JSONHandler] treats each group as a separate JSON object, with the group name as the key. + * + * Use [Group] to create a Group attribute from a name and a list of key-value pairs: + * + * ``` + * slog.Group("request", + * "method", r.Method, + * "url", r.URL) + * ``` + * + * TextHandler would display this group as + * + * ``` + * request.method=GET request.url=http://example.com + * ``` + * + * JSONHandler would display it as + * + * ``` + * "request":{"method":"GET","url":"http://example.com"} + * ``` + * + * Use [Logger.WithGroup] to qualify all of a Logger's output + * with a group name. Calling WithGroup on a Logger results in a + * new Logger with the same Handler as the original, but with all + * its attributes qualified by the group name. + * + * This can help prevent duplicate attribute keys in large systems, + * where subsystems might use the same keys. + * Pass each subsystem a different Logger with its own group name so that + * potential duplicates are qualified: + * + * ``` + * logger := slog.Default().With("id", systemID) + * parserLogger := logger.WithGroup("parser") + * parseInput(input, parserLogger) + * ``` + * + * When parseInput logs with parserLogger, its keys will be qualified with "parser", + * so even if it uses the common key "id", the log line will have distinct keys. + * + * # Contexts + * + * Some handlers may wish to include information from the [context.Context] that is + * available at the call site. One example of such information + * is the identifier for the current span when tracing is enabled. + * + * The [Logger.Log] and [Logger.LogAttrs] methods take a context as a first + * argument, as do their corresponding top-level functions. + * + * Although the convenience methods on Logger (Info and so on) and the + * corresponding top-level functions do not take a context, the alternatives ending + * in "Context" do. For example, + * + * ``` + * slog.InfoContext(ctx, "message") + * ``` + * + * It is recommended to pass a context to an output method if one is available. + * + * # Attrs and Values + * + * An [Attr] is a key-value pair. The Logger output methods accept Attrs as well as + * alternating keys and values. The statement + * + * ``` + * slog.Info("hello", slog.Int("count", 3)) + * ``` + * + * behaves the same as + * + * ``` + * slog.Info("hello", "count", 3) + * ``` + * + * There are convenience constructors for [Attr] such as [Int], [String], and [Bool] + * for common types, as well as the function [Any] for constructing Attrs of any + * type. + * + * The value part of an Attr is a type called [Value]. + * Like an [any], a Value can hold any Go value, + * but it can represent typical values, including all numbers and strings, + * without an allocation. + * + * For the most efficient log output, use [Logger.LogAttrs]. + * It is similar to [Logger.Log] but accepts only Attrs, not alternating + * keys and values; this allows it, too, to avoid allocation. + * + * The call + * + * ``` + * logger.LogAttrs(ctx, slog.LevelInfo, "hello", slog.Int("count", 3)) + * ``` + * + * is the most efficient way to achieve the same output as + * + * ``` + * slog.InfoContext(ctx, "hello", "count", 3) + * ``` + * + * # Customizing a type's logging behavior + * + * If a type implements the [LogValuer] interface, the [Value] returned from its LogValue + * method is used for logging. You can use this to control how values of the type + * appear in logs. For example, you can redact secret information like passwords, + * or gather a struct's fields in a Group. See the examples under [LogValuer] for + * details. + * + * A LogValue method may return a Value that itself implements [LogValuer]. The [Value.Resolve] + * method handles these cases carefully, avoiding infinite loops and unbounded recursion. + * Handler authors and others may wish to use [Value.Resolve] instead of calling LogValue directly. + * + * # Wrapping output methods + * + * The logger functions use reflection over the call stack to find the file name + * and line number of the logging call within the application. This can produce + * incorrect source information for functions that wrap slog. For instance, if you + * define this function in file mylog.go: + * + * ``` + * func Infof(logger *slog.Logger, format string, args ...any) { + * logger.Info(fmt.Sprintf(format, args...)) + * } + * ``` + * + * and you call it like this in main.go: + * + * ``` + * Infof(slog.Default(), "hello, %s", "world") + * ``` + * + * then slog will report the source file as mylog.go, not main.go. + * + * A correct implementation of Infof will obtain the source location + * (pc) and pass it to NewRecord. + * The Infof function in the package-level example called "wrapping" + * demonstrates how to do this. + * + * # Working with Records + * + * Sometimes a Handler will need to modify a Record + * before passing it on to another Handler or backend. + * A Record contains a mixture of simple public fields (e.g. Time, Level, Message) + * and hidden fields that refer to state (such as attributes) indirectly. This + * means that modifying a simple copy of a Record (e.g. by calling + * [Record.Add] or [Record.AddAttrs] to add attributes) + * may have unexpected effects on the original. + * Before modifying a Record, use [Record.Clone] to + * create a copy that shares no state with the original, + * or create a new Record with [NewRecord] + * and build up its Attrs by traversing the old ones with [Record.Attrs]. + * + * # Performance considerations + * + * If profiling your application demonstrates that logging is taking significant time, + * the following suggestions may help. + * + * If many log lines have a common attribute, use [Logger.With] to create a Logger with + * that attribute. The built-in handlers will format that attribute only once, at the + * call to [Logger.With]. The [Handler] interface is designed to allow that optimization, + * and a well-written Handler should take advantage of it. + * + * The arguments to a log call are always evaluated, even if the log event is discarded. + * If possible, defer computation so that it happens only if the value is actually logged. + * For example, consider the call + * + * ``` + * slog.Info("starting request", "url", r.URL.String()) // may compute String unnecessarily + * ``` + * + * The URL.String method will be called even if the logger discards Info-level events. + * Instead, pass the URL directly: + * + * ``` + * slog.Info("starting request", "url", &r.URL) // calls URL.String only if needed + * ``` + * + * The built-in [TextHandler] will call its String method, but only + * if the log event is enabled. + * Avoiding the call to String also preserves the structure of the underlying value. + * For example [JSONHandler] emits the components of the parsed URL as a JSON object. + * If you want to avoid eagerly paying the cost of the String call + * without causing the handler to potentially inspect the structure of the value, + * wrap the value in a fmt.Stringer implementation that hides its Marshal methods. + * + * You can also use the [LogValuer] interface to avoid unnecessary work in disabled log + * calls. Say you need to log some expensive value: + * + * ``` + * slog.Debug("frobbing", "value", computeExpensiveValue(arg)) + * ``` + * + * Even if this line is disabled, computeExpensiveValue will be called. + * To avoid that, define a type implementing LogValuer: + * + * ``` + * type expensive struct { arg int } + * + * func (e expensive) LogValue() slog.Value { + * return slog.AnyValue(computeExpensiveValue(e.arg)) + * } + * ``` + * + * Then use a value of that type in log calls: + * + * ``` + * slog.Debug("frobbing", "value", expensive{arg}) + * ``` + * + * Now computeExpensiveValue will only be called when the line is enabled. + * + * The built-in handlers acquire a lock before calling [io.Writer.Write] + * to ensure that exactly one [Record] is written at a time in its entirety. + * Although each log record has a timestamp, + * the built-in handlers do not use that time to sort the written records. + * User-defined handlers are responsible for their own locking and sorting. + * + * # Writing a handler + * + * For a guide to writing a custom handler, see https://golang.org/s/slog-handler-guide. + */ +namespace slog { + // @ts-ignore + import loginternal = internal + /** + * A Logger records structured information about each call to its + * Log, Debug, Info, Warn, and Error methods. + * For each call, it creates a [Record] and passes it to a [Handler]. + * + * To create a new Logger, call [New] or a Logger method + * that begins "With". + */ + interface Logger { + } + interface Logger { + /** + * Handler returns l's Handler. + */ + handler(): Handler + } + interface Logger { + /** + * With returns a Logger that includes the given attributes + * in each output operation. Arguments are converted to + * attributes as if by [Logger.Log]. + */ + with(...args: any[]): (Logger) + } + interface Logger { + /** + * WithGroup returns a Logger that starts a group, if name is non-empty. + * The keys of all attributes added to the Logger will be qualified by the given + * name. (How that qualification happens depends on the [Handler.WithGroup] + * method of the Logger's Handler.) + * + * If name is empty, WithGroup returns the receiver. + */ + withGroup(name: string): (Logger) + } + interface Logger { + /** + * Enabled reports whether l emits log records at the given context and level. + */ + enabled(ctx: context.Context, level: Level): boolean + } + interface Logger { + /** + * Log emits a log record with the current time and the given level and message. + * The Record's Attrs consist of the Logger's attributes followed by + * the Attrs specified by args. + * + * The attribute arguments are processed as follows: + * ``` + * - If an argument is an Attr, it is used as is. + * - If an argument is a string and this is not the last argument, + * the following argument is treated as the value and the two are combined + * into an Attr. + * - Otherwise, the argument is treated as a value with key "!BADKEY". + * ``` + */ + log(ctx: context.Context, level: Level, msg: string, ...args: any[]): void + } + interface Logger { + /** + * LogAttrs is a more efficient version of [Logger.Log] that accepts only Attrs. + */ + logAttrs(ctx: context.Context, level: Level, msg: string, ...attrs: Attr[]): void + } + interface Logger { + /** + * Debug logs at [LevelDebug]. + */ + debug(msg: string, ...args: any[]): void + } + interface Logger { + /** + * DebugContext logs at [LevelDebug] with the given context. + */ + debugContext(ctx: context.Context, msg: string, ...args: any[]): void + } + interface Logger { + /** + * Info logs at [LevelInfo]. + */ + info(msg: string, ...args: any[]): void + } + interface Logger { + /** + * InfoContext logs at [LevelInfo] with the given context. + */ + infoContext(ctx: context.Context, msg: string, ...args: any[]): void + } + interface Logger { + /** + * Warn logs at [LevelWarn]. + */ + warn(msg: string, ...args: any[]): void + } + interface Logger { + /** + * WarnContext logs at [LevelWarn] with the given context. + */ + warnContext(ctx: context.Context, msg: string, ...args: any[]): void + } + interface Logger { + /** + * Error logs at [LevelError]. + */ + error(msg: string, ...args: any[]): void + } + interface Logger { + /** + * ErrorContext logs at [LevelError] with the given context. + */ + errorContext(ctx: context.Context, msg: string, ...args: any[]): void + } +} + +/** + * Package bufio implements buffered I/O. It wraps an io.Reader or io.Writer + * object, creating another object (Reader or Writer) that also implements + * the interface but provides buffering and some help for textual I/O. + */ +namespace bufio { + /** + * ReadWriter stores pointers to a [Reader] and a [Writer]. + * It implements [io.ReadWriter]. + */ + type _sFTbWSf = Reader&Writer + interface ReadWriter extends _sFTbWSf { + } +} + +/** + * Package multipart implements MIME multipart parsing, as defined in RFC + * 2046. + * + * The implementation is sufficient for HTTP (RFC 2388) and the multipart + * bodies generated by popular browsers. + * + * # Limits + * + * To protect against malicious inputs, this package sets limits on the size + * of the MIME data it processes. + * + * [Reader.NextPart] and [Reader.NextRawPart] limit the number of headers in a + * part to 10000 and [Reader.ReadForm] limits the total number of headers in all + * FileHeaders to 10000. + * These limits may be adjusted with the GODEBUG=multipartmaxheaders= + * setting. + * + * Reader.ReadForm further limits the number of parts in a form to 1000. + * This limit may be adjusted with the GODEBUG=multipartmaxparts= + * setting. + */ +namespace multipart { + /** + * A FileHeader describes a file part of a multipart request. + */ + interface FileHeader { + filename: string + header: textproto.MIMEHeader + size: number + } + interface FileHeader { + /** + * Open opens and returns the [FileHeader]'s associated File. + */ + open(): File + } +} + +/** + * Package http provides HTTP client and server implementations. + * + * [Get], [Head], [Post], and [PostForm] make HTTP (or HTTPS) requests: + * + * ``` + * resp, err := http.Get("http://example.com/") + * ... + * resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf) + * ... + * resp, err := http.PostForm("http://example.com/form", + * url.Values{"key": {"Value"}, "id": {"123"}}) + * ``` + * + * The caller must close the response body when finished with it: + * + * ``` + * resp, err := http.Get("http://example.com/") + * if err != nil { + * // handle error + * } + * defer resp.Body.Close() + * body, err := io.ReadAll(resp.Body) + * // ... + * ``` + * + * # Clients and Transports + * + * For control over HTTP client headers, redirect policy, and other + * settings, create a [Client]: + * + * ``` + * client := &http.Client{ + * CheckRedirect: redirectPolicyFunc, + * } + * + * resp, err := client.Get("http://example.com") + * // ... + * + * req, err := http.NewRequest("GET", "http://example.com", nil) + * // ... + * req.Header.Add("If-None-Match", `W/"wyzzy"`) + * resp, err := client.Do(req) + * // ... + * ``` + * + * For control over proxies, TLS configuration, keep-alives, + * compression, and other settings, create a [Transport]: + * + * ``` + * tr := &http.Transport{ + * MaxIdleConns: 10, + * IdleConnTimeout: 30 * time.Second, + * DisableCompression: true, + * } + * client := &http.Client{Transport: tr} + * resp, err := client.Get("https://example.com") + * ``` + * + * Clients and Transports are safe for concurrent use by multiple + * goroutines and for efficiency should only be created once and re-used. + * + * # Servers + * + * ListenAndServe starts an HTTP server with a given address and handler. + * The handler is usually nil, which means to use [DefaultServeMux]. + * [Handle] and [HandleFunc] add handlers to [DefaultServeMux]: + * + * ``` + * http.Handle("/foo", fooHandler) + * + * http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) { + * fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) + * }) + * + * log.Fatal(http.ListenAndServe(":8080", nil)) + * ``` + * + * More control over the server's behavior is available by creating a + * custom Server: + * + * ``` + * s := &http.Server{ + * Addr: ":8080", + * Handler: myHandler, + * ReadTimeout: 10 * time.Second, + * WriteTimeout: 10 * time.Second, + * MaxHeaderBytes: 1 << 20, + * } + * log.Fatal(s.ListenAndServe()) + * ``` + * + * # HTTP/2 + * + * Starting with Go 1.6, the http package has transparent support for the + * HTTP/2 protocol when using HTTPS. Programs that must disable HTTP/2 + * can do so by setting [Transport.TLSNextProto] (for clients) or + * [Server.TLSNextProto] (for servers) to a non-nil, empty + * map. Alternatively, the following GODEBUG settings are + * currently supported: + * + * ``` + * GODEBUG=http2client=0 # disable HTTP/2 client support + * GODEBUG=http2server=0 # disable HTTP/2 server support + * GODEBUG=http2debug=1 # enable verbose HTTP/2 debug logs + * GODEBUG=http2debug=2 # ... even more verbose, with frame dumps + * ``` + * + * Please report any issues before disabling HTTP/2 support: https://golang.org/s/http2bug + * + * The http package's [Transport] and [Server] both automatically enable + * HTTP/2 support for simple configurations. To enable HTTP/2 for more + * complex configurations, to use lower-level HTTP/2 features, or to use + * a newer version of Go's http2 package, import "golang.org/x/net/http2" + * directly and use its ConfigureTransport and/or ConfigureServer + * functions. Manually configuring HTTP/2 via the golang.org/x/net/http2 + * package takes precedence over the net/http package's built-in HTTP/2 + * support. + */ +namespace http { + // @ts-ignore + import mathrand = rand + /** + * PushOptions describes options for [Pusher.Push]. + */ + interface PushOptions { + /** + * Method specifies the HTTP method for the promised request. + * If set, it must be "GET" or "HEAD". Empty means "GET". + */ + method: string + /** + * Header specifies additional promised request headers. This cannot + * include HTTP/2 pseudo header fields like ":path" and ":scheme", + * which will be added automatically. + */ + header: Header + } + // @ts-ignore + import urlpkg = url + /** + * A Request represents an HTTP request received by a server + * or to be sent by a client. + * + * The field semantics differ slightly between client and server + * usage. In addition to the notes on the fields below, see the + * documentation for [Request.Write] and [RoundTripper]. + */ + interface Request { + /** + * Method specifies the HTTP method (GET, POST, PUT, etc.). + * For client requests, an empty string means GET. + */ + method: string + /** + * URL specifies either the URI being requested (for server + * requests) or the URL to access (for client requests). + * + * For server requests, the URL is parsed from the URI + * supplied on the Request-Line as stored in RequestURI. For + * most requests, fields other than Path and RawQuery will be + * empty. (See RFC 7230, Section 5.3) + * + * For client requests, the URL's Host specifies the server to + * connect to, while the Request's Host field optionally + * specifies the Host header value to send in the HTTP + * request. + */ + url?: url.URL + /** + * The protocol version for incoming server requests. + * + * For client requests, these fields are ignored. The HTTP + * client code always uses either HTTP/1.1 or HTTP/2. + * See the docs on Transport for details. + */ + proto: string // "HTTP/1.0" + protoMajor: number // 1 + protoMinor: number // 0 + /** + * Header contains the request header fields either received + * by the server or to be sent by the client. + * + * If a server received a request with header lines, + * + * ``` + * Host: example.com + * accept-encoding: gzip, deflate + * Accept-Language: en-us + * fOO: Bar + * foo: two + * ``` + * + * then + * + * ``` + * Header = map[string][]string{ + * "Accept-Encoding": {"gzip, deflate"}, + * "Accept-Language": {"en-us"}, + * "Foo": {"Bar", "two"}, + * } + * ``` + * + * For incoming requests, the Host header is promoted to the + * Request.Host field and removed from the Header map. + * + * HTTP defines that header names are case-insensitive. The + * request parser implements this by using CanonicalHeaderKey, + * making the first character and any characters following a + * hyphen uppercase and the rest lowercase. + * + * For client requests, certain headers such as Content-Length + * and Connection are automatically written when needed and + * values in Header may be ignored. See the documentation + * for the Request.Write method. + */ + header: Header + /** + * Body is the request's body. + * + * For client requests, a nil body means the request has no + * body, such as a GET request. The HTTP Client's Transport + * is responsible for calling the Close method. + * + * For server requests, the Request Body is always non-nil + * but will return EOF immediately when no body is present. + * The Server will close the request body. The ServeHTTP + * Handler does not need to. + * + * Body must allow Read to be called concurrently with Close. + * In particular, calling Close should unblock a Read waiting + * for input. + */ + body: io.ReadCloser + /** + * GetBody defines an optional func to return a new copy of + * Body. It is used for client requests when a redirect requires + * reading the body more than once. Use of GetBody still + * requires setting Body. + * + * For server requests, it is unused. + */ + getBody: () => io.ReadCloser + /** + * ContentLength records the length of the associated content. + * The value -1 indicates that the length is unknown. + * Values >= 0 indicate that the given number of bytes may + * be read from Body. + * + * For client requests, a value of 0 with a non-nil Body is + * also treated as unknown. + */ + contentLength: number + /** + * TransferEncoding lists the transfer encodings from outermost to + * innermost. An empty list denotes the "identity" encoding. + * TransferEncoding can usually be ignored; chunked encoding is + * automatically added and removed as necessary when sending and + * receiving requests. + */ + transferEncoding: Array + /** + * Close indicates whether to close the connection after + * replying to this request (for servers) or after sending this + * request and reading its response (for clients). + * + * For server requests, the HTTP server handles this automatically + * and this field is not needed by Handlers. + * + * For client requests, setting this field prevents re-use of + * TCP connections between requests to the same hosts, as if + * Transport.DisableKeepAlives were set. + */ + close: boolean + /** + * For server requests, Host specifies the host on which the + * URL is sought. For HTTP/1 (per RFC 7230, section 5.4), this + * is either the value of the "Host" header or the host name + * given in the URL itself. For HTTP/2, it is the value of the + * ":authority" pseudo-header field. + * It may be of the form "host:port". For international domain + * names, Host may be in Punycode or Unicode form. Use + * golang.org/x/net/idna to convert it to either format if + * needed. + * To prevent DNS rebinding attacks, server Handlers should + * validate that the Host header has a value for which the + * Handler considers itself authoritative. The included + * ServeMux supports patterns registered to particular host + * names and thus protects its registered Handlers. + * + * For client requests, Host optionally overrides the Host + * header to send. If empty, the Request.Write method uses + * the value of URL.Host. Host may contain an international + * domain name. + */ + host: string + /** + * Form contains the parsed form data, including both the URL + * field's query parameters and the PATCH, POST, or PUT form data. + * This field is only available after ParseForm is called. + * The HTTP client ignores Form and uses Body instead. + */ + form: url.Values + /** + * PostForm contains the parsed form data from PATCH, POST + * or PUT body parameters. + * + * This field is only available after ParseForm is called. + * The HTTP client ignores PostForm and uses Body instead. + */ + postForm: url.Values + /** + * MultipartForm is the parsed multipart form, including file uploads. + * This field is only available after ParseMultipartForm is called. + * The HTTP client ignores MultipartForm and uses Body instead. + */ + multipartForm?: multipart.Form + /** + * Trailer specifies additional headers that are sent after the request + * body. + * + * For server requests, the Trailer map initially contains only the + * trailer keys, with nil values. (The client declares which trailers it + * will later send.) While the handler is reading from Body, it must + * not reference Trailer. After reading from Body returns EOF, Trailer + * can be read again and will contain non-nil values, if they were sent + * by the client. + * + * For client requests, Trailer must be initialized to a map containing + * the trailer keys to later send. The values may be nil or their final + * values. The ContentLength must be 0 or -1, to send a chunked request. + * After the HTTP request is sent the map values can be updated while + * the request body is read. Once the body returns EOF, the caller must + * not mutate Trailer. + * + * Few HTTP clients, servers, or proxies support HTTP trailers. + */ + trailer: Header + /** + * RemoteAddr allows HTTP servers and other software to record + * the network address that sent the request, usually for + * logging. This field is not filled in by ReadRequest and + * has no defined format. The HTTP server in this package + * sets RemoteAddr to an "IP:port" address before invoking a + * handler. + * This field is ignored by the HTTP client. + */ + remoteAddr: string + /** + * RequestURI is the unmodified request-target of the + * Request-Line (RFC 7230, Section 3.1.1) as sent by the client + * to a server. Usually the URL field should be used instead. + * It is an error to set this field in an HTTP client request. + */ + requestURI: string + /** + * TLS allows HTTP servers and other software to record + * information about the TLS connection on which the request + * was received. This field is not filled in by ReadRequest. + * The HTTP server in this package sets the field for + * TLS-enabled connections before invoking a handler; + * otherwise it leaves the field nil. + * This field is ignored by the HTTP client. + */ + tls?: any + /** + * Cancel is an optional channel whose closure indicates that the client + * request should be regarded as canceled. Not all implementations of + * RoundTripper may support Cancel. + * + * For server requests, this field is not applicable. + * + * Deprecated: Set the Request's context with NewRequestWithContext + * instead. If a Request's Cancel field and context are both + * set, it is undefined whether Cancel is respected. + */ + cancel: undefined + /** + * Response is the redirect response which caused this request + * to be created. This field is only populated during client + * redirects. + */ + response?: Response + /** + * Pattern is the [ServeMux] pattern that matched the request. + * It is empty if the request was not matched against a pattern. + */ + pattern: string + } + interface Request { + /** + * Context returns the request's context. To change the context, use + * [Request.Clone] or [Request.WithContext]. + * + * The returned context is always non-nil; it defaults to the + * background context. + * + * For outgoing client requests, the context controls cancellation. + * + * For incoming server requests, the context is canceled when the + * client's connection closes, the request is canceled (with HTTP/2), + * or when the ServeHTTP method returns. + */ + context(): context.Context + } + interface Request { + /** + * WithContext returns a shallow copy of r with its context changed + * to ctx. The provided ctx must be non-nil. + * + * For outgoing client request, the context controls the entire + * lifetime of a request and its response: obtaining a connection, + * sending the request, and reading the response headers and body. + * + * To create a new request with a context, use [NewRequestWithContext]. + * To make a deep copy of a request with a new context, use [Request.Clone]. + */ + withContext(ctx: context.Context): (Request) + } + interface Request { + /** + * Clone returns a deep copy of r with its context changed to ctx. + * The provided ctx must be non-nil. + * + * Clone only makes a shallow copy of the Body field. + * + * For an outgoing client request, the context controls the entire + * lifetime of a request and its response: obtaining a connection, + * sending the request, and reading the response headers and body. + */ + clone(ctx: context.Context): (Request) + } + interface Request { + /** + * ProtoAtLeast reports whether the HTTP protocol used + * in the request is at least major.minor. + */ + protoAtLeast(major: number, minor: number): boolean + } + interface Request { + /** + * UserAgent returns the client's User-Agent, if sent in the request. + */ + userAgent(): string + } + interface Request { + /** + * Cookies parses and returns the HTTP cookies sent with the request. + */ + cookies(): Array<(Cookie | undefined)> + } + interface Request { + /** + * CookiesNamed parses and returns the named HTTP cookies sent with the request + * or an empty slice if none matched. + */ + cookiesNamed(name: string): Array<(Cookie | undefined)> + } + interface Request { + /** + * Cookie returns the named cookie provided in the request or + * [ErrNoCookie] if not found. + * If multiple cookies match the given name, only one cookie will + * be returned. + */ + cookie(name: string): (Cookie) + } + interface Request { + /** + * AddCookie adds a cookie to the request. Per RFC 6265 section 5.4, + * AddCookie does not attach more than one [Cookie] header field. That + * means all cookies, if any, are written into the same line, + * separated by semicolon. + * AddCookie only sanitizes c's name and value, and does not sanitize + * a Cookie header already present in the request. + */ + addCookie(c: Cookie): void + } + interface Request { + /** + * Referer returns the referring URL, if sent in the request. + * + * Referer is misspelled as in the request itself, a mistake from the + * earliest days of HTTP. This value can also be fetched from the + * [Header] map as Header["Referer"]; the benefit of making it available + * as a method is that the compiler can diagnose programs that use the + * alternate (correct English) spelling req.Referrer() but cannot + * diagnose programs that use Header["Referrer"]. + */ + referer(): string + } + interface Request { + /** + * MultipartReader returns a MIME multipart reader if this is a + * multipart/form-data or a multipart/mixed POST request, else returns nil and an error. + * Use this function instead of [Request.ParseMultipartForm] to + * process the request body as a stream. + */ + multipartReader(): (multipart.Reader) + } + interface Request { + /** + * Write writes an HTTP/1.1 request, which is the header and body, in wire format. + * This method consults the following fields of the request: + * + * ``` + * Host + * URL + * Method (defaults to "GET") + * Header + * ContentLength + * TransferEncoding + * Body + * ``` + * + * If Body is present, Content-Length is <= 0 and [Request.TransferEncoding] + * hasn't been set to "identity", Write adds "Transfer-Encoding: + * chunked" to the header. Body is closed after it is sent. + */ + write(w: io.Writer): void + } + interface Request { + /** + * WriteProxy is like [Request.Write] but writes the request in the form + * expected by an HTTP proxy. In particular, [Request.WriteProxy] writes the + * initial Request-URI line of the request with an absolute URI, per + * section 5.3 of RFC 7230, including the scheme and host. + * In either case, WriteProxy also writes a Host header, using + * either r.Host or r.URL.Host. + */ + writeProxy(w: io.Writer): void + } + interface Request { + /** + * BasicAuth returns the username and password provided in the request's + * Authorization header, if the request uses HTTP Basic Authentication. + * See RFC 2617, Section 2. + */ + basicAuth(): [string, string, boolean] + } + interface Request { + /** + * SetBasicAuth sets the request's Authorization header to use HTTP + * Basic Authentication with the provided username and password. + * + * With HTTP Basic Authentication the provided username and password + * are not encrypted. It should generally only be used in an HTTPS + * request. + * + * The username may not contain a colon. Some protocols may impose + * additional requirements on pre-escaping the username and + * password. For instance, when used with OAuth2, both arguments must + * be URL encoded first with [url.QueryEscape]. + */ + setBasicAuth(username: string, password: string): void + } + interface Request { + /** + * ParseForm populates r.Form and r.PostForm. + * + * For all requests, ParseForm parses the raw query from the URL and updates + * r.Form. + * + * For POST, PUT, and PATCH requests, it also reads the request body, parses it + * as a form and puts the results into both r.PostForm and r.Form. Request body + * parameters take precedence over URL query string values in r.Form. + * + * If the request Body's size has not already been limited by [MaxBytesReader], + * the size is capped at 10MB. + * + * For other HTTP methods, or when the Content-Type is not + * application/x-www-form-urlencoded, the request Body is not read, and + * r.PostForm is initialized to a non-nil, empty value. + * + * [Request.ParseMultipartForm] calls ParseForm automatically. + * ParseForm is idempotent. + */ + parseForm(): void + } + interface Request { + /** + * ParseMultipartForm parses a request body as multipart/form-data. + * The whole request body is parsed and up to a total of maxMemory bytes of + * its file parts are stored in memory, with the remainder stored on + * disk in temporary files. + * ParseMultipartForm calls [Request.ParseForm] if necessary. + * If ParseForm returns an error, ParseMultipartForm returns it but also + * continues parsing the request body. + * After one call to ParseMultipartForm, subsequent calls have no effect. + */ + parseMultipartForm(maxMemory: number): void + } + interface Request { + /** + * FormValue returns the first value for the named component of the query. + * The precedence order: + * 1. application/x-www-form-urlencoded form body (POST, PUT, PATCH only) + * 2. query parameters (always) + * 3. multipart/form-data form body (always) + * + * FormValue calls [Request.ParseMultipartForm] and [Request.ParseForm] + * if necessary and ignores any errors returned by these functions. + * If key is not present, FormValue returns the empty string. + * To access multiple values of the same key, call ParseForm and + * then inspect [Request.Form] directly. + */ + formValue(key: string): string + } + interface Request { + /** + * PostFormValue returns the first value for the named component of the POST, + * PUT, or PATCH request body. URL query parameters are ignored. + * PostFormValue calls [Request.ParseMultipartForm] and [Request.ParseForm] if necessary and ignores + * any errors returned by these functions. + * If key is not present, PostFormValue returns the empty string. + */ + postFormValue(key: string): string + } + interface Request { + /** + * FormFile returns the first file for the provided form key. + * FormFile calls [Request.ParseMultipartForm] and [Request.ParseForm] if necessary. + */ + formFile(key: string): [multipart.File, (multipart.FileHeader)] + } + interface Request { + /** + * PathValue returns the value for the named path wildcard in the [ServeMux] pattern + * that matched the request. + * It returns the empty string if the request was not matched against a pattern + * or there is no such wildcard in the pattern. + */ + pathValue(name: string): string + } + interface Request { + /** + * SetPathValue sets name to value, so that subsequent calls to r.PathValue(name) + * return value. + */ + setPathValue(name: string, value: string): void + } + /** + * A Handler responds to an HTTP request. + * + * [Handler.ServeHTTP] should write reply headers and data to the [ResponseWriter] + * and then return. Returning signals that the request is finished; it + * is not valid to use the [ResponseWriter] or read from the + * [Request.Body] after or concurrently with the completion of the + * ServeHTTP call. + * + * Depending on the HTTP client software, HTTP protocol version, and + * any intermediaries between the client and the Go server, it may not + * be possible to read from the [Request.Body] after writing to the + * [ResponseWriter]. Cautious handlers should read the [Request.Body] + * first, and then reply. + * + * Except for reading the body, handlers should not modify the + * provided Request. + * + * If ServeHTTP panics, the server (the caller of ServeHTTP) assumes + * that the effect of the panic was isolated to the active request. + * It recovers the panic, logs a stack trace to the server error log, + * and either closes the network connection or sends an HTTP/2 + * RST_STREAM, depending on the HTTP protocol. To abort a handler so + * the client sees an interrupted response but the server doesn't log + * an error, panic with the value [ErrAbortHandler]. + */ + interface Handler { + [key:string]: any; + serveHTTP(_arg0: ResponseWriter, _arg1: Request): void + } + /** + * A ResponseWriter interface is used by an HTTP handler to + * construct an HTTP response. + * + * A ResponseWriter may not be used after [Handler.ServeHTTP] has returned. + */ + interface ResponseWriter { + [key:string]: any; + /** + * Header returns the header map that will be sent by + * [ResponseWriter.WriteHeader]. The [Header] map also is the mechanism with which + * [Handler] implementations can set HTTP trailers. + * + * Changing the header map after a call to [ResponseWriter.WriteHeader] (or + * [ResponseWriter.Write]) has no effect unless the HTTP status code was of the + * 1xx class or the modified headers are trailers. + * + * There are two ways to set Trailers. The preferred way is to + * predeclare in the headers which trailers you will later + * send by setting the "Trailer" header to the names of the + * trailer keys which will come later. In this case, those + * keys of the Header map are treated as if they were + * trailers. See the example. The second way, for trailer + * keys not known to the [Handler] until after the first [ResponseWriter.Write], + * is to prefix the [Header] map keys with the [TrailerPrefix] + * constant value. + * + * To suppress automatic response headers (such as "Date"), set + * their value to nil. + */ + header(): Header + /** + * Write writes the data to the connection as part of an HTTP reply. + * + * If [ResponseWriter.WriteHeader] has not yet been called, Write calls + * WriteHeader(http.StatusOK) before writing the data. If the Header + * does not contain a Content-Type line, Write adds a Content-Type set + * to the result of passing the initial 512 bytes of written data to + * [DetectContentType]. Additionally, if the total size of all written + * data is under a few KB and there are no Flush calls, the + * Content-Length header is added automatically. + * + * Depending on the HTTP protocol version and the client, calling + * Write or WriteHeader may prevent future reads on the + * Request.Body. For HTTP/1.x requests, handlers should read any + * needed request body data before writing the response. Once the + * headers have been flushed (due to either an explicit Flusher.Flush + * call or writing enough data to trigger a flush), the request body + * may be unavailable. For HTTP/2 requests, the Go HTTP server permits + * handlers to continue to read the request body while concurrently + * writing the response. However, such behavior may not be supported + * by all HTTP/2 clients. Handlers should read before writing if + * possible to maximize compatibility. + */ + write(_arg0: string|Array): number + /** + * WriteHeader sends an HTTP response header with the provided + * status code. + * + * If WriteHeader is not called explicitly, the first call to Write + * will trigger an implicit WriteHeader(http.StatusOK). + * Thus explicit calls to WriteHeader are mainly used to + * send error codes or 1xx informational responses. + * + * The provided code must be a valid HTTP 1xx-5xx status code. + * Any number of 1xx headers may be written, followed by at most + * one 2xx-5xx header. 1xx headers are sent immediately, but 2xx-5xx + * headers may be buffered. Use the Flusher interface to send + * buffered data. The header map is cleared when 2xx-5xx headers are + * sent, but not with 1xx headers. + * + * The server will automatically send a 100 (Continue) header + * on the first read from the request body if the request has + * an "Expect: 100-continue" header. + */ + writeHeader(statusCode: number): void + } + /** + * A Server defines parameters for running an HTTP server. + * The zero value for Server is a valid configuration. + */ + interface Server { + /** + * Addr optionally specifies the TCP address for the server to listen on, + * in the form "host:port". If empty, ":http" (port 80) is used. + * The service names are defined in RFC 6335 and assigned by IANA. + * See net.Dial for details of the address format. + */ + addr: string + handler: Handler // handler to invoke, http.DefaultServeMux if nil + /** + * DisableGeneralOptionsHandler, if true, passes "OPTIONS *" requests to the Handler, + * otherwise responds with 200 OK and Content-Length: 0. + */ + disableGeneralOptionsHandler: boolean + /** + * TLSConfig optionally provides a TLS configuration for use + * by ServeTLS and ListenAndServeTLS. Note that this value is + * cloned by ServeTLS and ListenAndServeTLS, so it's not + * possible to modify the configuration with methods like + * tls.Config.SetSessionTicketKeys. To use + * SetSessionTicketKeys, use Server.Serve with a TLS Listener + * instead. + */ + tlsConfig?: any + /** + * ReadTimeout is the maximum duration for reading the entire + * request, including the body. A zero or negative value means + * there will be no timeout. + * + * Because ReadTimeout does not let Handlers make per-request + * decisions on each request body's acceptable deadline or + * upload rate, most users will prefer to use + * ReadHeaderTimeout. It is valid to use them both. + */ + readTimeout: time.Duration + /** + * ReadHeaderTimeout is the amount of time allowed to read + * request headers. The connection's read deadline is reset + * after reading the headers and the Handler can decide what + * is considered too slow for the body. If zero, the value of + * ReadTimeout is used. If negative, or if zero and ReadTimeout + * is zero or negative, there is no timeout. + */ + readHeaderTimeout: time.Duration + /** + * WriteTimeout is the maximum duration before timing out + * writes of the response. It is reset whenever a new + * request's header is read. Like ReadTimeout, it does not + * let Handlers make decisions on a per-request basis. + * A zero or negative value means there will be no timeout. + */ + writeTimeout: time.Duration + /** + * IdleTimeout is the maximum amount of time to wait for the + * next request when keep-alives are enabled. If zero, the value + * of ReadTimeout is used. If negative, or if zero and ReadTimeout + * is zero or negative, there is no timeout. + */ + idleTimeout: time.Duration + /** + * MaxHeaderBytes controls the maximum number of bytes the + * server will read parsing the request header's keys and + * values, including the request line. It does not limit the + * size of the request body. + * If zero, DefaultMaxHeaderBytes is used. + */ + maxHeaderBytes: number + /** + * TLSNextProto optionally specifies a function to take over + * ownership of the provided TLS connection when an ALPN + * protocol upgrade has occurred. The map key is the protocol + * name negotiated. The Handler argument should be used to + * handle HTTP requests and will initialize the Request's TLS + * and RemoteAddr if not already set. The connection is + * automatically closed when the function returns. + * If TLSNextProto is not nil, HTTP/2 support is not enabled + * automatically. + */ + tlsNextProto: _TygojaDict + /** + * ConnState specifies an optional callback function that is + * called when a client connection changes state. See the + * ConnState type and associated constants for details. + */ + connState: (_arg0: net.Conn, _arg1: ConnState) => void + /** + * ErrorLog specifies an optional logger for errors accepting + * connections, unexpected behavior from handlers, and + * underlying FileSystem errors. + * If nil, logging is done via the log package's standard logger. + */ + errorLog?: any + /** + * BaseContext optionally specifies a function that returns + * the base context for incoming requests on this server. + * The provided Listener is the specific Listener that's + * about to start accepting requests. + * If BaseContext is nil, the default is context.Background(). + * If non-nil, it must return a non-nil context. + */ + baseContext: (_arg0: net.Listener) => context.Context + /** + * ConnContext optionally specifies a function that modifies + * the context used for a new connection c. The provided ctx + * is derived from the base context and has a ServerContextKey + * value. + */ + connContext: (ctx: context.Context, c: net.Conn) => context.Context + } + interface Server { + /** + * Close immediately closes all active net.Listeners and any + * connections in state [StateNew], [StateActive], or [StateIdle]. For a + * graceful shutdown, use [Server.Shutdown]. + * + * Close does not attempt to close (and does not even know about) + * any hijacked connections, such as WebSockets. + * + * Close returns any error returned from closing the [Server]'s + * underlying Listener(s). + */ + close(): void + } + interface Server { + /** + * Shutdown gracefully shuts down the server without interrupting any + * active connections. Shutdown works by first closing all open + * listeners, then closing all idle connections, and then waiting + * indefinitely for connections to return to idle and then shut down. + * If the provided context expires before the shutdown is complete, + * Shutdown returns the context's error, otherwise it returns any + * error returned from closing the [Server]'s underlying Listener(s). + * + * When Shutdown is called, [Serve], [ListenAndServe], and + * [ListenAndServeTLS] immediately return [ErrServerClosed]. Make sure the + * program doesn't exit and waits instead for Shutdown to return. + * + * Shutdown does not attempt to close nor wait for hijacked + * connections such as WebSockets. The caller of Shutdown should + * separately notify such long-lived connections of shutdown and wait + * for them to close, if desired. See [Server.RegisterOnShutdown] for a way to + * register shutdown notification functions. + * + * Once Shutdown has been called on a server, it may not be reused; + * future calls to methods such as Serve will return ErrServerClosed. + */ + shutdown(ctx: context.Context): void + } + interface Server { + /** + * RegisterOnShutdown registers a function to call on [Server.Shutdown]. + * This can be used to gracefully shutdown connections that have + * undergone ALPN protocol upgrade or that have been hijacked. + * This function should start protocol-specific graceful shutdown, + * but should not wait for shutdown to complete. + */ + registerOnShutdown(f: () => void): void + } + interface Server { + /** + * ListenAndServe listens on the TCP network address srv.Addr and then + * calls [Serve] to handle requests on incoming connections. + * Accepted connections are configured to enable TCP keep-alives. + * + * If srv.Addr is blank, ":http" is used. + * + * ListenAndServe always returns a non-nil error. After [Server.Shutdown] or [Server.Close], + * the returned error is [ErrServerClosed]. + */ + listenAndServe(): void + } + interface Server { + /** + * Serve accepts incoming connections on the Listener l, creating a + * new service goroutine for each. The service goroutines read requests and + * then call srv.Handler to reply to them. + * + * HTTP/2 support is only enabled if the Listener returns [*tls.Conn] + * connections and they were configured with "h2" in the TLS + * Config.NextProtos. + * + * Serve always returns a non-nil error and closes l. + * After [Server.Shutdown] or [Server.Close], the returned error is [ErrServerClosed]. + */ + serve(l: net.Listener): void + } + interface Server { + /** + * ServeTLS accepts incoming connections on the Listener l, creating a + * new service goroutine for each. The service goroutines perform TLS + * setup and then read requests, calling srv.Handler to reply to them. + * + * Files containing a certificate and matching private key for the + * server must be provided if neither the [Server]'s + * TLSConfig.Certificates, TLSConfig.GetCertificate nor + * config.GetConfigForClient are populated. + * If the certificate is signed by a certificate authority, the + * certFile should be the concatenation of the server's certificate, + * any intermediates, and the CA's certificate. + * + * ServeTLS always returns a non-nil error. After [Server.Shutdown] or [Server.Close], the + * returned error is [ErrServerClosed]. + */ + serveTLS(l: net.Listener, certFile: string, keyFile: string): void + } + interface Server { + /** + * SetKeepAlivesEnabled controls whether HTTP keep-alives are enabled. + * By default, keep-alives are always enabled. Only very + * resource-constrained environments or servers in the process of + * shutting down should disable them. + */ + setKeepAlivesEnabled(v: boolean): void + } + interface Server { + /** + * ListenAndServeTLS listens on the TCP network address srv.Addr and + * then calls [ServeTLS] to handle requests on incoming TLS connections. + * Accepted connections are configured to enable TCP keep-alives. + * + * Filenames containing a certificate and matching private key for the + * server must be provided if neither the [Server]'s TLSConfig.Certificates + * nor TLSConfig.GetCertificate are populated. If the certificate is + * signed by a certificate authority, the certFile should be the + * concatenation of the server's certificate, any intermediates, and + * the CA's certificate. + * + * If srv.Addr is blank, ":https" is used. + * + * ListenAndServeTLS always returns a non-nil error. After [Server.Shutdown] or + * [Server.Close], the returned error is [ErrServerClosed]. + */ + listenAndServeTLS(certFile: string, keyFile: string): void + } +} + +namespace hook { + /** + * Event implements [Resolver] and it is intended to be used as a base + * Hook event that you can embed in your custom typed event structs. + * + * Example: + * + * ``` + * type CustomEvent struct { + * hook.Event + * + * SomeField int + * } + * ``` + */ + interface Event { + } + interface Event { + /** + * Next calls the next hook handler. + */ + next(): void + } + /** + * Handler defines a single Hook handler. + * Multiple handlers can share the same id. + * If Id is not explicitly set it will be autogenerated by Hook.Add and Hook.AddHandler. + */ + interface Handler { + /** + * Func defines the handler function to execute. + * + * Note that users need to call e.Next() in order to proceed with + * the execution of the hook chain. + */ + func: (_arg0: T) => void + /** + * Id is the unique identifier of the handler. + * + * It could be used later to remove the handler from a hook via [Hook.Remove]. + * + * If missing, an autogenerated value will be assigned when adding + * the handler to a hook. + */ + id: string + /** + * Priority allows changing the default exec priority of the handler within a hook. + * + * If 0, the handler will be executed in the same order it was registered. + */ + priority: number + } + /** + * Hook defines a generic concurrent safe structure for managing event hooks. + * + * When using custom event it must embed the base [hook.Event]. + * + * Example: + * + * ``` + * type CustomEvent struct { + * hook.Event + * SomeField int + * } + * + * h := Hook[*CustomEvent]{} + * + * h.BindFunc(func(e *CustomEvent) error { + * println(e.SomeField) + * + * return e.Next() + * }) + * + * h.Trigger(&CustomEvent{ SomeField: 123 }) + * ``` + */ + interface Hook { + } + /** + * TaggedHook defines a proxy hook which register handlers that are triggered only + * if the TaggedHook.tags are empty or includes at least one of the event data tag(s). + */ + type _sSpEQZd = mainHook + interface TaggedHook extends _sSpEQZd { + } +} + +namespace exec { + /** + * Cmd represents an external command being prepared or run. + * + * A Cmd cannot be reused after calling its [Cmd.Run], [Cmd.Output] or [Cmd.CombinedOutput] + * methods. + */ + interface Cmd { + /** + * Path is the path of the command to run. + * + * This is the only field that must be set to a non-zero + * value. If Path is relative, it is evaluated relative + * to Dir. + */ + path: string + /** + * Args holds command line arguments, including the command as Args[0]. + * If the Args field is empty or nil, Run uses {Path}. + * + * In typical use, both Path and Args are set by calling Command. + */ + args: Array + /** + * Env specifies the environment of the process. + * Each entry is of the form "key=value". + * If Env is nil, the new process uses the current process's + * environment. + * If Env contains duplicate environment keys, only the last + * value in the slice for each duplicate key is used. + * As a special case on Windows, SYSTEMROOT is always added if + * missing and not explicitly set to the empty string. + */ + env: Array + /** + * Dir specifies the working directory of the command. + * If Dir is the empty string, Run runs the command in the + * calling process's current directory. + */ + dir: string + /** + * Stdin specifies the process's standard input. + * + * If Stdin is nil, the process reads from the null device (os.DevNull). + * + * If Stdin is an *os.File, the process's standard input is connected + * directly to that file. + * + * Otherwise, during the execution of the command a separate + * goroutine reads from Stdin and delivers that data to the command + * over a pipe. In this case, Wait does not complete until the goroutine + * stops copying, either because it has reached the end of Stdin + * (EOF or a read error), or because writing to the pipe returned an error, + * or because a nonzero WaitDelay was set and expired. + */ + stdin: io.Reader + /** + * Stdout and Stderr specify the process's standard output and error. + * + * If either is nil, Run connects the corresponding file descriptor + * to the null device (os.DevNull). + * + * If either is an *os.File, the corresponding output from the process + * is connected directly to that file. + * + * Otherwise, during the execution of the command a separate goroutine + * reads from the process over a pipe and delivers that data to the + * corresponding Writer. In this case, Wait does not complete until the + * goroutine reaches EOF or encounters an error or a nonzero WaitDelay + * expires. + * + * If Stdout and Stderr are the same writer, and have a type that can + * be compared with ==, at most one goroutine at a time will call Write. + */ + stdout: io.Writer + stderr: io.Writer + /** + * ExtraFiles specifies additional open files to be inherited by the + * new process. It does not include standard input, standard output, or + * standard error. If non-nil, entry i becomes file descriptor 3+i. + * + * ExtraFiles is not supported on Windows. + */ + extraFiles: Array<(os.File | undefined)> + /** + * SysProcAttr holds optional, operating system-specific attributes. + * Run passes it to os.StartProcess as the os.ProcAttr's Sys field. + */ + sysProcAttr?: syscall.SysProcAttr + /** + * Process is the underlying process, once started. + */ + process?: os.Process + /** + * ProcessState contains information about an exited process. + * If the process was started successfully, Wait or Run will + * populate its ProcessState when the command completes. + */ + processState?: os.ProcessState + err: Error // LookPath error, if any. + /** + * If Cancel is non-nil, the command must have been created with + * CommandContext and Cancel will be called when the command's + * Context is done. By default, CommandContext sets Cancel to + * call the Kill method on the command's Process. + * + * Typically a custom Cancel will send a signal to the command's + * Process, but it may instead take other actions to initiate cancellation, + * such as closing a stdin or stdout pipe or sending a shutdown request on a + * network socket. + * + * If the command exits with a success status after Cancel is + * called, and Cancel does not return an error equivalent to + * os.ErrProcessDone, then Wait and similar methods will return a non-nil + * error: either an error wrapping the one returned by Cancel, + * or the error from the Context. + * (If the command exits with a non-success status, or Cancel + * returns an error that wraps os.ErrProcessDone, Wait and similar methods + * continue to return the command's usual exit status.) + * + * If Cancel is set to nil, nothing will happen immediately when the command's + * Context is done, but a nonzero WaitDelay will still take effect. That may + * be useful, for example, to work around deadlocks in commands that do not + * support shutdown signals but are expected to always finish quickly. + * + * Cancel will not be called if Start returns a non-nil error. + */ + cancel: () => void + /** + * If WaitDelay is non-zero, it bounds the time spent waiting on two sources + * of unexpected delay in Wait: a child process that fails to exit after the + * associated Context is canceled, and a child process that exits but leaves + * its I/O pipes unclosed. + * + * The WaitDelay timer starts when either the associated Context is done or a + * call to Wait observes that the child process has exited, whichever occurs + * first. When the delay has elapsed, the command shuts down the child process + * and/or its I/O pipes. + * + * If the child process has failed to exit — perhaps because it ignored or + * failed to receive a shutdown signal from a Cancel function, or because no + * Cancel function was set — then it will be terminated using os.Process.Kill. + * + * Then, if the I/O pipes communicating with the child process are still open, + * those pipes are closed in order to unblock any goroutines currently blocked + * on Read or Write calls. + * + * If pipes are closed due to WaitDelay, no Cancel call has occurred, + * and the command has otherwise exited with a successful status, Wait and + * similar methods will return ErrWaitDelay instead of nil. + * + * If WaitDelay is zero (the default), I/O pipes will be read until EOF, + * which might not occur until orphaned subprocesses of the command have + * also closed their descriptors for the pipes. + */ + waitDelay: time.Duration + } + interface Cmd { + /** + * String returns a human-readable description of c. + * It is intended only for debugging. + * In particular, it is not suitable for use as input to a shell. + * The output of String may vary across Go releases. + */ + string(): string + } + interface Cmd { + /** + * Run starts the specified command and waits for it to complete. + * + * The returned error is nil if the command runs, has no problems + * copying stdin, stdout, and stderr, and exits with a zero exit + * status. + * + * If the command starts but does not complete successfully, the error is of + * type [*ExitError]. Other error types may be returned for other situations. + * + * If the calling goroutine has locked the operating system thread + * with [runtime.LockOSThread] and modified any inheritable OS-level + * thread state (for example, Linux or Plan 9 name spaces), the new + * process will inherit the caller's thread state. + */ + run(): void + } + interface Cmd { + /** + * Start starts the specified command but does not wait for it to complete. + * + * If Start returns successfully, the c.Process field will be set. + * + * After a successful call to Start the [Cmd.Wait] method must be called in + * order to release associated system resources. + */ + start(): void + } + interface Cmd { + /** + * Wait waits for the command to exit and waits for any copying to + * stdin or copying from stdout or stderr to complete. + * + * The command must have been started by [Cmd.Start]. + * + * The returned error is nil if the command runs, has no problems + * copying stdin, stdout, and stderr, and exits with a zero exit + * status. + * + * If the command fails to run or doesn't complete successfully, the + * error is of type [*ExitError]. Other error types may be + * returned for I/O problems. + * + * If any of c.Stdin, c.Stdout or c.Stderr are not an [*os.File], Wait also waits + * for the respective I/O loop copying to or from the process to complete. + * + * Wait releases any resources associated with the [Cmd]. + */ + wait(): void + } + interface Cmd { + /** + * Output runs the command and returns its standard output. + * Any returned error will usually be of type [*ExitError]. + * If c.Stderr was nil, Output populates [ExitError.Stderr]. + */ + output(): string|Array + } + interface Cmd { + /** + * CombinedOutput runs the command and returns its combined standard + * output and standard error. + */ + combinedOutput(): string|Array + } + interface Cmd { + /** + * StdinPipe returns a pipe that will be connected to the command's + * standard input when the command starts. + * The pipe will be closed automatically after [Cmd.Wait] sees the command exit. + * A caller need only call Close to force the pipe to close sooner. + * For example, if the command being run will not exit until standard input + * is closed, the caller must close the pipe. + */ + stdinPipe(): io.WriteCloser + } + interface Cmd { + /** + * StdoutPipe returns a pipe that will be connected to the command's + * standard output when the command starts. + * + * [Cmd.Wait] will close the pipe after seeing the command exit, so most callers + * need not close the pipe themselves. It is thus incorrect to call Wait + * before all reads from the pipe have completed. + * For the same reason, it is incorrect to call [Cmd.Run] when using StdoutPipe. + * See the example for idiomatic usage. + */ + stdoutPipe(): io.ReadCloser + } + interface Cmd { + /** + * StderrPipe returns a pipe that will be connected to the command's + * standard error when the command starts. + * + * [Cmd.Wait] will close the pipe after seeing the command exit, so most callers + * need not close the pipe themselves. It is thus incorrect to call Wait + * before all reads from the pipe have completed. + * For the same reason, it is incorrect to use [Cmd.Run] when using StderrPipe. + * See the StdoutPipe example for idiomatic usage. + */ + stderrPipe(): io.ReadCloser + } + interface Cmd { + /** + * Environ returns a copy of the environment in which the command would be run + * as it is currently configured. + */ + environ(): Array + } +} + +namespace mailer { + /** + * Message defines a generic email message struct. + */ + interface Message { + from: { address: string; name?: string; } + to: Array<{ address: string; name?: string; }> + bcc: Array<{ address: string; name?: string; }> + cc: Array<{ address: string; name?: string; }> + subject: string + html: string + text: string + headers: _TygojaDict + attachments: _TygojaDict + inlineAttachments: _TygojaDict + } + /** + * Mailer defines a base mail client interface. + */ + interface Mailer { + [key:string]: any; + /** + * Send sends an email with the provided Message. + */ + send(message: Message): void + } +} + +/** + * Package blob defines a lightweight abstration for interacting with + * various storage services (local filesystem, S3, etc.). + * + * NB! + * For compatibility with earlier PocketBase versions and to prevent + * unnecessary breaking changes, this package is based and implemented + * as a minimal, stripped down version of the previously used gocloud.dev/blob. + * While there is no promise that it won't diverge in the future to accommodate + * better some PocketBase specific use cases, currently it copies and + * tries to follow as close as possible the same implementations, + * conventions and rules for the key escaping/unescaping, blob read/write + * interfaces and struct options as gocloud.dev/blob, therefore the + * credits goes to the original Go Cloud Development Kit Authors. + */ +namespace blob { + /** + * ListObject represents a single blob returned from List. + */ + interface ListObject { + /** + * Key is the key for this blob. + */ + key: string + /** + * ModTime is the time the blob was last modified. + */ + modTime: time.Time + /** + * Size is the size of the blob's content in bytes. + */ + size: number + /** + * MD5 is an MD5 hash of the blob contents or nil if not available. + */ + md5: string|Array + /** + * IsDir indicates that this result represents a "directory" in the + * hierarchical namespace, ending in ListOptions.Delimiter. Key can be + * passed as ListOptions.Prefix to list items in the "directory". + * Fields other than Key and IsDir will not be set if IsDir is true. + */ + isDir: boolean + } + /** + * Attributes contains attributes about a blob. + */ + interface Attributes { + /** + * CacheControl specifies caching attributes that services may use + * when serving the blob. + * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control + */ + cacheControl: string + /** + * ContentDisposition specifies whether the blob content is expected to be + * displayed inline or as an attachment. + * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition + */ + contentDisposition: string + /** + * ContentEncoding specifies the encoding used for the blob's content, if any. + * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding + */ + contentEncoding: string + /** + * ContentLanguage specifies the language used in the blob's content, if any. + * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language + */ + contentLanguage: string + /** + * ContentType is the MIME type of the blob. It will not be empty. + * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type + */ + contentType: string + /** + * Metadata holds key/value pairs associated with the blob. + * Keys are guaranteed to be in lowercase, even if the backend service + * has case-sensitive keys (although note that Metadata written via + * this package will always be lowercased). If there are duplicate + * case-insensitive keys (e.g., "foo" and "FOO"), only one value + * will be kept, and it is undefined which one. + */ + metadata: _TygojaDict + /** + * CreateTime is the time the blob was created, if available. If not available, + * CreateTime will be the zero time. + */ + createTime: time.Time + /** + * ModTime is the time the blob was last modified. + */ + modTime: time.Time + /** + * Size is the size of the blob's content in bytes. + */ + size: number + /** + * MD5 is an MD5 hash of the blob contents or nil if not available. + */ + md5: string|Array + /** + * ETag for the blob; see https://en.wikipedia.org/wiki/HTTP_ETag. + */ + eTag: string + } + /** + * Reader reads bytes from a blob. + * It implements io.ReadSeekCloser, and must be closed after reads are finished. + */ + interface Reader { + } + interface Reader { + /** + * Read implements io.Reader (https://golang.org/pkg/io/#Reader). + */ + read(p: string|Array): number + } + interface Reader { + /** + * Seek implements io.Seeker (https://golang.org/pkg/io/#Seeker). + */ + seek(offset: number, whence: number): number + } + interface Reader { + /** + * Close implements io.Closer (https://golang.org/pkg/io/#Closer). + */ + close(): void + } + interface Reader { + /** + * ContentType returns the MIME type of the blob. + */ + contentType(): string + } + interface Reader { + /** + * ModTime returns the time the blob was last modified. + */ + modTime(): time.Time + } + interface Reader { + /** + * Size returns the size of the blob content in bytes. + */ + size(): number + } + interface Reader { + /** + * WriteTo reads from r and writes to w until there's no more data or + * an error occurs. + * The return value is the number of bytes written to w. + * + * It implements the io.WriterTo interface. + */ + writeTo(w: io.Writer): number + } } /** @@ -16909,2371 +20379,155 @@ namespace cobra { } } -namespace store { +namespace auth { /** - * Store defines a concurrent safe in memory key-value data store. + * Provider defines a common interface for an OAuth2 client. */ - interface Store { - } - interface Store { - /** - * Reset clears the store and replaces the store data with a - * shallow copy of the provided newData. - */ - reset(newData: _TygojaDict): void - } - interface Store { - /** - * Length returns the current number of elements in the store. - */ - length(): number - } - interface Store { - /** - * RemoveAll removes all the existing store entries. - */ - removeAll(): void - } - interface Store { - /** - * Remove removes a single entry from the store. - * - * Remove does nothing if key doesn't exist in the store. - */ - remove(key: K): void - } - interface Store { - /** - * Has checks if element with the specified key exist or not. - */ - has(key: K): boolean - } - interface Store { - /** - * Get returns a single element value from the store. - * - * If key is not set, the zero T value is returned. - */ - get(key: K): T - } - interface Store { - /** - * GetOk is similar to Get but returns also a boolean indicating whether the key exists or not. - */ - getOk(key: K): [T, boolean] - } - interface Store { - /** - * GetAll returns a shallow copy of the current store data. - */ - getAll(): _TygojaDict - } - interface Store { - /** - * Values returns a slice with all of the current store values. - */ - values(): Array - } - interface Store { - /** - * Set sets (or overwrite if already exists) a new value for key. - */ - set(key: K, value: T): void - } - interface Store { - /** - * SetFunc sets (or overwrite if already exists) a new value resolved - * from the function callback for the provided key. - * - * The function callback receives as argument the old store element value (if exists). - * If there is no old store element, the argument will be the T zero value. - * - * Example: - * - * ``` - * s := store.New[string, int](nil) - * s.SetFunc("count", func(old int) int { - * return old + 1 - * }) - * ``` - */ - setFunc(key: K, fn: (old: T) => T): void - } - interface Store { - /** - * GetOrSet retrieves a single existing value for the provided key - * or stores a new one if it doesn't exist. - */ - getOrSet(key: K, setFunc: () => T): T - } - interface Store { - /** - * SetIfLessThanLimit sets (or overwrite if already exist) a new value for key. - * - * This method is similar to Set() but **it will skip adding new elements** - * to the store if the store length has reached the specified limit. - * false is returned if maxAllowedElements limit is reached. - */ - setIfLessThanLimit(key: K, value: T, maxAllowedElements: number): boolean - } - interface Store { - /** - * UnmarshalJSON implements [json.Unmarshaler] and imports the - * provided JSON data into the store. - * - * The store entries that match with the ones from the data will be overwritten with the new value. - */ - unmarshalJSON(data: string|Array): void - } - interface Store { - /** - * MarshalJSON implements [json.Marshaler] and export the current - * store data into valid JSON. - */ - marshalJSON(): string|Array - } -} - -/** - * Package multipart implements MIME multipart parsing, as defined in RFC - * 2046. - * - * The implementation is sufficient for HTTP (RFC 2388) and the multipart - * bodies generated by popular browsers. - * - * # Limits - * - * To protect against malicious inputs, this package sets limits on the size - * of the MIME data it processes. - * - * [Reader.NextPart] and [Reader.NextRawPart] limit the number of headers in a - * part to 10000 and [Reader.ReadForm] limits the total number of headers in all - * FileHeaders to 10000. - * These limits may be adjusted with the GODEBUG=multipartmaxheaders= - * setting. - * - * Reader.ReadForm further limits the number of parts in a form to 1000. - * This limit may be adjusted with the GODEBUG=multipartmaxparts= - * setting. - */ -namespace multipart { - /** - * A FileHeader describes a file part of a multipart request. - */ - interface FileHeader { - filename: string - header: textproto.MIMEHeader - size: number - } - interface FileHeader { - /** - * Open opens and returns the [FileHeader]'s associated File. - */ - open(): File - } -} - -/** - * Package jwt is a Go implementation of JSON Web Tokens: http://self-issued.info/docs/draft-jones-json-web-token.html - * - * See README.md for more info. - */ -namespace jwt { - /** - * MapClaims is a claims type that uses the map[string]interface{} for JSON - * decoding. This is the default claims type if you don't supply one - */ - interface MapClaims extends _TygojaDict{} - interface MapClaims { - /** - * GetExpirationTime implements the Claims interface. - */ - getExpirationTime(): (NumericDate) - } - interface MapClaims { - /** - * GetNotBefore implements the Claims interface. - */ - getNotBefore(): (NumericDate) - } - interface MapClaims { - /** - * GetIssuedAt implements the Claims interface. - */ - getIssuedAt(): (NumericDate) - } - interface MapClaims { - /** - * GetAudience implements the Claims interface. - */ - getAudience(): ClaimStrings - } - interface MapClaims { - /** - * GetIssuer implements the Claims interface. - */ - getIssuer(): string - } - interface MapClaims { - /** - * GetSubject implements the Claims interface. - */ - getSubject(): string - } -} - -namespace hook { - /** - * Event implements [Resolver] and it is intended to be used as a base - * Hook event that you can embed in your custom typed event structs. - * - * Example: - * - * ``` - * type CustomEvent struct { - * hook.Event - * - * SomeField int - * } - * ``` - */ - interface Event { - } - interface Event { - /** - * Next calls the next hook handler. - */ - next(): void - } - /** - * Handler defines a single Hook handler. - * Multiple handlers can share the same id. - * If Id is not explicitly set it will be autogenerated by Hook.Add and Hook.AddHandler. - */ - interface Handler { - /** - * Func defines the handler function to execute. - * - * Note that users need to call e.Next() in order to proceed with - * the execution of the hook chain. - */ - func: (_arg0: T) => void - /** - * Id is the unique identifier of the handler. - * - * It could be used later to remove the handler from a hook via [Hook.Remove]. - * - * If missing, an autogenerated value will be assigned when adding - * the handler to a hook. - */ - id: string - /** - * Priority allows changing the default exec priority of the handler within a hook. - * - * If 0, the handler will be executed in the same order it was registered. - */ - priority: number - } - /** - * Hook defines a generic concurrent safe structure for managing event hooks. - * - * When using custom event it must embed the base [hook.Event]. - * - * Example: - * - * ``` - * type CustomEvent struct { - * hook.Event - * SomeField int - * } - * - * h := Hook[*CustomEvent]{} - * - * h.BindFunc(func(e *CustomEvent) error { - * println(e.SomeField) - * - * return e.Next() - * }) - * - * h.Trigger(&CustomEvent{ SomeField: 123 }) - * ``` - */ - interface Hook { - } - /** - * TaggedHook defines a proxy hook which register handlers that are triggered only - * if the TaggedHook.tags are empty or includes at least one of the event data tag(s). - */ - type _sgASblN = mainHook - interface TaggedHook extends _sgASblN { - } -} - -/** - * Package sql provides a generic interface around SQL (or SQL-like) - * databases. - * - * The sql package must be used in conjunction with a database driver. - * See https://golang.org/s/sqldrivers for a list of drivers. - * - * Drivers that do not support context cancellation will not return until - * after the query is completed. - * - * For usage examples, see the wiki page at - * https://golang.org/s/sqlwiki. - */ -namespace sql { - /** - * TxOptions holds the transaction options to be used in [DB.BeginTx]. - */ - interface TxOptions { - /** - * Isolation is the transaction isolation level. - * If zero, the driver or database's default level is used. - */ - isolation: IsolationLevel - readOnly: boolean - } - /** - * NullString represents a string that may be null. - * NullString implements the [Scanner] interface so - * it can be used as a scan destination: - * - * ``` - * var s NullString - * err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&s) - * ... - * if s.Valid { - * // use s.String - * } else { - * // NULL value - * } - * ``` - */ - interface NullString { - string: string - valid: boolean // Valid is true if String is not NULL - } - interface NullString { - /** - * Scan implements the [Scanner] interface. - */ - scan(value: any): void - } - interface NullString { - /** - * Value implements the [driver.Valuer] interface. - */ - value(): any - } - /** - * DB is a database handle representing a pool of zero or more - * underlying connections. It's safe for concurrent use by multiple - * goroutines. - * - * The sql package creates and frees connections automatically; it - * also maintains a free pool of idle connections. If the database has - * a concept of per-connection state, such state can be reliably observed - * within a transaction ([Tx]) or connection ([Conn]). Once [DB.Begin] is called, the - * returned [Tx] is bound to a single connection. Once [Tx.Commit] or - * [Tx.Rollback] is called on the transaction, that transaction's - * connection is returned to [DB]'s idle connection pool. The pool size - * can be controlled with [DB.SetMaxIdleConns]. - */ - interface DB { - } - interface DB { - /** - * PingContext verifies a connection to the database is still alive, - * establishing a connection if necessary. - */ - pingContext(ctx: context.Context): void - } - interface DB { - /** - * Ping verifies a connection to the database is still alive, - * establishing a connection if necessary. - * - * Ping uses [context.Background] internally; to specify the context, use - * [DB.PingContext]. - */ - ping(): void - } - interface DB { - /** - * Close closes the database and prevents new queries from starting. - * Close then waits for all queries that have started processing on the server - * to finish. - * - * It is rare to Close a [DB], as the [DB] handle is meant to be - * long-lived and shared between many goroutines. - */ - close(): void - } - interface DB { - /** - * SetMaxIdleConns sets the maximum number of connections in the idle - * connection pool. - * - * If MaxOpenConns is greater than 0 but less than the new MaxIdleConns, - * then the new MaxIdleConns will be reduced to match the MaxOpenConns limit. - * - * If n <= 0, no idle connections are retained. - * - * The default max idle connections is currently 2. This may change in - * a future release. - */ - setMaxIdleConns(n: number): void - } - interface DB { - /** - * SetMaxOpenConns sets the maximum number of open connections to the database. - * - * If MaxIdleConns is greater than 0 and the new MaxOpenConns is less than - * MaxIdleConns, then MaxIdleConns will be reduced to match the new - * MaxOpenConns limit. - * - * If n <= 0, then there is no limit on the number of open connections. - * The default is 0 (unlimited). - */ - setMaxOpenConns(n: number): void - } - interface DB { - /** - * SetConnMaxLifetime sets the maximum amount of time a connection may be reused. - * - * Expired connections may be closed lazily before reuse. - * - * If d <= 0, connections are not closed due to a connection's age. - */ - setConnMaxLifetime(d: time.Duration): void - } - interface DB { - /** - * SetConnMaxIdleTime sets the maximum amount of time a connection may be idle. - * - * Expired connections may be closed lazily before reuse. - * - * If d <= 0, connections are not closed due to a connection's idle time. - */ - setConnMaxIdleTime(d: time.Duration): void - } - interface DB { - /** - * Stats returns database statistics. - */ - stats(): DBStats - } - interface DB { - /** - * PrepareContext creates a prepared statement for later queries or executions. - * Multiple queries or executions may be run concurrently from the - * returned statement. - * The caller must call the statement's [*Stmt.Close] method - * when the statement is no longer needed. - * - * The provided context is used for the preparation of the statement, not for the - * execution of the statement. - */ - prepareContext(ctx: context.Context, query: string): (Stmt) - } - interface DB { - /** - * Prepare creates a prepared statement for later queries or executions. - * Multiple queries or executions may be run concurrently from the - * returned statement. - * The caller must call the statement's [*Stmt.Close] method - * when the statement is no longer needed. - * - * Prepare uses [context.Background] internally; to specify the context, use - * [DB.PrepareContext]. - */ - prepare(query: string): (Stmt) - } - interface DB { - /** - * ExecContext executes a query without returning any rows. - * The args are for any placeholder parameters in the query. - */ - execContext(ctx: context.Context, query: string, ...args: any[]): Result - } - interface DB { - /** - * Exec executes a query without returning any rows. - * The args are for any placeholder parameters in the query. - * - * Exec uses [context.Background] internally; to specify the context, use - * [DB.ExecContext]. - */ - exec(query: string, ...args: any[]): Result - } - interface DB { - /** - * QueryContext executes a query that returns rows, typically a SELECT. - * The args are for any placeholder parameters in the query. - */ - queryContext(ctx: context.Context, query: string, ...args: any[]): (Rows) - } - interface DB { - /** - * Query executes a query that returns rows, typically a SELECT. - * The args are for any placeholder parameters in the query. - * - * Query uses [context.Background] internally; to specify the context, use - * [DB.QueryContext]. - */ - query(query: string, ...args: any[]): (Rows) - } - interface DB { - /** - * QueryRowContext executes a query that is expected to return at most one row. - * QueryRowContext always returns a non-nil value. Errors are deferred until - * [Row]'s Scan method is called. - * If the query selects no rows, the [*Row.Scan] will return [ErrNoRows]. - * Otherwise, [*Row.Scan] scans the first selected row and discards - * the rest. - */ - queryRowContext(ctx: context.Context, query: string, ...args: any[]): (Row) - } - interface DB { - /** - * QueryRow executes a query that is expected to return at most one row. - * QueryRow always returns a non-nil value. Errors are deferred until - * [Row]'s Scan method is called. - * If the query selects no rows, the [*Row.Scan] will return [ErrNoRows]. - * Otherwise, [*Row.Scan] scans the first selected row and discards - * the rest. - * - * QueryRow uses [context.Background] internally; to specify the context, use - * [DB.QueryRowContext]. - */ - queryRow(query: string, ...args: any[]): (Row) - } - interface DB { - /** - * BeginTx starts a transaction. - * - * The provided context is used until the transaction is committed or rolled back. - * If the context is canceled, the sql package will roll back - * the transaction. [Tx.Commit] will return an error if the context provided to - * BeginTx is canceled. - * - * The provided [TxOptions] is optional and may be nil if defaults should be used. - * If a non-default isolation level is used that the driver doesn't support, - * an error will be returned. - */ - beginTx(ctx: context.Context, opts: TxOptions): (Tx) - } - interface DB { - /** - * Begin starts a transaction. The default isolation level is dependent on - * the driver. - * - * Begin uses [context.Background] internally; to specify the context, use - * [DB.BeginTx]. - */ - begin(): (Tx) - } - interface DB { - /** - * Driver returns the database's underlying driver. - */ - driver(): any - } - interface DB { - /** - * Conn returns a single connection by either opening a new connection - * or returning an existing connection from the connection pool. Conn will - * block until either a connection is returned or ctx is canceled. - * Queries run on the same Conn will be run in the same database session. - * - * Every Conn must be returned to the database pool after use by - * calling [Conn.Close]. - */ - conn(ctx: context.Context): (Conn) - } - /** - * Tx is an in-progress database transaction. - * - * A transaction must end with a call to [Tx.Commit] or [Tx.Rollback]. - * - * After a call to [Tx.Commit] or [Tx.Rollback], all operations on the - * transaction fail with [ErrTxDone]. - * - * The statements prepared for a transaction by calling - * the transaction's [Tx.Prepare] or [Tx.Stmt] methods are closed - * by the call to [Tx.Commit] or [Tx.Rollback]. - */ - interface Tx { - } - interface Tx { - /** - * Commit commits the transaction. - */ - commit(): void - } - interface Tx { - /** - * Rollback aborts the transaction. - */ - rollback(): void - } - interface Tx { - /** - * PrepareContext creates a prepared statement for use within a transaction. - * - * The returned statement operates within the transaction and will be closed - * when the transaction has been committed or rolled back. - * - * To use an existing prepared statement on this transaction, see [Tx.Stmt]. - * - * The provided context will be used for the preparation of the context, not - * for the execution of the returned statement. The returned statement - * will run in the transaction context. - */ - prepareContext(ctx: context.Context, query: string): (Stmt) - } - interface Tx { - /** - * Prepare creates a prepared statement for use within a transaction. - * - * The returned statement operates within the transaction and will be closed - * when the transaction has been committed or rolled back. - * - * To use an existing prepared statement on this transaction, see [Tx.Stmt]. - * - * Prepare uses [context.Background] internally; to specify the context, use - * [Tx.PrepareContext]. - */ - prepare(query: string): (Stmt) - } - interface Tx { - /** - * StmtContext returns a transaction-specific prepared statement from - * an existing statement. - * - * Example: - * - * ``` - * updateMoney, err := db.Prepare("UPDATE balance SET money=money+? WHERE id=?") - * ... - * tx, err := db.Begin() - * ... - * res, err := tx.StmtContext(ctx, updateMoney).Exec(123.45, 98293203) - * ``` - * - * The provided context is used for the preparation of the statement, not for the - * execution of the statement. - * - * The returned statement operates within the transaction and will be closed - * when the transaction has been committed or rolled back. - */ - stmtContext(ctx: context.Context, stmt: Stmt): (Stmt) - } - interface Tx { - /** - * Stmt returns a transaction-specific prepared statement from - * an existing statement. - * - * Example: - * - * ``` - * updateMoney, err := db.Prepare("UPDATE balance SET money=money+? WHERE id=?") - * ... - * tx, err := db.Begin() - * ... - * res, err := tx.Stmt(updateMoney).Exec(123.45, 98293203) - * ``` - * - * The returned statement operates within the transaction and will be closed - * when the transaction has been committed or rolled back. - * - * Stmt uses [context.Background] internally; to specify the context, use - * [Tx.StmtContext]. - */ - stmt(stmt: Stmt): (Stmt) - } - interface Tx { - /** - * ExecContext executes a query that doesn't return rows. - * For example: an INSERT and UPDATE. - */ - execContext(ctx: context.Context, query: string, ...args: any[]): Result - } - interface Tx { - /** - * Exec executes a query that doesn't return rows. - * For example: an INSERT and UPDATE. - * - * Exec uses [context.Background] internally; to specify the context, use - * [Tx.ExecContext]. - */ - exec(query: string, ...args: any[]): Result - } - interface Tx { - /** - * QueryContext executes a query that returns rows, typically a SELECT. - */ - queryContext(ctx: context.Context, query: string, ...args: any[]): (Rows) - } - interface Tx { - /** - * Query executes a query that returns rows, typically a SELECT. - * - * Query uses [context.Background] internally; to specify the context, use - * [Tx.QueryContext]. - */ - query(query: string, ...args: any[]): (Rows) - } - interface Tx { - /** - * QueryRowContext executes a query that is expected to return at most one row. - * QueryRowContext always returns a non-nil value. Errors are deferred until - * [Row]'s Scan method is called. - * If the query selects no rows, the [*Row.Scan] will return [ErrNoRows]. - * Otherwise, the [*Row.Scan] scans the first selected row and discards - * the rest. - */ - queryRowContext(ctx: context.Context, query: string, ...args: any[]): (Row) - } - interface Tx { - /** - * QueryRow executes a query that is expected to return at most one row. - * QueryRow always returns a non-nil value. Errors are deferred until - * [Row]'s Scan method is called. - * If the query selects no rows, the [*Row.Scan] will return [ErrNoRows]. - * Otherwise, the [*Row.Scan] scans the first selected row and discards - * the rest. - * - * QueryRow uses [context.Background] internally; to specify the context, use - * [Tx.QueryRowContext]. - */ - queryRow(query: string, ...args: any[]): (Row) - } - /** - * Stmt is a prepared statement. - * A Stmt is safe for concurrent use by multiple goroutines. - * - * If a Stmt is prepared on a [Tx] or [Conn], it will be bound to a single - * underlying connection forever. If the [Tx] or [Conn] closes, the Stmt will - * become unusable and all operations will return an error. - * If a Stmt is prepared on a [DB], it will remain usable for the lifetime of the - * [DB]. When the Stmt needs to execute on a new underlying connection, it will - * prepare itself on the new connection automatically. - */ - interface Stmt { - } - interface Stmt { - /** - * ExecContext executes a prepared statement with the given arguments and - * returns a [Result] summarizing the effect of the statement. - */ - execContext(ctx: context.Context, ...args: any[]): Result - } - interface Stmt { - /** - * Exec executes a prepared statement with the given arguments and - * returns a [Result] summarizing the effect of the statement. - * - * Exec uses [context.Background] internally; to specify the context, use - * [Stmt.ExecContext]. - */ - exec(...args: any[]): Result - } - interface Stmt { - /** - * QueryContext executes a prepared query statement with the given arguments - * and returns the query results as a [*Rows]. - */ - queryContext(ctx: context.Context, ...args: any[]): (Rows) - } - interface Stmt { - /** - * Query executes a prepared query statement with the given arguments - * and returns the query results as a *Rows. - * - * Query uses [context.Background] internally; to specify the context, use - * [Stmt.QueryContext]. - */ - query(...args: any[]): (Rows) - } - interface Stmt { - /** - * QueryRowContext executes a prepared query statement with the given arguments. - * If an error occurs during the execution of the statement, that error will - * be returned by a call to Scan on the returned [*Row], which is always non-nil. - * If the query selects no rows, the [*Row.Scan] will return [ErrNoRows]. - * Otherwise, the [*Row.Scan] scans the first selected row and discards - * the rest. - */ - queryRowContext(ctx: context.Context, ...args: any[]): (Row) - } - interface Stmt { - /** - * QueryRow executes a prepared query statement with the given arguments. - * If an error occurs during the execution of the statement, that error will - * be returned by a call to Scan on the returned [*Row], which is always non-nil. - * If the query selects no rows, the [*Row.Scan] will return [ErrNoRows]. - * Otherwise, the [*Row.Scan] scans the first selected row and discards - * the rest. - * - * Example usage: - * - * ``` - * var name string - * err := nameByUseridStmt.QueryRow(id).Scan(&name) - * ``` - * - * QueryRow uses [context.Background] internally; to specify the context, use - * [Stmt.QueryRowContext]. - */ - queryRow(...args: any[]): (Row) - } - interface Stmt { - /** - * Close closes the statement. - */ - close(): void - } - /** - * Rows is the result of a query. Its cursor starts before the first row - * of the result set. Use [Rows.Next] to advance from row to row. - */ - interface Rows { - } - interface Rows { - /** - * Next prepares the next result row for reading with the [Rows.Scan] method. It - * returns true on success, or false if there is no next result row or an error - * happened while preparing it. [Rows.Err] should be consulted to distinguish between - * the two cases. - * - * Every call to [Rows.Scan], even the first one, must be preceded by a call to [Rows.Next]. - */ - next(): boolean - } - interface Rows { - /** - * NextResultSet prepares the next result set for reading. It reports whether - * there is further result sets, or false if there is no further result set - * or if there is an error advancing to it. The [Rows.Err] method should be consulted - * to distinguish between the two cases. - * - * After calling NextResultSet, the [Rows.Next] method should always be called before - * scanning. If there are further result sets they may not have rows in the result - * set. - */ - nextResultSet(): boolean - } - interface Rows { - /** - * Err returns the error, if any, that was encountered during iteration. - * Err may be called after an explicit or implicit [Rows.Close]. - */ - err(): void - } - interface Rows { - /** - * Columns returns the column names. - * Columns returns an error if the rows are closed. - */ - columns(): Array - } - interface Rows { - /** - * ColumnTypes returns column information such as column type, length, - * and nullable. Some information may not be available from some drivers. - */ - columnTypes(): Array<(ColumnType | undefined)> - } - interface Rows { - /** - * Scan copies the columns in the current row into the values pointed - * at by dest. The number of values in dest must be the same as the - * number of columns in [Rows]. - * - * Scan converts columns read from the database into the following - * common Go types and special types provided by the sql package: - * - * ``` - * *string - * *[]byte - * *int, *int8, *int16, *int32, *int64 - * *uint, *uint8, *uint16, *uint32, *uint64 - * *bool - * *float32, *float64 - * *interface{} - * *RawBytes - * *Rows (cursor value) - * any type implementing Scanner (see Scanner docs) - * ``` - * - * In the most simple case, if the type of the value from the source - * column is an integer, bool or string type T and dest is of type *T, - * Scan simply assigns the value through the pointer. - * - * Scan also converts between string and numeric types, as long as no - * information would be lost. While Scan stringifies all numbers - * scanned from numeric database columns into *string, scans into - * numeric types are checked for overflow. For example, a float64 with - * value 300 or a string with value "300" can scan into a uint16, but - * not into a uint8, though float64(255) or "255" can scan into a - * uint8. One exception is that scans of some float64 numbers to - * strings may lose information when stringifying. In general, scan - * floating point columns into *float64. - * - * If a dest argument has type *[]byte, Scan saves in that argument a - * copy of the corresponding data. The copy is owned by the caller and - * can be modified and held indefinitely. The copy can be avoided by - * using an argument of type [*RawBytes] instead; see the documentation - * for [RawBytes] for restrictions on its use. - * - * If an argument has type *interface{}, Scan copies the value - * provided by the underlying driver without conversion. When scanning - * from a source value of type []byte to *interface{}, a copy of the - * slice is made and the caller owns the result. - * - * Source values of type [time.Time] may be scanned into values of type - * *time.Time, *interface{}, *string, or *[]byte. When converting to - * the latter two, [time.RFC3339Nano] is used. - * - * Source values of type bool may be scanned into types *bool, - * *interface{}, *string, *[]byte, or [*RawBytes]. - * - * For scanning into *bool, the source may be true, false, 1, 0, or - * string inputs parseable by [strconv.ParseBool]. - * - * Scan can also convert a cursor returned from a query, such as - * "select cursor(select * from my_table) from dual", into a - * [*Rows] value that can itself be scanned from. The parent - * select query will close any cursor [*Rows] if the parent [*Rows] is closed. - * - * If any of the first arguments implementing [Scanner] returns an error, - * that error will be wrapped in the returned error. - */ - scan(...dest: any[]): void - } - interface Rows { - /** - * Close closes the [Rows], preventing further enumeration. If [Rows.Next] is called - * and returns false and there are no further result sets, - * the [Rows] are closed automatically and it will suffice to check the - * result of [Rows.Err]. Close is idempotent and does not affect the result of [Rows.Err]. - */ - close(): void - } - /** - * A Result summarizes an executed SQL command. - */ - interface Result { + interface Provider { [key:string]: any; /** - * LastInsertId returns the integer generated by the database - * in response to a command. Typically this will be from an - * "auto increment" column when inserting a new row. Not all - * databases support this feature, and the syntax of such - * statements varies. - */ - lastInsertId(): number - /** - * RowsAffected returns the number of rows affected by an - * update, insert, or delete. Not every database or database - * driver may support this. - */ - rowsAffected(): number - } -} - -/** - * Package http provides HTTP client and server implementations. - * - * [Get], [Head], [Post], and [PostForm] make HTTP (or HTTPS) requests: - * - * ``` - * resp, err := http.Get("http://example.com/") - * ... - * resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf) - * ... - * resp, err := http.PostForm("http://example.com/form", - * url.Values{"key": {"Value"}, "id": {"123"}}) - * ``` - * - * The caller must close the response body when finished with it: - * - * ``` - * resp, err := http.Get("http://example.com/") - * if err != nil { - * // handle error - * } - * defer resp.Body.Close() - * body, err := io.ReadAll(resp.Body) - * // ... - * ``` - * - * # Clients and Transports - * - * For control over HTTP client headers, redirect policy, and other - * settings, create a [Client]: - * - * ``` - * client := &http.Client{ - * CheckRedirect: redirectPolicyFunc, - * } - * - * resp, err := client.Get("http://example.com") - * // ... - * - * req, err := http.NewRequest("GET", "http://example.com", nil) - * // ... - * req.Header.Add("If-None-Match", `W/"wyzzy"`) - * resp, err := client.Do(req) - * // ... - * ``` - * - * For control over proxies, TLS configuration, keep-alives, - * compression, and other settings, create a [Transport]: - * - * ``` - * tr := &http.Transport{ - * MaxIdleConns: 10, - * IdleConnTimeout: 30 * time.Second, - * DisableCompression: true, - * } - * client := &http.Client{Transport: tr} - * resp, err := client.Get("https://example.com") - * ``` - * - * Clients and Transports are safe for concurrent use by multiple - * goroutines and for efficiency should only be created once and re-used. - * - * # Servers - * - * ListenAndServe starts an HTTP server with a given address and handler. - * The handler is usually nil, which means to use [DefaultServeMux]. - * [Handle] and [HandleFunc] add handlers to [DefaultServeMux]: - * - * ``` - * http.Handle("/foo", fooHandler) - * - * http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) { - * fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) - * }) - * - * log.Fatal(http.ListenAndServe(":8080", nil)) - * ``` - * - * More control over the server's behavior is available by creating a - * custom Server: - * - * ``` - * s := &http.Server{ - * Addr: ":8080", - * Handler: myHandler, - * ReadTimeout: 10 * time.Second, - * WriteTimeout: 10 * time.Second, - * MaxHeaderBytes: 1 << 20, - * } - * log.Fatal(s.ListenAndServe()) - * ``` - * - * # HTTP/2 - * - * Starting with Go 1.6, the http package has transparent support for the - * HTTP/2 protocol when using HTTPS. Programs that must disable HTTP/2 - * can do so by setting [Transport.TLSNextProto] (for clients) or - * [Server.TLSNextProto] (for servers) to a non-nil, empty - * map. Alternatively, the following GODEBUG settings are - * currently supported: - * - * ``` - * GODEBUG=http2client=0 # disable HTTP/2 client support - * GODEBUG=http2server=0 # disable HTTP/2 server support - * GODEBUG=http2debug=1 # enable verbose HTTP/2 debug logs - * GODEBUG=http2debug=2 # ... even more verbose, with frame dumps - * ``` - * - * Please report any issues before disabling HTTP/2 support: https://golang.org/s/http2bug - * - * The http package's [Transport] and [Server] both automatically enable - * HTTP/2 support for simple configurations. To enable HTTP/2 for more - * complex configurations, to use lower-level HTTP/2 features, or to use - * a newer version of Go's http2 package, import "golang.org/x/net/http2" - * directly and use its ConfigureTransport and/or ConfigureServer - * functions. Manually configuring HTTP/2 via the golang.org/x/net/http2 - * package takes precedence over the net/http package's built-in HTTP/2 - * support. - */ -namespace http { - // @ts-ignore - import mathrand = rand - /** - * PushOptions describes options for [Pusher.Push]. - */ - interface PushOptions { - /** - * Method specifies the HTTP method for the promised request. - * If set, it must be "GET" or "HEAD". Empty means "GET". - */ - method: string - /** - * Header specifies additional promised request headers. This cannot - * include HTTP/2 pseudo header fields like ":path" and ":scheme", - * which will be added automatically. - */ - header: Header - } - // @ts-ignore - import urlpkg = url - /** - * A Request represents an HTTP request received by a server - * or to be sent by a client. - * - * The field semantics differ slightly between client and server - * usage. In addition to the notes on the fields below, see the - * documentation for [Request.Write] and [RoundTripper]. - */ - interface Request { - /** - * Method specifies the HTTP method (GET, POST, PUT, etc.). - * For client requests, an empty string means GET. - */ - method: string - /** - * URL specifies either the URI being requested (for server - * requests) or the URL to access (for client requests). - * - * For server requests, the URL is parsed from the URI - * supplied on the Request-Line as stored in RequestURI. For - * most requests, fields other than Path and RawQuery will be - * empty. (See RFC 7230, Section 5.3) - * - * For client requests, the URL's Host specifies the server to - * connect to, while the Request's Host field optionally - * specifies the Host header value to send in the HTTP - * request. - */ - url?: url.URL - /** - * The protocol version for incoming server requests. - * - * For client requests, these fields are ignored. The HTTP - * client code always uses either HTTP/1.1 or HTTP/2. - * See the docs on Transport for details. - */ - proto: string // "HTTP/1.0" - protoMajor: number // 1 - protoMinor: number // 0 - /** - * Header contains the request header fields either received - * by the server or to be sent by the client. - * - * If a server received a request with header lines, - * - * ``` - * Host: example.com - * accept-encoding: gzip, deflate - * Accept-Language: en-us - * fOO: Bar - * foo: two - * ``` - * - * then - * - * ``` - * Header = map[string][]string{ - * "Accept-Encoding": {"gzip, deflate"}, - * "Accept-Language": {"en-us"}, - * "Foo": {"Bar", "two"}, - * } - * ``` - * - * For incoming requests, the Host header is promoted to the - * Request.Host field and removed from the Header map. - * - * HTTP defines that header names are case-insensitive. The - * request parser implements this by using CanonicalHeaderKey, - * making the first character and any characters following a - * hyphen uppercase and the rest lowercase. - * - * For client requests, certain headers such as Content-Length - * and Connection are automatically written when needed and - * values in Header may be ignored. See the documentation - * for the Request.Write method. - */ - header: Header - /** - * Body is the request's body. - * - * For client requests, a nil body means the request has no - * body, such as a GET request. The HTTP Client's Transport - * is responsible for calling the Close method. - * - * For server requests, the Request Body is always non-nil - * but will return EOF immediately when no body is present. - * The Server will close the request body. The ServeHTTP - * Handler does not need to. - * - * Body must allow Read to be called concurrently with Close. - * In particular, calling Close should unblock a Read waiting - * for input. - */ - body: io.ReadCloser - /** - * GetBody defines an optional func to return a new copy of - * Body. It is used for client requests when a redirect requires - * reading the body more than once. Use of GetBody still - * requires setting Body. - * - * For server requests, it is unused. - */ - getBody: () => io.ReadCloser - /** - * ContentLength records the length of the associated content. - * The value -1 indicates that the length is unknown. - * Values >= 0 indicate that the given number of bytes may - * be read from Body. - * - * For client requests, a value of 0 with a non-nil Body is - * also treated as unknown. - */ - contentLength: number - /** - * TransferEncoding lists the transfer encodings from outermost to - * innermost. An empty list denotes the "identity" encoding. - * TransferEncoding can usually be ignored; chunked encoding is - * automatically added and removed as necessary when sending and - * receiving requests. - */ - transferEncoding: Array - /** - * Close indicates whether to close the connection after - * replying to this request (for servers) or after sending this - * request and reading its response (for clients). - * - * For server requests, the HTTP server handles this automatically - * and this field is not needed by Handlers. - * - * For client requests, setting this field prevents re-use of - * TCP connections between requests to the same hosts, as if - * Transport.DisableKeepAlives were set. - */ - close: boolean - /** - * For server requests, Host specifies the host on which the - * URL is sought. For HTTP/1 (per RFC 7230, section 5.4), this - * is either the value of the "Host" header or the host name - * given in the URL itself. For HTTP/2, it is the value of the - * ":authority" pseudo-header field. - * It may be of the form "host:port". For international domain - * names, Host may be in Punycode or Unicode form. Use - * golang.org/x/net/idna to convert it to either format if - * needed. - * To prevent DNS rebinding attacks, server Handlers should - * validate that the Host header has a value for which the - * Handler considers itself authoritative. The included - * ServeMux supports patterns registered to particular host - * names and thus protects its registered Handlers. - * - * For client requests, Host optionally overrides the Host - * header to send. If empty, the Request.Write method uses - * the value of URL.Host. Host may contain an international - * domain name. - */ - host: string - /** - * Form contains the parsed form data, including both the URL - * field's query parameters and the PATCH, POST, or PUT form data. - * This field is only available after ParseForm is called. - * The HTTP client ignores Form and uses Body instead. - */ - form: url.Values - /** - * PostForm contains the parsed form data from PATCH, POST - * or PUT body parameters. - * - * This field is only available after ParseForm is called. - * The HTTP client ignores PostForm and uses Body instead. - */ - postForm: url.Values - /** - * MultipartForm is the parsed multipart form, including file uploads. - * This field is only available after ParseMultipartForm is called. - * The HTTP client ignores MultipartForm and uses Body instead. - */ - multipartForm?: multipart.Form - /** - * Trailer specifies additional headers that are sent after the request - * body. - * - * For server requests, the Trailer map initially contains only the - * trailer keys, with nil values. (The client declares which trailers it - * will later send.) While the handler is reading from Body, it must - * not reference Trailer. After reading from Body returns EOF, Trailer - * can be read again and will contain non-nil values, if they were sent - * by the client. - * - * For client requests, Trailer must be initialized to a map containing - * the trailer keys to later send. The values may be nil or their final - * values. The ContentLength must be 0 or -1, to send a chunked request. - * After the HTTP request is sent the map values can be updated while - * the request body is read. Once the body returns EOF, the caller must - * not mutate Trailer. - * - * Few HTTP clients, servers, or proxies support HTTP trailers. - */ - trailer: Header - /** - * RemoteAddr allows HTTP servers and other software to record - * the network address that sent the request, usually for - * logging. This field is not filled in by ReadRequest and - * has no defined format. The HTTP server in this package - * sets RemoteAddr to an "IP:port" address before invoking a - * handler. - * This field is ignored by the HTTP client. - */ - remoteAddr: string - /** - * RequestURI is the unmodified request-target of the - * Request-Line (RFC 7230, Section 3.1.1) as sent by the client - * to a server. Usually the URL field should be used instead. - * It is an error to set this field in an HTTP client request. - */ - requestURI: string - /** - * TLS allows HTTP servers and other software to record - * information about the TLS connection on which the request - * was received. This field is not filled in by ReadRequest. - * The HTTP server in this package sets the field for - * TLS-enabled connections before invoking a handler; - * otherwise it leaves the field nil. - * This field is ignored by the HTTP client. - */ - tls?: any - /** - * Cancel is an optional channel whose closure indicates that the client - * request should be regarded as canceled. Not all implementations of - * RoundTripper may support Cancel. - * - * For server requests, this field is not applicable. - * - * Deprecated: Set the Request's context with NewRequestWithContext - * instead. If a Request's Cancel field and context are both - * set, it is undefined whether Cancel is respected. - */ - cancel: undefined - /** - * Response is the redirect response which caused this request - * to be created. This field is only populated during client - * redirects. - */ - response?: Response - /** - * Pattern is the [ServeMux] pattern that matched the request. - * It is empty if the request was not matched against a pattern. - */ - pattern: string - } - interface Request { - /** - * Context returns the request's context. To change the context, use - * [Request.Clone] or [Request.WithContext]. - * - * The returned context is always non-nil; it defaults to the - * background context. - * - * For outgoing client requests, the context controls cancellation. - * - * For incoming server requests, the context is canceled when the - * client's connection closes, the request is canceled (with HTTP/2), - * or when the ServeHTTP method returns. + * Context returns the context associated with the provider (if any). */ context(): context.Context - } - interface Request { /** - * WithContext returns a shallow copy of r with its context changed - * to ctx. The provided ctx must be non-nil. - * - * For outgoing client request, the context controls the entire - * lifetime of a request and its response: obtaining a connection, - * sending the request, and reading the response headers and body. - * - * To create a new request with a context, use [NewRequestWithContext]. - * To make a deep copy of a request with a new context, use [Request.Clone]. + * SetContext assigns the specified context to the current provider. */ - withContext(ctx: context.Context): (Request) - } - interface Request { + setContext(ctx: context.Context): void /** - * Clone returns a deep copy of r with its context changed to ctx. - * The provided ctx must be non-nil. - * - * Clone only makes a shallow copy of the Body field. - * - * For an outgoing client request, the context controls the entire - * lifetime of a request and its response: obtaining a connection, - * sending the request, and reading the response headers and body. + * PKCE indicates whether the provider can use the PKCE flow. */ - clone(ctx: context.Context): (Request) - } - interface Request { + pkce(): boolean /** - * ProtoAtLeast reports whether the HTTP protocol used - * in the request is at least major.minor. + * SetPKCE toggles the state whether the provider can use the PKCE flow or not. */ - protoAtLeast(major: number, minor: number): boolean - } - interface Request { + setPKCE(enable: boolean): void /** - * UserAgent returns the client's User-Agent, if sent in the request. + * DisplayName usually returns provider name as it is officially written + * and it could be used directly in the UI. */ - userAgent(): string - } - interface Request { + displayName(): string /** - * Cookies parses and returns the HTTP cookies sent with the request. + * SetDisplayName sets the provider's display name. */ - cookies(): Array<(Cookie | undefined)> - } - interface Request { + setDisplayName(displayName: string): void /** - * CookiesNamed parses and returns the named HTTP cookies sent with the request - * or an empty slice if none matched. + * Scopes returns the provider access permissions that will be requested. */ - cookiesNamed(name: string): Array<(Cookie | undefined)> - } - interface Request { + scopes(): Array /** - * Cookie returns the named cookie provided in the request or - * [ErrNoCookie] if not found. - * If multiple cookies match the given name, only one cookie will - * be returned. + * SetScopes sets the provider access permissions that will be requested later. */ - cookie(name: string): (Cookie) - } - interface Request { + setScopes(scopes: Array): void /** - * AddCookie adds a cookie to the request. Per RFC 6265 section 5.4, - * AddCookie does not attach more than one [Cookie] header field. That - * means all cookies, if any, are written into the same line, - * separated by semicolon. - * AddCookie only sanitizes c's name and value, and does not sanitize - * a Cookie header already present in the request. + * ClientId returns the provider client's app ID. */ - addCookie(c: Cookie): void - } - interface Request { + clientId(): string /** - * Referer returns the referring URL, if sent in the request. - * - * Referer is misspelled as in the request itself, a mistake from the - * earliest days of HTTP. This value can also be fetched from the - * [Header] map as Header["Referer"]; the benefit of making it available - * as a method is that the compiler can diagnose programs that use the - * alternate (correct English) spelling req.Referrer() but cannot - * diagnose programs that use Header["Referrer"]. + * SetClientId sets the provider client's ID. */ - referer(): string - } - interface Request { + setClientId(clientId: string): void /** - * MultipartReader returns a MIME multipart reader if this is a - * multipart/form-data or a multipart/mixed POST request, else returns nil and an error. - * Use this function instead of [Request.ParseMultipartForm] to - * process the request body as a stream. + * ClientSecret returns the provider client's app secret. */ - multipartReader(): (multipart.Reader) - } - interface Request { + clientSecret(): string /** - * Write writes an HTTP/1.1 request, which is the header and body, in wire format. - * This method consults the following fields of the request: - * - * ``` - * Host - * URL - * Method (defaults to "GET") - * Header - * ContentLength - * TransferEncoding - * Body - * ``` - * - * If Body is present, Content-Length is <= 0 and [Request.TransferEncoding] - * hasn't been set to "identity", Write adds "Transfer-Encoding: - * chunked" to the header. Body is closed after it is sent. + * SetClientSecret sets the provider client's app secret. */ - write(w: io.Writer): void - } - interface Request { + setClientSecret(secret: string): void /** - * WriteProxy is like [Request.Write] but writes the request in the form - * expected by an HTTP proxy. In particular, [Request.WriteProxy] writes the - * initial Request-URI line of the request with an absolute URI, per - * section 5.3 of RFC 7230, including the scheme and host. - * In either case, WriteProxy also writes a Host header, using - * either r.Host or r.URL.Host. + * RedirectURL returns the end address to redirect the user + * going through the OAuth flow. */ - writeProxy(w: io.Writer): void - } - interface Request { + redirectURL(): string /** - * BasicAuth returns the username and password provided in the request's - * Authorization header, if the request uses HTTP Basic Authentication. - * See RFC 2617, Section 2. + * SetRedirectURL sets the provider's RedirectURL. */ - basicAuth(): [string, string, boolean] - } - interface Request { + setRedirectURL(url: string): void /** - * SetBasicAuth sets the request's Authorization header to use HTTP - * Basic Authentication with the provided username and password. - * - * With HTTP Basic Authentication the provided username and password - * are not encrypted. It should generally only be used in an HTTPS - * request. - * - * The username may not contain a colon. Some protocols may impose - * additional requirements on pre-escaping the username and - * password. For instance, when used with OAuth2, both arguments must - * be URL encoded first with [url.QueryEscape]. + * AuthURL returns the provider's authorization service url. */ - setBasicAuth(username: string, password: string): void - } - interface Request { + authURL(): string /** - * ParseForm populates r.Form and r.PostForm. - * - * For all requests, ParseForm parses the raw query from the URL and updates - * r.Form. - * - * For POST, PUT, and PATCH requests, it also reads the request body, parses it - * as a form and puts the results into both r.PostForm and r.Form. Request body - * parameters take precedence over URL query string values in r.Form. - * - * If the request Body's size has not already been limited by [MaxBytesReader], - * the size is capped at 10MB. - * - * For other HTTP methods, or when the Content-Type is not - * application/x-www-form-urlencoded, the request Body is not read, and - * r.PostForm is initialized to a non-nil, empty value. - * - * [Request.ParseMultipartForm] calls ParseForm automatically. - * ParseForm is idempotent. + * SetAuthURL sets the provider's AuthURL. */ - parseForm(): void - } - interface Request { + setAuthURL(url: string): void /** - * ParseMultipartForm parses a request body as multipart/form-data. - * The whole request body is parsed and up to a total of maxMemory bytes of - * its file parts are stored in memory, with the remainder stored on - * disk in temporary files. - * ParseMultipartForm calls [Request.ParseForm] if necessary. - * If ParseForm returns an error, ParseMultipartForm returns it but also - * continues parsing the request body. - * After one call to ParseMultipartForm, subsequent calls have no effect. + * TokenURL returns the provider's token exchange service url. */ - parseMultipartForm(maxMemory: number): void - } - interface Request { + tokenURL(): string /** - * FormValue returns the first value for the named component of the query. - * The precedence order: - * 1. application/x-www-form-urlencoded form body (POST, PUT, PATCH only) - * 2. query parameters (always) - * 3. multipart/form-data form body (always) - * - * FormValue calls [Request.ParseMultipartForm] and [Request.ParseForm] - * if necessary and ignores any errors returned by these functions. - * If key is not present, FormValue returns the empty string. - * To access multiple values of the same key, call ParseForm and - * then inspect [Request.Form] directly. + * SetTokenURL sets the provider's TokenURL. */ - formValue(key: string): string - } - interface Request { + setTokenURL(url: string): void /** - * PostFormValue returns the first value for the named component of the POST, - * PUT, or PATCH request body. URL query parameters are ignored. - * PostFormValue calls [Request.ParseMultipartForm] and [Request.ParseForm] if necessary and ignores - * any errors returned by these functions. - * If key is not present, PostFormValue returns the empty string. + * UserInfoURL returns the provider's user info api url. */ - postFormValue(key: string): string - } - interface Request { + userInfoURL(): string /** - * FormFile returns the first file for the provided form key. - * FormFile calls [Request.ParseMultipartForm] and [Request.ParseForm] if necessary. + * SetUserInfoURL sets the provider's UserInfoURL. */ - formFile(key: string): [multipart.File, (multipart.FileHeader)] - } - interface Request { + setUserInfoURL(url: string): void /** - * PathValue returns the value for the named path wildcard in the [ServeMux] pattern - * that matched the request. - * It returns the empty string if the request was not matched against a pattern - * or there is no such wildcard in the pattern. + * Extra returns a shallow copy of any custom config data + * that the provider may be need. */ - pathValue(name: string): string - } - interface Request { + extra(): _TygojaDict /** - * SetPathValue sets name to value, so that subsequent calls to r.PathValue(name) - * return value. + * SetExtra updates the provider's custom config data. */ - setPathValue(name: string, value: string): void + setExtra(data: _TygojaDict): void + /** + * Client returns an http client using the provided token. + */ + client(token: oauth2.Token): (any) + /** + * BuildAuthURL returns a URL to the provider's consent page + * that asks for permissions for the required scopes explicitly. + */ + buildAuthURL(state: string, ...opts: oauth2.AuthCodeOption[]): string + /** + * FetchToken converts an authorization code to token. + */ + fetchToken(code: string, ...opts: oauth2.AuthCodeOption[]): (oauth2.Token) + /** + * FetchRawUserInfo requests and marshalizes into `result` the + * the OAuth user api response. + */ + fetchRawUserInfo(token: oauth2.Token): string|Array + /** + * FetchAuthUser is similar to FetchRawUserInfo, but normalizes and + * marshalizes the user api response into a standardized AuthUser struct. + */ + fetchAuthUser(token: oauth2.Token): (AuthUser) } /** - * A Handler responds to an HTTP request. - * - * [Handler.ServeHTTP] should write reply headers and data to the [ResponseWriter] - * and then return. Returning signals that the request is finished; it - * is not valid to use the [ResponseWriter] or read from the - * [Request.Body] after or concurrently with the completion of the - * ServeHTTP call. - * - * Depending on the HTTP client software, HTTP protocol version, and - * any intermediaries between the client and the Go server, it may not - * be possible to read from the [Request.Body] after writing to the - * [ResponseWriter]. Cautious handlers should read the [Request.Body] - * first, and then reply. - * - * Except for reading the body, handlers should not modify the - * provided Request. - * - * If ServeHTTP panics, the server (the caller of ServeHTTP) assumes - * that the effect of the panic was isolated to the active request. - * It recovers the panic, logs a stack trace to the server error log, - * and either closes the network connection or sends an HTTP/2 - * RST_STREAM, depending on the HTTP protocol. To abort a handler so - * the client sees an interrupted response but the server doesn't log - * an error, panic with the value [ErrAbortHandler]. + * AuthUser defines a standardized OAuth2 user data structure. */ - interface Handler { - [key:string]: any; - serveHTTP(_arg0: ResponseWriter, _arg1: Request): void + interface AuthUser { + expiry: types.DateTime + rawUser: _TygojaDict + id: string + name: string + username: string + email: string + avatarURL: string + accessToken: string + refreshToken: string + /** + * @todo + * deprecated: use AvatarURL instead + * AvatarUrl will be removed after dropping v0.22 support + */ + avatarUrl: string } - /** - * A ResponseWriter interface is used by an HTTP handler to - * construct an HTTP response. - * - * A ResponseWriter may not be used after [Handler.ServeHTTP] has returned. - */ - interface ResponseWriter { - [key:string]: any; - /** - * Header returns the header map that will be sent by - * [ResponseWriter.WriteHeader]. The [Header] map also is the mechanism with which - * [Handler] implementations can set HTTP trailers. - * - * Changing the header map after a call to [ResponseWriter.WriteHeader] (or - * [ResponseWriter.Write]) has no effect unless the HTTP status code was of the - * 1xx class or the modified headers are trailers. - * - * There are two ways to set Trailers. The preferred way is to - * predeclare in the headers which trailers you will later - * send by setting the "Trailer" header to the names of the - * trailer keys which will come later. In this case, those - * keys of the Header map are treated as if they were - * trailers. See the example. The second way, for trailer - * keys not known to the [Handler] until after the first [ResponseWriter.Write], - * is to prefix the [Header] map keys with the [TrailerPrefix] - * constant value. - * - * To suppress automatic response headers (such as "Date"), set - * their value to nil. - */ - header(): Header - /** - * Write writes the data to the connection as part of an HTTP reply. - * - * If [ResponseWriter.WriteHeader] has not yet been called, Write calls - * WriteHeader(http.StatusOK) before writing the data. If the Header - * does not contain a Content-Type line, Write adds a Content-Type set - * to the result of passing the initial 512 bytes of written data to - * [DetectContentType]. Additionally, if the total size of all written - * data is under a few KB and there are no Flush calls, the - * Content-Length header is added automatically. - * - * Depending on the HTTP protocol version and the client, calling - * Write or WriteHeader may prevent future reads on the - * Request.Body. For HTTP/1.x requests, handlers should read any - * needed request body data before writing the response. Once the - * headers have been flushed (due to either an explicit Flusher.Flush - * call or writing enough data to trigger a flush), the request body - * may be unavailable. For HTTP/2 requests, the Go HTTP server permits - * handlers to continue to read the request body while concurrently - * writing the response. However, such behavior may not be supported - * by all HTTP/2 clients. Handlers should read before writing if - * possible to maximize compatibility. - */ - write(_arg0: string|Array): number - /** - * WriteHeader sends an HTTP response header with the provided - * status code. - * - * If WriteHeader is not called explicitly, the first call to Write - * will trigger an implicit WriteHeader(http.StatusOK). - * Thus explicit calls to WriteHeader are mainly used to - * send error codes or 1xx informational responses. - * - * The provided code must be a valid HTTP 1xx-5xx status code. - * Any number of 1xx headers may be written, followed by at most - * one 2xx-5xx header. 1xx headers are sent immediately, but 2xx-5xx - * headers may be buffered. Use the Flusher interface to send - * buffered data. The header map is cleared when 2xx-5xx headers are - * sent, but not with 1xx headers. - * - * The server will automatically send a 100 (Continue) header - * on the first read from the request body if the request has - * an "Expect: 100-continue" header. - */ - writeHeader(statusCode: number): void - } - /** - * A Server defines parameters for running an HTTP server. - * The zero value for Server is a valid configuration. - */ - interface Server { - /** - * Addr optionally specifies the TCP address for the server to listen on, - * in the form "host:port". If empty, ":http" (port 80) is used. - * The service names are defined in RFC 6335 and assigned by IANA. - * See net.Dial for details of the address format. - */ - addr: string - handler: Handler // handler to invoke, http.DefaultServeMux if nil - /** - * DisableGeneralOptionsHandler, if true, passes "OPTIONS *" requests to the Handler, - * otherwise responds with 200 OK and Content-Length: 0. - */ - disableGeneralOptionsHandler: boolean - /** - * TLSConfig optionally provides a TLS configuration for use - * by ServeTLS and ListenAndServeTLS. Note that this value is - * cloned by ServeTLS and ListenAndServeTLS, so it's not - * possible to modify the configuration with methods like - * tls.Config.SetSessionTicketKeys. To use - * SetSessionTicketKeys, use Server.Serve with a TLS Listener - * instead. - */ - tlsConfig?: any - /** - * ReadTimeout is the maximum duration for reading the entire - * request, including the body. A zero or negative value means - * there will be no timeout. - * - * Because ReadTimeout does not let Handlers make per-request - * decisions on each request body's acceptable deadline or - * upload rate, most users will prefer to use - * ReadHeaderTimeout. It is valid to use them both. - */ - readTimeout: time.Duration - /** - * ReadHeaderTimeout is the amount of time allowed to read - * request headers. The connection's read deadline is reset - * after reading the headers and the Handler can decide what - * is considered too slow for the body. If zero, the value of - * ReadTimeout is used. If negative, or if zero and ReadTimeout - * is zero or negative, there is no timeout. - */ - readHeaderTimeout: time.Duration - /** - * WriteTimeout is the maximum duration before timing out - * writes of the response. It is reset whenever a new - * request's header is read. Like ReadTimeout, it does not - * let Handlers make decisions on a per-request basis. - * A zero or negative value means there will be no timeout. - */ - writeTimeout: time.Duration - /** - * IdleTimeout is the maximum amount of time to wait for the - * next request when keep-alives are enabled. If zero, the value - * of ReadTimeout is used. If negative, or if zero and ReadTimeout - * is zero or negative, there is no timeout. - */ - idleTimeout: time.Duration - /** - * MaxHeaderBytes controls the maximum number of bytes the - * server will read parsing the request header's keys and - * values, including the request line. It does not limit the - * size of the request body. - * If zero, DefaultMaxHeaderBytes is used. - */ - maxHeaderBytes: number - /** - * TLSNextProto optionally specifies a function to take over - * ownership of the provided TLS connection when an ALPN - * protocol upgrade has occurred. The map key is the protocol - * name negotiated. The Handler argument should be used to - * handle HTTP requests and will initialize the Request's TLS - * and RemoteAddr if not already set. The connection is - * automatically closed when the function returns. - * If TLSNextProto is not nil, HTTP/2 support is not enabled - * automatically. - */ - tlsNextProto: _TygojaDict - /** - * ConnState specifies an optional callback function that is - * called when a client connection changes state. See the - * ConnState type and associated constants for details. - */ - connState: (_arg0: net.Conn, _arg1: ConnState) => void - /** - * ErrorLog specifies an optional logger for errors accepting - * connections, unexpected behavior from handlers, and - * underlying FileSystem errors. - * If nil, logging is done via the log package's standard logger. - */ - errorLog?: any - /** - * BaseContext optionally specifies a function that returns - * the base context for incoming requests on this server. - * The provided Listener is the specific Listener that's - * about to start accepting requests. - * If BaseContext is nil, the default is context.Background(). - * If non-nil, it must return a non-nil context. - */ - baseContext: (_arg0: net.Listener) => context.Context - /** - * ConnContext optionally specifies a function that modifies - * the context used for a new connection c. The provided ctx - * is derived from the base context and has a ServerContextKey - * value. - */ - connContext: (ctx: context.Context, c: net.Conn) => context.Context - } - interface Server { - /** - * Close immediately closes all active net.Listeners and any - * connections in state [StateNew], [StateActive], or [StateIdle]. For a - * graceful shutdown, use [Server.Shutdown]. - * - * Close does not attempt to close (and does not even know about) - * any hijacked connections, such as WebSockets. - * - * Close returns any error returned from closing the [Server]'s - * underlying Listener(s). - */ - close(): void - } - interface Server { - /** - * Shutdown gracefully shuts down the server without interrupting any - * active connections. Shutdown works by first closing all open - * listeners, then closing all idle connections, and then waiting - * indefinitely for connections to return to idle and then shut down. - * If the provided context expires before the shutdown is complete, - * Shutdown returns the context's error, otherwise it returns any - * error returned from closing the [Server]'s underlying Listener(s). - * - * When Shutdown is called, [Serve], [ListenAndServe], and - * [ListenAndServeTLS] immediately return [ErrServerClosed]. Make sure the - * program doesn't exit and waits instead for Shutdown to return. - * - * Shutdown does not attempt to close nor wait for hijacked - * connections such as WebSockets. The caller of Shutdown should - * separately notify such long-lived connections of shutdown and wait - * for them to close, if desired. See [Server.RegisterOnShutdown] for a way to - * register shutdown notification functions. - * - * Once Shutdown has been called on a server, it may not be reused; - * future calls to methods such as Serve will return ErrServerClosed. - */ - shutdown(ctx: context.Context): void - } - interface Server { - /** - * RegisterOnShutdown registers a function to call on [Server.Shutdown]. - * This can be used to gracefully shutdown connections that have - * undergone ALPN protocol upgrade or that have been hijacked. - * This function should start protocol-specific graceful shutdown, - * but should not wait for shutdown to complete. - */ - registerOnShutdown(f: () => void): void - } - interface Server { - /** - * ListenAndServe listens on the TCP network address srv.Addr and then - * calls [Serve] to handle requests on incoming connections. - * Accepted connections are configured to enable TCP keep-alives. - * - * If srv.Addr is blank, ":http" is used. - * - * ListenAndServe always returns a non-nil error. After [Server.Shutdown] or [Server.Close], - * the returned error is [ErrServerClosed]. - */ - listenAndServe(): void - } - interface Server { - /** - * Serve accepts incoming connections on the Listener l, creating a - * new service goroutine for each. The service goroutines read requests and - * then call srv.Handler to reply to them. - * - * HTTP/2 support is only enabled if the Listener returns [*tls.Conn] - * connections and they were configured with "h2" in the TLS - * Config.NextProtos. - * - * Serve always returns a non-nil error and closes l. - * After [Server.Shutdown] or [Server.Close], the returned error is [ErrServerClosed]. - */ - serve(l: net.Listener): void - } - interface Server { - /** - * ServeTLS accepts incoming connections on the Listener l, creating a - * new service goroutine for each. The service goroutines perform TLS - * setup and then read requests, calling srv.Handler to reply to them. - * - * Files containing a certificate and matching private key for the - * server must be provided if neither the [Server]'s - * TLSConfig.Certificates, TLSConfig.GetCertificate nor - * config.GetConfigForClient are populated. - * If the certificate is signed by a certificate authority, the - * certFile should be the concatenation of the server's certificate, - * any intermediates, and the CA's certificate. - * - * ServeTLS always returns a non-nil error. After [Server.Shutdown] or [Server.Close], the - * returned error is [ErrServerClosed]. - */ - serveTLS(l: net.Listener, certFile: string, keyFile: string): void - } - interface Server { - /** - * SetKeepAlivesEnabled controls whether HTTP keep-alives are enabled. - * By default, keep-alives are always enabled. Only very - * resource-constrained environments or servers in the process of - * shutting down should disable them. - */ - setKeepAlivesEnabled(v: boolean): void - } - interface Server { - /** - * ListenAndServeTLS listens on the TCP network address srv.Addr and - * then calls [ServeTLS] to handle requests on incoming TLS connections. - * Accepted connections are configured to enable TCP keep-alives. - * - * Filenames containing a certificate and matching private key for the - * server must be provided if neither the [Server]'s TLSConfig.Certificates - * nor TLSConfig.GetCertificate are populated. If the certificate is - * signed by a certificate authority, the certFile should be the - * concatenation of the server's certificate, any intermediates, and - * the CA's certificate. - * - * If srv.Addr is blank, ":https" is used. - * - * ListenAndServeTLS always returns a non-nil error. After [Server.Shutdown] or - * [Server.Close], the returned error is [ErrServerClosed]. - */ - listenAndServeTLS(certFile: string, keyFile: string): void - } -} - -/** - * Package blob defines a lightweight abstration for interacting with - * various storage services (local filesystem, S3, etc.). - * - * NB! - * For compatibility with earlier PocketBase versions and to prevent - * unnecessary breaking changes, this package is based and implemented - * as a minimal, stripped down version of the previously used gocloud.dev/blob. - * While there is no promise that it won't diverge in the future to accommodate - * better some PocketBase specific use cases, currently it copies and - * tries to follow as close as possible the same implementations, - * conventions and rules for the key escaping/unescaping, blob read/write - * interfaces and struct options as gocloud.dev/blob, therefore the - * credits goes to the original Go Cloud Development Kit Authors. - */ -namespace blob { - /** - * ListObject represents a single blob returned from List. - */ - interface ListObject { - /** - * Key is the key for this blob. - */ - key: string - /** - * ModTime is the time the blob was last modified. - */ - modTime: time.Time - /** - * Size is the size of the blob's content in bytes. - */ - size: number - /** - * MD5 is an MD5 hash of the blob contents or nil if not available. - */ - md5: string|Array - /** - * IsDir indicates that this result represents a "directory" in the - * hierarchical namespace, ending in ListOptions.Delimiter. Key can be - * passed as ListOptions.Prefix to list items in the "directory". - * Fields other than Key and IsDir will not be set if IsDir is true. - */ - isDir: boolean - } - /** - * Attributes contains attributes about a blob. - */ - interface Attributes { - /** - * CacheControl specifies caching attributes that services may use - * when serving the blob. - * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control - */ - cacheControl: string - /** - * ContentDisposition specifies whether the blob content is expected to be - * displayed inline or as an attachment. - * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition - */ - contentDisposition: string - /** - * ContentEncoding specifies the encoding used for the blob's content, if any. - * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding - */ - contentEncoding: string - /** - * ContentLanguage specifies the language used in the blob's content, if any. - * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language - */ - contentLanguage: string - /** - * ContentType is the MIME type of the blob. It will not be empty. - * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type - */ - contentType: string - /** - * Metadata holds key/value pairs associated with the blob. - * Keys are guaranteed to be in lowercase, even if the backend service - * has case-sensitive keys (although note that Metadata written via - * this package will always be lowercased). If there are duplicate - * case-insensitive keys (e.g., "foo" and "FOO"), only one value - * will be kept, and it is undefined which one. - */ - metadata: _TygojaDict - /** - * CreateTime is the time the blob was created, if available. If not available, - * CreateTime will be the zero time. - */ - createTime: time.Time - /** - * ModTime is the time the blob was last modified. - */ - modTime: time.Time - /** - * Size is the size of the blob's content in bytes. - */ - size: number - /** - * MD5 is an MD5 hash of the blob contents or nil if not available. - */ - md5: string|Array - /** - * ETag for the blob; see https://en.wikipedia.org/wiki/HTTP_ETag. - */ - eTag: string - } - /** - * Reader reads bytes from a blob. - * It implements io.ReadSeekCloser, and must be closed after reads are finished. - */ - interface Reader { - } - interface Reader { - /** - * Read implements io.Reader (https://golang.org/pkg/io/#Reader). - */ - read(p: string|Array): number - } - interface Reader { - /** - * Seek implements io.Seeker (https://golang.org/pkg/io/#Seeker). - */ - seek(offset: number, whence: number): number - } - interface Reader { - /** - * Close implements io.Closer (https://golang.org/pkg/io/#Closer). - */ - close(): void - } - interface Reader { - /** - * ContentType returns the MIME type of the blob. - */ - contentType(): string - } - interface Reader { - /** - * ModTime returns the time the blob was last modified. - */ - modTime(): time.Time - } - interface Reader { - /** - * Size returns the size of the blob content in bytes. - */ - size(): number - } - interface Reader { - /** - * WriteTo reads from r and writes to w until there's no more data or - * an error occurs. - * The return value is the number of bytes written to w. - * - * It implements the io.WriterTo interface. - */ - writeTo(w: io.Writer): number - } -} - -/** - * Package types implements some commonly used db serializable types - * like datetime, json, etc. - */ -namespace types { - /** - * DateTime represents a [time.Time] instance in UTC that is wrapped - * and serialized using the app default date layout. - */ - interface DateTime { - } - interface DateTime { - /** - * Time returns the internal [time.Time] instance. - */ - time(): time.Time - } - interface DateTime { - /** - * Add returns a new DateTime based on the current DateTime + the specified duration. - */ - add(duration: time.Duration): DateTime - } - interface DateTime { - /** - * Sub returns a [time.Duration] by subtracting the specified DateTime from the current one. - * - * If the result exceeds the maximum (or minimum) value that can be stored in a [time.Duration], - * the maximum (or minimum) duration will be returned. - */ - sub(u: DateTime): time.Duration - } - interface DateTime { - /** - * AddDate returns a new DateTime based on the current one + duration. - * - * It follows the same rules as [time.AddDate]. - */ - addDate(years: number, months: number, days: number): DateTime - } - interface DateTime { - /** - * After reports whether the current DateTime instance is after u. - */ - after(u: DateTime): boolean - } - interface DateTime { - /** - * Before reports whether the current DateTime instance is before u. - */ - before(u: DateTime): boolean - } - interface DateTime { - /** - * Compare compares the current DateTime instance with u. - * If the current instance is before u, it returns -1. - * If the current instance is after u, it returns +1. - * If they're the same, it returns 0. - */ - compare(u: DateTime): number - } - interface DateTime { - /** - * Equal reports whether the current DateTime and u represent the same time instant. - * Two DateTime can be equal even if they are in different locations. - * For example, 6:00 +0200 and 4:00 UTC are Equal. - */ - equal(u: DateTime): boolean - } - interface DateTime { - /** - * Unix returns the current DateTime as a Unix time, aka. - * the number of seconds elapsed since January 1, 1970 UTC. - */ - unix(): number - } - interface DateTime { - /** - * IsZero checks whether the current DateTime instance has zero time value. - */ - isZero(): boolean - } - interface DateTime { - /** - * String serializes the current DateTime instance into a formatted - * UTC date string. - * - * The zero value is serialized to an empty string. - */ - string(): string - } - interface DateTime { + interface AuthUser { /** * MarshalJSON implements the [json.Marshaler] interface. - */ - marshalJSON(): string|Array - } - interface DateTime { - /** - * UnmarshalJSON implements the [json.Unmarshaler] interface. - */ - unmarshalJSON(b: string|Array): void - } - interface DateTime { - /** - * Value implements the [driver.Valuer] interface. - */ - value(): any - } - interface DateTime { - /** - * Scan implements [sql.Scanner] interface to scan the provided value - * into the current DateTime instance. - */ - scan(value: any): void - } - /** - * GeoPoint defines a struct for storing geo coordinates as serialized json object - * (e.g. {lon:0,lat:0}). - * - * Note: using object notation and not a plain array to avoid the confusion - * as there doesn't seem to be a fixed standard for the coordinates order. - */ - interface GeoPoint { - lon: number - lat: number - } - interface GeoPoint { - /** - * String returns the string representation of the current GeoPoint instance. - */ - string(): string - } - interface GeoPoint { - /** - * AsMap implements [core.mapExtractor] and returns a value suitable - * to be used in an API rule expression. - */ - asMap(): _TygojaDict - } - interface GeoPoint { - /** - * Value implements the [driver.Valuer] interface. - */ - value(): any - } - interface GeoPoint { - /** - * Scan implements [sql.Scanner] interface to scan the provided value - * into the current GeoPoint instance. * - * The value argument could be nil (no-op), another GeoPoint instance, - * map or serialized json object with lat-lon props. - */ - scan(value: any): void - } - /** - * JSONArray defines a slice that is safe for json and db read/write. - */ - interface JSONArray extends Array{} - /** - * JSONMap defines a map that is safe for json and db read/write. - */ - interface JSONMap extends _TygojaDict{} - /** - * JSONRaw defines a json value type that is safe for db read/write. - */ - interface JSONRaw extends Array{} - interface JSONRaw { - /** - * String returns the current JSONRaw instance as a json encoded string. - */ - string(): string - } - interface JSONRaw { - /** - * MarshalJSON implements the [json.Marshaler] interface. + * @todo remove after dropping v0.22 support */ marshalJSON(): string|Array } - interface JSONRaw { - /** - * UnmarshalJSON implements the [json.Unmarshaler] interface. - */ - unmarshalJSON(b: string|Array): void - } - interface JSONRaw { - /** - * Value implements the [driver.Valuer] interface. - */ - value(): any - } - interface JSONRaw { - /** - * Scan implements [sql.Scanner] interface to scan the provided value - * into the current JSONRaw instance. - */ - scan(value: any): void - } -} - -namespace search { - /** - * Result defines the returned search result structure. - */ - interface Result { - items: any - page: number - perPage: number - totalItems: number - totalPages: number - } - /** - * ResolverResult defines a single FieldResolver.Resolve() successfully parsed result. - */ - interface ResolverResult { - /** - * Identifier is the plain SQL identifier/column that will be used - * in the final db expression as left or right operand. - */ - identifier: string - /** - * NoCoalesce instructs to not use COALESCE or NULL fallbacks - * when building the identifier expression. - */ - noCoalesce: boolean - /** - * Params is a map with db placeholder->value pairs that will be added - * to the query when building both resolved operands/sides in a single expression. - */ - params: dbx.Params - /** - * MultiMatchSubQuery is an optional sub query expression that will be added - * in addition to the combined ResolverResult expression during build. - */ - multiMatchSubQuery: dbx.Expression - /** - * AfterBuild is an optional function that will be called after building - * and combining the result of both resolved operands/sides in a single expression. - */ - afterBuild: (expr: dbx.Expression) => dbx.Expression - } } namespace router { @@ -19311,8 +20565,8 @@ namespace router { * * NB! It is expected that the Response and Request fields are always set. */ - type _sJEbvdc = hook.Event - interface Event extends _sJEbvdc { + type _sZPWzsb = hook.Event + interface Event extends _sZPWzsb { response: http.ResponseWriter request?: http.Request } @@ -19548,256 +20802,8 @@ namespace router { * http.ListenAndServe("localhost:8090", mux) * ``` */ - type _swVWjOY = RouterGroup - interface Router extends _swVWjOY { - } -} - -/** - * Package cron implements a crontab-like service to execute and schedule - * repeative tasks/jobs. - * - * Example: - * - * ``` - * c := cron.New() - * c.MustAdd("dailyReport", "0 0 * * *", func() { ... }) - * c.Start() - * ``` - */ -namespace cron { - /** - * Cron is a crontab-like struct for tasks/jobs scheduling. - */ - interface Cron { - } - interface Cron { - /** - * SetInterval changes the current cron tick interval - * (it usually should be >= 1 minute). - */ - setInterval(d: time.Duration): void - } - interface Cron { - /** - * SetTimezone changes the current cron tick timezone. - */ - setTimezone(l: time.Location): void - } - interface Cron { - /** - * MustAdd is similar to Add() but panic on failure. - */ - mustAdd(jobId: string, cronExpr: string, run: () => void): void - } - interface Cron { - /** - * Add registers a single cron job. - * - * If there is already a job with the provided id, then the old job - * will be replaced with the new one. - * - * cronExpr is a regular cron expression, eg. "0 *\/3 * * *" (aka. at minute 0 past every 3rd hour). - * Check cron.NewSchedule() for the supported tokens. - */ - add(jobId: string, cronExpr: string, fn: () => void): void - } - interface Cron { - /** - * Remove removes a single cron job by its id. - */ - remove(jobId: string): void - } - interface Cron { - /** - * RemoveAll removes all registered cron jobs. - */ - removeAll(): void - } - interface Cron { - /** - * Total returns the current total number of registered cron jobs. - */ - total(): number - } - interface Cron { - /** - * Jobs returns a shallow copy of the currently registered cron jobs. - */ - jobs(): Array<(Job | undefined)> - } - interface Cron { - /** - * Stop stops the current cron ticker (if not already). - * - * You can resume the ticker by calling Start(). - */ - stop(): void - } - interface Cron { - /** - * Start starts the cron ticker. - * - * Calling Start() on already started cron will restart the ticker. - */ - start(): void - } - interface Cron { - /** - * HasStarted checks whether the current Cron ticker has been started. - */ - hasStarted(): boolean - } -} - -namespace auth { - /** - * Provider defines a common interface for an OAuth2 client. - */ - interface Provider { - [key:string]: any; - /** - * Context returns the context associated with the provider (if any). - */ - context(): context.Context - /** - * SetContext assigns the specified context to the current provider. - */ - setContext(ctx: context.Context): void - /** - * PKCE indicates whether the provider can use the PKCE flow. - */ - pkce(): boolean - /** - * SetPKCE toggles the state whether the provider can use the PKCE flow or not. - */ - setPKCE(enable: boolean): void - /** - * DisplayName usually returns provider name as it is officially written - * and it could be used directly in the UI. - */ - displayName(): string - /** - * SetDisplayName sets the provider's display name. - */ - setDisplayName(displayName: string): void - /** - * Scopes returns the provider access permissions that will be requested. - */ - scopes(): Array - /** - * SetScopes sets the provider access permissions that will be requested later. - */ - setScopes(scopes: Array): void - /** - * ClientId returns the provider client's app ID. - */ - clientId(): string - /** - * SetClientId sets the provider client's ID. - */ - setClientId(clientId: string): void - /** - * ClientSecret returns the provider client's app secret. - */ - clientSecret(): string - /** - * SetClientSecret sets the provider client's app secret. - */ - setClientSecret(secret: string): void - /** - * RedirectURL returns the end address to redirect the user - * going through the OAuth flow. - */ - redirectURL(): string - /** - * SetRedirectURL sets the provider's RedirectURL. - */ - setRedirectURL(url: string): void - /** - * AuthURL returns the provider's authorization service url. - */ - authURL(): string - /** - * SetAuthURL sets the provider's AuthURL. - */ - setAuthURL(url: string): void - /** - * TokenURL returns the provider's token exchange service url. - */ - tokenURL(): string - /** - * SetTokenURL sets the provider's TokenURL. - */ - setTokenURL(url: string): void - /** - * UserInfoURL returns the provider's user info api url. - */ - userInfoURL(): string - /** - * SetUserInfoURL sets the provider's UserInfoURL. - */ - setUserInfoURL(url: string): void - /** - * Extra returns a shallow copy of any custom config data - * that the provider may be need. - */ - extra(): _TygojaDict - /** - * SetExtra updates the provider's custom config data. - */ - setExtra(data: _TygojaDict): void - /** - * Client returns an http client using the provided token. - */ - client(token: oauth2.Token): (any) - /** - * BuildAuthURL returns a URL to the provider's consent page - * that asks for permissions for the required scopes explicitly. - */ - buildAuthURL(state: string, ...opts: oauth2.AuthCodeOption[]): string - /** - * FetchToken converts an authorization code to token. - */ - fetchToken(code: string, ...opts: oauth2.AuthCodeOption[]): (oauth2.Token) - /** - * FetchRawUserInfo requests and marshalizes into `result` the - * the OAuth user api response. - */ - fetchRawUserInfo(token: oauth2.Token): string|Array - /** - * FetchAuthUser is similar to FetchRawUserInfo, but normalizes and - * marshalizes the user api response into a standardized AuthUser struct. - */ - fetchAuthUser(token: oauth2.Token): (AuthUser) - } - /** - * AuthUser defines a standardized OAuth2 user data structure. - */ - interface AuthUser { - expiry: types.DateTime - rawUser: _TygojaDict - id: string - name: string - username: string - email: string - avatarURL: string - accessToken: string - refreshToken: string - /** - * @todo - * deprecated: use AvatarURL instead - * AvatarUrl will be removed after dropping v0.22 support - */ - avatarUrl: string - } - interface AuthUser { - /** - * MarshalJSON implements the [json.Marshaler] interface. - * - * @todo remove after dropping v0.22 support - */ - marshalJSON(): string|Array + type _sAyDGzz = RouterGroup + interface Router extends _sAyDGzz { } } @@ -19943,799 +20949,100 @@ namespace subscriptions { } } -namespace exec { +/** + * Package cron implements a crontab-like service to execute and schedule + * repeative tasks/jobs. + * + * Example: + * + * ``` + * c := cron.New() + * c.MustAdd("dailyReport", "0 0 * * *", func() { ... }) + * c.Start() + * ``` + */ +namespace cron { /** - * Cmd represents an external command being prepared or run. - * - * A Cmd cannot be reused after calling its [Cmd.Run], [Cmd.Output] or [Cmd.CombinedOutput] - * methods. + * Cron is a crontab-like struct for tasks/jobs scheduling. */ - interface Cmd { - /** - * Path is the path of the command to run. - * - * This is the only field that must be set to a non-zero - * value. If Path is relative, it is evaluated relative - * to Dir. - */ - path: string - /** - * Args holds command line arguments, including the command as Args[0]. - * If the Args field is empty or nil, Run uses {Path}. - * - * In typical use, both Path and Args are set by calling Command. - */ - args: Array - /** - * Env specifies the environment of the process. - * Each entry is of the form "key=value". - * If Env is nil, the new process uses the current process's - * environment. - * If Env contains duplicate environment keys, only the last - * value in the slice for each duplicate key is used. - * As a special case on Windows, SYSTEMROOT is always added if - * missing and not explicitly set to the empty string. - */ - env: Array - /** - * Dir specifies the working directory of the command. - * If Dir is the empty string, Run runs the command in the - * calling process's current directory. - */ - dir: string - /** - * Stdin specifies the process's standard input. - * - * If Stdin is nil, the process reads from the null device (os.DevNull). - * - * If Stdin is an *os.File, the process's standard input is connected - * directly to that file. - * - * Otherwise, during the execution of the command a separate - * goroutine reads from Stdin and delivers that data to the command - * over a pipe. In this case, Wait does not complete until the goroutine - * stops copying, either because it has reached the end of Stdin - * (EOF or a read error), or because writing to the pipe returned an error, - * or because a nonzero WaitDelay was set and expired. - */ - stdin: io.Reader - /** - * Stdout and Stderr specify the process's standard output and error. - * - * If either is nil, Run connects the corresponding file descriptor - * to the null device (os.DevNull). - * - * If either is an *os.File, the corresponding output from the process - * is connected directly to that file. - * - * Otherwise, during the execution of the command a separate goroutine - * reads from the process over a pipe and delivers that data to the - * corresponding Writer. In this case, Wait does not complete until the - * goroutine reaches EOF or encounters an error or a nonzero WaitDelay - * expires. - * - * If Stdout and Stderr are the same writer, and have a type that can - * be compared with ==, at most one goroutine at a time will call Write. - */ - stdout: io.Writer - stderr: io.Writer - /** - * ExtraFiles specifies additional open files to be inherited by the - * new process. It does not include standard input, standard output, or - * standard error. If non-nil, entry i becomes file descriptor 3+i. - * - * ExtraFiles is not supported on Windows. - */ - extraFiles: Array<(os.File | undefined)> - /** - * SysProcAttr holds optional, operating system-specific attributes. - * Run passes it to os.StartProcess as the os.ProcAttr's Sys field. - */ - sysProcAttr?: syscall.SysProcAttr - /** - * Process is the underlying process, once started. - */ - process?: os.Process - /** - * ProcessState contains information about an exited process. - * If the process was started successfully, Wait or Run will - * populate its ProcessState when the command completes. - */ - processState?: os.ProcessState - err: Error // LookPath error, if any. - /** - * If Cancel is non-nil, the command must have been created with - * CommandContext and Cancel will be called when the command's - * Context is done. By default, CommandContext sets Cancel to - * call the Kill method on the command's Process. - * - * Typically a custom Cancel will send a signal to the command's - * Process, but it may instead take other actions to initiate cancellation, - * such as closing a stdin or stdout pipe or sending a shutdown request on a - * network socket. - * - * If the command exits with a success status after Cancel is - * called, and Cancel does not return an error equivalent to - * os.ErrProcessDone, then Wait and similar methods will return a non-nil - * error: either an error wrapping the one returned by Cancel, - * or the error from the Context. - * (If the command exits with a non-success status, or Cancel - * returns an error that wraps os.ErrProcessDone, Wait and similar methods - * continue to return the command's usual exit status.) - * - * If Cancel is set to nil, nothing will happen immediately when the command's - * Context is done, but a nonzero WaitDelay will still take effect. That may - * be useful, for example, to work around deadlocks in commands that do not - * support shutdown signals but are expected to always finish quickly. - * - * Cancel will not be called if Start returns a non-nil error. - */ - cancel: () => void - /** - * If WaitDelay is non-zero, it bounds the time spent waiting on two sources - * of unexpected delay in Wait: a child process that fails to exit after the - * associated Context is canceled, and a child process that exits but leaves - * its I/O pipes unclosed. - * - * The WaitDelay timer starts when either the associated Context is done or a - * call to Wait observes that the child process has exited, whichever occurs - * first. When the delay has elapsed, the command shuts down the child process - * and/or its I/O pipes. - * - * If the child process has failed to exit — perhaps because it ignored or - * failed to receive a shutdown signal from a Cancel function, or because no - * Cancel function was set — then it will be terminated using os.Process.Kill. - * - * Then, if the I/O pipes communicating with the child process are still open, - * those pipes are closed in order to unblock any goroutines currently blocked - * on Read or Write calls. - * - * If pipes are closed due to WaitDelay, no Cancel call has occurred, - * and the command has otherwise exited with a successful status, Wait and - * similar methods will return ErrWaitDelay instead of nil. - * - * If WaitDelay is zero (the default), I/O pipes will be read until EOF, - * which might not occur until orphaned subprocesses of the command have - * also closed their descriptors for the pipes. - */ - waitDelay: time.Duration + interface Cron { } - interface Cmd { + interface Cron { /** - * String returns a human-readable description of c. - * It is intended only for debugging. - * In particular, it is not suitable for use as input to a shell. - * The output of String may vary across Go releases. + * SetInterval changes the current cron tick interval + * (it usually should be >= 1 minute). */ - string(): string + setInterval(d: time.Duration): void } - interface Cmd { + interface Cron { /** - * Run starts the specified command and waits for it to complete. - * - * The returned error is nil if the command runs, has no problems - * copying stdin, stdout, and stderr, and exits with a zero exit - * status. - * - * If the command starts but does not complete successfully, the error is of - * type [*ExitError]. Other error types may be returned for other situations. - * - * If the calling goroutine has locked the operating system thread - * with [runtime.LockOSThread] and modified any inheritable OS-level - * thread state (for example, Linux or Plan 9 name spaces), the new - * process will inherit the caller's thread state. + * SetTimezone changes the current cron tick timezone. */ - run(): void + setTimezone(l: time.Location): void } - interface Cmd { + interface Cron { /** - * Start starts the specified command but does not wait for it to complete. + * MustAdd is similar to Add() but panic on failure. + */ + mustAdd(jobId: string, cronExpr: string, run: () => void): void + } + interface Cron { + /** + * Add registers a single cron job. * - * If Start returns successfully, the c.Process field will be set. + * If there is already a job with the provided id, then the old job + * will be replaced with the new one. * - * After a successful call to Start the [Cmd.Wait] method must be called in - * order to release associated system resources. + * cronExpr is a regular cron expression, eg. "0 *\/3 * * *" (aka. at minute 0 past every 3rd hour). + * Check cron.NewSchedule() for the supported tokens. + */ + add(jobId: string, cronExpr: string, fn: () => void): void + } + interface Cron { + /** + * Remove removes a single cron job by its id. + */ + remove(jobId: string): void + } + interface Cron { + /** + * RemoveAll removes all registered cron jobs. + */ + removeAll(): void + } + interface Cron { + /** + * Total returns the current total number of registered cron jobs. + */ + total(): number + } + interface Cron { + /** + * Jobs returns a shallow copy of the currently registered cron jobs. + */ + jobs(): Array<(Job | undefined)> + } + interface Cron { + /** + * Stop stops the current cron ticker (if not already). + * + * You can resume the ticker by calling Start(). + */ + stop(): void + } + interface Cron { + /** + * Start starts the cron ticker. + * + * Calling Start() on already started cron will restart the ticker. */ start(): void } - interface Cmd { + interface Cron { /** - * Wait waits for the command to exit and waits for any copying to - * stdin or copying from stdout or stderr to complete. - * - * The command must have been started by [Cmd.Start]. - * - * The returned error is nil if the command runs, has no problems - * copying stdin, stdout, and stderr, and exits with a zero exit - * status. - * - * If the command fails to run or doesn't complete successfully, the - * error is of type [*ExitError]. Other error types may be - * returned for I/O problems. - * - * If any of c.Stdin, c.Stdout or c.Stderr are not an [*os.File], Wait also waits - * for the respective I/O loop copying to or from the process to complete. - * - * Wait releases any resources associated with the [Cmd]. + * HasStarted checks whether the current Cron ticker has been started. */ - wait(): void - } - interface Cmd { - /** - * Output runs the command and returns its standard output. - * Any returned error will usually be of type [*ExitError]. - * If c.Stderr was nil, Output populates [ExitError.Stderr]. - */ - output(): string|Array - } - interface Cmd { - /** - * CombinedOutput runs the command and returns its combined standard - * output and standard error. - */ - combinedOutput(): string|Array - } - interface Cmd { - /** - * StdinPipe returns a pipe that will be connected to the command's - * standard input when the command starts. - * The pipe will be closed automatically after [Cmd.Wait] sees the command exit. - * A caller need only call Close to force the pipe to close sooner. - * For example, if the command being run will not exit until standard input - * is closed, the caller must close the pipe. - */ - stdinPipe(): io.WriteCloser - } - interface Cmd { - /** - * StdoutPipe returns a pipe that will be connected to the command's - * standard output when the command starts. - * - * [Cmd.Wait] will close the pipe after seeing the command exit, so most callers - * need not close the pipe themselves. It is thus incorrect to call Wait - * before all reads from the pipe have completed. - * For the same reason, it is incorrect to call [Cmd.Run] when using StdoutPipe. - * See the example for idiomatic usage. - */ - stdoutPipe(): io.ReadCloser - } - interface Cmd { - /** - * StderrPipe returns a pipe that will be connected to the command's - * standard error when the command starts. - * - * [Cmd.Wait] will close the pipe after seeing the command exit, so most callers - * need not close the pipe themselves. It is thus incorrect to call Wait - * before all reads from the pipe have completed. - * For the same reason, it is incorrect to use [Cmd.Run] when using StderrPipe. - * See the StdoutPipe example for idiomatic usage. - */ - stderrPipe(): io.ReadCloser - } - interface Cmd { - /** - * Environ returns a copy of the environment in which the command would be run - * as it is currently configured. - */ - environ(): Array - } -} - -namespace mailer { - /** - * Message defines a generic email message struct. - */ - interface Message { - from: { address: string; name?: string; } - to: Array<{ address: string; name?: string; }> - bcc: Array<{ address: string; name?: string; }> - cc: Array<{ address: string; name?: string; }> - subject: string - html: string - text: string - headers: _TygojaDict - attachments: _TygojaDict - inlineAttachments: _TygojaDict - } - /** - * Mailer defines a base mail client interface. - */ - interface Mailer { - [key:string]: any; - /** - * Send sends an email with the provided Message. - */ - send(message: Message): void - } -} - -/** - * Package slog provides structured logging, - * in which log records include a message, - * a severity level, and various other attributes - * expressed as key-value pairs. - * - * It defines a type, [Logger], - * which provides several methods (such as [Logger.Info] and [Logger.Error]) - * for reporting events of interest. - * - * Each Logger is associated with a [Handler]. - * A Logger output method creates a [Record] from the method arguments - * and passes it to the Handler, which decides how to handle it. - * There is a default Logger accessible through top-level functions - * (such as [Info] and [Error]) that call the corresponding Logger methods. - * - * A log record consists of a time, a level, a message, and a set of key-value - * pairs, where the keys are strings and the values may be of any type. - * As an example, - * - * ``` - * slog.Info("hello", "count", 3) - * ``` - * - * creates a record containing the time of the call, - * a level of Info, the message "hello", and a single - * pair with key "count" and value 3. - * - * The [Info] top-level function calls the [Logger.Info] method on the default Logger. - * In addition to [Logger.Info], there are methods for Debug, Warn and Error levels. - * Besides these convenience methods for common levels, - * there is also a [Logger.Log] method which takes the level as an argument. - * Each of these methods has a corresponding top-level function that uses the - * default logger. - * - * The default handler formats the log record's message, time, level, and attributes - * as a string and passes it to the [log] package. - * - * ``` - * 2022/11/08 15:28:26 INFO hello count=3 - * ``` - * - * For more control over the output format, create a logger with a different handler. - * This statement uses [New] to create a new logger with a [TextHandler] - * that writes structured records in text form to standard error: - * - * ``` - * logger := slog.New(slog.NewTextHandler(os.Stderr, nil)) - * ``` - * - * [TextHandler] output is a sequence of key=value pairs, easily and unambiguously - * parsed by machine. This statement: - * - * ``` - * logger.Info("hello", "count", 3) - * ``` - * - * produces this output: - * - * ``` - * time=2022-11-08T15:28:26.000-05:00 level=INFO msg=hello count=3 - * ``` - * - * The package also provides [JSONHandler], whose output is line-delimited JSON: - * - * ``` - * logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) - * logger.Info("hello", "count", 3) - * ``` - * - * produces this output: - * - * ``` - * {"time":"2022-11-08T15:28:26.000000000-05:00","level":"INFO","msg":"hello","count":3} - * ``` - * - * Both [TextHandler] and [JSONHandler] can be configured with [HandlerOptions]. - * There are options for setting the minimum level (see Levels, below), - * displaying the source file and line of the log call, and - * modifying attributes before they are logged. - * - * Setting a logger as the default with - * - * ``` - * slog.SetDefault(logger) - * ``` - * - * will cause the top-level functions like [Info] to use it. - * [SetDefault] also updates the default logger used by the [log] package, - * so that existing applications that use [log.Printf] and related functions - * will send log records to the logger's handler without needing to be rewritten. - * - * Some attributes are common to many log calls. - * For example, you may wish to include the URL or trace identifier of a server request - * with all log events arising from the request. - * Rather than repeat the attribute with every log call, you can use [Logger.With] - * to construct a new Logger containing the attributes: - * - * ``` - * logger2 := logger.With("url", r.URL) - * ``` - * - * The arguments to With are the same key-value pairs used in [Logger.Info]. - * The result is a new Logger with the same handler as the original, but additional - * attributes that will appear in the output of every call. - * - * # Levels - * - * A [Level] is an integer representing the importance or severity of a log event. - * The higher the level, the more severe the event. - * This package defines constants for the most common levels, - * but any int can be used as a level. - * - * In an application, you may wish to log messages only at a certain level or greater. - * One common configuration is to log messages at Info or higher levels, - * suppressing debug logging until it is needed. - * The built-in handlers can be configured with the minimum level to output by - * setting [HandlerOptions.Level]. - * The program's `main` function typically does this. - * The default value is LevelInfo. - * - * Setting the [HandlerOptions.Level] field to a [Level] value - * fixes the handler's minimum level throughout its lifetime. - * Setting it to a [LevelVar] allows the level to be varied dynamically. - * A LevelVar holds a Level and is safe to read or write from multiple - * goroutines. - * To vary the level dynamically for an entire program, first initialize - * a global LevelVar: - * - * ``` - * var programLevel = new(slog.LevelVar) // Info by default - * ``` - * - * Then use the LevelVar to construct a handler, and make it the default: - * - * ``` - * h := slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{Level: programLevel}) - * slog.SetDefault(slog.New(h)) - * ``` - * - * Now the program can change its logging level with a single statement: - * - * ``` - * programLevel.Set(slog.LevelDebug) - * ``` - * - * # Groups - * - * Attributes can be collected into groups. - * A group has a name that is used to qualify the names of its attributes. - * How this qualification is displayed depends on the handler. - * [TextHandler] separates the group and attribute names with a dot. - * [JSONHandler] treats each group as a separate JSON object, with the group name as the key. - * - * Use [Group] to create a Group attribute from a name and a list of key-value pairs: - * - * ``` - * slog.Group("request", - * "method", r.Method, - * "url", r.URL) - * ``` - * - * TextHandler would display this group as - * - * ``` - * request.method=GET request.url=http://example.com - * ``` - * - * JSONHandler would display it as - * - * ``` - * "request":{"method":"GET","url":"http://example.com"} - * ``` - * - * Use [Logger.WithGroup] to qualify all of a Logger's output - * with a group name. Calling WithGroup on a Logger results in a - * new Logger with the same Handler as the original, but with all - * its attributes qualified by the group name. - * - * This can help prevent duplicate attribute keys in large systems, - * where subsystems might use the same keys. - * Pass each subsystem a different Logger with its own group name so that - * potential duplicates are qualified: - * - * ``` - * logger := slog.Default().With("id", systemID) - * parserLogger := logger.WithGroup("parser") - * parseInput(input, parserLogger) - * ``` - * - * When parseInput logs with parserLogger, its keys will be qualified with "parser", - * so even if it uses the common key "id", the log line will have distinct keys. - * - * # Contexts - * - * Some handlers may wish to include information from the [context.Context] that is - * available at the call site. One example of such information - * is the identifier for the current span when tracing is enabled. - * - * The [Logger.Log] and [Logger.LogAttrs] methods take a context as a first - * argument, as do their corresponding top-level functions. - * - * Although the convenience methods on Logger (Info and so on) and the - * corresponding top-level functions do not take a context, the alternatives ending - * in "Context" do. For example, - * - * ``` - * slog.InfoContext(ctx, "message") - * ``` - * - * It is recommended to pass a context to an output method if one is available. - * - * # Attrs and Values - * - * An [Attr] is a key-value pair. The Logger output methods accept Attrs as well as - * alternating keys and values. The statement - * - * ``` - * slog.Info("hello", slog.Int("count", 3)) - * ``` - * - * behaves the same as - * - * ``` - * slog.Info("hello", "count", 3) - * ``` - * - * There are convenience constructors for [Attr] such as [Int], [String], and [Bool] - * for common types, as well as the function [Any] for constructing Attrs of any - * type. - * - * The value part of an Attr is a type called [Value]. - * Like an [any], a Value can hold any Go value, - * but it can represent typical values, including all numbers and strings, - * without an allocation. - * - * For the most efficient log output, use [Logger.LogAttrs]. - * It is similar to [Logger.Log] but accepts only Attrs, not alternating - * keys and values; this allows it, too, to avoid allocation. - * - * The call - * - * ``` - * logger.LogAttrs(ctx, slog.LevelInfo, "hello", slog.Int("count", 3)) - * ``` - * - * is the most efficient way to achieve the same output as - * - * ``` - * slog.InfoContext(ctx, "hello", "count", 3) - * ``` - * - * # Customizing a type's logging behavior - * - * If a type implements the [LogValuer] interface, the [Value] returned from its LogValue - * method is used for logging. You can use this to control how values of the type - * appear in logs. For example, you can redact secret information like passwords, - * or gather a struct's fields in a Group. See the examples under [LogValuer] for - * details. - * - * A LogValue method may return a Value that itself implements [LogValuer]. The [Value.Resolve] - * method handles these cases carefully, avoiding infinite loops and unbounded recursion. - * Handler authors and others may wish to use [Value.Resolve] instead of calling LogValue directly. - * - * # Wrapping output methods - * - * The logger functions use reflection over the call stack to find the file name - * and line number of the logging call within the application. This can produce - * incorrect source information for functions that wrap slog. For instance, if you - * define this function in file mylog.go: - * - * ``` - * func Infof(logger *slog.Logger, format string, args ...any) { - * logger.Info(fmt.Sprintf(format, args...)) - * } - * ``` - * - * and you call it like this in main.go: - * - * ``` - * Infof(slog.Default(), "hello, %s", "world") - * ``` - * - * then slog will report the source file as mylog.go, not main.go. - * - * A correct implementation of Infof will obtain the source location - * (pc) and pass it to NewRecord. - * The Infof function in the package-level example called "wrapping" - * demonstrates how to do this. - * - * # Working with Records - * - * Sometimes a Handler will need to modify a Record - * before passing it on to another Handler or backend. - * A Record contains a mixture of simple public fields (e.g. Time, Level, Message) - * and hidden fields that refer to state (such as attributes) indirectly. This - * means that modifying a simple copy of a Record (e.g. by calling - * [Record.Add] or [Record.AddAttrs] to add attributes) - * may have unexpected effects on the original. - * Before modifying a Record, use [Record.Clone] to - * create a copy that shares no state with the original, - * or create a new Record with [NewRecord] - * and build up its Attrs by traversing the old ones with [Record.Attrs]. - * - * # Performance considerations - * - * If profiling your application demonstrates that logging is taking significant time, - * the following suggestions may help. - * - * If many log lines have a common attribute, use [Logger.With] to create a Logger with - * that attribute. The built-in handlers will format that attribute only once, at the - * call to [Logger.With]. The [Handler] interface is designed to allow that optimization, - * and a well-written Handler should take advantage of it. - * - * The arguments to a log call are always evaluated, even if the log event is discarded. - * If possible, defer computation so that it happens only if the value is actually logged. - * For example, consider the call - * - * ``` - * slog.Info("starting request", "url", r.URL.String()) // may compute String unnecessarily - * ``` - * - * The URL.String method will be called even if the logger discards Info-level events. - * Instead, pass the URL directly: - * - * ``` - * slog.Info("starting request", "url", &r.URL) // calls URL.String only if needed - * ``` - * - * The built-in [TextHandler] will call its String method, but only - * if the log event is enabled. - * Avoiding the call to String also preserves the structure of the underlying value. - * For example [JSONHandler] emits the components of the parsed URL as a JSON object. - * If you want to avoid eagerly paying the cost of the String call - * without causing the handler to potentially inspect the structure of the value, - * wrap the value in a fmt.Stringer implementation that hides its Marshal methods. - * - * You can also use the [LogValuer] interface to avoid unnecessary work in disabled log - * calls. Say you need to log some expensive value: - * - * ``` - * slog.Debug("frobbing", "value", computeExpensiveValue(arg)) - * ``` - * - * Even if this line is disabled, computeExpensiveValue will be called. - * To avoid that, define a type implementing LogValuer: - * - * ``` - * type expensive struct { arg int } - * - * func (e expensive) LogValue() slog.Value { - * return slog.AnyValue(computeExpensiveValue(e.arg)) - * } - * ``` - * - * Then use a value of that type in log calls: - * - * ``` - * slog.Debug("frobbing", "value", expensive{arg}) - * ``` - * - * Now computeExpensiveValue will only be called when the line is enabled. - * - * The built-in handlers acquire a lock before calling [io.Writer.Write] - * to ensure that exactly one [Record] is written at a time in its entirety. - * Although each log record has a timestamp, - * the built-in handlers do not use that time to sort the written records. - * User-defined handlers are responsible for their own locking and sorting. - * - * # Writing a handler - * - * For a guide to writing a custom handler, see https://golang.org/s/slog-handler-guide. - */ -namespace slog { - // @ts-ignore - import loginternal = internal - /** - * A Logger records structured information about each call to its - * Log, Debug, Info, Warn, and Error methods. - * For each call, it creates a [Record] and passes it to a [Handler]. - * - * To create a new Logger, call [New] or a Logger method - * that begins "With". - */ - interface Logger { - } - interface Logger { - /** - * Handler returns l's Handler. - */ - handler(): Handler - } - interface Logger { - /** - * With returns a Logger that includes the given attributes - * in each output operation. Arguments are converted to - * attributes as if by [Logger.Log]. - */ - with(...args: any[]): (Logger) - } - interface Logger { - /** - * WithGroup returns a Logger that starts a group, if name is non-empty. - * The keys of all attributes added to the Logger will be qualified by the given - * name. (How that qualification happens depends on the [Handler.WithGroup] - * method of the Logger's Handler.) - * - * If name is empty, WithGroup returns the receiver. - */ - withGroup(name: string): (Logger) - } - interface Logger { - /** - * Enabled reports whether l emits log records at the given context and level. - */ - enabled(ctx: context.Context, level: Level): boolean - } - interface Logger { - /** - * Log emits a log record with the current time and the given level and message. - * The Record's Attrs consist of the Logger's attributes followed by - * the Attrs specified by args. - * - * The attribute arguments are processed as follows: - * ``` - * - If an argument is an Attr, it is used as is. - * - If an argument is a string and this is not the last argument, - * the following argument is treated as the value and the two are combined - * into an Attr. - * - Otherwise, the argument is treated as a value with key "!BADKEY". - * ``` - */ - log(ctx: context.Context, level: Level, msg: string, ...args: any[]): void - } - interface Logger { - /** - * LogAttrs is a more efficient version of [Logger.Log] that accepts only Attrs. - */ - logAttrs(ctx: context.Context, level: Level, msg: string, ...attrs: Attr[]): void - } - interface Logger { - /** - * Debug logs at [LevelDebug]. - */ - debug(msg: string, ...args: any[]): void - } - interface Logger { - /** - * DebugContext logs at [LevelDebug] with the given context. - */ - debugContext(ctx: context.Context, msg: string, ...args: any[]): void - } - interface Logger { - /** - * Info logs at [LevelInfo]. - */ - info(msg: string, ...args: any[]): void - } - interface Logger { - /** - * InfoContext logs at [LevelInfo] with the given context. - */ - infoContext(ctx: context.Context, msg: string, ...args: any[]): void - } - interface Logger { - /** - * Warn logs at [LevelWarn]. - */ - warn(msg: string, ...args: any[]): void - } - interface Logger { - /** - * WarnContext logs at [LevelWarn] with the given context. - */ - warnContext(ctx: context.Context, msg: string, ...args: any[]): void - } - interface Logger { - /** - * Error logs at [LevelError]. - */ - error(msg: string, ...args: any[]): void - } - interface Logger { - /** - * ErrorContext logs at [LevelError] with the given context. - */ - errorContext(ctx: context.Context, msg: string, ...args: any[]): void + hasStarted(): boolean } } @@ -20750,6 +21057,47 @@ namespace sync { } } +namespace syscall { + /** + * SysProcIDMap holds Container ID to Host ID mappings used for User Namespaces in Linux. + * See user_namespaces(7). + * + * Note that User Namespaces are not available on a number of popular Linux + * versions (due to security issues), or are available but subject to AppArmor + * restrictions like in Ubuntu 24.04. + */ + interface SysProcIDMap { + containerID: number // Container ID. + hostID: number // Host ID. + size: number // Size. + } + // @ts-ignore + import errorspkg = errors + /** + * Credential holds user and group identities to be assumed + * by a child process started by [StartProcess]. + */ + interface Credential { + uid: number // User ID. + gid: number // Group ID. + groups: Array // Supplementary group IDs. + noSetGroups: boolean // If true, don't set supplementary groups + } + // @ts-ignore + import runtimesyscall = syscall + /** + * A Signal is a number describing a process signal. + * It implements the [os.Signal] interface. + */ + interface Signal extends Number{} + interface Signal { + signal(): void + } + interface Signal { + string(): string + } +} + namespace io { /** * WriteCloser is the interface that groups the basic Write and Close methods. @@ -20759,6 +21107,587 @@ namespace io { } } +namespace time { + /** + * A Month specifies a month of the year (January = 1, ...). + */ + interface Month extends Number{} + interface Month { + /** + * String returns the English name of the month ("January", "February", ...). + */ + string(): string + } + /** + * A Weekday specifies a day of the week (Sunday = 0, ...). + */ + interface Weekday extends Number{} + interface Weekday { + /** + * String returns the English name of the day ("Sunday", "Monday", ...). + */ + string(): string + } + /** + * A Location maps time instants to the zone in use at that time. + * Typically, the Location represents the collection of time offsets + * in use in a geographical area. For many Locations the time offset varies + * depending on whether daylight savings time is in use at the time instant. + * + * Location is used to provide a time zone in a printed Time value and for + * calculations involving intervals that may cross daylight savings time + * boundaries. + */ + interface Location { + } + interface Location { + /** + * String returns a descriptive name for the time zone information, + * corresponding to the name argument to [LoadLocation] or [FixedZone]. + */ + string(): string + } +} + +namespace fs { +} + +namespace store { +} + +/** + * Package url parses URLs and implements query escaping. + */ +namespace url { + /** + * A URL represents a parsed URL (technically, a URI reference). + * + * The general form represented is: + * + * ``` + * [scheme:][//[userinfo@]host][/]path[?query][#fragment] + * ``` + * + * URLs that do not start with a slash after the scheme are interpreted as: + * + * ``` + * scheme:opaque[?query][#fragment] + * ``` + * + * The Host field contains the host and port subcomponents of the URL. + * When the port is present, it is separated from the host with a colon. + * When the host is an IPv6 address, it must be enclosed in square brackets: + * "[fe80::1]:80". The [net.JoinHostPort] function combines a host and port + * into a string suitable for the Host field, adding square brackets to + * the host when necessary. + * + * Note that the Path field is stored in decoded form: /%47%6f%2f becomes /Go/. + * A consequence is that it is impossible to tell which slashes in the Path were + * slashes in the raw URL and which were %2f. This distinction is rarely important, + * but when it is, the code should use the [URL.EscapedPath] method, which preserves + * the original encoding of Path. + * + * The RawPath field is an optional field which is only set when the default + * encoding of Path is different from the escaped path. See the EscapedPath method + * for more details. + * + * URL's String method uses the EscapedPath method to obtain the path. + */ + interface URL { + scheme: string + opaque: string // encoded opaque data + user?: Userinfo // username and password information + host: string // host or host:port (see Hostname and Port methods) + path: string // path (relative paths may omit leading slash) + rawPath: string // encoded path hint (see EscapedPath method) + omitHost: boolean // do not emit empty host (authority) + forceQuery: boolean // append a query ('?') even if RawQuery is empty + rawQuery: string // encoded query values, without '?' + fragment: string // fragment for references, without '#' + rawFragment: string // encoded fragment hint (see EscapedFragment method) + } + interface URL { + /** + * EscapedPath returns the escaped form of u.Path. + * In general there are multiple possible escaped forms of any path. + * EscapedPath returns u.RawPath when it is a valid escaping of u.Path. + * Otherwise EscapedPath ignores u.RawPath and computes an escaped + * form on its own. + * The [URL.String] and [URL.RequestURI] methods use EscapedPath to construct + * their results. + * In general, code should call EscapedPath instead of + * reading u.RawPath directly. + */ + escapedPath(): string + } + interface URL { + /** + * EscapedFragment returns the escaped form of u.Fragment. + * In general there are multiple possible escaped forms of any fragment. + * EscapedFragment returns u.RawFragment when it is a valid escaping of u.Fragment. + * Otherwise EscapedFragment ignores u.RawFragment and computes an escaped + * form on its own. + * The [URL.String] method uses EscapedFragment to construct its result. + * In general, code should call EscapedFragment instead of + * reading u.RawFragment directly. + */ + escapedFragment(): string + } + interface URL { + /** + * String reassembles the [URL] into a valid URL string. + * The general form of the result is one of: + * + * ``` + * scheme:opaque?query#fragment + * scheme://userinfo@host/path?query#fragment + * ``` + * + * If u.Opaque is non-empty, String uses the first form; + * otherwise it uses the second form. + * Any non-ASCII characters in host are escaped. + * To obtain the path, String uses u.EscapedPath(). + * + * In the second form, the following rules apply: + * ``` + * - if u.Scheme is empty, scheme: is omitted. + * - if u.User is nil, userinfo@ is omitted. + * - if u.Host is empty, host/ is omitted. + * - if u.Scheme and u.Host are empty and u.User is nil, + * the entire scheme://userinfo@host/ is omitted. + * - if u.Host is non-empty and u.Path begins with a /, + * the form host/path does not add its own /. + * - if u.RawQuery is empty, ?query is omitted. + * - if u.Fragment is empty, #fragment is omitted. + * ``` + */ + string(): string + } + interface URL { + /** + * Redacted is like [URL.String] but replaces any password with "xxxxx". + * Only the password in u.User is redacted. + */ + redacted(): string + } + /** + * Values maps a string key to a list of values. + * It is typically used for query parameters and form values. + * Unlike in the http.Header map, the keys in a Values map + * are case-sensitive. + */ + interface Values extends _TygojaDict{} + interface Values { + /** + * Get gets the first value associated with the given key. + * If there are no values associated with the key, Get returns + * the empty string. To access multiple values, use the map + * directly. + */ + get(key: string): string + } + interface Values { + /** + * Set sets the key to value. It replaces any existing + * values. + */ + set(key: string, value: string): void + } + interface Values { + /** + * Add adds the value to key. It appends to any existing + * values associated with key. + */ + add(key: string, value: string): void + } + interface Values { + /** + * Del deletes the values associated with key. + */ + del(key: string): void + } + interface Values { + /** + * Has checks whether a given key is set. + */ + has(key: string): boolean + } + interface Values { + /** + * Encode encodes the values into “URL encoded” form + * ("bar=baz&foo=quux") sorted by key. + */ + encode(): string + } + interface URL { + /** + * IsAbs reports whether the [URL] is absolute. + * Absolute means that it has a non-empty scheme. + */ + isAbs(): boolean + } + interface URL { + /** + * Parse parses a [URL] in the context of the receiver. The provided URL + * may be relative or absolute. Parse returns nil, err on parse + * failure, otherwise its return value is the same as [URL.ResolveReference]. + */ + parse(ref: string): (URL) + } + interface URL { + /** + * ResolveReference resolves a URI reference to an absolute URI from + * an absolute base URI u, per RFC 3986 Section 5.2. The URI reference + * may be relative or absolute. ResolveReference always returns a new + * [URL] instance, even if the returned URL is identical to either the + * base or reference. If ref is an absolute URL, then ResolveReference + * ignores base and returns a copy of ref. + */ + resolveReference(ref: URL): (URL) + } + interface URL { + /** + * Query parses RawQuery and returns the corresponding values. + * It silently discards malformed value pairs. + * To check errors use [ParseQuery]. + */ + query(): Values + } + interface URL { + /** + * RequestURI returns the encoded path?query or opaque?query + * string that would be used in an HTTP request for u. + */ + requestURI(): string + } + interface URL { + /** + * Hostname returns u.Host, stripping any valid port number if present. + * + * If the result is enclosed in square brackets, as literal IPv6 addresses are, + * the square brackets are removed from the result. + */ + hostname(): string + } + interface URL { + /** + * Port returns the port part of u.Host, without the leading colon. + * + * If u.Host doesn't contain a valid numeric port, Port returns an empty string. + */ + port(): string + } + interface URL { + marshalBinary(): string|Array + } + interface URL { + unmarshalBinary(text: string|Array): void + } + interface URL { + /** + * JoinPath returns a new [URL] with the provided path elements joined to + * any existing path and the resulting path cleaned of any ./ or ../ elements. + * Any sequences of multiple / characters will be reduced to a single /. + */ + joinPath(...elem: string[]): (URL) + } +} + +namespace context { +} + +namespace net { + /** + * Addr represents a network end point address. + * + * The two methods [Addr.Network] and [Addr.String] conventionally return strings + * that can be passed as the arguments to [Dial], but the exact form + * and meaning of the strings is up to the implementation. + */ + interface Addr { + [key:string]: any; + network(): string // name of the network (for example, "tcp", "udp") + string(): string // string form of address (for example, "192.0.2.1:25", "[2001:db8::1]:80") + } + /** + * A Listener is a generic network listener for stream-oriented protocols. + * + * Multiple goroutines may invoke methods on a Listener simultaneously. + */ + interface Listener { + [key:string]: any; + /** + * Accept waits for and returns the next connection to the listener. + */ + accept(): Conn + /** + * Close closes the listener. + * Any blocked Accept operations will be unblocked and return errors. + */ + close(): void + /** + * Addr returns the listener's network address. + */ + addr(): Addr + } +} + +namespace jwt { + /** + * NumericDate represents a JSON numeric date value, as referenced at + * https://datatracker.ietf.org/doc/html/rfc7519#section-2. + */ + type _sHxJrxk = time.Time + interface NumericDate extends _sHxJrxk { + } + interface NumericDate { + /** + * MarshalJSON is an implementation of the json.RawMessage interface and serializes the UNIX epoch + * represented in NumericDate to a byte array, using the precision specified in TimePrecision. + */ + marshalJSON(): string|Array + } + interface NumericDate { + /** + * UnmarshalJSON is an implementation of the json.RawMessage interface and + * deserializes a [NumericDate] from a JSON representation, i.e. a + * [json.Number]. This number represents an UNIX epoch with either integer or + * non-integer seconds. + */ + unmarshalJSON(b: string|Array): void + } + /** + * ClaimStrings is basically just a slice of strings, but it can be either + * serialized from a string array or just a string. This type is necessary, + * since the "aud" claim can either be a single string or an array. + */ + interface ClaimStrings extends Array{} + interface ClaimStrings { + unmarshalJSON(data: string|Array): void + } + interface ClaimStrings { + marshalJSON(): string|Array + } +} + +namespace hook { + /** + * wrapped local Hook embedded struct to limit the public API surface. + */ + type _sAafFuB = Hook + interface mainHook extends _sAafFuB { + } +} + +namespace sql { + /** + * IsolationLevel is the transaction isolation level used in [TxOptions]. + */ + interface IsolationLevel extends Number{} + interface IsolationLevel { + /** + * String returns the name of the transaction isolation level. + */ + string(): string + } + /** + * DBStats contains database statistics. + */ + interface DBStats { + maxOpenConnections: number // Maximum number of open connections to the database. + /** + * Pool Status + */ + openConnections: number // The number of established connections both in use and idle. + inUse: number // The number of connections currently in use. + idle: number // The number of idle connections. + /** + * Counters + */ + waitCount: number // The total number of connections waited for. + waitDuration: time.Duration // The total time blocked waiting for a new connection. + maxIdleClosed: number // The total number of connections closed due to SetMaxIdleConns. + maxIdleTimeClosed: number // The total number of connections closed due to SetConnMaxIdleTime. + maxLifetimeClosed: number // The total number of connections closed due to SetConnMaxLifetime. + } + /** + * Conn represents a single database connection rather than a pool of database + * connections. Prefer running queries from [DB] unless there is a specific + * need for a continuous single database connection. + * + * A Conn must call [Conn.Close] to return the connection to the database pool + * and may do so concurrently with a running query. + * + * After a call to [Conn.Close], all operations on the + * connection fail with [ErrConnDone]. + */ + interface Conn { + } + interface Conn { + /** + * PingContext verifies the connection to the database is still alive. + */ + pingContext(ctx: context.Context): void + } + interface Conn { + /** + * ExecContext executes a query without returning any rows. + * The args are for any placeholder parameters in the query. + */ + execContext(ctx: context.Context, query: string, ...args: any[]): Result + } + interface Conn { + /** + * QueryContext executes a query that returns rows, typically a SELECT. + * The args are for any placeholder parameters in the query. + */ + queryContext(ctx: context.Context, query: string, ...args: any[]): (Rows) + } + interface Conn { + /** + * QueryRowContext executes a query that is expected to return at most one row. + * QueryRowContext always returns a non-nil value. Errors are deferred until + * the [*Row.Scan] method is called. + * If the query selects no rows, the [*Row.Scan] will return [ErrNoRows]. + * Otherwise, the [*Row.Scan] scans the first selected row and discards + * the rest. + */ + queryRowContext(ctx: context.Context, query: string, ...args: any[]): (Row) + } + interface Conn { + /** + * PrepareContext creates a prepared statement for later queries or executions. + * Multiple queries or executions may be run concurrently from the + * returned statement. + * The caller must call the statement's [*Stmt.Close] method + * when the statement is no longer needed. + * + * The provided context is used for the preparation of the statement, not for the + * execution of the statement. + */ + prepareContext(ctx: context.Context, query: string): (Stmt) + } + interface Conn { + /** + * Raw executes f exposing the underlying driver connection for the + * duration of f. The driverConn must not be used outside of f. + * + * Once f returns and err is not [driver.ErrBadConn], the [Conn] will continue to be usable + * until [Conn.Close] is called. + */ + raw(f: (driverConn: any) => void): void + } + interface Conn { + /** + * BeginTx starts a transaction. + * + * The provided context is used until the transaction is committed or rolled back. + * If the context is canceled, the sql package will roll back + * the transaction. [Tx.Commit] will return an error if the context provided to + * BeginTx is canceled. + * + * The provided [TxOptions] is optional and may be nil if defaults should be used. + * If a non-default isolation level is used that the driver doesn't support, + * an error will be returned. + */ + beginTx(ctx: context.Context, opts: TxOptions): (Tx) + } + interface Conn { + /** + * Close returns the connection to the connection pool. + * All operations after a Close will return with [ErrConnDone]. + * Close is safe to call concurrently with other operations and will + * block until all other operations finish. It may be useful to first + * cancel any used context and then call close directly after. + */ + close(): void + } + /** + * ColumnType contains the name and type of a column. + */ + interface ColumnType { + } + interface ColumnType { + /** + * Name returns the name or alias of the column. + */ + name(): string + } + interface ColumnType { + /** + * Length returns the column type length for variable length column types such + * as text and binary field types. If the type length is unbounded the value will + * be [math.MaxInt64] (any database limits will still apply). + * If the column type is not variable length, such as an int, or if not supported + * by the driver ok is false. + */ + length(): [number, boolean] + } + interface ColumnType { + /** + * DecimalSize returns the scale and precision of a decimal type. + * If not applicable or if not supported ok is false. + */ + decimalSize(): [number, number, boolean] + } + interface ColumnType { + /** + * ScanType returns a Go type suitable for scanning into using [Rows.Scan]. + * If a driver does not support this property ScanType will return + * the type of an empty interface. + */ + scanType(): any + } + interface ColumnType { + /** + * Nullable reports whether the column may be null. + * If a driver does not support this property ok will be false. + */ + nullable(): [boolean, boolean] + } + interface ColumnType { + /** + * DatabaseTypeName returns the database system name of the column type. If an empty + * string is returned, then the driver type name is not supported. + * Consult your driver documentation for a list of driver data types. [ColumnType.Length] specifiers + * are not included. + * Common type names include "VARCHAR", "TEXT", "NVARCHAR", "DECIMAL", "BOOL", + * "INT", and "BIGINT". + */ + databaseTypeName(): string + } + /** + * Row is the result of calling [DB.QueryRow] to select a single row. + */ + interface Row { + } + interface Row { + /** + * Scan copies the columns from the matched row into the values + * pointed at by dest. See the documentation on [Rows.Scan] for details. + * If more than one row matches the query, + * Scan uses the first row and discards the rest. If no row matches + * the query, Scan returns [ErrNoRows]. + */ + scan(...dest: any[]): void + } + interface Row { + /** + * Err provides a way for wrapping packages to check for + * query errors without calling [Row.Scan]. + * Err returns the error, if any, that was encountered while running the query. + * If this error is not nil, this error will also be returned from [Row.Scan]. + */ + err(): void + } +} + +namespace types { +} + +namespace search { +} + namespace bufio { /** * Reader implements buffering for an io.Reader object. @@ -21019,131 +21948,6 @@ namespace bufio { } } -namespace syscall { - /** - * SysProcIDMap holds Container ID to Host ID mappings used for User Namespaces in Linux. - * See user_namespaces(7). - * - * Note that User Namespaces are not available on a number of popular Linux - * versions (due to security issues), or are available but subject to AppArmor - * restrictions like in Ubuntu 24.04. - */ - interface SysProcIDMap { - containerID: number // Container ID. - hostID: number // Host ID. - size: number // Size. - } - // @ts-ignore - import errorspkg = errors - /** - * Credential holds user and group identities to be assumed - * by a child process started by [StartProcess]. - */ - interface Credential { - uid: number // User ID. - gid: number // Group ID. - groups: Array // Supplementary group IDs. - noSetGroups: boolean // If true, don't set supplementary groups - } - // @ts-ignore - import runtimesyscall = syscall - /** - * A Signal is a number describing a process signal. - * It implements the [os.Signal] interface. - */ - interface Signal extends Number{} - interface Signal { - signal(): void - } - interface Signal { - string(): string - } -} - -namespace time { - /** - * A Month specifies a month of the year (January = 1, ...). - */ - interface Month extends Number{} - interface Month { - /** - * String returns the English name of the month ("January", "February", ...). - */ - string(): string - } - /** - * A Weekday specifies a day of the week (Sunday = 0, ...). - */ - interface Weekday extends Number{} - interface Weekday { - /** - * String returns the English name of the day ("Sunday", "Monday", ...). - */ - string(): string - } - /** - * A Location maps time instants to the zone in use at that time. - * Typically, the Location represents the collection of time offsets - * in use in a geographical area. For many Locations the time offset varies - * depending on whether daylight savings time is in use at the time instant. - * - * Location is used to provide a time zone in a printed Time value and for - * calculations involving intervals that may cross daylight savings time - * boundaries. - */ - interface Location { - } - interface Location { - /** - * String returns a descriptive name for the time zone information, - * corresponding to the name argument to [LoadLocation] or [FixedZone]. - */ - string(): string - } -} - -namespace fs { -} - -namespace context { -} - -namespace net { - /** - * Addr represents a network end point address. - * - * The two methods [Addr.Network] and [Addr.String] conventionally return strings - * that can be passed as the arguments to [Dial], but the exact form - * and meaning of the strings is up to the implementation. - */ - interface Addr { - [key:string]: any; - network(): string // name of the network (for example, "tcp", "udp") - string(): string // string form of address (for example, "192.0.2.1:25", "[2001:db8::1]:80") - } - /** - * A Listener is a generic network listener for stream-oriented protocols. - * - * Multiple goroutines may invoke methods on a Listener simultaneously. - */ - interface Listener { - [key:string]: any; - /** - * Accept waits for and returns the next connection to the listener. - */ - accept(): Conn - /** - * Close closes the listener. - * Any blocked Accept operations will be unblocked and return errors. - */ - close(): void - /** - * Addr returns the listener's network address. - */ - addr(): Addr - } -} - /** * Package textproto implements generic support for text-based request/response * protocols in the style of HTTP, NNTP, and SMTP. @@ -21283,497 +22087,6 @@ namespace multipart { } } -namespace store { -} - -/** - * Package url parses URLs and implements query escaping. - */ -namespace url { - /** - * A URL represents a parsed URL (technically, a URI reference). - * - * The general form represented is: - * - * ``` - * [scheme:][//[userinfo@]host][/]path[?query][#fragment] - * ``` - * - * URLs that do not start with a slash after the scheme are interpreted as: - * - * ``` - * scheme:opaque[?query][#fragment] - * ``` - * - * The Host field contains the host and port subcomponents of the URL. - * When the port is present, it is separated from the host with a colon. - * When the host is an IPv6 address, it must be enclosed in square brackets: - * "[fe80::1]:80". The [net.JoinHostPort] function combines a host and port - * into a string suitable for the Host field, adding square brackets to - * the host when necessary. - * - * Note that the Path field is stored in decoded form: /%47%6f%2f becomes /Go/. - * A consequence is that it is impossible to tell which slashes in the Path were - * slashes in the raw URL and which were %2f. This distinction is rarely important, - * but when it is, the code should use the [URL.EscapedPath] method, which preserves - * the original encoding of Path. - * - * The RawPath field is an optional field which is only set when the default - * encoding of Path is different from the escaped path. See the EscapedPath method - * for more details. - * - * URL's String method uses the EscapedPath method to obtain the path. - */ - interface URL { - scheme: string - opaque: string // encoded opaque data - user?: Userinfo // username and password information - host: string // host or host:port (see Hostname and Port methods) - path: string // path (relative paths may omit leading slash) - rawPath: string // encoded path hint (see EscapedPath method) - omitHost: boolean // do not emit empty host (authority) - forceQuery: boolean // append a query ('?') even if RawQuery is empty - rawQuery: string // encoded query values, without '?' - fragment: string // fragment for references, without '#' - rawFragment: string // encoded fragment hint (see EscapedFragment method) - } - interface URL { - /** - * EscapedPath returns the escaped form of u.Path. - * In general there are multiple possible escaped forms of any path. - * EscapedPath returns u.RawPath when it is a valid escaping of u.Path. - * Otherwise EscapedPath ignores u.RawPath and computes an escaped - * form on its own. - * The [URL.String] and [URL.RequestURI] methods use EscapedPath to construct - * their results. - * In general, code should call EscapedPath instead of - * reading u.RawPath directly. - */ - escapedPath(): string - } - interface URL { - /** - * EscapedFragment returns the escaped form of u.Fragment. - * In general there are multiple possible escaped forms of any fragment. - * EscapedFragment returns u.RawFragment when it is a valid escaping of u.Fragment. - * Otherwise EscapedFragment ignores u.RawFragment and computes an escaped - * form on its own. - * The [URL.String] method uses EscapedFragment to construct its result. - * In general, code should call EscapedFragment instead of - * reading u.RawFragment directly. - */ - escapedFragment(): string - } - interface URL { - /** - * String reassembles the [URL] into a valid URL string. - * The general form of the result is one of: - * - * ``` - * scheme:opaque?query#fragment - * scheme://userinfo@host/path?query#fragment - * ``` - * - * If u.Opaque is non-empty, String uses the first form; - * otherwise it uses the second form. - * Any non-ASCII characters in host are escaped. - * To obtain the path, String uses u.EscapedPath(). - * - * In the second form, the following rules apply: - * ``` - * - if u.Scheme is empty, scheme: is omitted. - * - if u.User is nil, userinfo@ is omitted. - * - if u.Host is empty, host/ is omitted. - * - if u.Scheme and u.Host are empty and u.User is nil, - * the entire scheme://userinfo@host/ is omitted. - * - if u.Host is non-empty and u.Path begins with a /, - * the form host/path does not add its own /. - * - if u.RawQuery is empty, ?query is omitted. - * - if u.Fragment is empty, #fragment is omitted. - * ``` - */ - string(): string - } - interface URL { - /** - * Redacted is like [URL.String] but replaces any password with "xxxxx". - * Only the password in u.User is redacted. - */ - redacted(): string - } - /** - * Values maps a string key to a list of values. - * It is typically used for query parameters and form values. - * Unlike in the http.Header map, the keys in a Values map - * are case-sensitive. - */ - interface Values extends _TygojaDict{} - interface Values { - /** - * Get gets the first value associated with the given key. - * If there are no values associated with the key, Get returns - * the empty string. To access multiple values, use the map - * directly. - */ - get(key: string): string - } - interface Values { - /** - * Set sets the key to value. It replaces any existing - * values. - */ - set(key: string, value: string): void - } - interface Values { - /** - * Add adds the value to key. It appends to any existing - * values associated with key. - */ - add(key: string, value: string): void - } - interface Values { - /** - * Del deletes the values associated with key. - */ - del(key: string): void - } - interface Values { - /** - * Has checks whether a given key is set. - */ - has(key: string): boolean - } - interface Values { - /** - * Encode encodes the values into “URL encoded” form - * ("bar=baz&foo=quux") sorted by key. - */ - encode(): string - } - interface URL { - /** - * IsAbs reports whether the [URL] is absolute. - * Absolute means that it has a non-empty scheme. - */ - isAbs(): boolean - } - interface URL { - /** - * Parse parses a [URL] in the context of the receiver. The provided URL - * may be relative or absolute. Parse returns nil, err on parse - * failure, otherwise its return value is the same as [URL.ResolveReference]. - */ - parse(ref: string): (URL) - } - interface URL { - /** - * ResolveReference resolves a URI reference to an absolute URI from - * an absolute base URI u, per RFC 3986 Section 5.2. The URI reference - * may be relative or absolute. ResolveReference always returns a new - * [URL] instance, even if the returned URL is identical to either the - * base or reference. If ref is an absolute URL, then ResolveReference - * ignores base and returns a copy of ref. - */ - resolveReference(ref: URL): (URL) - } - interface URL { - /** - * Query parses RawQuery and returns the corresponding values. - * It silently discards malformed value pairs. - * To check errors use [ParseQuery]. - */ - query(): Values - } - interface URL { - /** - * RequestURI returns the encoded path?query or opaque?query - * string that would be used in an HTTP request for u. - */ - requestURI(): string - } - interface URL { - /** - * Hostname returns u.Host, stripping any valid port number if present. - * - * If the result is enclosed in square brackets, as literal IPv6 addresses are, - * the square brackets are removed from the result. - */ - hostname(): string - } - interface URL { - /** - * Port returns the port part of u.Host, without the leading colon. - * - * If u.Host doesn't contain a valid numeric port, Port returns an empty string. - */ - port(): string - } - interface URL { - marshalBinary(): string|Array - } - interface URL { - unmarshalBinary(text: string|Array): void - } - interface URL { - /** - * JoinPath returns a new [URL] with the provided path elements joined to - * any existing path and the resulting path cleaned of any ./ or ../ elements. - * Any sequences of multiple / characters will be reduced to a single /. - */ - joinPath(...elem: string[]): (URL) - } -} - -namespace jwt { - /** - * NumericDate represents a JSON numeric date value, as referenced at - * https://datatracker.ietf.org/doc/html/rfc7519#section-2. - */ - type _sEeskws = time.Time - interface NumericDate extends _sEeskws { - } - interface NumericDate { - /** - * MarshalJSON is an implementation of the json.RawMessage interface and serializes the UNIX epoch - * represented in NumericDate to a byte array, using the precision specified in TimePrecision. - */ - marshalJSON(): string|Array - } - interface NumericDate { - /** - * UnmarshalJSON is an implementation of the json.RawMessage interface and - * deserializes a [NumericDate] from a JSON representation, i.e. a - * [json.Number]. This number represents an UNIX epoch with either integer or - * non-integer seconds. - */ - unmarshalJSON(b: string|Array): void - } - /** - * ClaimStrings is basically just a slice of strings, but it can be either - * serialized from a string array or just a string. This type is necessary, - * since the "aud" claim can either be a single string or an array. - */ - interface ClaimStrings extends Array{} - interface ClaimStrings { - unmarshalJSON(data: string|Array): void - } - interface ClaimStrings { - marshalJSON(): string|Array - } -} - -namespace hook { - /** - * wrapped local Hook embedded struct to limit the public API surface. - */ - type _sSdWBej = Hook - interface mainHook extends _sSdWBej { - } -} - -namespace sql { - /** - * IsolationLevel is the transaction isolation level used in [TxOptions]. - */ - interface IsolationLevel extends Number{} - interface IsolationLevel { - /** - * String returns the name of the transaction isolation level. - */ - string(): string - } - /** - * DBStats contains database statistics. - */ - interface DBStats { - maxOpenConnections: number // Maximum number of open connections to the database. - /** - * Pool Status - */ - openConnections: number // The number of established connections both in use and idle. - inUse: number // The number of connections currently in use. - idle: number // The number of idle connections. - /** - * Counters - */ - waitCount: number // The total number of connections waited for. - waitDuration: time.Duration // The total time blocked waiting for a new connection. - maxIdleClosed: number // The total number of connections closed due to SetMaxIdleConns. - maxIdleTimeClosed: number // The total number of connections closed due to SetConnMaxIdleTime. - maxLifetimeClosed: number // The total number of connections closed due to SetConnMaxLifetime. - } - /** - * Conn represents a single database connection rather than a pool of database - * connections. Prefer running queries from [DB] unless there is a specific - * need for a continuous single database connection. - * - * A Conn must call [Conn.Close] to return the connection to the database pool - * and may do so concurrently with a running query. - * - * After a call to [Conn.Close], all operations on the - * connection fail with [ErrConnDone]. - */ - interface Conn { - } - interface Conn { - /** - * PingContext verifies the connection to the database is still alive. - */ - pingContext(ctx: context.Context): void - } - interface Conn { - /** - * ExecContext executes a query without returning any rows. - * The args are for any placeholder parameters in the query. - */ - execContext(ctx: context.Context, query: string, ...args: any[]): Result - } - interface Conn { - /** - * QueryContext executes a query that returns rows, typically a SELECT. - * The args are for any placeholder parameters in the query. - */ - queryContext(ctx: context.Context, query: string, ...args: any[]): (Rows) - } - interface Conn { - /** - * QueryRowContext executes a query that is expected to return at most one row. - * QueryRowContext always returns a non-nil value. Errors are deferred until - * the [*Row.Scan] method is called. - * If the query selects no rows, the [*Row.Scan] will return [ErrNoRows]. - * Otherwise, the [*Row.Scan] scans the first selected row and discards - * the rest. - */ - queryRowContext(ctx: context.Context, query: string, ...args: any[]): (Row) - } - interface Conn { - /** - * PrepareContext creates a prepared statement for later queries or executions. - * Multiple queries or executions may be run concurrently from the - * returned statement. - * The caller must call the statement's [*Stmt.Close] method - * when the statement is no longer needed. - * - * The provided context is used for the preparation of the statement, not for the - * execution of the statement. - */ - prepareContext(ctx: context.Context, query: string): (Stmt) - } - interface Conn { - /** - * Raw executes f exposing the underlying driver connection for the - * duration of f. The driverConn must not be used outside of f. - * - * Once f returns and err is not [driver.ErrBadConn], the [Conn] will continue to be usable - * until [Conn.Close] is called. - */ - raw(f: (driverConn: any) => void): void - } - interface Conn { - /** - * BeginTx starts a transaction. - * - * The provided context is used until the transaction is committed or rolled back. - * If the context is canceled, the sql package will roll back - * the transaction. [Tx.Commit] will return an error if the context provided to - * BeginTx is canceled. - * - * The provided [TxOptions] is optional and may be nil if defaults should be used. - * If a non-default isolation level is used that the driver doesn't support, - * an error will be returned. - */ - beginTx(ctx: context.Context, opts: TxOptions): (Tx) - } - interface Conn { - /** - * Close returns the connection to the connection pool. - * All operations after a Close will return with [ErrConnDone]. - * Close is safe to call concurrently with other operations and will - * block until all other operations finish. It may be useful to first - * cancel any used context and then call close directly after. - */ - close(): void - } - /** - * ColumnType contains the name and type of a column. - */ - interface ColumnType { - } - interface ColumnType { - /** - * Name returns the name or alias of the column. - */ - name(): string - } - interface ColumnType { - /** - * Length returns the column type length for variable length column types such - * as text and binary field types. If the type length is unbounded the value will - * be [math.MaxInt64] (any database limits will still apply). - * If the column type is not variable length, such as an int, or if not supported - * by the driver ok is false. - */ - length(): [number, boolean] - } - interface ColumnType { - /** - * DecimalSize returns the scale and precision of a decimal type. - * If not applicable or if not supported ok is false. - */ - decimalSize(): [number, number, boolean] - } - interface ColumnType { - /** - * ScanType returns a Go type suitable for scanning into using [Rows.Scan]. - * If a driver does not support this property ScanType will return - * the type of an empty interface. - */ - scanType(): any - } - interface ColumnType { - /** - * Nullable reports whether the column may be null. - * If a driver does not support this property ok will be false. - */ - nullable(): [boolean, boolean] - } - interface ColumnType { - /** - * DatabaseTypeName returns the database system name of the column type. If an empty - * string is returned, then the driver type name is not supported. - * Consult your driver documentation for a list of driver data types. [ColumnType.Length] specifiers - * are not included. - * Common type names include "VARCHAR", "TEXT", "NVARCHAR", "DECIMAL", "BOOL", - * "INT", and "BIGINT". - */ - databaseTypeName(): string - } - /** - * Row is the result of calling [DB.QueryRow] to select a single row. - */ - interface Row { - } - interface Row { - /** - * Scan copies the columns from the matched row into the values - * pointed at by dest. See the documentation on [Rows.Scan] for details. - * If more than one row matches the query, - * Scan uses the first row and discards the rest. If no row matches - * the query, Scan returns [ErrNoRows]. - */ - scan(...dest: any[]): void - } - interface Row { - /** - * Err provides a way for wrapping packages to check for - * query errors without calling [Row.Scan]. - * Err returns the error, if any, that was encountered while running the query. - * If this error is not nil, this error will also be returned from [Row.Scan]. - */ - err(): void - } -} - namespace http { /** * A Cookie represents an HTTP cookie as sent in the Set-Cookie header of an @@ -22055,22 +22368,99 @@ namespace http { } } -namespace types { -} - -namespace search { -} - -namespace router { - // @ts-ignore - import validation = ozzo_validation +/** + * Package oauth2 provides support for making + * OAuth2 authorized and authenticated HTTP requests, + * as specified in RFC 6749. + * It can additionally grant authorization with Bearer JWT. + */ +namespace oauth2 { /** - * RouterGroup represents a collection of routes and other sub groups - * that share common pattern prefix and middlewares. + * An AuthCodeOption is passed to Config.AuthCodeURL. */ - interface RouterGroup { - prefix: string - middlewares: Array<(hook.Handler | undefined)> + interface AuthCodeOption { + [key:string]: any; + } + /** + * Token represents the credentials used to authorize + * the requests to access protected resources on the OAuth 2.0 + * provider's backend. + * + * Most users of this package should not access fields of Token + * directly. They're exported mostly for use by related packages + * implementing derivative OAuth2 flows. + */ + interface Token { + /** + * AccessToken is the token that authorizes and authenticates + * the requests. + */ + accessToken: string + /** + * TokenType is the type of token. + * The Type method returns either this or "Bearer", the default. + */ + tokenType: string + /** + * RefreshToken is a token that's used by the application + * (as opposed to the user) to refresh the access token + * if it expires. + */ + refreshToken: string + /** + * Expiry is the optional expiration time of the access token. + * + * If zero, [TokenSource] implementations will reuse the same + * token forever and RefreshToken or equivalent + * mechanisms for that TokenSource will not be used. + */ + expiry: time.Time + /** + * ExpiresIn is the OAuth2 wire format "expires_in" field, + * which specifies how many seconds later the token expires, + * relative to an unknown time base approximately around "now". + * It is the application's responsibility to populate + * `Expiry` from `ExpiresIn` when required. + */ + expiresIn: number + } + interface Token { + /** + * Type returns t.TokenType if non-empty, else "Bearer". + */ + type(): string + } + interface Token { + /** + * SetAuthHeader sets the Authorization header to r using the access + * token in t. + * + * This method is unnecessary when using [Transport] or an HTTP Client + * returned by this package. + */ + setAuthHeader(r: http.Request): void + } + interface Token { + /** + * WithExtra returns a new [Token] that's a clone of t, but using the + * provided raw extra map. This is only intended for use by packages + * implementing derivative OAuth2 flows. + */ + withExtra(extra: any): (Token) + } + interface Token { + /** + * Extra returns an extra field. + * Extra fields are key-value pairs returned by the server as a + * part of the token retrieval response. + */ + extra(key: string): any + } + interface Token { + /** + * Valid reports whether t is non-nil, has an AccessToken, and is not expired. + */ + valid(): boolean } } @@ -22110,164 +22500,16 @@ namespace cron { } } -namespace cobra { - interface PositionalArgs {(cmd: Command, args: Array): void } +namespace router { // @ts-ignore - import flag = pflag + import validation = ozzo_validation /** - * FParseErrWhitelist configures Flag parse errors to be ignored + * RouterGroup represents a collection of routes and other sub groups + * that share common pattern prefix and middlewares. */ - interface FParseErrWhitelist extends _TygojaAny{} - /** - * Group Structure to manage groups for commands - */ - interface Group { - id: string - title: string - } - /** - * CompletionOptions are the options to control shell completion - */ - interface CompletionOptions { - /** - * DisableDefaultCmd prevents Cobra from creating a default 'completion' command - */ - disableDefaultCmd: boolean - /** - * DisableNoDescFlag prevents Cobra from creating the '--no-descriptions' flag - * for shells that support completion descriptions - */ - disableNoDescFlag: boolean - /** - * DisableDescriptions turns off all completion descriptions for shells - * that support them - */ - disableDescriptions: boolean - /** - * HiddenDefaultCmd makes the default 'completion' command hidden - */ - hiddenDefaultCmd: boolean - } - /** - * Completion is a string that can be used for completions - * - * two formats are supported: - * ``` - * - the completion choice - * - the completion choice with a textual description (separated by a TAB). - * ``` - * - * [CompletionWithDesc] can be used to create a completion string with a textual description. - * - * Note: Go type alias is used to provide a more descriptive name in the documentation, but any string can be used. - */ - interface Completion extends String{} - /** - * CompletionFunc is a function that provides completion results. - */ - interface CompletionFunc {(cmd: Command, args: Array, toComplete: string): [Array, ShellCompDirective] } -} - -/** - * Package oauth2 provides support for making - * OAuth2 authorized and authenticated HTTP requests, - * as specified in RFC 6749. - * It can additionally grant authorization with Bearer JWT. - */ -/** - * Copyright 2023 The Go Authors. All rights reserved. - * Use of this source code is governed by a BSD-style - * license that can be found in the LICENSE file. - */ -namespace oauth2 { - /** - * An AuthCodeOption is passed to Config.AuthCodeURL. - */ - interface AuthCodeOption { - [key:string]: any; - } - /** - * Token represents the credentials used to authorize - * the requests to access protected resources on the OAuth 2.0 - * provider's backend. - * - * Most users of this package should not access fields of Token - * directly. They're exported mostly for use by related packages - * implementing derivative OAuth2 flows. - */ - interface Token { - /** - * AccessToken is the token that authorizes and authenticates - * the requests. - */ - accessToken: string - /** - * TokenType is the type of token. - * The Type method returns either this or "Bearer", the default. - */ - tokenType: string - /** - * RefreshToken is a token that's used by the application - * (as opposed to the user) to refresh the access token - * if it expires. - */ - refreshToken: string - /** - * Expiry is the optional expiration time of the access token. - * - * If zero, TokenSource implementations will reuse the same - * token forever and RefreshToken or equivalent - * mechanisms for that TokenSource will not be used. - */ - expiry: time.Time - /** - * ExpiresIn is the OAuth2 wire format "expires_in" field, - * which specifies how many seconds later the token expires, - * relative to an unknown time base approximately around "now". - * It is the application's responsibility to populate - * `Expiry` from `ExpiresIn` when required. - */ - expiresIn: number - } - interface Token { - /** - * Type returns t.TokenType if non-empty, else "Bearer". - */ - type(): string - } - interface Token { - /** - * SetAuthHeader sets the Authorization header to r using the access - * token in t. - * - * This method is unnecessary when using Transport or an HTTP Client - * returned by this package. - */ - setAuthHeader(r: http.Request): void - } - interface Token { - /** - * WithExtra returns a new Token that's a clone of t, but using the - * provided raw extra map. This is only intended for use by packages - * implementing derivative OAuth2 flows. - */ - withExtra(extra: { - }): (Token) - } - interface Token { - /** - * Extra returns an extra field. - * Extra fields are key-value pairs returned by the server as a - * part of the token retrieval response. - */ - extra(key: string): { - } - } - interface Token { - /** - * Valid reports whether t is non-nil, has an AccessToken, and is not expired. - */ - valid(): boolean + interface RouterGroup { + prefix: string + middlewares: Array<(hook.Handler | undefined)> } } @@ -22437,6 +22679,103 @@ namespace slog { import loginternal = internal } +namespace cobra { + interface PositionalArgs {(cmd: Command, args: Array): void } + // @ts-ignore + import flag = pflag + /** + * FParseErrWhitelist configures Flag parse errors to be ignored + */ + interface FParseErrWhitelist extends _TygojaAny{} + /** + * Group Structure to manage groups for commands + */ + interface Group { + id: string + title: string + } + /** + * CompletionOptions are the options to control shell completion + */ + interface CompletionOptions { + /** + * DisableDefaultCmd prevents Cobra from creating a default 'completion' command + */ + disableDefaultCmd: boolean + /** + * DisableNoDescFlag prevents Cobra from creating the '--no-descriptions' flag + * for shells that support completion descriptions + */ + disableNoDescFlag: boolean + /** + * DisableDescriptions turns off all completion descriptions for shells + * that support them + */ + disableDescriptions: boolean + /** + * HiddenDefaultCmd makes the default 'completion' command hidden + */ + hiddenDefaultCmd: boolean + } + /** + * Completion is a string that can be used for completions + * + * two formats are supported: + * ``` + * - the completion choice + * - the completion choice with a textual description (separated by a TAB). + * ``` + * + * [CompletionWithDesc] can be used to create a completion string with a textual description. + * + * Note: Go type alias is used to provide a more descriptive name in the documentation, but any string can be used. + */ + interface Completion extends String{} + /** + * CompletionFunc is a function that provides completion results. + */ + interface CompletionFunc {(cmd: Command, args: Array, toComplete: string): [Array, ShellCompDirective] } +} + +namespace multipart { + /** + * A Part represents a single part in a multipart body. + */ + interface Part { + /** + * The headers of the body, if any, with the keys canonicalized + * in the same fashion that the Go http.Request headers are. + * For example, "foo-bar" changes case to "Foo-Bar" + */ + header: textproto.MIMEHeader + } + interface Part { + /** + * FormName returns the name parameter if p has a Content-Disposition + * of type "form-data". Otherwise it returns the empty string. + */ + formName(): string + } + interface Part { + /** + * FileName returns the filename parameter of the [Part]'s Content-Disposition + * header. If not empty, the filename is passed through filepath.Base (which is + * platform dependent) before being returned. + */ + fileName(): string + } + interface Part { + /** + * Read reads the body of a part, after its headers and before the + * next part (if any) begins. + */ + read(d: string|Array): number + } + interface Part { + close(): void + } +} + namespace url { /** * The Userinfo type is an immutable encapsulation of username and @@ -22467,14 +22806,23 @@ namespace url { } } -namespace cobra { - // @ts-ignore - import flag = pflag +namespace http { /** - * ShellCompDirective is a bit map representing the different behaviors the shell - * can be instructed to have once completions have been provided. + * SameSite allows a server to define a cookie attribute making it impossible for + * the browser to send this cookie along with cross-site requests. The main + * goal is to mitigate the risk of cross-origin information leakage, and provide + * some protection against cross-site request forgery attacks. + * + * See https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00 for details. */ - interface ShellCompDirective extends Number{} + interface SameSite extends Number{} + // @ts-ignore + import mathrand = rand + // @ts-ignore + import urlpkg = url +} + +namespace oauth2 { } namespace slog { @@ -22649,59 +22997,14 @@ namespace slog { } } -namespace multipart { - /** - * A Part represents a single part in a multipart body. - */ - interface Part { - /** - * The headers of the body, if any, with the keys canonicalized - * in the same fashion that the Go http.Request headers are. - * For example, "foo-bar" changes case to "Foo-Bar" - */ - header: textproto.MIMEHeader - } - interface Part { - /** - * FormName returns the name parameter if p has a Content-Disposition - * of type "form-data". Otherwise it returns the empty string. - */ - formName(): string - } - interface Part { - /** - * FileName returns the filename parameter of the [Part]'s Content-Disposition - * header. If not empty, the filename is passed through filepath.Base (which is - * platform dependent) before being returned. - */ - fileName(): string - } - interface Part { - /** - * Read reads the body of a part, after its headers and before the - * next part (if any) begins. - */ - read(d: string|Array): number - } - interface Part { - close(): void - } -} - -namespace http { - /** - * SameSite allows a server to define a cookie attribute making it impossible for - * the browser to send this cookie along with cross-site requests. The main - * goal is to mitigate the risk of cross-origin information leakage, and provide - * some protection against cross-site request forgery attacks. - * - * See https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00 for details. - */ - interface SameSite extends Number{} +namespace cobra { // @ts-ignore - import mathrand = rand - // @ts-ignore - import urlpkg = url + import flag = pflag + /** + * ShellCompDirective is a bit map representing the different behaviors the shell + * can be instructed to have once completions have been provided. + */ + interface ShellCompDirective extends Number{} } namespace slog {